diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/node/src/app/call/page.tsx b/node/src/app/call/page.tsx new file mode 100644 index 0000000..4075387 --- /dev/null +++ b/node/src/app/call/page.tsx @@ -0,0 +1,128 @@ +'use client' +import { Suspense, useEffect, useRef } from 'react' +import { useSearchParams, useRouter } from 'next/navigation' +import { IconButton, Typography } from '@mui/material' +import { + Mic as MicIcon, + MicOff as MicOffIcon, + Videocam as VideocamIcon, + VideocamOff as VideocamOffIcon, + CallEnd as CallEndIcon, +} from '@mui/icons-material' +import { useWebRTC } from '@/hooks' +import './page.css' + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 +function CallPageInner() { + const searchParams = useSearchParams() + const router = useRouter() + const callId = searchParams.get('callId') ?? '' + const accessKey = searchParams.get('accessKey') ?? '' + + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? '' + const wsUrl = callId && accessKey + ? baseUrl.replace(/^https?:\/\//, 'wss://') + `/api/mobile/${accessKey}/call/${callId}` + : '' + + const { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup } = + useWebRTC({ callId, wsUrl, onHangup: () => {} }) + + const remoteVideoRef = useRef(null) + const localVideoRef = useRef(null) + + useEffect(() => { + if (remoteVideoRef.current && remoteStream) { + remoteVideoRef.current.srcObject = remoteStream + } + }, [remoteStream]) + + useEffect(() => { + if (localVideoRef.current && localStream) { + localVideoRef.current.srcObject = localStream + } + }, [localStream]) + + // 通話終了・失敗時は2秒後に前のページへ戻る + useEffect(() => { + if (callState === 'ended' || callState === 'failed') { + const timer = setTimeout(() => router.back(), 2000) + return () => clearTimeout(timer) + } + }, [callState, router]) + + const statusText: Record = { + connecting: '接続中…', + failed: '接続に失敗しました', + ended: '通話終了', + } + + const isEnded = callState === 'ended' || callState === 'failed' + + return ( +
+ {/* リモート映像(全画面) */} +
+ ) +} + +export default function CallPage() { + return ( + }> + + + ) +} diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/node/src/app/call/page.tsx b/node/src/app/call/page.tsx new file mode 100644 index 0000000..4075387 --- /dev/null +++ b/node/src/app/call/page.tsx @@ -0,0 +1,128 @@ +'use client' +import { Suspense, useEffect, useRef } from 'react' +import { useSearchParams, useRouter } from 'next/navigation' +import { IconButton, Typography } from '@mui/material' +import { + Mic as MicIcon, + MicOff as MicOffIcon, + Videocam as VideocamIcon, + VideocamOff as VideocamOffIcon, + CallEnd as CallEndIcon, +} from '@mui/icons-material' +import { useWebRTC } from '@/hooks' +import './page.css' + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 +function CallPageInner() { + const searchParams = useSearchParams() + const router = useRouter() + const callId = searchParams.get('callId') ?? '' + const accessKey = searchParams.get('accessKey') ?? '' + + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? '' + const wsUrl = callId && accessKey + ? baseUrl.replace(/^https?:\/\//, 'wss://') + `/api/mobile/${accessKey}/call/${callId}` + : '' + + const { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup } = + useWebRTC({ callId, wsUrl, onHangup: () => {} }) + + const remoteVideoRef = useRef(null) + const localVideoRef = useRef(null) + + useEffect(() => { + if (remoteVideoRef.current && remoteStream) { + remoteVideoRef.current.srcObject = remoteStream + } + }, [remoteStream]) + + useEffect(() => { + if (localVideoRef.current && localStream) { + localVideoRef.current.srcObject = localStream + } + }, [localStream]) + + // 通話終了・失敗時は2秒後に前のページへ戻る + useEffect(() => { + if (callState === 'ended' || callState === 'failed') { + const timer = setTimeout(() => router.back(), 2000) + return () => clearTimeout(timer) + } + }, [callState, router]) + + const statusText: Record = { + connecting: '接続中…', + failed: '接続に失敗しました', + ended: '通話終了', + } + + const isEnded = callState === 'ended' || callState === 'failed' + + return ( +
+ {/* リモート映像(全画面) */} +
+ ) +} + +export default function CallPage() { + return ( + }> + + + ) +} diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100644 new mode 100755 index 50bc743..8d56ba1 --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -28,7 +28,8 @@ - + + ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/node/src/app/call/page.tsx b/node/src/app/call/page.tsx new file mode 100644 index 0000000..4075387 --- /dev/null +++ b/node/src/app/call/page.tsx @@ -0,0 +1,128 @@ +'use client' +import { Suspense, useEffect, useRef } from 'react' +import { useSearchParams, useRouter } from 'next/navigation' +import { IconButton, Typography } from '@mui/material' +import { + Mic as MicIcon, + MicOff as MicOffIcon, + Videocam as VideocamIcon, + VideocamOff as VideocamOffIcon, + CallEnd as CallEndIcon, +} from '@mui/icons-material' +import { useWebRTC } from '@/hooks' +import './page.css' + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 +function CallPageInner() { + const searchParams = useSearchParams() + const router = useRouter() + const callId = searchParams.get('callId') ?? '' + const accessKey = searchParams.get('accessKey') ?? '' + + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? '' + const wsUrl = callId && accessKey + ? baseUrl.replace(/^https?:\/\//, 'wss://') + `/api/mobile/${accessKey}/call/${callId}` + : '' + + const { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup } = + useWebRTC({ callId, wsUrl, onHangup: () => {} }) + + const remoteVideoRef = useRef(null) + const localVideoRef = useRef(null) + + useEffect(() => { + if (remoteVideoRef.current && remoteStream) { + remoteVideoRef.current.srcObject = remoteStream + } + }, [remoteStream]) + + useEffect(() => { + if (localVideoRef.current && localStream) { + localVideoRef.current.srcObject = localStream + } + }, [localStream]) + + // 通話終了・失敗時は2秒後に前のページへ戻る + useEffect(() => { + if (callState === 'ended' || callState === 'failed') { + const timer = setTimeout(() => router.back(), 2000) + return () => clearTimeout(timer) + } + }, [callState, router]) + + const statusText: Record = { + connecting: '接続中…', + failed: '接続に失敗しました', + ended: '通話終了', + } + + const isEnded = callState === 'ended' || callState === 'failed' + + return ( +
+ {/* リモート映像(全画面) */} +
+ ) +} + +export default function CallPage() { + return ( + }> + + + ) +} diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100644 new mode 100755 index 50bc743..8d56ba1 --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -28,7 +28,8 @@ - + + (null) const [osDetected, setOsDetected] = useState(false) const [installPrompt, setInstallPrompt] = useState(null) @@ -37,9 +36,15 @@ const browser = getBrowser() setOS(os) setBrowser(browser) + setIosVersion(getIOSVersion()) setOsDetected(true) - setIsStandalone(window.matchMedia('(display-mode: standalone)').matches) + // iOS は display-mode メディアクエリが home screen 起動でも false を返すことがある。 + // iOS の正規シグナルは navigator.standalone なので両方を OR で判定する。 + setIsStandalone( + window.matchMedia('(display-mode: standalone)').matches || + (window.navigator as { standalone?: boolean }).standalone === true, + ) navigator.getInstalledRelatedApps?.().then(apps => { setIsInstalled(apps.length > 0) @@ -102,7 +107,7 @@ const registerMode = isStandalone || (!installPrompt && !isInstalled) ? 'allowed' : installPrompt ? 'install-required' : 'hidden' - const { Subscribe, errorMessage, accessKey, isSubscribed, canSubscribe, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) + const { Subscribe, errorMessage, accessKey, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) @@ -218,7 +223,7 @@ )} - {os === 'iOS' && browser === 'Safari' && !isStandalone && } + {os === 'iOS' && browser === 'Safari' && !isStandalone && = 26 ? '/images/install_for_ios26.svg' : '/images/install_for_ios.png'} />} {os === 'Android' && (isStandalone || isInstalled) && 通知が届かなくなった場合
@@ -231,36 +236,3 @@ ) } - - -const ServiceWorkerStatus: React.FC = () => { - const [registrations, setRegistrations] = useState(['確認中...']); - - useEffect(() => { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.getRegistrations().then(regs => { - if (regs.length === 0) { - setRegistrations(['サービスワーカーは登録されていません。']); - } else { - const swInfo = regs.map((reg, index) => - `(${index + 1}) スコープ: ${reg.scope}, 状態: ${reg.active ? 'アクティブ' : '非アクティブ'}` - ); - setRegistrations(swInfo); - } - }); - } else { - setRegistrations(['このブラウザはサービスワーカーをサポートしていません。']); - } - }, []); - - return ( -
-

Service Workerの状態

-
    - {registrations.map((reg, index) => ( -
  • {reg}
  • - ))} -
-
- ); - }; \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/node/src/app/call/page.tsx b/node/src/app/call/page.tsx new file mode 100644 index 0000000..4075387 --- /dev/null +++ b/node/src/app/call/page.tsx @@ -0,0 +1,128 @@ +'use client' +import { Suspense, useEffect, useRef } from 'react' +import { useSearchParams, useRouter } from 'next/navigation' +import { IconButton, Typography } from '@mui/material' +import { + Mic as MicIcon, + MicOff as MicOffIcon, + Videocam as VideocamIcon, + VideocamOff as VideocamOffIcon, + CallEnd as CallEndIcon, +} from '@mui/icons-material' +import { useWebRTC } from '@/hooks' +import './page.css' + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 +function CallPageInner() { + const searchParams = useSearchParams() + const router = useRouter() + const callId = searchParams.get('callId') ?? '' + const accessKey = searchParams.get('accessKey') ?? '' + + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? '' + const wsUrl = callId && accessKey + ? baseUrl.replace(/^https?:\/\//, 'wss://') + `/api/mobile/${accessKey}/call/${callId}` + : '' + + const { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup } = + useWebRTC({ callId, wsUrl, onHangup: () => {} }) + + const remoteVideoRef = useRef(null) + const localVideoRef = useRef(null) + + useEffect(() => { + if (remoteVideoRef.current && remoteStream) { + remoteVideoRef.current.srcObject = remoteStream + } + }, [remoteStream]) + + useEffect(() => { + if (localVideoRef.current && localStream) { + localVideoRef.current.srcObject = localStream + } + }, [localStream]) + + // 通話終了・失敗時は2秒後に前のページへ戻る + useEffect(() => { + if (callState === 'ended' || callState === 'failed') { + const timer = setTimeout(() => router.back(), 2000) + return () => clearTimeout(timer) + } + }, [callState, router]) + + const statusText: Record = { + connecting: '接続中…', + failed: '接続に失敗しました', + ended: '通話終了', + } + + const isEnded = callState === 'ended' || callState === 'failed' + + return ( +
+ {/* リモート映像(全画面) */} +
+ ) +} + +export default function CallPage() { + return ( + }> + + + ) +} diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100644 new mode 100755 index 50bc743..8d56ba1 --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -28,7 +28,8 @@ - + + (null) const [osDetected, setOsDetected] = useState(false) const [installPrompt, setInstallPrompt] = useState(null) @@ -37,9 +36,15 @@ const browser = getBrowser() setOS(os) setBrowser(browser) + setIosVersion(getIOSVersion()) setOsDetected(true) - setIsStandalone(window.matchMedia('(display-mode: standalone)').matches) + // iOS は display-mode メディアクエリが home screen 起動でも false を返すことがある。 + // iOS の正規シグナルは navigator.standalone なので両方を OR で判定する。 + setIsStandalone( + window.matchMedia('(display-mode: standalone)').matches || + (window.navigator as { standalone?: boolean }).standalone === true, + ) navigator.getInstalledRelatedApps?.().then(apps => { setIsInstalled(apps.length > 0) @@ -102,7 +107,7 @@ const registerMode = isStandalone || (!installPrompt && !isInstalled) ? 'allowed' : installPrompt ? 'install-required' : 'hidden' - const { Subscribe, errorMessage, accessKey, isSubscribed, canSubscribe, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) + const { Subscribe, errorMessage, accessKey, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) @@ -218,7 +223,7 @@ )} - {os === 'iOS' && browser === 'Safari' && !isStandalone && } + {os === 'iOS' && browser === 'Safari' && !isStandalone && = 26 ? '/images/install_for_ios26.svg' : '/images/install_for_ios.png'} />} {os === 'Android' && (isStandalone || isInstalled) && 通知が届かなくなった場合
@@ -231,36 +236,3 @@ ) } - - -const ServiceWorkerStatus: React.FC = () => { - const [registrations, setRegistrations] = useState(['確認中...']); - - useEffect(() => { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.getRegistrations().then(regs => { - if (regs.length === 0) { - setRegistrations(['サービスワーカーは登録されていません。']); - } else { - const swInfo = regs.map((reg, index) => - `(${index + 1}) スコープ: ${reg.scope}, 状態: ${reg.active ? 'アクティブ' : '非アクティブ'}` - ); - setRegistrations(swInfo); - } - }); - } else { - setRegistrations(['このブラウザはサービスワーカーをサポートしていません。']); - } - }, []); - - return ( -
-

Service Workerの状態

-
    - {registrations.map((reg, index) => ( -
  • {reg}
  • - ))} -
-
- ); - }; \ No newline at end of file diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx old mode 100755 new mode 100644 index 540d330..4a8dc66 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -1,5 +1,5 @@ 'use client' -import { useEffect, useMemo, useState, useCallback } from 'react' +import { useEffect, useMemo, useState, useCallback, useRef } from 'react' import webpush from 'web-push' import { Button, FormHelperText, Alert, FormControl, InputLabel, OutlinedInput, InputAdornment, IconButton, Tooltip, ClickAwayListener, Tabs, CircularProgress } from '@mui/material' import { ContentPasteGo as ContentPasteGoIcon } from '@mui/icons-material' @@ -30,9 +30,12 @@ const [isLoading, setIsLoading] = useState(true) const [pushSupported, setPushSupported] = useState(null) const [state, setState] = useState<{status: string, token: string | null}>({ status: 'unknown', token: null }) + // 最後に checkAccessKey へ渡したキー。手入力 blur 時の二重照会 (ペースト → blur 等) を防ぐ。 + const lastCheckedAccessKeyRef = useRef('') // アクセスキーが入力されたらサーバへ問い合わせる const checkAccessKey = useCallback((newAccessKey: string) => { + lastCheckedAccessKeyRef.current = newAccessKey setAccessKey(newAccessKey) setIsLoading(true) setAccessKeyError(null) @@ -83,10 +86,11 @@ console.error('GET /accessKey failed', e) } - // 2. URLハッシュのキーを取得し、即座に消去 + // 2. URLハッシュのキーを取得 (ハッシュは URL に残す。 + // deep link / bookmark / タブ復元で再適用できるようにするため。 + // キー変更をキャンセルした時のみ後段で消去する)。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - if (hashKey) history.replaceState(null, '', location.pathname + location.search) // 3. localStorageからCookieへ移行(CookieもURLハッシュもない場合) let migratedKey: string | null = null @@ -172,7 +176,10 @@ checkAccessKey(hashKey) return } - // キャンセル: 旧キーのまま継続(hashKeyは消去済み、CookieはcookieKeyのまま) + // キャンセル: 旧キーのまま継続(Cookie は cookieKey のまま)。 + // 拒否したキーが URL ハッシュに残ると reload のたびに再プロンプトになるため、 + // このケースだけハッシュを消去する。 + history.replaceState(null, '', location.pathname + location.search) keyChangeCancelled = true } @@ -380,9 +387,21 @@ : undefined } label="アクセスキー" - placeholder="(タップしてペースト)" + placeholder="(タップしてペースト、または入力)" onPaste={e => !isLoading && !isSubscribed && checkAccessKey(e.clipboardData.getData('text'))} - readOnly + onChange={e => { + // 手入力中は値の更新のみ。サーバ照会は blur 時にまとめて行う。 + if (isLoading || isSubscribed) return + setAccessKey(e.target.value) + setAccessKeyError(null) + }} + onBlur={() => { + // 手入力でフォーカスが外れたタイミングで照会。 + // ペースト経路 (onPaste / ペーストボタン) は既に checkAccessKey 済みなので + // lastCheckedAccessKeyRef との比較で二重照会を防ぐ。 + if (isLoading || isSubscribed) return + if (accessKey && accessKey !== lastCheckedAccessKeyRef.current) checkAccessKey(accessKey) + }} disabled={isLoading} inputProps={{ size: 20 }} sx={{fontFamily: 'monospace'}} /> @@ -399,7 +418,8 @@ プッシュ通知にはSafariで開く必要があります } - {pushSupported === false && os !== 'iOS' && このブラウザはプッシュ通知に対応していません。AndroidはChromeでお開きください。} + {pushSupported === false && os === 'Android' && このブラウザはプッシュ通知に対応していません。Chromeでお開きください。} + {pushSupported === false && os !== 'iOS' && os !== 'Android' && このブラウザはプッシュ通知に対応していません。} {registerMode === 'allowed' && os === 'iOS' && browser === 'Safari' && !isStandalone && プッシュ通知にはホーム画面への追加が必要です。画面下部の共有ボタン(□↑)から「ホーム画面に追加」を選んでください} {registerMode === 'allowed' && !(os === 'iOS' && browser === 'Safari' && !isStandalone) && pushSupported !== false && } {registerMode === 'install-required' && プッシュ通知を受け取るにはWebアプリとしてインストールしてください} diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/node/src/app/call/page.tsx b/node/src/app/call/page.tsx new file mode 100644 index 0000000..4075387 --- /dev/null +++ b/node/src/app/call/page.tsx @@ -0,0 +1,128 @@ +'use client' +import { Suspense, useEffect, useRef } from 'react' +import { useSearchParams, useRouter } from 'next/navigation' +import { IconButton, Typography } from '@mui/material' +import { + Mic as MicIcon, + MicOff as MicOffIcon, + Videocam as VideocamIcon, + VideocamOff as VideocamOffIcon, + CallEnd as CallEndIcon, +} from '@mui/icons-material' +import { useWebRTC } from '@/hooks' +import './page.css' + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 +function CallPageInner() { + const searchParams = useSearchParams() + const router = useRouter() + const callId = searchParams.get('callId') ?? '' + const accessKey = searchParams.get('accessKey') ?? '' + + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? '' + const wsUrl = callId && accessKey + ? baseUrl.replace(/^https?:\/\//, 'wss://') + `/api/mobile/${accessKey}/call/${callId}` + : '' + + const { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup } = + useWebRTC({ callId, wsUrl, onHangup: () => {} }) + + const remoteVideoRef = useRef(null) + const localVideoRef = useRef(null) + + useEffect(() => { + if (remoteVideoRef.current && remoteStream) { + remoteVideoRef.current.srcObject = remoteStream + } + }, [remoteStream]) + + useEffect(() => { + if (localVideoRef.current && localStream) { + localVideoRef.current.srcObject = localStream + } + }, [localStream]) + + // 通話終了・失敗時は2秒後に前のページへ戻る + useEffect(() => { + if (callState === 'ended' || callState === 'failed') { + const timer = setTimeout(() => router.back(), 2000) + return () => clearTimeout(timer) + } + }, [callState, router]) + + const statusText: Record = { + connecting: '接続中…', + failed: '接続に失敗しました', + ended: '通話終了', + } + + const isEnded = callState === 'ended' || callState === 'failed' + + return ( +
+ {/* リモート映像(全画面) */} +
+ ) +} + +export default function CallPage() { + return ( + }> + + + ) +} diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100644 new mode 100755 index 50bc743..8d56ba1 --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -28,7 +28,8 @@ - + + (null) const [osDetected, setOsDetected] = useState(false) const [installPrompt, setInstallPrompt] = useState(null) @@ -37,9 +36,15 @@ const browser = getBrowser() setOS(os) setBrowser(browser) + setIosVersion(getIOSVersion()) setOsDetected(true) - setIsStandalone(window.matchMedia('(display-mode: standalone)').matches) + // iOS は display-mode メディアクエリが home screen 起動でも false を返すことがある。 + // iOS の正規シグナルは navigator.standalone なので両方を OR で判定する。 + setIsStandalone( + window.matchMedia('(display-mode: standalone)').matches || + (window.navigator as { standalone?: boolean }).standalone === true, + ) navigator.getInstalledRelatedApps?.().then(apps => { setIsInstalled(apps.length > 0) @@ -102,7 +107,7 @@ const registerMode = isStandalone || (!installPrompt && !isInstalled) ? 'allowed' : installPrompt ? 'install-required' : 'hidden' - const { Subscribe, errorMessage, accessKey, isSubscribed, canSubscribe, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) + const { Subscribe, errorMessage, accessKey, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) @@ -218,7 +223,7 @@ )} - {os === 'iOS' && browser === 'Safari' && !isStandalone && } + {os === 'iOS' && browser === 'Safari' && !isStandalone && = 26 ? '/images/install_for_ios26.svg' : '/images/install_for_ios.png'} />} {os === 'Android' && (isStandalone || isInstalled) && 通知が届かなくなった場合
@@ -231,36 +236,3 @@ ) } - - -const ServiceWorkerStatus: React.FC = () => { - const [registrations, setRegistrations] = useState(['確認中...']); - - useEffect(() => { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.getRegistrations().then(regs => { - if (regs.length === 0) { - setRegistrations(['サービスワーカーは登録されていません。']); - } else { - const swInfo = regs.map((reg, index) => - `(${index + 1}) スコープ: ${reg.scope}, 状態: ${reg.active ? 'アクティブ' : '非アクティブ'}` - ); - setRegistrations(swInfo); - } - }); - } else { - setRegistrations(['このブラウザはサービスワーカーをサポートしていません。']); - } - }, []); - - return ( -
-

Service Workerの状態

-
    - {registrations.map((reg, index) => ( -
  • {reg}
  • - ))} -
-
- ); - }; \ No newline at end of file diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx old mode 100755 new mode 100644 index 540d330..4a8dc66 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -1,5 +1,5 @@ 'use client' -import { useEffect, useMemo, useState, useCallback } from 'react' +import { useEffect, useMemo, useState, useCallback, useRef } from 'react' import webpush from 'web-push' import { Button, FormHelperText, Alert, FormControl, InputLabel, OutlinedInput, InputAdornment, IconButton, Tooltip, ClickAwayListener, Tabs, CircularProgress } from '@mui/material' import { ContentPasteGo as ContentPasteGoIcon } from '@mui/icons-material' @@ -30,9 +30,12 @@ const [isLoading, setIsLoading] = useState(true) const [pushSupported, setPushSupported] = useState(null) const [state, setState] = useState<{status: string, token: string | null}>({ status: 'unknown', token: null }) + // 最後に checkAccessKey へ渡したキー。手入力 blur 時の二重照会 (ペースト → blur 等) を防ぐ。 + const lastCheckedAccessKeyRef = useRef('') // アクセスキーが入力されたらサーバへ問い合わせる const checkAccessKey = useCallback((newAccessKey: string) => { + lastCheckedAccessKeyRef.current = newAccessKey setAccessKey(newAccessKey) setIsLoading(true) setAccessKeyError(null) @@ -83,10 +86,11 @@ console.error('GET /accessKey failed', e) } - // 2. URLハッシュのキーを取得し、即座に消去 + // 2. URLハッシュのキーを取得 (ハッシュは URL に残す。 + // deep link / bookmark / タブ復元で再適用できるようにするため。 + // キー変更をキャンセルした時のみ後段で消去する)。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - if (hashKey) history.replaceState(null, '', location.pathname + location.search) // 3. localStorageからCookieへ移行(CookieもURLハッシュもない場合) let migratedKey: string | null = null @@ -172,7 +176,10 @@ checkAccessKey(hashKey) return } - // キャンセル: 旧キーのまま継続(hashKeyは消去済み、CookieはcookieKeyのまま) + // キャンセル: 旧キーのまま継続(Cookie は cookieKey のまま)。 + // 拒否したキーが URL ハッシュに残ると reload のたびに再プロンプトになるため、 + // このケースだけハッシュを消去する。 + history.replaceState(null, '', location.pathname + location.search) keyChangeCancelled = true } @@ -380,9 +387,21 @@ : undefined } label="アクセスキー" - placeholder="(タップしてペースト)" + placeholder="(タップしてペースト、または入力)" onPaste={e => !isLoading && !isSubscribed && checkAccessKey(e.clipboardData.getData('text'))} - readOnly + onChange={e => { + // 手入力中は値の更新のみ。サーバ照会は blur 時にまとめて行う。 + if (isLoading || isSubscribed) return + setAccessKey(e.target.value) + setAccessKeyError(null) + }} + onBlur={() => { + // 手入力でフォーカスが外れたタイミングで照会。 + // ペースト経路 (onPaste / ペーストボタン) は既に checkAccessKey 済みなので + // lastCheckedAccessKeyRef との比較で二重照会を防ぐ。 + if (isLoading || isSubscribed) return + if (accessKey && accessKey !== lastCheckedAccessKeyRef.current) checkAccessKey(accessKey) + }} disabled={isLoading} inputProps={{ size: 20 }} sx={{fontFamily: 'monospace'}} /> @@ -399,7 +418,8 @@ プッシュ通知にはSafariで開く必要があります } - {pushSupported === false && os !== 'iOS' && このブラウザはプッシュ通知に対応していません。AndroidはChromeでお開きください。} + {pushSupported === false && os === 'Android' && このブラウザはプッシュ通知に対応していません。Chromeでお開きください。} + {pushSupported === false && os !== 'iOS' && os !== 'Android' && このブラウザはプッシュ通知に対応していません。} {registerMode === 'allowed' && os === 'iOS' && browser === 'Safari' && !isStandalone && プッシュ通知にはホーム画面への追加が必要です。画面下部の共有ボタン(□↑)から「ホーム画面に追加」を選んでください} {registerMode === 'allowed' && !(os === 'iOS' && browser === 'Safari' && !isStandalone) && pushSupported !== false && } {registerMode === 'install-required' && プッシュ通知を受け取るにはWebアプリとしてインストールしてください} diff --git a/node/src/components/ThemeRegistry/ThemeRegistry.tsx b/node/src/components/ThemeRegistry/ThemeRegistry.tsx index 1c48312..e127dab 100755 --- a/node/src/components/ThemeRegistry/ThemeRegistry.tsx +++ b/node/src/components/ThemeRegistry/ThemeRegistry.tsx @@ -2,15 +2,17 @@ import * as React from 'react'; import { ThemeProvider } from '@mui/material/styles'; +import useMediaQuery from '@mui/material/useMediaQuery'; import CssBaseline from '@mui/material/CssBaseline'; import NextAppDirEmotionCacheProvider from './EmotionCache'; -import theme from './theme'; +import { lightTheme, darkTheme } from './theme'; export default function ThemeRegistry({ children }: { children: React.ReactNode }) { + const prefersDark = useMediaQuery('(prefers-color-scheme: dark)'); + return ( - - {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */} + {children} diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/node/src/app/call/page.tsx b/node/src/app/call/page.tsx new file mode 100644 index 0000000..4075387 --- /dev/null +++ b/node/src/app/call/page.tsx @@ -0,0 +1,128 @@ +'use client' +import { Suspense, useEffect, useRef } from 'react' +import { useSearchParams, useRouter } from 'next/navigation' +import { IconButton, Typography } from '@mui/material' +import { + Mic as MicIcon, + MicOff as MicOffIcon, + Videocam as VideocamIcon, + VideocamOff as VideocamOffIcon, + CallEnd as CallEndIcon, +} from '@mui/icons-material' +import { useWebRTC } from '@/hooks' +import './page.css' + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 +function CallPageInner() { + const searchParams = useSearchParams() + const router = useRouter() + const callId = searchParams.get('callId') ?? '' + const accessKey = searchParams.get('accessKey') ?? '' + + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? '' + const wsUrl = callId && accessKey + ? baseUrl.replace(/^https?:\/\//, 'wss://') + `/api/mobile/${accessKey}/call/${callId}` + : '' + + const { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup } = + useWebRTC({ callId, wsUrl, onHangup: () => {} }) + + const remoteVideoRef = useRef(null) + const localVideoRef = useRef(null) + + useEffect(() => { + if (remoteVideoRef.current && remoteStream) { + remoteVideoRef.current.srcObject = remoteStream + } + }, [remoteStream]) + + useEffect(() => { + if (localVideoRef.current && localStream) { + localVideoRef.current.srcObject = localStream + } + }, [localStream]) + + // 通話終了・失敗時は2秒後に前のページへ戻る + useEffect(() => { + if (callState === 'ended' || callState === 'failed') { + const timer = setTimeout(() => router.back(), 2000) + return () => clearTimeout(timer) + } + }, [callState, router]) + + const statusText: Record = { + connecting: '接続中…', + failed: '接続に失敗しました', + ended: '通話終了', + } + + const isEnded = callState === 'ended' || callState === 'failed' + + return ( +
+ {/* リモート映像(全画面) */} +
+ ) +} + +export default function CallPage() { + return ( + }> + + + ) +} diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100644 new mode 100755 index 50bc743..8d56ba1 --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -28,7 +28,8 @@ - + + (null) const [osDetected, setOsDetected] = useState(false) const [installPrompt, setInstallPrompt] = useState(null) @@ -37,9 +36,15 @@ const browser = getBrowser() setOS(os) setBrowser(browser) + setIosVersion(getIOSVersion()) setOsDetected(true) - setIsStandalone(window.matchMedia('(display-mode: standalone)').matches) + // iOS は display-mode メディアクエリが home screen 起動でも false を返すことがある。 + // iOS の正規シグナルは navigator.standalone なので両方を OR で判定する。 + setIsStandalone( + window.matchMedia('(display-mode: standalone)').matches || + (window.navigator as { standalone?: boolean }).standalone === true, + ) navigator.getInstalledRelatedApps?.().then(apps => { setIsInstalled(apps.length > 0) @@ -102,7 +107,7 @@ const registerMode = isStandalone || (!installPrompt && !isInstalled) ? 'allowed' : installPrompt ? 'install-required' : 'hidden' - const { Subscribe, errorMessage, accessKey, isSubscribed, canSubscribe, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) + const { Subscribe, errorMessage, accessKey, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) @@ -218,7 +223,7 @@ )} - {os === 'iOS' && browser === 'Safari' && !isStandalone && } + {os === 'iOS' && browser === 'Safari' && !isStandalone && = 26 ? '/images/install_for_ios26.svg' : '/images/install_for_ios.png'} />} {os === 'Android' && (isStandalone || isInstalled) && 通知が届かなくなった場合
@@ -231,36 +236,3 @@ ) } - - -const ServiceWorkerStatus: React.FC = () => { - const [registrations, setRegistrations] = useState(['確認中...']); - - useEffect(() => { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.getRegistrations().then(regs => { - if (regs.length === 0) { - setRegistrations(['サービスワーカーは登録されていません。']); - } else { - const swInfo = regs.map((reg, index) => - `(${index + 1}) スコープ: ${reg.scope}, 状態: ${reg.active ? 'アクティブ' : '非アクティブ'}` - ); - setRegistrations(swInfo); - } - }); - } else { - setRegistrations(['このブラウザはサービスワーカーをサポートしていません。']); - } - }, []); - - return ( -
-

Service Workerの状態

-
    - {registrations.map((reg, index) => ( -
  • {reg}
  • - ))} -
-
- ); - }; \ No newline at end of file diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx old mode 100755 new mode 100644 index 540d330..4a8dc66 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -1,5 +1,5 @@ 'use client' -import { useEffect, useMemo, useState, useCallback } from 'react' +import { useEffect, useMemo, useState, useCallback, useRef } from 'react' import webpush from 'web-push' import { Button, FormHelperText, Alert, FormControl, InputLabel, OutlinedInput, InputAdornment, IconButton, Tooltip, ClickAwayListener, Tabs, CircularProgress } from '@mui/material' import { ContentPasteGo as ContentPasteGoIcon } from '@mui/icons-material' @@ -30,9 +30,12 @@ const [isLoading, setIsLoading] = useState(true) const [pushSupported, setPushSupported] = useState(null) const [state, setState] = useState<{status: string, token: string | null}>({ status: 'unknown', token: null }) + // 最後に checkAccessKey へ渡したキー。手入力 blur 時の二重照会 (ペースト → blur 等) を防ぐ。 + const lastCheckedAccessKeyRef = useRef('') // アクセスキーが入力されたらサーバへ問い合わせる const checkAccessKey = useCallback((newAccessKey: string) => { + lastCheckedAccessKeyRef.current = newAccessKey setAccessKey(newAccessKey) setIsLoading(true) setAccessKeyError(null) @@ -83,10 +86,11 @@ console.error('GET /accessKey failed', e) } - // 2. URLハッシュのキーを取得し、即座に消去 + // 2. URLハッシュのキーを取得 (ハッシュは URL に残す。 + // deep link / bookmark / タブ復元で再適用できるようにするため。 + // キー変更をキャンセルした時のみ後段で消去する)。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - if (hashKey) history.replaceState(null, '', location.pathname + location.search) // 3. localStorageからCookieへ移行(CookieもURLハッシュもない場合) let migratedKey: string | null = null @@ -172,7 +176,10 @@ checkAccessKey(hashKey) return } - // キャンセル: 旧キーのまま継続(hashKeyは消去済み、CookieはcookieKeyのまま) + // キャンセル: 旧キーのまま継続(Cookie は cookieKey のまま)。 + // 拒否したキーが URL ハッシュに残ると reload のたびに再プロンプトになるため、 + // このケースだけハッシュを消去する。 + history.replaceState(null, '', location.pathname + location.search) keyChangeCancelled = true } @@ -380,9 +387,21 @@ : undefined } label="アクセスキー" - placeholder="(タップしてペースト)" + placeholder="(タップしてペースト、または入力)" onPaste={e => !isLoading && !isSubscribed && checkAccessKey(e.clipboardData.getData('text'))} - readOnly + onChange={e => { + // 手入力中は値の更新のみ。サーバ照会は blur 時にまとめて行う。 + if (isLoading || isSubscribed) return + setAccessKey(e.target.value) + setAccessKeyError(null) + }} + onBlur={() => { + // 手入力でフォーカスが外れたタイミングで照会。 + // ペースト経路 (onPaste / ペーストボタン) は既に checkAccessKey 済みなので + // lastCheckedAccessKeyRef との比較で二重照会を防ぐ。 + if (isLoading || isSubscribed) return + if (accessKey && accessKey !== lastCheckedAccessKeyRef.current) checkAccessKey(accessKey) + }} disabled={isLoading} inputProps={{ size: 20 }} sx={{fontFamily: 'monospace'}} /> @@ -399,7 +418,8 @@ プッシュ通知にはSafariで開く必要があります } - {pushSupported === false && os !== 'iOS' && このブラウザはプッシュ通知に対応していません。AndroidはChromeでお開きください。} + {pushSupported === false && os === 'Android' && このブラウザはプッシュ通知に対応していません。Chromeでお開きください。} + {pushSupported === false && os !== 'iOS' && os !== 'Android' && このブラウザはプッシュ通知に対応していません。} {registerMode === 'allowed' && os === 'iOS' && browser === 'Safari' && !isStandalone && プッシュ通知にはホーム画面への追加が必要です。画面下部の共有ボタン(□↑)から「ホーム画面に追加」を選んでください} {registerMode === 'allowed' && !(os === 'iOS' && browser === 'Safari' && !isStandalone) && pushSupported !== false && } {registerMode === 'install-required' && プッシュ通知を受け取るにはWebアプリとしてインストールしてください} diff --git a/node/src/components/ThemeRegistry/ThemeRegistry.tsx b/node/src/components/ThemeRegistry/ThemeRegistry.tsx index 1c48312..e127dab 100755 --- a/node/src/components/ThemeRegistry/ThemeRegistry.tsx +++ b/node/src/components/ThemeRegistry/ThemeRegistry.tsx @@ -2,15 +2,17 @@ import * as React from 'react'; import { ThemeProvider } from '@mui/material/styles'; +import useMediaQuery from '@mui/material/useMediaQuery'; import CssBaseline from '@mui/material/CssBaseline'; import NextAppDirEmotionCacheProvider from './EmotionCache'; -import theme from './theme'; +import { lightTheme, darkTheme } from './theme'; export default function ThemeRegistry({ children }: { children: React.ReactNode }) { + const prefersDark = useMediaQuery('(prefers-color-scheme: dark)'); + return ( - - {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */} + {children} diff --git a/node/src/components/ThemeRegistry/theme.ts b/node/src/components/ThemeRegistry/theme.ts index 566a51e..dcca54c 100755 --- a/node/src/components/ThemeRegistry/theme.ts +++ b/node/src/components/ThemeRegistry/theme.ts @@ -7,31 +7,39 @@ display: 'swap', }); -const theme = createTheme({ - palette: { - mode: 'light', - }, - typography: { - fontFamily: roboto.style.fontFamily, - }, - components: { - MuiButton: { - styleOverrides: { - root: { - textTransform: 'none', - }, +const sharedComponents = { + MuiButton: { + styleOverrides: { + root: { + textTransform: 'none' as const, }, }, - MuiAlert: { - styleOverrides: { - root: ({ ownerState }) => ({ - ...(ownerState.severity === 'info' && { - backgroundColor: '#60a5fa', - }), + }, + MuiAlert: { + styleOverrides: { + root: ({ ownerState }: { ownerState: { severity?: string } }) => ({ + ...(ownerState.severity === 'info' && { + backgroundColor: '#60a5fa', }), - }, + }), }, }, +}; + +const sharedTypography = { + fontFamily: roboto.style.fontFamily, +}; + +export const lightTheme = createTheme({ + palette: { mode: 'light' }, + typography: sharedTypography, + components: sharedComponents, }); -export default theme; \ No newline at end of file +export const darkTheme = createTheme({ + palette: { mode: 'dark' }, + typography: sharedTypography, + components: sharedComponents, +}); + +export default lightTheme; \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/node/src/app/call/page.tsx b/node/src/app/call/page.tsx new file mode 100644 index 0000000..4075387 --- /dev/null +++ b/node/src/app/call/page.tsx @@ -0,0 +1,128 @@ +'use client' +import { Suspense, useEffect, useRef } from 'react' +import { useSearchParams, useRouter } from 'next/navigation' +import { IconButton, Typography } from '@mui/material' +import { + Mic as MicIcon, + MicOff as MicOffIcon, + Videocam as VideocamIcon, + VideocamOff as VideocamOffIcon, + CallEnd as CallEndIcon, +} from '@mui/icons-material' +import { useWebRTC } from '@/hooks' +import './page.css' + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 +function CallPageInner() { + const searchParams = useSearchParams() + const router = useRouter() + const callId = searchParams.get('callId') ?? '' + const accessKey = searchParams.get('accessKey') ?? '' + + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? '' + const wsUrl = callId && accessKey + ? baseUrl.replace(/^https?:\/\//, 'wss://') + `/api/mobile/${accessKey}/call/${callId}` + : '' + + const { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup } = + useWebRTC({ callId, wsUrl, onHangup: () => {} }) + + const remoteVideoRef = useRef(null) + const localVideoRef = useRef(null) + + useEffect(() => { + if (remoteVideoRef.current && remoteStream) { + remoteVideoRef.current.srcObject = remoteStream + } + }, [remoteStream]) + + useEffect(() => { + if (localVideoRef.current && localStream) { + localVideoRef.current.srcObject = localStream + } + }, [localStream]) + + // 通話終了・失敗時は2秒後に前のページへ戻る + useEffect(() => { + if (callState === 'ended' || callState === 'failed') { + const timer = setTimeout(() => router.back(), 2000) + return () => clearTimeout(timer) + } + }, [callState, router]) + + const statusText: Record = { + connecting: '接続中…', + failed: '接続に失敗しました', + ended: '通話終了', + } + + const isEnded = callState === 'ended' || callState === 'failed' + + return ( +
+ {/* リモート映像(全画面) */} +
+ ) +} + +export default function CallPage() { + return ( + }> + + + ) +} diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100644 new mode 100755 index 50bc743..8d56ba1 --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -28,7 +28,8 @@ - + + (null) const [osDetected, setOsDetected] = useState(false) const [installPrompt, setInstallPrompt] = useState(null) @@ -37,9 +36,15 @@ const browser = getBrowser() setOS(os) setBrowser(browser) + setIosVersion(getIOSVersion()) setOsDetected(true) - setIsStandalone(window.matchMedia('(display-mode: standalone)').matches) + // iOS は display-mode メディアクエリが home screen 起動でも false を返すことがある。 + // iOS の正規シグナルは navigator.standalone なので両方を OR で判定する。 + setIsStandalone( + window.matchMedia('(display-mode: standalone)').matches || + (window.navigator as { standalone?: boolean }).standalone === true, + ) navigator.getInstalledRelatedApps?.().then(apps => { setIsInstalled(apps.length > 0) @@ -102,7 +107,7 @@ const registerMode = isStandalone || (!installPrompt && !isInstalled) ? 'allowed' : installPrompt ? 'install-required' : 'hidden' - const { Subscribe, errorMessage, accessKey, isSubscribed, canSubscribe, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) + const { Subscribe, errorMessage, accessKey, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) @@ -218,7 +223,7 @@ )} - {os === 'iOS' && browser === 'Safari' && !isStandalone && } + {os === 'iOS' && browser === 'Safari' && !isStandalone && = 26 ? '/images/install_for_ios26.svg' : '/images/install_for_ios.png'} />} {os === 'Android' && (isStandalone || isInstalled) && 通知が届かなくなった場合
@@ -231,36 +236,3 @@ ) } - - -const ServiceWorkerStatus: React.FC = () => { - const [registrations, setRegistrations] = useState(['確認中...']); - - useEffect(() => { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.getRegistrations().then(regs => { - if (regs.length === 0) { - setRegistrations(['サービスワーカーは登録されていません。']); - } else { - const swInfo = regs.map((reg, index) => - `(${index + 1}) スコープ: ${reg.scope}, 状態: ${reg.active ? 'アクティブ' : '非アクティブ'}` - ); - setRegistrations(swInfo); - } - }); - } else { - setRegistrations(['このブラウザはサービスワーカーをサポートしていません。']); - } - }, []); - - return ( -
-

Service Workerの状態

-
    - {registrations.map((reg, index) => ( -
  • {reg}
  • - ))} -
-
- ); - }; \ No newline at end of file diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx old mode 100755 new mode 100644 index 540d330..4a8dc66 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -1,5 +1,5 @@ 'use client' -import { useEffect, useMemo, useState, useCallback } from 'react' +import { useEffect, useMemo, useState, useCallback, useRef } from 'react' import webpush from 'web-push' import { Button, FormHelperText, Alert, FormControl, InputLabel, OutlinedInput, InputAdornment, IconButton, Tooltip, ClickAwayListener, Tabs, CircularProgress } from '@mui/material' import { ContentPasteGo as ContentPasteGoIcon } from '@mui/icons-material' @@ -30,9 +30,12 @@ const [isLoading, setIsLoading] = useState(true) const [pushSupported, setPushSupported] = useState(null) const [state, setState] = useState<{status: string, token: string | null}>({ status: 'unknown', token: null }) + // 最後に checkAccessKey へ渡したキー。手入力 blur 時の二重照会 (ペースト → blur 等) を防ぐ。 + const lastCheckedAccessKeyRef = useRef('') // アクセスキーが入力されたらサーバへ問い合わせる const checkAccessKey = useCallback((newAccessKey: string) => { + lastCheckedAccessKeyRef.current = newAccessKey setAccessKey(newAccessKey) setIsLoading(true) setAccessKeyError(null) @@ -83,10 +86,11 @@ console.error('GET /accessKey failed', e) } - // 2. URLハッシュのキーを取得し、即座に消去 + // 2. URLハッシュのキーを取得 (ハッシュは URL に残す。 + // deep link / bookmark / タブ復元で再適用できるようにするため。 + // キー変更をキャンセルした時のみ後段で消去する)。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - if (hashKey) history.replaceState(null, '', location.pathname + location.search) // 3. localStorageからCookieへ移行(CookieもURLハッシュもない場合) let migratedKey: string | null = null @@ -172,7 +176,10 @@ checkAccessKey(hashKey) return } - // キャンセル: 旧キーのまま継続(hashKeyは消去済み、CookieはcookieKeyのまま) + // キャンセル: 旧キーのまま継続(Cookie は cookieKey のまま)。 + // 拒否したキーが URL ハッシュに残ると reload のたびに再プロンプトになるため、 + // このケースだけハッシュを消去する。 + history.replaceState(null, '', location.pathname + location.search) keyChangeCancelled = true } @@ -380,9 +387,21 @@ : undefined } label="アクセスキー" - placeholder="(タップしてペースト)" + placeholder="(タップしてペースト、または入力)" onPaste={e => !isLoading && !isSubscribed && checkAccessKey(e.clipboardData.getData('text'))} - readOnly + onChange={e => { + // 手入力中は値の更新のみ。サーバ照会は blur 時にまとめて行う。 + if (isLoading || isSubscribed) return + setAccessKey(e.target.value) + setAccessKeyError(null) + }} + onBlur={() => { + // 手入力でフォーカスが外れたタイミングで照会。 + // ペースト経路 (onPaste / ペーストボタン) は既に checkAccessKey 済みなので + // lastCheckedAccessKeyRef との比較で二重照会を防ぐ。 + if (isLoading || isSubscribed) return + if (accessKey && accessKey !== lastCheckedAccessKeyRef.current) checkAccessKey(accessKey) + }} disabled={isLoading} inputProps={{ size: 20 }} sx={{fontFamily: 'monospace'}} /> @@ -399,7 +418,8 @@ プッシュ通知にはSafariで開く必要があります } - {pushSupported === false && os !== 'iOS' && このブラウザはプッシュ通知に対応していません。AndroidはChromeでお開きください。} + {pushSupported === false && os === 'Android' && このブラウザはプッシュ通知に対応していません。Chromeでお開きください。} + {pushSupported === false && os !== 'iOS' && os !== 'Android' && このブラウザはプッシュ通知に対応していません。} {registerMode === 'allowed' && os === 'iOS' && browser === 'Safari' && !isStandalone && プッシュ通知にはホーム画面への追加が必要です。画面下部の共有ボタン(□↑)から「ホーム画面に追加」を選んでください} {registerMode === 'allowed' && !(os === 'iOS' && browser === 'Safari' && !isStandalone) && pushSupported !== false && } {registerMode === 'install-required' && プッシュ通知を受け取るにはWebアプリとしてインストールしてください} diff --git a/node/src/components/ThemeRegistry/ThemeRegistry.tsx b/node/src/components/ThemeRegistry/ThemeRegistry.tsx index 1c48312..e127dab 100755 --- a/node/src/components/ThemeRegistry/ThemeRegistry.tsx +++ b/node/src/components/ThemeRegistry/ThemeRegistry.tsx @@ -2,15 +2,17 @@ import * as React from 'react'; import { ThemeProvider } from '@mui/material/styles'; +import useMediaQuery from '@mui/material/useMediaQuery'; import CssBaseline from '@mui/material/CssBaseline'; import NextAppDirEmotionCacheProvider from './EmotionCache'; -import theme from './theme'; +import { lightTheme, darkTheme } from './theme'; export default function ThemeRegistry({ children }: { children: React.ReactNode }) { + const prefersDark = useMediaQuery('(prefers-color-scheme: dark)'); + return ( - - {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */} + {children} diff --git a/node/src/components/ThemeRegistry/theme.ts b/node/src/components/ThemeRegistry/theme.ts index 566a51e..dcca54c 100755 --- a/node/src/components/ThemeRegistry/theme.ts +++ b/node/src/components/ThemeRegistry/theme.ts @@ -7,31 +7,39 @@ display: 'swap', }); -const theme = createTheme({ - palette: { - mode: 'light', - }, - typography: { - fontFamily: roboto.style.fontFamily, - }, - components: { - MuiButton: { - styleOverrides: { - root: { - textTransform: 'none', - }, +const sharedComponents = { + MuiButton: { + styleOverrides: { + root: { + textTransform: 'none' as const, }, }, - MuiAlert: { - styleOverrides: { - root: ({ ownerState }) => ({ - ...(ownerState.severity === 'info' && { - backgroundColor: '#60a5fa', - }), + }, + MuiAlert: { + styleOverrides: { + root: ({ ownerState }: { ownerState: { severity?: string } }) => ({ + ...(ownerState.severity === 'info' && { + backgroundColor: '#60a5fa', }), - }, + }), }, }, +}; + +const sharedTypography = { + fontFamily: roboto.style.fontFamily, +}; + +export const lightTheme = createTheme({ + palette: { mode: 'light' }, + typography: sharedTypography, + components: sharedComponents, }); -export default theme; \ No newline at end of file +export const darkTheme = createTheme({ + palette: { mode: 'dark' }, + typography: sharedTypography, + components: sharedComponents, +}); + +export default lightTheme; \ No newline at end of file diff --git a/node/src/hooks/useWebRTC.tsx b/node/src/hooks/useWebRTC.tsx index ba8a142..13c708a 100755 --- a/node/src/hooks/useWebRTC.tsx +++ b/node/src/hooks/useWebRTC.tsx @@ -1,105 +1,207 @@ // useWebRTC.ts import { useState, useEffect, useRef, useCallback } from 'react' -interface useWebRTCReturn { - pc: RTCPeerConnection | null - localStream: MediaStream | null - ws: WebSocket | null - setURL: (wsUrl: string) => () => void +export type CallState = 'idle' | 'connecting' | 'connected' | 'failed' | 'ended' + +interface UseWebRTCOptions { + callId: string + wsUrl: string + onHangup?: () => void } -export function useWebRTC(): useWebRTCReturn { - const [pc, setPc] = useState(null) - const [localStream, setLocalStream] = useState(null) - const [ws, setWs] = useState(null) - const iceServers: RTCIceServer[] = [ - { urls: "stun:stun.l.google.com:19302" }, - { urls: "stun:stun1.l.google.com:19302" }, - { urls: "stun:stun2.l.google.com:19302" }, - { urls: "stun:stun3.l.google.com:19302" }, - { urls: "stun:stun4.l.google.com:19302" } - ] - // ICE候補を格納する配列(シグナリング送信用) - const iceCandidatesRef = useRef([]) +interface UseWebRTCReturn { + callState: CallState + localStream: MediaStream | null + remoteStream: MediaStream | null + isMuted: boolean + isCameraOff: boolean + toggleMute: () => void + toggleCamera: () => void + hangup: () => void + errorMessage: string | null +} - // WebSocket初期化 - const setURL = useCallback((wsUrl: string) => { - const socket = new WebSocket(wsUrl) - socket.onopen = () => { - console.log("WebSocket connected") - // WebSocket接続後にWebRTCの初期化を開始 - initWebRTC(socket) - } - socket.onmessage = (event: MessageEvent) => { - console.log("WebSocket message received:", event.data) - // ここでリモートからのシグナリング(アンサーやICE候補)を処理する - } - socket.onerror = (err) => { - console.error("WebSocket error:", err) - } - socket.onclose = () => { - console.log("WebSocket closed") - } - setWs(socket) - // クリーンアップ - return () => { - socket.close() - pc?.close() - } - // eslint-disable-next-line react-hooks/exhaustive-deps +const ICE_SERVERS: RTCIceServer[] = [ + { urls: 'stun:stun.l.google.com:19302' }, + { urls: 'stun:stun1.l.google.com:19302' }, + { urls: 'stun:stun2.l.google.com:19302' }, + { urls: 'stun:stun3.l.google.com:19302' }, + { urls: 'stun:stun4.l.google.com:19302' }, +] + +export function useWebRTC({ callId, wsUrl, onHangup }: UseWebRTCOptions): UseWebRTCReturn { + const [callState, setCallState] = useState('idle') + const [localStream, setLocalStream] = useState(null) + const [remoteStream, setRemoteStream] = useState(null) + const [isMuted, setIsMuted] = useState(false) + const [isCameraOff, setIsCameraOff] = useState(false) + const [errorMessage, setErrorMessage] = useState(null) + + // useRef でPCとWSを保持(非同期ハンドラ内でも最新値を参照できる) + const pcRef = useRef(null) + const wsRef = useRef(null) + const localStreamRef = useRef(null) + // remoteDescriptionが設定される前に届いたICE候補をバッファリング + const pendingCandidatesRef = useRef([]) + const callStateRef = useRef('idle') + + const updateCallState = useCallback((state: CallState) => { + callStateRef.current = state + setCallState(state) }, []) - // WebRTC初期化関数 - const initWebRTC = useCallback((socket: WebSocket) => { - // ユーザーに映像・音声の許可をリクエスト - navigator.mediaDevices.getUserMedia({ video: true, audio: true }) - .then(stream => { - setLocalStream(stream) - const connection = new RTCPeerConnection({ iceServers }) - // ローカルストリームの各トラックを追加 - stream.getTracks().forEach(track => connection.addTrack(track, stream)) - // ダミーデータチャネルを作成してICE候補収集を促進 - connection.createDataChannel("dummy") - // ICE候補イベントのハンドラ - connection.onicecandidate = (event) => { - console.log("ICE candidate event:", event) - if (event.candidate) { - iceCandidatesRef.current.push(event.candidate.toJSON()) - // 候補が見つかるたびに送信する(例:ここで個別送信) - socket.send(JSON.stringify({ - type: "ice", - candidate: event.candidate.toJSON() - })) - } else { - // ICE候補の収集が完了(candidateがnull) - const signalingMessage = { - type: "offer", - sdp: connection.localDescription ? connection.localDescription.sdp : null, - iceCandidates: iceCandidatesRef.current - } - console.log("Signaling JSON message:", JSON.stringify(signalingMessage, null, 2)) - socket.send(JSON.stringify(signalingMessage)) - } - } - connection.onicegatheringstatechange = () => { - console.log("ICE gathering state:", connection.iceGatheringState) - } - // SDPオファー生成とローカル記述の設定 - connection.createOffer() - .then(offer => { - console.log("Created SDP offer:", offer) - return connection.setLocalDescription(offer) - }) - .then(() => { - // setLocalDescription()実行後、ICE候補収集が開始される - setPc(connection) - }) - .catch(err => console.error("Error during SDP offer creation:", err)) - }) - .catch(err => { - console.error("Error getting user media:", err) - }) - }, [iceServers]) + const cleanup = useCallback(() => { + localStreamRef.current?.getTracks().forEach(track => track.stop()) + localStreamRef.current = null + setLocalStream(null) + if (pcRef.current) { + pcRef.current.close() + pcRef.current = null + } + if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) { + wsRef.current.close() + } + wsRef.current = null + pendingCandidatesRef.current = [] + }, []) - return { pc, localStream, ws, setURL } + useEffect(() => { + if (!callId || !wsUrl) return + + updateCallState('idle') + const socket = new WebSocket(wsUrl) + wsRef.current = socket + + socket.onopen = () => { + console.log('WebSocket connected') + navigator.mediaDevices.getUserMedia({ video: true, audio: true }) + .then(stream => { + localStreamRef.current = stream + setLocalStream(stream) + + const pc = new RTCPeerConnection({ iceServers: ICE_SERVERS }) + pcRef.current = pc + + stream.getTracks().forEach(track => pc.addTrack(track, stream)) + + pc.ontrack = (event) => { + if (event.streams?.[0]) setRemoteStream(event.streams[0]) + } + + pc.oniceconnectionstatechange = () => { + console.log('ICE connection state:', pc.iceConnectionState) + if (pc.iceConnectionState === 'connected' || pc.iceConnectionState === 'completed') { + updateCallState('connected') + } else if (pc.iceConnectionState === 'failed' || pc.iceConnectionState === 'disconnected') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + // Trickle ICE: 候補が見つかる都度送信 + pc.onicecandidate = (event) => { + if (socket.readyState !== WebSocket.OPEN) return + socket.send(JSON.stringify({ + type: 'ice', + callId, + candidate: event.candidate ? event.candidate.toJSON() : null, + })) + } + + pc.createOffer() + .then(offer => pc.setLocalDescription(offer)) + .then(() => { + if (socket.readyState !== WebSocket.OPEN || !pc.localDescription) return + socket.send(JSON.stringify({ type: 'offer', callId, sdp: pc.localDescription.sdp })) + updateCallState('connecting') + }) + .catch(err => { + console.error('SDP offer error:', err) + updateCallState('failed') + setErrorMessage('接続の開始に失敗しました') + }) + }) + .catch(err => { + console.error('getUserMedia error:', err) + updateCallState('failed') + setErrorMessage('カメラ・マイクへのアクセスが拒否されました') + }) + } + + socket.onmessage = async (event: MessageEvent) => { + let msg: { type: string; sdp?: string; candidate?: RTCIceCandidateInit | null; message?: string } + try { msg = JSON.parse(event.data) } catch { return } + console.log('WebSocket message:', msg.type) + + const pc = pcRef.current + switch (msg.type) { + case 'answer': + if (!pc || !msg.sdp) break + await pc.setRemoteDescription({ type: 'answer', sdp: msg.sdp }).catch(console.error) + for (const c of pendingCandidatesRef.current) { + await pc.addIceCandidate(c).catch(console.error) + } + pendingCandidatesRef.current = [] + break + case 'ice': + if (!pc || msg.candidate == null) break + if (pc.remoteDescription) { + await pc.addIceCandidate(msg.candidate).catch(console.error) + } else { + pendingCandidatesRef.current.push(msg.candidate) + } + break + case 'hangup': + cleanup() + updateCallState('ended') + onHangup?.() + break + case 'error': + updateCallState('failed') + setErrorMessage(msg.message ?? '接続エラーが発生しました') + break + } + } + + socket.onerror = () => { + if (callStateRef.current !== 'ended') { + updateCallState('failed') + setErrorMessage('通信エラーが発生しました') + } + } + + socket.onclose = () => { + if (callStateRef.current !== 'ended' && callStateRef.current !== 'failed') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + return () => { cleanup() } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [wsUrl, callId]) + + const hangup = useCallback(() => { + if (wsRef.current?.readyState === WebSocket.OPEN) { + wsRef.current.send(JSON.stringify({ type: 'hangup', callId })) + } + cleanup() + updateCallState('ended') + }, [callId, cleanup, updateCallState]) + + const toggleMute = useCallback(() => { + const track = localStreamRef.current?.getAudioTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsMuted(!track.enabled) + }, []) + + const toggleCamera = useCallback(() => { + const track = localStreamRef.current?.getVideoTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsCameraOff(!track.enabled) + }, []) + + return { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup, errorMessage } } diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/node/src/app/call/page.tsx b/node/src/app/call/page.tsx new file mode 100644 index 0000000..4075387 --- /dev/null +++ b/node/src/app/call/page.tsx @@ -0,0 +1,128 @@ +'use client' +import { Suspense, useEffect, useRef } from 'react' +import { useSearchParams, useRouter } from 'next/navigation' +import { IconButton, Typography } from '@mui/material' +import { + Mic as MicIcon, + MicOff as MicOffIcon, + Videocam as VideocamIcon, + VideocamOff as VideocamOffIcon, + CallEnd as CallEndIcon, +} from '@mui/icons-material' +import { useWebRTC } from '@/hooks' +import './page.css' + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 +function CallPageInner() { + const searchParams = useSearchParams() + const router = useRouter() + const callId = searchParams.get('callId') ?? '' + const accessKey = searchParams.get('accessKey') ?? '' + + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? '' + const wsUrl = callId && accessKey + ? baseUrl.replace(/^https?:\/\//, 'wss://') + `/api/mobile/${accessKey}/call/${callId}` + : '' + + const { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup } = + useWebRTC({ callId, wsUrl, onHangup: () => {} }) + + const remoteVideoRef = useRef(null) + const localVideoRef = useRef(null) + + useEffect(() => { + if (remoteVideoRef.current && remoteStream) { + remoteVideoRef.current.srcObject = remoteStream + } + }, [remoteStream]) + + useEffect(() => { + if (localVideoRef.current && localStream) { + localVideoRef.current.srcObject = localStream + } + }, [localStream]) + + // 通話終了・失敗時は2秒後に前のページへ戻る + useEffect(() => { + if (callState === 'ended' || callState === 'failed') { + const timer = setTimeout(() => router.back(), 2000) + return () => clearTimeout(timer) + } + }, [callState, router]) + + const statusText: Record = { + connecting: '接続中…', + failed: '接続に失敗しました', + ended: '通話終了', + } + + const isEnded = callState === 'ended' || callState === 'failed' + + return ( +
+ {/* リモート映像(全画面) */} +
+ ) +} + +export default function CallPage() { + return ( + }> + + + ) +} diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100644 new mode 100755 index 50bc743..8d56ba1 --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -28,7 +28,8 @@ - + + (null) const [osDetected, setOsDetected] = useState(false) const [installPrompt, setInstallPrompt] = useState(null) @@ -37,9 +36,15 @@ const browser = getBrowser() setOS(os) setBrowser(browser) + setIosVersion(getIOSVersion()) setOsDetected(true) - setIsStandalone(window.matchMedia('(display-mode: standalone)').matches) + // iOS は display-mode メディアクエリが home screen 起動でも false を返すことがある。 + // iOS の正規シグナルは navigator.standalone なので両方を OR で判定する。 + setIsStandalone( + window.matchMedia('(display-mode: standalone)').matches || + (window.navigator as { standalone?: boolean }).standalone === true, + ) navigator.getInstalledRelatedApps?.().then(apps => { setIsInstalled(apps.length > 0) @@ -102,7 +107,7 @@ const registerMode = isStandalone || (!installPrompt && !isInstalled) ? 'allowed' : installPrompt ? 'install-required' : 'hidden' - const { Subscribe, errorMessage, accessKey, isSubscribed, canSubscribe, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) + const { Subscribe, errorMessage, accessKey, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) @@ -218,7 +223,7 @@ )} - {os === 'iOS' && browser === 'Safari' && !isStandalone && } + {os === 'iOS' && browser === 'Safari' && !isStandalone && = 26 ? '/images/install_for_ios26.svg' : '/images/install_for_ios.png'} />} {os === 'Android' && (isStandalone || isInstalled) && 通知が届かなくなった場合
@@ -231,36 +236,3 @@ ) } - - -const ServiceWorkerStatus: React.FC = () => { - const [registrations, setRegistrations] = useState(['確認中...']); - - useEffect(() => { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.getRegistrations().then(regs => { - if (regs.length === 0) { - setRegistrations(['サービスワーカーは登録されていません。']); - } else { - const swInfo = regs.map((reg, index) => - `(${index + 1}) スコープ: ${reg.scope}, 状態: ${reg.active ? 'アクティブ' : '非アクティブ'}` - ); - setRegistrations(swInfo); - } - }); - } else { - setRegistrations(['このブラウザはサービスワーカーをサポートしていません。']); - } - }, []); - - return ( -
-

Service Workerの状態

-
    - {registrations.map((reg, index) => ( -
  • {reg}
  • - ))} -
-
- ); - }; \ No newline at end of file diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx old mode 100755 new mode 100644 index 540d330..4a8dc66 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -1,5 +1,5 @@ 'use client' -import { useEffect, useMemo, useState, useCallback } from 'react' +import { useEffect, useMemo, useState, useCallback, useRef } from 'react' import webpush from 'web-push' import { Button, FormHelperText, Alert, FormControl, InputLabel, OutlinedInput, InputAdornment, IconButton, Tooltip, ClickAwayListener, Tabs, CircularProgress } from '@mui/material' import { ContentPasteGo as ContentPasteGoIcon } from '@mui/icons-material' @@ -30,9 +30,12 @@ const [isLoading, setIsLoading] = useState(true) const [pushSupported, setPushSupported] = useState(null) const [state, setState] = useState<{status: string, token: string | null}>({ status: 'unknown', token: null }) + // 最後に checkAccessKey へ渡したキー。手入力 blur 時の二重照会 (ペースト → blur 等) を防ぐ。 + const lastCheckedAccessKeyRef = useRef('') // アクセスキーが入力されたらサーバへ問い合わせる const checkAccessKey = useCallback((newAccessKey: string) => { + lastCheckedAccessKeyRef.current = newAccessKey setAccessKey(newAccessKey) setIsLoading(true) setAccessKeyError(null) @@ -83,10 +86,11 @@ console.error('GET /accessKey failed', e) } - // 2. URLハッシュのキーを取得し、即座に消去 + // 2. URLハッシュのキーを取得 (ハッシュは URL に残す。 + // deep link / bookmark / タブ復元で再適用できるようにするため。 + // キー変更をキャンセルした時のみ後段で消去する)。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - if (hashKey) history.replaceState(null, '', location.pathname + location.search) // 3. localStorageからCookieへ移行(CookieもURLハッシュもない場合) let migratedKey: string | null = null @@ -172,7 +176,10 @@ checkAccessKey(hashKey) return } - // キャンセル: 旧キーのまま継続(hashKeyは消去済み、CookieはcookieKeyのまま) + // キャンセル: 旧キーのまま継続(Cookie は cookieKey のまま)。 + // 拒否したキーが URL ハッシュに残ると reload のたびに再プロンプトになるため、 + // このケースだけハッシュを消去する。 + history.replaceState(null, '', location.pathname + location.search) keyChangeCancelled = true } @@ -380,9 +387,21 @@ : undefined } label="アクセスキー" - placeholder="(タップしてペースト)" + placeholder="(タップしてペースト、または入力)" onPaste={e => !isLoading && !isSubscribed && checkAccessKey(e.clipboardData.getData('text'))} - readOnly + onChange={e => { + // 手入力中は値の更新のみ。サーバ照会は blur 時にまとめて行う。 + if (isLoading || isSubscribed) return + setAccessKey(e.target.value) + setAccessKeyError(null) + }} + onBlur={() => { + // 手入力でフォーカスが外れたタイミングで照会。 + // ペースト経路 (onPaste / ペーストボタン) は既に checkAccessKey 済みなので + // lastCheckedAccessKeyRef との比較で二重照会を防ぐ。 + if (isLoading || isSubscribed) return + if (accessKey && accessKey !== lastCheckedAccessKeyRef.current) checkAccessKey(accessKey) + }} disabled={isLoading} inputProps={{ size: 20 }} sx={{fontFamily: 'monospace'}} /> @@ -399,7 +418,8 @@ プッシュ通知にはSafariで開く必要があります } - {pushSupported === false && os !== 'iOS' && このブラウザはプッシュ通知に対応していません。AndroidはChromeでお開きください。} + {pushSupported === false && os === 'Android' && このブラウザはプッシュ通知に対応していません。Chromeでお開きください。} + {pushSupported === false && os !== 'iOS' && os !== 'Android' && このブラウザはプッシュ通知に対応していません。} {registerMode === 'allowed' && os === 'iOS' && browser === 'Safari' && !isStandalone && プッシュ通知にはホーム画面への追加が必要です。画面下部の共有ボタン(□↑)から「ホーム画面に追加」を選んでください} {registerMode === 'allowed' && !(os === 'iOS' && browser === 'Safari' && !isStandalone) && pushSupported !== false && } {registerMode === 'install-required' && プッシュ通知を受け取るにはWebアプリとしてインストールしてください} diff --git a/node/src/components/ThemeRegistry/ThemeRegistry.tsx b/node/src/components/ThemeRegistry/ThemeRegistry.tsx index 1c48312..e127dab 100755 --- a/node/src/components/ThemeRegistry/ThemeRegistry.tsx +++ b/node/src/components/ThemeRegistry/ThemeRegistry.tsx @@ -2,15 +2,17 @@ import * as React from 'react'; import { ThemeProvider } from '@mui/material/styles'; +import useMediaQuery from '@mui/material/useMediaQuery'; import CssBaseline from '@mui/material/CssBaseline'; import NextAppDirEmotionCacheProvider from './EmotionCache'; -import theme from './theme'; +import { lightTheme, darkTheme } from './theme'; export default function ThemeRegistry({ children }: { children: React.ReactNode }) { + const prefersDark = useMediaQuery('(prefers-color-scheme: dark)'); + return ( - - {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */} + {children} diff --git a/node/src/components/ThemeRegistry/theme.ts b/node/src/components/ThemeRegistry/theme.ts index 566a51e..dcca54c 100755 --- a/node/src/components/ThemeRegistry/theme.ts +++ b/node/src/components/ThemeRegistry/theme.ts @@ -7,31 +7,39 @@ display: 'swap', }); -const theme = createTheme({ - palette: { - mode: 'light', - }, - typography: { - fontFamily: roboto.style.fontFamily, - }, - components: { - MuiButton: { - styleOverrides: { - root: { - textTransform: 'none', - }, +const sharedComponents = { + MuiButton: { + styleOverrides: { + root: { + textTransform: 'none' as const, }, }, - MuiAlert: { - styleOverrides: { - root: ({ ownerState }) => ({ - ...(ownerState.severity === 'info' && { - backgroundColor: '#60a5fa', - }), + }, + MuiAlert: { + styleOverrides: { + root: ({ ownerState }: { ownerState: { severity?: string } }) => ({ + ...(ownerState.severity === 'info' && { + backgroundColor: '#60a5fa', }), - }, + }), }, }, +}; + +const sharedTypography = { + fontFamily: roboto.style.fontFamily, +}; + +export const lightTheme = createTheme({ + palette: { mode: 'light' }, + typography: sharedTypography, + components: sharedComponents, }); -export default theme; \ No newline at end of file +export const darkTheme = createTheme({ + palette: { mode: 'dark' }, + typography: sharedTypography, + components: sharedComponents, +}); + +export default lightTheme; \ No newline at end of file diff --git a/node/src/hooks/useWebRTC.tsx b/node/src/hooks/useWebRTC.tsx index ba8a142..13c708a 100755 --- a/node/src/hooks/useWebRTC.tsx +++ b/node/src/hooks/useWebRTC.tsx @@ -1,105 +1,207 @@ // useWebRTC.ts import { useState, useEffect, useRef, useCallback } from 'react' -interface useWebRTCReturn { - pc: RTCPeerConnection | null - localStream: MediaStream | null - ws: WebSocket | null - setURL: (wsUrl: string) => () => void +export type CallState = 'idle' | 'connecting' | 'connected' | 'failed' | 'ended' + +interface UseWebRTCOptions { + callId: string + wsUrl: string + onHangup?: () => void } -export function useWebRTC(): useWebRTCReturn { - const [pc, setPc] = useState(null) - const [localStream, setLocalStream] = useState(null) - const [ws, setWs] = useState(null) - const iceServers: RTCIceServer[] = [ - { urls: "stun:stun.l.google.com:19302" }, - { urls: "stun:stun1.l.google.com:19302" }, - { urls: "stun:stun2.l.google.com:19302" }, - { urls: "stun:stun3.l.google.com:19302" }, - { urls: "stun:stun4.l.google.com:19302" } - ] - // ICE候補を格納する配列(シグナリング送信用) - const iceCandidatesRef = useRef([]) +interface UseWebRTCReturn { + callState: CallState + localStream: MediaStream | null + remoteStream: MediaStream | null + isMuted: boolean + isCameraOff: boolean + toggleMute: () => void + toggleCamera: () => void + hangup: () => void + errorMessage: string | null +} - // WebSocket初期化 - const setURL = useCallback((wsUrl: string) => { - const socket = new WebSocket(wsUrl) - socket.onopen = () => { - console.log("WebSocket connected") - // WebSocket接続後にWebRTCの初期化を開始 - initWebRTC(socket) - } - socket.onmessage = (event: MessageEvent) => { - console.log("WebSocket message received:", event.data) - // ここでリモートからのシグナリング(アンサーやICE候補)を処理する - } - socket.onerror = (err) => { - console.error("WebSocket error:", err) - } - socket.onclose = () => { - console.log("WebSocket closed") - } - setWs(socket) - // クリーンアップ - return () => { - socket.close() - pc?.close() - } - // eslint-disable-next-line react-hooks/exhaustive-deps +const ICE_SERVERS: RTCIceServer[] = [ + { urls: 'stun:stun.l.google.com:19302' }, + { urls: 'stun:stun1.l.google.com:19302' }, + { urls: 'stun:stun2.l.google.com:19302' }, + { urls: 'stun:stun3.l.google.com:19302' }, + { urls: 'stun:stun4.l.google.com:19302' }, +] + +export function useWebRTC({ callId, wsUrl, onHangup }: UseWebRTCOptions): UseWebRTCReturn { + const [callState, setCallState] = useState('idle') + const [localStream, setLocalStream] = useState(null) + const [remoteStream, setRemoteStream] = useState(null) + const [isMuted, setIsMuted] = useState(false) + const [isCameraOff, setIsCameraOff] = useState(false) + const [errorMessage, setErrorMessage] = useState(null) + + // useRef でPCとWSを保持(非同期ハンドラ内でも最新値を参照できる) + const pcRef = useRef(null) + const wsRef = useRef(null) + const localStreamRef = useRef(null) + // remoteDescriptionが設定される前に届いたICE候補をバッファリング + const pendingCandidatesRef = useRef([]) + const callStateRef = useRef('idle') + + const updateCallState = useCallback((state: CallState) => { + callStateRef.current = state + setCallState(state) }, []) - // WebRTC初期化関数 - const initWebRTC = useCallback((socket: WebSocket) => { - // ユーザーに映像・音声の許可をリクエスト - navigator.mediaDevices.getUserMedia({ video: true, audio: true }) - .then(stream => { - setLocalStream(stream) - const connection = new RTCPeerConnection({ iceServers }) - // ローカルストリームの各トラックを追加 - stream.getTracks().forEach(track => connection.addTrack(track, stream)) - // ダミーデータチャネルを作成してICE候補収集を促進 - connection.createDataChannel("dummy") - // ICE候補イベントのハンドラ - connection.onicecandidate = (event) => { - console.log("ICE candidate event:", event) - if (event.candidate) { - iceCandidatesRef.current.push(event.candidate.toJSON()) - // 候補が見つかるたびに送信する(例:ここで個別送信) - socket.send(JSON.stringify({ - type: "ice", - candidate: event.candidate.toJSON() - })) - } else { - // ICE候補の収集が完了(candidateがnull) - const signalingMessage = { - type: "offer", - sdp: connection.localDescription ? connection.localDescription.sdp : null, - iceCandidates: iceCandidatesRef.current - } - console.log("Signaling JSON message:", JSON.stringify(signalingMessage, null, 2)) - socket.send(JSON.stringify(signalingMessage)) - } - } - connection.onicegatheringstatechange = () => { - console.log("ICE gathering state:", connection.iceGatheringState) - } - // SDPオファー生成とローカル記述の設定 - connection.createOffer() - .then(offer => { - console.log("Created SDP offer:", offer) - return connection.setLocalDescription(offer) - }) - .then(() => { - // setLocalDescription()実行後、ICE候補収集が開始される - setPc(connection) - }) - .catch(err => console.error("Error during SDP offer creation:", err)) - }) - .catch(err => { - console.error("Error getting user media:", err) - }) - }, [iceServers]) + const cleanup = useCallback(() => { + localStreamRef.current?.getTracks().forEach(track => track.stop()) + localStreamRef.current = null + setLocalStream(null) + if (pcRef.current) { + pcRef.current.close() + pcRef.current = null + } + if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) { + wsRef.current.close() + } + wsRef.current = null + pendingCandidatesRef.current = [] + }, []) - return { pc, localStream, ws, setURL } + useEffect(() => { + if (!callId || !wsUrl) return + + updateCallState('idle') + const socket = new WebSocket(wsUrl) + wsRef.current = socket + + socket.onopen = () => { + console.log('WebSocket connected') + navigator.mediaDevices.getUserMedia({ video: true, audio: true }) + .then(stream => { + localStreamRef.current = stream + setLocalStream(stream) + + const pc = new RTCPeerConnection({ iceServers: ICE_SERVERS }) + pcRef.current = pc + + stream.getTracks().forEach(track => pc.addTrack(track, stream)) + + pc.ontrack = (event) => { + if (event.streams?.[0]) setRemoteStream(event.streams[0]) + } + + pc.oniceconnectionstatechange = () => { + console.log('ICE connection state:', pc.iceConnectionState) + if (pc.iceConnectionState === 'connected' || pc.iceConnectionState === 'completed') { + updateCallState('connected') + } else if (pc.iceConnectionState === 'failed' || pc.iceConnectionState === 'disconnected') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + // Trickle ICE: 候補が見つかる都度送信 + pc.onicecandidate = (event) => { + if (socket.readyState !== WebSocket.OPEN) return + socket.send(JSON.stringify({ + type: 'ice', + callId, + candidate: event.candidate ? event.candidate.toJSON() : null, + })) + } + + pc.createOffer() + .then(offer => pc.setLocalDescription(offer)) + .then(() => { + if (socket.readyState !== WebSocket.OPEN || !pc.localDescription) return + socket.send(JSON.stringify({ type: 'offer', callId, sdp: pc.localDescription.sdp })) + updateCallState('connecting') + }) + .catch(err => { + console.error('SDP offer error:', err) + updateCallState('failed') + setErrorMessage('接続の開始に失敗しました') + }) + }) + .catch(err => { + console.error('getUserMedia error:', err) + updateCallState('failed') + setErrorMessage('カメラ・マイクへのアクセスが拒否されました') + }) + } + + socket.onmessage = async (event: MessageEvent) => { + let msg: { type: string; sdp?: string; candidate?: RTCIceCandidateInit | null; message?: string } + try { msg = JSON.parse(event.data) } catch { return } + console.log('WebSocket message:', msg.type) + + const pc = pcRef.current + switch (msg.type) { + case 'answer': + if (!pc || !msg.sdp) break + await pc.setRemoteDescription({ type: 'answer', sdp: msg.sdp }).catch(console.error) + for (const c of pendingCandidatesRef.current) { + await pc.addIceCandidate(c).catch(console.error) + } + pendingCandidatesRef.current = [] + break + case 'ice': + if (!pc || msg.candidate == null) break + if (pc.remoteDescription) { + await pc.addIceCandidate(msg.candidate).catch(console.error) + } else { + pendingCandidatesRef.current.push(msg.candidate) + } + break + case 'hangup': + cleanup() + updateCallState('ended') + onHangup?.() + break + case 'error': + updateCallState('failed') + setErrorMessage(msg.message ?? '接続エラーが発生しました') + break + } + } + + socket.onerror = () => { + if (callStateRef.current !== 'ended') { + updateCallState('failed') + setErrorMessage('通信エラーが発生しました') + } + } + + socket.onclose = () => { + if (callStateRef.current !== 'ended' && callStateRef.current !== 'failed') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + return () => { cleanup() } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [wsUrl, callId]) + + const hangup = useCallback(() => { + if (wsRef.current?.readyState === WebSocket.OPEN) { + wsRef.current.send(JSON.stringify({ type: 'hangup', callId })) + } + cleanup() + updateCallState('ended') + }, [callId, cleanup, updateCallState]) + + const toggleMute = useCallback(() => { + const track = localStreamRef.current?.getAudioTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsMuted(!track.enabled) + }, []) + + const toggleCamera = useCallback(() => { + const track = localStreamRef.current?.getVideoTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsCameraOff(!track.enabled) + }, []) + + return { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup, errorMessage } } diff --git a/node/src/types/globals.d.ts b/node/src/types/globals.d.ts index ca54560..ff05c42 100755 --- a/node/src/types/globals.d.ts +++ b/node/src/types/globals.d.ts @@ -1,3 +1,5 @@ +declare module '*.css' {} + export {} declare global { diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/node/src/app/call/page.tsx b/node/src/app/call/page.tsx new file mode 100644 index 0000000..4075387 --- /dev/null +++ b/node/src/app/call/page.tsx @@ -0,0 +1,128 @@ +'use client' +import { Suspense, useEffect, useRef } from 'react' +import { useSearchParams, useRouter } from 'next/navigation' +import { IconButton, Typography } from '@mui/material' +import { + Mic as MicIcon, + MicOff as MicOffIcon, + Videocam as VideocamIcon, + VideocamOff as VideocamOffIcon, + CallEnd as CallEndIcon, +} from '@mui/icons-material' +import { useWebRTC } from '@/hooks' +import './page.css' + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 +function CallPageInner() { + const searchParams = useSearchParams() + const router = useRouter() + const callId = searchParams.get('callId') ?? '' + const accessKey = searchParams.get('accessKey') ?? '' + + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? '' + const wsUrl = callId && accessKey + ? baseUrl.replace(/^https?:\/\//, 'wss://') + `/api/mobile/${accessKey}/call/${callId}` + : '' + + const { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup } = + useWebRTC({ callId, wsUrl, onHangup: () => {} }) + + const remoteVideoRef = useRef(null) + const localVideoRef = useRef(null) + + useEffect(() => { + if (remoteVideoRef.current && remoteStream) { + remoteVideoRef.current.srcObject = remoteStream + } + }, [remoteStream]) + + useEffect(() => { + if (localVideoRef.current && localStream) { + localVideoRef.current.srcObject = localStream + } + }, [localStream]) + + // 通話終了・失敗時は2秒後に前のページへ戻る + useEffect(() => { + if (callState === 'ended' || callState === 'failed') { + const timer = setTimeout(() => router.back(), 2000) + return () => clearTimeout(timer) + } + }, [callState, router]) + + const statusText: Record = { + connecting: '接続中…', + failed: '接続に失敗しました', + ended: '通話終了', + } + + const isEnded = callState === 'ended' || callState === 'failed' + + return ( +
+ {/* リモート映像(全画面) */} +
+ ) +} + +export default function CallPage() { + return ( + }> + + + ) +} diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100644 new mode 100755 index 50bc743..8d56ba1 --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -28,7 +28,8 @@ - + + (null) const [osDetected, setOsDetected] = useState(false) const [installPrompt, setInstallPrompt] = useState(null) @@ -37,9 +36,15 @@ const browser = getBrowser() setOS(os) setBrowser(browser) + setIosVersion(getIOSVersion()) setOsDetected(true) - setIsStandalone(window.matchMedia('(display-mode: standalone)').matches) + // iOS は display-mode メディアクエリが home screen 起動でも false を返すことがある。 + // iOS の正規シグナルは navigator.standalone なので両方を OR で判定する。 + setIsStandalone( + window.matchMedia('(display-mode: standalone)').matches || + (window.navigator as { standalone?: boolean }).standalone === true, + ) navigator.getInstalledRelatedApps?.().then(apps => { setIsInstalled(apps.length > 0) @@ -102,7 +107,7 @@ const registerMode = isStandalone || (!installPrompt && !isInstalled) ? 'allowed' : installPrompt ? 'install-required' : 'hidden' - const { Subscribe, errorMessage, accessKey, isSubscribed, canSubscribe, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) + const { Subscribe, errorMessage, accessKey, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) @@ -218,7 +223,7 @@ )} - {os === 'iOS' && browser === 'Safari' && !isStandalone && } + {os === 'iOS' && browser === 'Safari' && !isStandalone && = 26 ? '/images/install_for_ios26.svg' : '/images/install_for_ios.png'} />} {os === 'Android' && (isStandalone || isInstalled) && 通知が届かなくなった場合
@@ -231,36 +236,3 @@ ) } - - -const ServiceWorkerStatus: React.FC = () => { - const [registrations, setRegistrations] = useState(['確認中...']); - - useEffect(() => { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.getRegistrations().then(regs => { - if (regs.length === 0) { - setRegistrations(['サービスワーカーは登録されていません。']); - } else { - const swInfo = regs.map((reg, index) => - `(${index + 1}) スコープ: ${reg.scope}, 状態: ${reg.active ? 'アクティブ' : '非アクティブ'}` - ); - setRegistrations(swInfo); - } - }); - } else { - setRegistrations(['このブラウザはサービスワーカーをサポートしていません。']); - } - }, []); - - return ( -
-

Service Workerの状態

-
    - {registrations.map((reg, index) => ( -
  • {reg}
  • - ))} -
-
- ); - }; \ No newline at end of file diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx old mode 100755 new mode 100644 index 540d330..4a8dc66 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -1,5 +1,5 @@ 'use client' -import { useEffect, useMemo, useState, useCallback } from 'react' +import { useEffect, useMemo, useState, useCallback, useRef } from 'react' import webpush from 'web-push' import { Button, FormHelperText, Alert, FormControl, InputLabel, OutlinedInput, InputAdornment, IconButton, Tooltip, ClickAwayListener, Tabs, CircularProgress } from '@mui/material' import { ContentPasteGo as ContentPasteGoIcon } from '@mui/icons-material' @@ -30,9 +30,12 @@ const [isLoading, setIsLoading] = useState(true) const [pushSupported, setPushSupported] = useState(null) const [state, setState] = useState<{status: string, token: string | null}>({ status: 'unknown', token: null }) + // 最後に checkAccessKey へ渡したキー。手入力 blur 時の二重照会 (ペースト → blur 等) を防ぐ。 + const lastCheckedAccessKeyRef = useRef('') // アクセスキーが入力されたらサーバへ問い合わせる const checkAccessKey = useCallback((newAccessKey: string) => { + lastCheckedAccessKeyRef.current = newAccessKey setAccessKey(newAccessKey) setIsLoading(true) setAccessKeyError(null) @@ -83,10 +86,11 @@ console.error('GET /accessKey failed', e) } - // 2. URLハッシュのキーを取得し、即座に消去 + // 2. URLハッシュのキーを取得 (ハッシュは URL に残す。 + // deep link / bookmark / タブ復元で再適用できるようにするため。 + // キー変更をキャンセルした時のみ後段で消去する)。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - if (hashKey) history.replaceState(null, '', location.pathname + location.search) // 3. localStorageからCookieへ移行(CookieもURLハッシュもない場合) let migratedKey: string | null = null @@ -172,7 +176,10 @@ checkAccessKey(hashKey) return } - // キャンセル: 旧キーのまま継続(hashKeyは消去済み、CookieはcookieKeyのまま) + // キャンセル: 旧キーのまま継続(Cookie は cookieKey のまま)。 + // 拒否したキーが URL ハッシュに残ると reload のたびに再プロンプトになるため、 + // このケースだけハッシュを消去する。 + history.replaceState(null, '', location.pathname + location.search) keyChangeCancelled = true } @@ -380,9 +387,21 @@ : undefined } label="アクセスキー" - placeholder="(タップしてペースト)" + placeholder="(タップしてペースト、または入力)" onPaste={e => !isLoading && !isSubscribed && checkAccessKey(e.clipboardData.getData('text'))} - readOnly + onChange={e => { + // 手入力中は値の更新のみ。サーバ照会は blur 時にまとめて行う。 + if (isLoading || isSubscribed) return + setAccessKey(e.target.value) + setAccessKeyError(null) + }} + onBlur={() => { + // 手入力でフォーカスが外れたタイミングで照会。 + // ペースト経路 (onPaste / ペーストボタン) は既に checkAccessKey 済みなので + // lastCheckedAccessKeyRef との比較で二重照会を防ぐ。 + if (isLoading || isSubscribed) return + if (accessKey && accessKey !== lastCheckedAccessKeyRef.current) checkAccessKey(accessKey) + }} disabled={isLoading} inputProps={{ size: 20 }} sx={{fontFamily: 'monospace'}} /> @@ -399,7 +418,8 @@ プッシュ通知にはSafariで開く必要があります } - {pushSupported === false && os !== 'iOS' && このブラウザはプッシュ通知に対応していません。AndroidはChromeでお開きください。} + {pushSupported === false && os === 'Android' && このブラウザはプッシュ通知に対応していません。Chromeでお開きください。} + {pushSupported === false && os !== 'iOS' && os !== 'Android' && このブラウザはプッシュ通知に対応していません。} {registerMode === 'allowed' && os === 'iOS' && browser === 'Safari' && !isStandalone && プッシュ通知にはホーム画面への追加が必要です。画面下部の共有ボタン(□↑)から「ホーム画面に追加」を選んでください} {registerMode === 'allowed' && !(os === 'iOS' && browser === 'Safari' && !isStandalone) && pushSupported !== false && } {registerMode === 'install-required' && プッシュ通知を受け取るにはWebアプリとしてインストールしてください} diff --git a/node/src/components/ThemeRegistry/ThemeRegistry.tsx b/node/src/components/ThemeRegistry/ThemeRegistry.tsx index 1c48312..e127dab 100755 --- a/node/src/components/ThemeRegistry/ThemeRegistry.tsx +++ b/node/src/components/ThemeRegistry/ThemeRegistry.tsx @@ -2,15 +2,17 @@ import * as React from 'react'; import { ThemeProvider } from '@mui/material/styles'; +import useMediaQuery from '@mui/material/useMediaQuery'; import CssBaseline from '@mui/material/CssBaseline'; import NextAppDirEmotionCacheProvider from './EmotionCache'; -import theme from './theme'; +import { lightTheme, darkTheme } from './theme'; export default function ThemeRegistry({ children }: { children: React.ReactNode }) { + const prefersDark = useMediaQuery('(prefers-color-scheme: dark)'); + return ( - - {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */} + {children} diff --git a/node/src/components/ThemeRegistry/theme.ts b/node/src/components/ThemeRegistry/theme.ts index 566a51e..dcca54c 100755 --- a/node/src/components/ThemeRegistry/theme.ts +++ b/node/src/components/ThemeRegistry/theme.ts @@ -7,31 +7,39 @@ display: 'swap', }); -const theme = createTheme({ - palette: { - mode: 'light', - }, - typography: { - fontFamily: roboto.style.fontFamily, - }, - components: { - MuiButton: { - styleOverrides: { - root: { - textTransform: 'none', - }, +const sharedComponents = { + MuiButton: { + styleOverrides: { + root: { + textTransform: 'none' as const, }, }, - MuiAlert: { - styleOverrides: { - root: ({ ownerState }) => ({ - ...(ownerState.severity === 'info' && { - backgroundColor: '#60a5fa', - }), + }, + MuiAlert: { + styleOverrides: { + root: ({ ownerState }: { ownerState: { severity?: string } }) => ({ + ...(ownerState.severity === 'info' && { + backgroundColor: '#60a5fa', }), - }, + }), }, }, +}; + +const sharedTypography = { + fontFamily: roboto.style.fontFamily, +}; + +export const lightTheme = createTheme({ + palette: { mode: 'light' }, + typography: sharedTypography, + components: sharedComponents, }); -export default theme; \ No newline at end of file +export const darkTheme = createTheme({ + palette: { mode: 'dark' }, + typography: sharedTypography, + components: sharedComponents, +}); + +export default lightTheme; \ No newline at end of file diff --git a/node/src/hooks/useWebRTC.tsx b/node/src/hooks/useWebRTC.tsx index ba8a142..13c708a 100755 --- a/node/src/hooks/useWebRTC.tsx +++ b/node/src/hooks/useWebRTC.tsx @@ -1,105 +1,207 @@ // useWebRTC.ts import { useState, useEffect, useRef, useCallback } from 'react' -interface useWebRTCReturn { - pc: RTCPeerConnection | null - localStream: MediaStream | null - ws: WebSocket | null - setURL: (wsUrl: string) => () => void +export type CallState = 'idle' | 'connecting' | 'connected' | 'failed' | 'ended' + +interface UseWebRTCOptions { + callId: string + wsUrl: string + onHangup?: () => void } -export function useWebRTC(): useWebRTCReturn { - const [pc, setPc] = useState(null) - const [localStream, setLocalStream] = useState(null) - const [ws, setWs] = useState(null) - const iceServers: RTCIceServer[] = [ - { urls: "stun:stun.l.google.com:19302" }, - { urls: "stun:stun1.l.google.com:19302" }, - { urls: "stun:stun2.l.google.com:19302" }, - { urls: "stun:stun3.l.google.com:19302" }, - { urls: "stun:stun4.l.google.com:19302" } - ] - // ICE候補を格納する配列(シグナリング送信用) - const iceCandidatesRef = useRef([]) +interface UseWebRTCReturn { + callState: CallState + localStream: MediaStream | null + remoteStream: MediaStream | null + isMuted: boolean + isCameraOff: boolean + toggleMute: () => void + toggleCamera: () => void + hangup: () => void + errorMessage: string | null +} - // WebSocket初期化 - const setURL = useCallback((wsUrl: string) => { - const socket = new WebSocket(wsUrl) - socket.onopen = () => { - console.log("WebSocket connected") - // WebSocket接続後にWebRTCの初期化を開始 - initWebRTC(socket) - } - socket.onmessage = (event: MessageEvent) => { - console.log("WebSocket message received:", event.data) - // ここでリモートからのシグナリング(アンサーやICE候補)を処理する - } - socket.onerror = (err) => { - console.error("WebSocket error:", err) - } - socket.onclose = () => { - console.log("WebSocket closed") - } - setWs(socket) - // クリーンアップ - return () => { - socket.close() - pc?.close() - } - // eslint-disable-next-line react-hooks/exhaustive-deps +const ICE_SERVERS: RTCIceServer[] = [ + { urls: 'stun:stun.l.google.com:19302' }, + { urls: 'stun:stun1.l.google.com:19302' }, + { urls: 'stun:stun2.l.google.com:19302' }, + { urls: 'stun:stun3.l.google.com:19302' }, + { urls: 'stun:stun4.l.google.com:19302' }, +] + +export function useWebRTC({ callId, wsUrl, onHangup }: UseWebRTCOptions): UseWebRTCReturn { + const [callState, setCallState] = useState('idle') + const [localStream, setLocalStream] = useState(null) + const [remoteStream, setRemoteStream] = useState(null) + const [isMuted, setIsMuted] = useState(false) + const [isCameraOff, setIsCameraOff] = useState(false) + const [errorMessage, setErrorMessage] = useState(null) + + // useRef でPCとWSを保持(非同期ハンドラ内でも最新値を参照できる) + const pcRef = useRef(null) + const wsRef = useRef(null) + const localStreamRef = useRef(null) + // remoteDescriptionが設定される前に届いたICE候補をバッファリング + const pendingCandidatesRef = useRef([]) + const callStateRef = useRef('idle') + + const updateCallState = useCallback((state: CallState) => { + callStateRef.current = state + setCallState(state) }, []) - // WebRTC初期化関数 - const initWebRTC = useCallback((socket: WebSocket) => { - // ユーザーに映像・音声の許可をリクエスト - navigator.mediaDevices.getUserMedia({ video: true, audio: true }) - .then(stream => { - setLocalStream(stream) - const connection = new RTCPeerConnection({ iceServers }) - // ローカルストリームの各トラックを追加 - stream.getTracks().forEach(track => connection.addTrack(track, stream)) - // ダミーデータチャネルを作成してICE候補収集を促進 - connection.createDataChannel("dummy") - // ICE候補イベントのハンドラ - connection.onicecandidate = (event) => { - console.log("ICE candidate event:", event) - if (event.candidate) { - iceCandidatesRef.current.push(event.candidate.toJSON()) - // 候補が見つかるたびに送信する(例:ここで個別送信) - socket.send(JSON.stringify({ - type: "ice", - candidate: event.candidate.toJSON() - })) - } else { - // ICE候補の収集が完了(candidateがnull) - const signalingMessage = { - type: "offer", - sdp: connection.localDescription ? connection.localDescription.sdp : null, - iceCandidates: iceCandidatesRef.current - } - console.log("Signaling JSON message:", JSON.stringify(signalingMessage, null, 2)) - socket.send(JSON.stringify(signalingMessage)) - } - } - connection.onicegatheringstatechange = () => { - console.log("ICE gathering state:", connection.iceGatheringState) - } - // SDPオファー生成とローカル記述の設定 - connection.createOffer() - .then(offer => { - console.log("Created SDP offer:", offer) - return connection.setLocalDescription(offer) - }) - .then(() => { - // setLocalDescription()実行後、ICE候補収集が開始される - setPc(connection) - }) - .catch(err => console.error("Error during SDP offer creation:", err)) - }) - .catch(err => { - console.error("Error getting user media:", err) - }) - }, [iceServers]) + const cleanup = useCallback(() => { + localStreamRef.current?.getTracks().forEach(track => track.stop()) + localStreamRef.current = null + setLocalStream(null) + if (pcRef.current) { + pcRef.current.close() + pcRef.current = null + } + if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) { + wsRef.current.close() + } + wsRef.current = null + pendingCandidatesRef.current = [] + }, []) - return { pc, localStream, ws, setURL } + useEffect(() => { + if (!callId || !wsUrl) return + + updateCallState('idle') + const socket = new WebSocket(wsUrl) + wsRef.current = socket + + socket.onopen = () => { + console.log('WebSocket connected') + navigator.mediaDevices.getUserMedia({ video: true, audio: true }) + .then(stream => { + localStreamRef.current = stream + setLocalStream(stream) + + const pc = new RTCPeerConnection({ iceServers: ICE_SERVERS }) + pcRef.current = pc + + stream.getTracks().forEach(track => pc.addTrack(track, stream)) + + pc.ontrack = (event) => { + if (event.streams?.[0]) setRemoteStream(event.streams[0]) + } + + pc.oniceconnectionstatechange = () => { + console.log('ICE connection state:', pc.iceConnectionState) + if (pc.iceConnectionState === 'connected' || pc.iceConnectionState === 'completed') { + updateCallState('connected') + } else if (pc.iceConnectionState === 'failed' || pc.iceConnectionState === 'disconnected') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + // Trickle ICE: 候補が見つかる都度送信 + pc.onicecandidate = (event) => { + if (socket.readyState !== WebSocket.OPEN) return + socket.send(JSON.stringify({ + type: 'ice', + callId, + candidate: event.candidate ? event.candidate.toJSON() : null, + })) + } + + pc.createOffer() + .then(offer => pc.setLocalDescription(offer)) + .then(() => { + if (socket.readyState !== WebSocket.OPEN || !pc.localDescription) return + socket.send(JSON.stringify({ type: 'offer', callId, sdp: pc.localDescription.sdp })) + updateCallState('connecting') + }) + .catch(err => { + console.error('SDP offer error:', err) + updateCallState('failed') + setErrorMessage('接続の開始に失敗しました') + }) + }) + .catch(err => { + console.error('getUserMedia error:', err) + updateCallState('failed') + setErrorMessage('カメラ・マイクへのアクセスが拒否されました') + }) + } + + socket.onmessage = async (event: MessageEvent) => { + let msg: { type: string; sdp?: string; candidate?: RTCIceCandidateInit | null; message?: string } + try { msg = JSON.parse(event.data) } catch { return } + console.log('WebSocket message:', msg.type) + + const pc = pcRef.current + switch (msg.type) { + case 'answer': + if (!pc || !msg.sdp) break + await pc.setRemoteDescription({ type: 'answer', sdp: msg.sdp }).catch(console.error) + for (const c of pendingCandidatesRef.current) { + await pc.addIceCandidate(c).catch(console.error) + } + pendingCandidatesRef.current = [] + break + case 'ice': + if (!pc || msg.candidate == null) break + if (pc.remoteDescription) { + await pc.addIceCandidate(msg.candidate).catch(console.error) + } else { + pendingCandidatesRef.current.push(msg.candidate) + } + break + case 'hangup': + cleanup() + updateCallState('ended') + onHangup?.() + break + case 'error': + updateCallState('failed') + setErrorMessage(msg.message ?? '接続エラーが発生しました') + break + } + } + + socket.onerror = () => { + if (callStateRef.current !== 'ended') { + updateCallState('failed') + setErrorMessage('通信エラーが発生しました') + } + } + + socket.onclose = () => { + if (callStateRef.current !== 'ended' && callStateRef.current !== 'failed') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + return () => { cleanup() } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [wsUrl, callId]) + + const hangup = useCallback(() => { + if (wsRef.current?.readyState === WebSocket.OPEN) { + wsRef.current.send(JSON.stringify({ type: 'hangup', callId })) + } + cleanup() + updateCallState('ended') + }, [callId, cleanup, updateCallState]) + + const toggleMute = useCallback(() => { + const track = localStreamRef.current?.getAudioTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsMuted(!track.enabled) + }, []) + + const toggleCamera = useCallback(() => { + const track = localStreamRef.current?.getVideoTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsCameraOff(!track.enabled) + }, []) + + return { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup, errorMessage } } diff --git a/node/src/types/globals.d.ts b/node/src/types/globals.d.ts index ca54560..ff05c42 100755 --- a/node/src/types/globals.d.ts +++ b/node/src/types/globals.d.ts @@ -1,3 +1,5 @@ +declare module '*.css' {} + export {} declare global { diff --git a/node/src/utils/index.ts b/node/src/utils/index.ts index cf37f87..5644c75 100644 --- a/node/src/utils/index.ts +++ b/node/src/utils/index.ts @@ -5,13 +5,31 @@ if (/android/i.test(ua)) { return "Android" } - else if (/iPad|iPhone|iPod/.test(ua)) { + else if (/iPad|iPhone|iPod/.test(ua) || (/Macintosh/.test(ua) && navigator.maxTouchPoints > 1)) { return "iOS" } return "Other" } +// iOS の major version を返す。取得できない場合は null。 +// iOS 26 以降、Apple は "CPU iPhone OS" トークンを 18_7 で凍結しており +// (フィンガープリンティング対策)、実バージョンは Safari の "Version/26.x" 側にしか +// 出ない。逆に WebView 等では "Version/" が無い。そのため両方を見て大きい方を採用する。 +// iPad (iPadOS 13+) は UA が Macintosh 偽装で "iPhone OS" トークンが無く、 +// "Version/" のみが手がかりになる。 +export const getIOSVersion = (): number | null => { + if (typeof window === 'undefined') return null + const ua = window.navigator.userAgent + const osMatch = ua.match(/OS (\d+)_/) + const versionMatch = ua.match(/Version\/(\d+)/) + const candidates = [osMatch, versionMatch] + .map(m => (m ? parseInt(m[1], 10) : NaN)) + .filter(n => !isNaN(n)) + if (candidates.length === 0) return null + return Math.max(...candidates) +} + export const getBrowser = (): string => { if (typeof window === 'undefined') return 'Other' diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/node/src/app/call/page.tsx b/node/src/app/call/page.tsx new file mode 100644 index 0000000..4075387 --- /dev/null +++ b/node/src/app/call/page.tsx @@ -0,0 +1,128 @@ +'use client' +import { Suspense, useEffect, useRef } from 'react' +import { useSearchParams, useRouter } from 'next/navigation' +import { IconButton, Typography } from '@mui/material' +import { + Mic as MicIcon, + MicOff as MicOffIcon, + Videocam as VideocamIcon, + VideocamOff as VideocamOffIcon, + CallEnd as CallEndIcon, +} from '@mui/icons-material' +import { useWebRTC } from '@/hooks' +import './page.css' + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 +function CallPageInner() { + const searchParams = useSearchParams() + const router = useRouter() + const callId = searchParams.get('callId') ?? '' + const accessKey = searchParams.get('accessKey') ?? '' + + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? '' + const wsUrl = callId && accessKey + ? baseUrl.replace(/^https?:\/\//, 'wss://') + `/api/mobile/${accessKey}/call/${callId}` + : '' + + const { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup } = + useWebRTC({ callId, wsUrl, onHangup: () => {} }) + + const remoteVideoRef = useRef(null) + const localVideoRef = useRef(null) + + useEffect(() => { + if (remoteVideoRef.current && remoteStream) { + remoteVideoRef.current.srcObject = remoteStream + } + }, [remoteStream]) + + useEffect(() => { + if (localVideoRef.current && localStream) { + localVideoRef.current.srcObject = localStream + } + }, [localStream]) + + // 通話終了・失敗時は2秒後に前のページへ戻る + useEffect(() => { + if (callState === 'ended' || callState === 'failed') { + const timer = setTimeout(() => router.back(), 2000) + return () => clearTimeout(timer) + } + }, [callState, router]) + + const statusText: Record = { + connecting: '接続中…', + failed: '接続に失敗しました', + ended: '通話終了', + } + + const isEnded = callState === 'ended' || callState === 'failed' + + return ( +
+ {/* リモート映像(全画面) */} +
+ ) +} + +export default function CallPage() { + return ( + }> + + + ) +} diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100644 new mode 100755 index 50bc743..8d56ba1 --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -28,7 +28,8 @@ - + + (null) const [osDetected, setOsDetected] = useState(false) const [installPrompt, setInstallPrompt] = useState(null) @@ -37,9 +36,15 @@ const browser = getBrowser() setOS(os) setBrowser(browser) + setIosVersion(getIOSVersion()) setOsDetected(true) - setIsStandalone(window.matchMedia('(display-mode: standalone)').matches) + // iOS は display-mode メディアクエリが home screen 起動でも false を返すことがある。 + // iOS の正規シグナルは navigator.standalone なので両方を OR で判定する。 + setIsStandalone( + window.matchMedia('(display-mode: standalone)').matches || + (window.navigator as { standalone?: boolean }).standalone === true, + ) navigator.getInstalledRelatedApps?.().then(apps => { setIsInstalled(apps.length > 0) @@ -102,7 +107,7 @@ const registerMode = isStandalone || (!installPrompt && !isInstalled) ? 'allowed' : installPrompt ? 'install-required' : 'hidden' - const { Subscribe, errorMessage, accessKey, isSubscribed, canSubscribe, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) + const { Subscribe, errorMessage, accessKey, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) @@ -218,7 +223,7 @@ )} - {os === 'iOS' && browser === 'Safari' && !isStandalone && } + {os === 'iOS' && browser === 'Safari' && !isStandalone && = 26 ? '/images/install_for_ios26.svg' : '/images/install_for_ios.png'} />} {os === 'Android' && (isStandalone || isInstalled) && 通知が届かなくなった場合
@@ -231,36 +236,3 @@ ) } - - -const ServiceWorkerStatus: React.FC = () => { - const [registrations, setRegistrations] = useState(['確認中...']); - - useEffect(() => { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.getRegistrations().then(regs => { - if (regs.length === 0) { - setRegistrations(['サービスワーカーは登録されていません。']); - } else { - const swInfo = regs.map((reg, index) => - `(${index + 1}) スコープ: ${reg.scope}, 状態: ${reg.active ? 'アクティブ' : '非アクティブ'}` - ); - setRegistrations(swInfo); - } - }); - } else { - setRegistrations(['このブラウザはサービスワーカーをサポートしていません。']); - } - }, []); - - return ( -
-

Service Workerの状態

-
    - {registrations.map((reg, index) => ( -
  • {reg}
  • - ))} -
-
- ); - }; \ No newline at end of file diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx old mode 100755 new mode 100644 index 540d330..4a8dc66 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -1,5 +1,5 @@ 'use client' -import { useEffect, useMemo, useState, useCallback } from 'react' +import { useEffect, useMemo, useState, useCallback, useRef } from 'react' import webpush from 'web-push' import { Button, FormHelperText, Alert, FormControl, InputLabel, OutlinedInput, InputAdornment, IconButton, Tooltip, ClickAwayListener, Tabs, CircularProgress } from '@mui/material' import { ContentPasteGo as ContentPasteGoIcon } from '@mui/icons-material' @@ -30,9 +30,12 @@ const [isLoading, setIsLoading] = useState(true) const [pushSupported, setPushSupported] = useState(null) const [state, setState] = useState<{status: string, token: string | null}>({ status: 'unknown', token: null }) + // 最後に checkAccessKey へ渡したキー。手入力 blur 時の二重照会 (ペースト → blur 等) を防ぐ。 + const lastCheckedAccessKeyRef = useRef('') // アクセスキーが入力されたらサーバへ問い合わせる const checkAccessKey = useCallback((newAccessKey: string) => { + lastCheckedAccessKeyRef.current = newAccessKey setAccessKey(newAccessKey) setIsLoading(true) setAccessKeyError(null) @@ -83,10 +86,11 @@ console.error('GET /accessKey failed', e) } - // 2. URLハッシュのキーを取得し、即座に消去 + // 2. URLハッシュのキーを取得 (ハッシュは URL に残す。 + // deep link / bookmark / タブ復元で再適用できるようにするため。 + // キー変更をキャンセルした時のみ後段で消去する)。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - if (hashKey) history.replaceState(null, '', location.pathname + location.search) // 3. localStorageからCookieへ移行(CookieもURLハッシュもない場合) let migratedKey: string | null = null @@ -172,7 +176,10 @@ checkAccessKey(hashKey) return } - // キャンセル: 旧キーのまま継続(hashKeyは消去済み、CookieはcookieKeyのまま) + // キャンセル: 旧キーのまま継続(Cookie は cookieKey のまま)。 + // 拒否したキーが URL ハッシュに残ると reload のたびに再プロンプトになるため、 + // このケースだけハッシュを消去する。 + history.replaceState(null, '', location.pathname + location.search) keyChangeCancelled = true } @@ -380,9 +387,21 @@ : undefined } label="アクセスキー" - placeholder="(タップしてペースト)" + placeholder="(タップしてペースト、または入力)" onPaste={e => !isLoading && !isSubscribed && checkAccessKey(e.clipboardData.getData('text'))} - readOnly + onChange={e => { + // 手入力中は値の更新のみ。サーバ照会は blur 時にまとめて行う。 + if (isLoading || isSubscribed) return + setAccessKey(e.target.value) + setAccessKeyError(null) + }} + onBlur={() => { + // 手入力でフォーカスが外れたタイミングで照会。 + // ペースト経路 (onPaste / ペーストボタン) は既に checkAccessKey 済みなので + // lastCheckedAccessKeyRef との比較で二重照会を防ぐ。 + if (isLoading || isSubscribed) return + if (accessKey && accessKey !== lastCheckedAccessKeyRef.current) checkAccessKey(accessKey) + }} disabled={isLoading} inputProps={{ size: 20 }} sx={{fontFamily: 'monospace'}} /> @@ -399,7 +418,8 @@ プッシュ通知にはSafariで開く必要があります } - {pushSupported === false && os !== 'iOS' && このブラウザはプッシュ通知に対応していません。AndroidはChromeでお開きください。} + {pushSupported === false && os === 'Android' && このブラウザはプッシュ通知に対応していません。Chromeでお開きください。} + {pushSupported === false && os !== 'iOS' && os !== 'Android' && このブラウザはプッシュ通知に対応していません。} {registerMode === 'allowed' && os === 'iOS' && browser === 'Safari' && !isStandalone && プッシュ通知にはホーム画面への追加が必要です。画面下部の共有ボタン(□↑)から「ホーム画面に追加」を選んでください} {registerMode === 'allowed' && !(os === 'iOS' && browser === 'Safari' && !isStandalone) && pushSupported !== false && } {registerMode === 'install-required' && プッシュ通知を受け取るにはWebアプリとしてインストールしてください} diff --git a/node/src/components/ThemeRegistry/ThemeRegistry.tsx b/node/src/components/ThemeRegistry/ThemeRegistry.tsx index 1c48312..e127dab 100755 --- a/node/src/components/ThemeRegistry/ThemeRegistry.tsx +++ b/node/src/components/ThemeRegistry/ThemeRegistry.tsx @@ -2,15 +2,17 @@ import * as React from 'react'; import { ThemeProvider } from '@mui/material/styles'; +import useMediaQuery from '@mui/material/useMediaQuery'; import CssBaseline from '@mui/material/CssBaseline'; import NextAppDirEmotionCacheProvider from './EmotionCache'; -import theme from './theme'; +import { lightTheme, darkTheme } from './theme'; export default function ThemeRegistry({ children }: { children: React.ReactNode }) { + const prefersDark = useMediaQuery('(prefers-color-scheme: dark)'); + return ( - - {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */} + {children} diff --git a/node/src/components/ThemeRegistry/theme.ts b/node/src/components/ThemeRegistry/theme.ts index 566a51e..dcca54c 100755 --- a/node/src/components/ThemeRegistry/theme.ts +++ b/node/src/components/ThemeRegistry/theme.ts @@ -7,31 +7,39 @@ display: 'swap', }); -const theme = createTheme({ - palette: { - mode: 'light', - }, - typography: { - fontFamily: roboto.style.fontFamily, - }, - components: { - MuiButton: { - styleOverrides: { - root: { - textTransform: 'none', - }, +const sharedComponents = { + MuiButton: { + styleOverrides: { + root: { + textTransform: 'none' as const, }, }, - MuiAlert: { - styleOverrides: { - root: ({ ownerState }) => ({ - ...(ownerState.severity === 'info' && { - backgroundColor: '#60a5fa', - }), + }, + MuiAlert: { + styleOverrides: { + root: ({ ownerState }: { ownerState: { severity?: string } }) => ({ + ...(ownerState.severity === 'info' && { + backgroundColor: '#60a5fa', }), - }, + }), }, }, +}; + +const sharedTypography = { + fontFamily: roboto.style.fontFamily, +}; + +export const lightTheme = createTheme({ + palette: { mode: 'light' }, + typography: sharedTypography, + components: sharedComponents, }); -export default theme; \ No newline at end of file +export const darkTheme = createTheme({ + palette: { mode: 'dark' }, + typography: sharedTypography, + components: sharedComponents, +}); + +export default lightTheme; \ No newline at end of file diff --git a/node/src/hooks/useWebRTC.tsx b/node/src/hooks/useWebRTC.tsx index ba8a142..13c708a 100755 --- a/node/src/hooks/useWebRTC.tsx +++ b/node/src/hooks/useWebRTC.tsx @@ -1,105 +1,207 @@ // useWebRTC.ts import { useState, useEffect, useRef, useCallback } from 'react' -interface useWebRTCReturn { - pc: RTCPeerConnection | null - localStream: MediaStream | null - ws: WebSocket | null - setURL: (wsUrl: string) => () => void +export type CallState = 'idle' | 'connecting' | 'connected' | 'failed' | 'ended' + +interface UseWebRTCOptions { + callId: string + wsUrl: string + onHangup?: () => void } -export function useWebRTC(): useWebRTCReturn { - const [pc, setPc] = useState(null) - const [localStream, setLocalStream] = useState(null) - const [ws, setWs] = useState(null) - const iceServers: RTCIceServer[] = [ - { urls: "stun:stun.l.google.com:19302" }, - { urls: "stun:stun1.l.google.com:19302" }, - { urls: "stun:stun2.l.google.com:19302" }, - { urls: "stun:stun3.l.google.com:19302" }, - { urls: "stun:stun4.l.google.com:19302" } - ] - // ICE候補を格納する配列(シグナリング送信用) - const iceCandidatesRef = useRef([]) +interface UseWebRTCReturn { + callState: CallState + localStream: MediaStream | null + remoteStream: MediaStream | null + isMuted: boolean + isCameraOff: boolean + toggleMute: () => void + toggleCamera: () => void + hangup: () => void + errorMessage: string | null +} - // WebSocket初期化 - const setURL = useCallback((wsUrl: string) => { - const socket = new WebSocket(wsUrl) - socket.onopen = () => { - console.log("WebSocket connected") - // WebSocket接続後にWebRTCの初期化を開始 - initWebRTC(socket) - } - socket.onmessage = (event: MessageEvent) => { - console.log("WebSocket message received:", event.data) - // ここでリモートからのシグナリング(アンサーやICE候補)を処理する - } - socket.onerror = (err) => { - console.error("WebSocket error:", err) - } - socket.onclose = () => { - console.log("WebSocket closed") - } - setWs(socket) - // クリーンアップ - return () => { - socket.close() - pc?.close() - } - // eslint-disable-next-line react-hooks/exhaustive-deps +const ICE_SERVERS: RTCIceServer[] = [ + { urls: 'stun:stun.l.google.com:19302' }, + { urls: 'stun:stun1.l.google.com:19302' }, + { urls: 'stun:stun2.l.google.com:19302' }, + { urls: 'stun:stun3.l.google.com:19302' }, + { urls: 'stun:stun4.l.google.com:19302' }, +] + +export function useWebRTC({ callId, wsUrl, onHangup }: UseWebRTCOptions): UseWebRTCReturn { + const [callState, setCallState] = useState('idle') + const [localStream, setLocalStream] = useState(null) + const [remoteStream, setRemoteStream] = useState(null) + const [isMuted, setIsMuted] = useState(false) + const [isCameraOff, setIsCameraOff] = useState(false) + const [errorMessage, setErrorMessage] = useState(null) + + // useRef でPCとWSを保持(非同期ハンドラ内でも最新値を参照できる) + const pcRef = useRef(null) + const wsRef = useRef(null) + const localStreamRef = useRef(null) + // remoteDescriptionが設定される前に届いたICE候補をバッファリング + const pendingCandidatesRef = useRef([]) + const callStateRef = useRef('idle') + + const updateCallState = useCallback((state: CallState) => { + callStateRef.current = state + setCallState(state) }, []) - // WebRTC初期化関数 - const initWebRTC = useCallback((socket: WebSocket) => { - // ユーザーに映像・音声の許可をリクエスト - navigator.mediaDevices.getUserMedia({ video: true, audio: true }) - .then(stream => { - setLocalStream(stream) - const connection = new RTCPeerConnection({ iceServers }) - // ローカルストリームの各トラックを追加 - stream.getTracks().forEach(track => connection.addTrack(track, stream)) - // ダミーデータチャネルを作成してICE候補収集を促進 - connection.createDataChannel("dummy") - // ICE候補イベントのハンドラ - connection.onicecandidate = (event) => { - console.log("ICE candidate event:", event) - if (event.candidate) { - iceCandidatesRef.current.push(event.candidate.toJSON()) - // 候補が見つかるたびに送信する(例:ここで個別送信) - socket.send(JSON.stringify({ - type: "ice", - candidate: event.candidate.toJSON() - })) - } else { - // ICE候補の収集が完了(candidateがnull) - const signalingMessage = { - type: "offer", - sdp: connection.localDescription ? connection.localDescription.sdp : null, - iceCandidates: iceCandidatesRef.current - } - console.log("Signaling JSON message:", JSON.stringify(signalingMessage, null, 2)) - socket.send(JSON.stringify(signalingMessage)) - } - } - connection.onicegatheringstatechange = () => { - console.log("ICE gathering state:", connection.iceGatheringState) - } - // SDPオファー生成とローカル記述の設定 - connection.createOffer() - .then(offer => { - console.log("Created SDP offer:", offer) - return connection.setLocalDescription(offer) - }) - .then(() => { - // setLocalDescription()実行後、ICE候補収集が開始される - setPc(connection) - }) - .catch(err => console.error("Error during SDP offer creation:", err)) - }) - .catch(err => { - console.error("Error getting user media:", err) - }) - }, [iceServers]) + const cleanup = useCallback(() => { + localStreamRef.current?.getTracks().forEach(track => track.stop()) + localStreamRef.current = null + setLocalStream(null) + if (pcRef.current) { + pcRef.current.close() + pcRef.current = null + } + if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) { + wsRef.current.close() + } + wsRef.current = null + pendingCandidatesRef.current = [] + }, []) - return { pc, localStream, ws, setURL } + useEffect(() => { + if (!callId || !wsUrl) return + + updateCallState('idle') + const socket = new WebSocket(wsUrl) + wsRef.current = socket + + socket.onopen = () => { + console.log('WebSocket connected') + navigator.mediaDevices.getUserMedia({ video: true, audio: true }) + .then(stream => { + localStreamRef.current = stream + setLocalStream(stream) + + const pc = new RTCPeerConnection({ iceServers: ICE_SERVERS }) + pcRef.current = pc + + stream.getTracks().forEach(track => pc.addTrack(track, stream)) + + pc.ontrack = (event) => { + if (event.streams?.[0]) setRemoteStream(event.streams[0]) + } + + pc.oniceconnectionstatechange = () => { + console.log('ICE connection state:', pc.iceConnectionState) + if (pc.iceConnectionState === 'connected' || pc.iceConnectionState === 'completed') { + updateCallState('connected') + } else if (pc.iceConnectionState === 'failed' || pc.iceConnectionState === 'disconnected') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + // Trickle ICE: 候補が見つかる都度送信 + pc.onicecandidate = (event) => { + if (socket.readyState !== WebSocket.OPEN) return + socket.send(JSON.stringify({ + type: 'ice', + callId, + candidate: event.candidate ? event.candidate.toJSON() : null, + })) + } + + pc.createOffer() + .then(offer => pc.setLocalDescription(offer)) + .then(() => { + if (socket.readyState !== WebSocket.OPEN || !pc.localDescription) return + socket.send(JSON.stringify({ type: 'offer', callId, sdp: pc.localDescription.sdp })) + updateCallState('connecting') + }) + .catch(err => { + console.error('SDP offer error:', err) + updateCallState('failed') + setErrorMessage('接続の開始に失敗しました') + }) + }) + .catch(err => { + console.error('getUserMedia error:', err) + updateCallState('failed') + setErrorMessage('カメラ・マイクへのアクセスが拒否されました') + }) + } + + socket.onmessage = async (event: MessageEvent) => { + let msg: { type: string; sdp?: string; candidate?: RTCIceCandidateInit | null; message?: string } + try { msg = JSON.parse(event.data) } catch { return } + console.log('WebSocket message:', msg.type) + + const pc = pcRef.current + switch (msg.type) { + case 'answer': + if (!pc || !msg.sdp) break + await pc.setRemoteDescription({ type: 'answer', sdp: msg.sdp }).catch(console.error) + for (const c of pendingCandidatesRef.current) { + await pc.addIceCandidate(c).catch(console.error) + } + pendingCandidatesRef.current = [] + break + case 'ice': + if (!pc || msg.candidate == null) break + if (pc.remoteDescription) { + await pc.addIceCandidate(msg.candidate).catch(console.error) + } else { + pendingCandidatesRef.current.push(msg.candidate) + } + break + case 'hangup': + cleanup() + updateCallState('ended') + onHangup?.() + break + case 'error': + updateCallState('failed') + setErrorMessage(msg.message ?? '接続エラーが発生しました') + break + } + } + + socket.onerror = () => { + if (callStateRef.current !== 'ended') { + updateCallState('failed') + setErrorMessage('通信エラーが発生しました') + } + } + + socket.onclose = () => { + if (callStateRef.current !== 'ended' && callStateRef.current !== 'failed') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + return () => { cleanup() } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [wsUrl, callId]) + + const hangup = useCallback(() => { + if (wsRef.current?.readyState === WebSocket.OPEN) { + wsRef.current.send(JSON.stringify({ type: 'hangup', callId })) + } + cleanup() + updateCallState('ended') + }, [callId, cleanup, updateCallState]) + + const toggleMute = useCallback(() => { + const track = localStreamRef.current?.getAudioTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsMuted(!track.enabled) + }, []) + + const toggleCamera = useCallback(() => { + const track = localStreamRef.current?.getVideoTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsCameraOff(!track.enabled) + }, []) + + return { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup, errorMessage } } diff --git a/node/src/types/globals.d.ts b/node/src/types/globals.d.ts index ca54560..ff05c42 100755 --- a/node/src/types/globals.d.ts +++ b/node/src/types/globals.d.ts @@ -1,3 +1,5 @@ +declare module '*.css' {} + export {} declare global { diff --git a/node/src/utils/index.ts b/node/src/utils/index.ts index cf37f87..5644c75 100644 --- a/node/src/utils/index.ts +++ b/node/src/utils/index.ts @@ -5,13 +5,31 @@ if (/android/i.test(ua)) { return "Android" } - else if (/iPad|iPhone|iPod/.test(ua)) { + else if (/iPad|iPhone|iPod/.test(ua) || (/Macintosh/.test(ua) && navigator.maxTouchPoints > 1)) { return "iOS" } return "Other" } +// iOS の major version を返す。取得できない場合は null。 +// iOS 26 以降、Apple は "CPU iPhone OS" トークンを 18_7 で凍結しており +// (フィンガープリンティング対策)、実バージョンは Safari の "Version/26.x" 側にしか +// 出ない。逆に WebView 等では "Version/" が無い。そのため両方を見て大きい方を採用する。 +// iPad (iPadOS 13+) は UA が Macintosh 偽装で "iPhone OS" トークンが無く、 +// "Version/" のみが手がかりになる。 +export const getIOSVersion = (): number | null => { + if (typeof window === 'undefined') return null + const ua = window.navigator.userAgent + const osMatch = ua.match(/OS (\d+)_/) + const versionMatch = ua.match(/Version\/(\d+)/) + const candidates = [osMatch, versionMatch] + .map(m => (m ? parseInt(m[1], 10) : NaN)) + .filter(n => !isNaN(n)) + if (candidates.length === 0) return null + return Math.max(...candidates) +} + export const getBrowser = (): string => { if (typeof window === 'undefined') return 'Other' diff --git a/node/ssh/authorized_keys b/node/ssh/authorized_keys new file mode 100755 index 0000000..306005e --- /dev/null +++ b/node/ssh/authorized_keys @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO/cW740yjBdFlyGXuYsSZOd7CJEneHiJswkPCHuaNLP raikyakun-codex diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/node/src/app/call/page.tsx b/node/src/app/call/page.tsx new file mode 100644 index 0000000..4075387 --- /dev/null +++ b/node/src/app/call/page.tsx @@ -0,0 +1,128 @@ +'use client' +import { Suspense, useEffect, useRef } from 'react' +import { useSearchParams, useRouter } from 'next/navigation' +import { IconButton, Typography } from '@mui/material' +import { + Mic as MicIcon, + MicOff as MicOffIcon, + Videocam as VideocamIcon, + VideocamOff as VideocamOffIcon, + CallEnd as CallEndIcon, +} from '@mui/icons-material' +import { useWebRTC } from '@/hooks' +import './page.css' + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 +function CallPageInner() { + const searchParams = useSearchParams() + const router = useRouter() + const callId = searchParams.get('callId') ?? '' + const accessKey = searchParams.get('accessKey') ?? '' + + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? '' + const wsUrl = callId && accessKey + ? baseUrl.replace(/^https?:\/\//, 'wss://') + `/api/mobile/${accessKey}/call/${callId}` + : '' + + const { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup } = + useWebRTC({ callId, wsUrl, onHangup: () => {} }) + + const remoteVideoRef = useRef(null) + const localVideoRef = useRef(null) + + useEffect(() => { + if (remoteVideoRef.current && remoteStream) { + remoteVideoRef.current.srcObject = remoteStream + } + }, [remoteStream]) + + useEffect(() => { + if (localVideoRef.current && localStream) { + localVideoRef.current.srcObject = localStream + } + }, [localStream]) + + // 通話終了・失敗時は2秒後に前のページへ戻る + useEffect(() => { + if (callState === 'ended' || callState === 'failed') { + const timer = setTimeout(() => router.back(), 2000) + return () => clearTimeout(timer) + } + }, [callState, router]) + + const statusText: Record = { + connecting: '接続中…', + failed: '接続に失敗しました', + ended: '通話終了', + } + + const isEnded = callState === 'ended' || callState === 'failed' + + return ( +
+ {/* リモート映像(全画面) */} +
+ ) +} + +export default function CallPage() { + return ( + }> + + + ) +} diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100644 new mode 100755 index 50bc743..8d56ba1 --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -28,7 +28,8 @@ - + + (null) const [osDetected, setOsDetected] = useState(false) const [installPrompt, setInstallPrompt] = useState(null) @@ -37,9 +36,15 @@ const browser = getBrowser() setOS(os) setBrowser(browser) + setIosVersion(getIOSVersion()) setOsDetected(true) - setIsStandalone(window.matchMedia('(display-mode: standalone)').matches) + // iOS は display-mode メディアクエリが home screen 起動でも false を返すことがある。 + // iOS の正規シグナルは navigator.standalone なので両方を OR で判定する。 + setIsStandalone( + window.matchMedia('(display-mode: standalone)').matches || + (window.navigator as { standalone?: boolean }).standalone === true, + ) navigator.getInstalledRelatedApps?.().then(apps => { setIsInstalled(apps.length > 0) @@ -102,7 +107,7 @@ const registerMode = isStandalone || (!installPrompt && !isInstalled) ? 'allowed' : installPrompt ? 'install-required' : 'hidden' - const { Subscribe, errorMessage, accessKey, isSubscribed, canSubscribe, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) + const { Subscribe, errorMessage, accessKey, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) @@ -218,7 +223,7 @@ )} - {os === 'iOS' && browser === 'Safari' && !isStandalone && } + {os === 'iOS' && browser === 'Safari' && !isStandalone && = 26 ? '/images/install_for_ios26.svg' : '/images/install_for_ios.png'} />} {os === 'Android' && (isStandalone || isInstalled) && 通知が届かなくなった場合
@@ -231,36 +236,3 @@ ) } - - -const ServiceWorkerStatus: React.FC = () => { - const [registrations, setRegistrations] = useState(['確認中...']); - - useEffect(() => { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.getRegistrations().then(regs => { - if (regs.length === 0) { - setRegistrations(['サービスワーカーは登録されていません。']); - } else { - const swInfo = regs.map((reg, index) => - `(${index + 1}) スコープ: ${reg.scope}, 状態: ${reg.active ? 'アクティブ' : '非アクティブ'}` - ); - setRegistrations(swInfo); - } - }); - } else { - setRegistrations(['このブラウザはサービスワーカーをサポートしていません。']); - } - }, []); - - return ( -
-

Service Workerの状態

-
    - {registrations.map((reg, index) => ( -
  • {reg}
  • - ))} -
-
- ); - }; \ No newline at end of file diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx old mode 100755 new mode 100644 index 540d330..4a8dc66 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -1,5 +1,5 @@ 'use client' -import { useEffect, useMemo, useState, useCallback } from 'react' +import { useEffect, useMemo, useState, useCallback, useRef } from 'react' import webpush from 'web-push' import { Button, FormHelperText, Alert, FormControl, InputLabel, OutlinedInput, InputAdornment, IconButton, Tooltip, ClickAwayListener, Tabs, CircularProgress } from '@mui/material' import { ContentPasteGo as ContentPasteGoIcon } from '@mui/icons-material' @@ -30,9 +30,12 @@ const [isLoading, setIsLoading] = useState(true) const [pushSupported, setPushSupported] = useState(null) const [state, setState] = useState<{status: string, token: string | null}>({ status: 'unknown', token: null }) + // 最後に checkAccessKey へ渡したキー。手入力 blur 時の二重照会 (ペースト → blur 等) を防ぐ。 + const lastCheckedAccessKeyRef = useRef('') // アクセスキーが入力されたらサーバへ問い合わせる const checkAccessKey = useCallback((newAccessKey: string) => { + lastCheckedAccessKeyRef.current = newAccessKey setAccessKey(newAccessKey) setIsLoading(true) setAccessKeyError(null) @@ -83,10 +86,11 @@ console.error('GET /accessKey failed', e) } - // 2. URLハッシュのキーを取得し、即座に消去 + // 2. URLハッシュのキーを取得 (ハッシュは URL に残す。 + // deep link / bookmark / タブ復元で再適用できるようにするため。 + // キー変更をキャンセルした時のみ後段で消去する)。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - if (hashKey) history.replaceState(null, '', location.pathname + location.search) // 3. localStorageからCookieへ移行(CookieもURLハッシュもない場合) let migratedKey: string | null = null @@ -172,7 +176,10 @@ checkAccessKey(hashKey) return } - // キャンセル: 旧キーのまま継続(hashKeyは消去済み、CookieはcookieKeyのまま) + // キャンセル: 旧キーのまま継続(Cookie は cookieKey のまま)。 + // 拒否したキーが URL ハッシュに残ると reload のたびに再プロンプトになるため、 + // このケースだけハッシュを消去する。 + history.replaceState(null, '', location.pathname + location.search) keyChangeCancelled = true } @@ -380,9 +387,21 @@ : undefined } label="アクセスキー" - placeholder="(タップしてペースト)" + placeholder="(タップしてペースト、または入力)" onPaste={e => !isLoading && !isSubscribed && checkAccessKey(e.clipboardData.getData('text'))} - readOnly + onChange={e => { + // 手入力中は値の更新のみ。サーバ照会は blur 時にまとめて行う。 + if (isLoading || isSubscribed) return + setAccessKey(e.target.value) + setAccessKeyError(null) + }} + onBlur={() => { + // 手入力でフォーカスが外れたタイミングで照会。 + // ペースト経路 (onPaste / ペーストボタン) は既に checkAccessKey 済みなので + // lastCheckedAccessKeyRef との比較で二重照会を防ぐ。 + if (isLoading || isSubscribed) return + if (accessKey && accessKey !== lastCheckedAccessKeyRef.current) checkAccessKey(accessKey) + }} disabled={isLoading} inputProps={{ size: 20 }} sx={{fontFamily: 'monospace'}} /> @@ -399,7 +418,8 @@ プッシュ通知にはSafariで開く必要があります } - {pushSupported === false && os !== 'iOS' && このブラウザはプッシュ通知に対応していません。AndroidはChromeでお開きください。} + {pushSupported === false && os === 'Android' && このブラウザはプッシュ通知に対応していません。Chromeでお開きください。} + {pushSupported === false && os !== 'iOS' && os !== 'Android' && このブラウザはプッシュ通知に対応していません。} {registerMode === 'allowed' && os === 'iOS' && browser === 'Safari' && !isStandalone && プッシュ通知にはホーム画面への追加が必要です。画面下部の共有ボタン(□↑)から「ホーム画面に追加」を選んでください} {registerMode === 'allowed' && !(os === 'iOS' && browser === 'Safari' && !isStandalone) && pushSupported !== false && } {registerMode === 'install-required' && プッシュ通知を受け取るにはWebアプリとしてインストールしてください} diff --git a/node/src/components/ThemeRegistry/ThemeRegistry.tsx b/node/src/components/ThemeRegistry/ThemeRegistry.tsx index 1c48312..e127dab 100755 --- a/node/src/components/ThemeRegistry/ThemeRegistry.tsx +++ b/node/src/components/ThemeRegistry/ThemeRegistry.tsx @@ -2,15 +2,17 @@ import * as React from 'react'; import { ThemeProvider } from '@mui/material/styles'; +import useMediaQuery from '@mui/material/useMediaQuery'; import CssBaseline from '@mui/material/CssBaseline'; import NextAppDirEmotionCacheProvider from './EmotionCache'; -import theme from './theme'; +import { lightTheme, darkTheme } from './theme'; export default function ThemeRegistry({ children }: { children: React.ReactNode }) { + const prefersDark = useMediaQuery('(prefers-color-scheme: dark)'); + return ( - - {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */} + {children} diff --git a/node/src/components/ThemeRegistry/theme.ts b/node/src/components/ThemeRegistry/theme.ts index 566a51e..dcca54c 100755 --- a/node/src/components/ThemeRegistry/theme.ts +++ b/node/src/components/ThemeRegistry/theme.ts @@ -7,31 +7,39 @@ display: 'swap', }); -const theme = createTheme({ - palette: { - mode: 'light', - }, - typography: { - fontFamily: roboto.style.fontFamily, - }, - components: { - MuiButton: { - styleOverrides: { - root: { - textTransform: 'none', - }, +const sharedComponents = { + MuiButton: { + styleOverrides: { + root: { + textTransform: 'none' as const, }, }, - MuiAlert: { - styleOverrides: { - root: ({ ownerState }) => ({ - ...(ownerState.severity === 'info' && { - backgroundColor: '#60a5fa', - }), + }, + MuiAlert: { + styleOverrides: { + root: ({ ownerState }: { ownerState: { severity?: string } }) => ({ + ...(ownerState.severity === 'info' && { + backgroundColor: '#60a5fa', }), - }, + }), }, }, +}; + +const sharedTypography = { + fontFamily: roboto.style.fontFamily, +}; + +export const lightTheme = createTheme({ + palette: { mode: 'light' }, + typography: sharedTypography, + components: sharedComponents, }); -export default theme; \ No newline at end of file +export const darkTheme = createTheme({ + palette: { mode: 'dark' }, + typography: sharedTypography, + components: sharedComponents, +}); + +export default lightTheme; \ No newline at end of file diff --git a/node/src/hooks/useWebRTC.tsx b/node/src/hooks/useWebRTC.tsx index ba8a142..13c708a 100755 --- a/node/src/hooks/useWebRTC.tsx +++ b/node/src/hooks/useWebRTC.tsx @@ -1,105 +1,207 @@ // useWebRTC.ts import { useState, useEffect, useRef, useCallback } from 'react' -interface useWebRTCReturn { - pc: RTCPeerConnection | null - localStream: MediaStream | null - ws: WebSocket | null - setURL: (wsUrl: string) => () => void +export type CallState = 'idle' | 'connecting' | 'connected' | 'failed' | 'ended' + +interface UseWebRTCOptions { + callId: string + wsUrl: string + onHangup?: () => void } -export function useWebRTC(): useWebRTCReturn { - const [pc, setPc] = useState(null) - const [localStream, setLocalStream] = useState(null) - const [ws, setWs] = useState(null) - const iceServers: RTCIceServer[] = [ - { urls: "stun:stun.l.google.com:19302" }, - { urls: "stun:stun1.l.google.com:19302" }, - { urls: "stun:stun2.l.google.com:19302" }, - { urls: "stun:stun3.l.google.com:19302" }, - { urls: "stun:stun4.l.google.com:19302" } - ] - // ICE候補を格納する配列(シグナリング送信用) - const iceCandidatesRef = useRef([]) +interface UseWebRTCReturn { + callState: CallState + localStream: MediaStream | null + remoteStream: MediaStream | null + isMuted: boolean + isCameraOff: boolean + toggleMute: () => void + toggleCamera: () => void + hangup: () => void + errorMessage: string | null +} - // WebSocket初期化 - const setURL = useCallback((wsUrl: string) => { - const socket = new WebSocket(wsUrl) - socket.onopen = () => { - console.log("WebSocket connected") - // WebSocket接続後にWebRTCの初期化を開始 - initWebRTC(socket) - } - socket.onmessage = (event: MessageEvent) => { - console.log("WebSocket message received:", event.data) - // ここでリモートからのシグナリング(アンサーやICE候補)を処理する - } - socket.onerror = (err) => { - console.error("WebSocket error:", err) - } - socket.onclose = () => { - console.log("WebSocket closed") - } - setWs(socket) - // クリーンアップ - return () => { - socket.close() - pc?.close() - } - // eslint-disable-next-line react-hooks/exhaustive-deps +const ICE_SERVERS: RTCIceServer[] = [ + { urls: 'stun:stun.l.google.com:19302' }, + { urls: 'stun:stun1.l.google.com:19302' }, + { urls: 'stun:stun2.l.google.com:19302' }, + { urls: 'stun:stun3.l.google.com:19302' }, + { urls: 'stun:stun4.l.google.com:19302' }, +] + +export function useWebRTC({ callId, wsUrl, onHangup }: UseWebRTCOptions): UseWebRTCReturn { + const [callState, setCallState] = useState('idle') + const [localStream, setLocalStream] = useState(null) + const [remoteStream, setRemoteStream] = useState(null) + const [isMuted, setIsMuted] = useState(false) + const [isCameraOff, setIsCameraOff] = useState(false) + const [errorMessage, setErrorMessage] = useState(null) + + // useRef でPCとWSを保持(非同期ハンドラ内でも最新値を参照できる) + const pcRef = useRef(null) + const wsRef = useRef(null) + const localStreamRef = useRef(null) + // remoteDescriptionが設定される前に届いたICE候補をバッファリング + const pendingCandidatesRef = useRef([]) + const callStateRef = useRef('idle') + + const updateCallState = useCallback((state: CallState) => { + callStateRef.current = state + setCallState(state) }, []) - // WebRTC初期化関数 - const initWebRTC = useCallback((socket: WebSocket) => { - // ユーザーに映像・音声の許可をリクエスト - navigator.mediaDevices.getUserMedia({ video: true, audio: true }) - .then(stream => { - setLocalStream(stream) - const connection = new RTCPeerConnection({ iceServers }) - // ローカルストリームの各トラックを追加 - stream.getTracks().forEach(track => connection.addTrack(track, stream)) - // ダミーデータチャネルを作成してICE候補収集を促進 - connection.createDataChannel("dummy") - // ICE候補イベントのハンドラ - connection.onicecandidate = (event) => { - console.log("ICE candidate event:", event) - if (event.candidate) { - iceCandidatesRef.current.push(event.candidate.toJSON()) - // 候補が見つかるたびに送信する(例:ここで個別送信) - socket.send(JSON.stringify({ - type: "ice", - candidate: event.candidate.toJSON() - })) - } else { - // ICE候補の収集が完了(candidateがnull) - const signalingMessage = { - type: "offer", - sdp: connection.localDescription ? connection.localDescription.sdp : null, - iceCandidates: iceCandidatesRef.current - } - console.log("Signaling JSON message:", JSON.stringify(signalingMessage, null, 2)) - socket.send(JSON.stringify(signalingMessage)) - } - } - connection.onicegatheringstatechange = () => { - console.log("ICE gathering state:", connection.iceGatheringState) - } - // SDPオファー生成とローカル記述の設定 - connection.createOffer() - .then(offer => { - console.log("Created SDP offer:", offer) - return connection.setLocalDescription(offer) - }) - .then(() => { - // setLocalDescription()実行後、ICE候補収集が開始される - setPc(connection) - }) - .catch(err => console.error("Error during SDP offer creation:", err)) - }) - .catch(err => { - console.error("Error getting user media:", err) - }) - }, [iceServers]) + const cleanup = useCallback(() => { + localStreamRef.current?.getTracks().forEach(track => track.stop()) + localStreamRef.current = null + setLocalStream(null) + if (pcRef.current) { + pcRef.current.close() + pcRef.current = null + } + if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) { + wsRef.current.close() + } + wsRef.current = null + pendingCandidatesRef.current = [] + }, []) - return { pc, localStream, ws, setURL } + useEffect(() => { + if (!callId || !wsUrl) return + + updateCallState('idle') + const socket = new WebSocket(wsUrl) + wsRef.current = socket + + socket.onopen = () => { + console.log('WebSocket connected') + navigator.mediaDevices.getUserMedia({ video: true, audio: true }) + .then(stream => { + localStreamRef.current = stream + setLocalStream(stream) + + const pc = new RTCPeerConnection({ iceServers: ICE_SERVERS }) + pcRef.current = pc + + stream.getTracks().forEach(track => pc.addTrack(track, stream)) + + pc.ontrack = (event) => { + if (event.streams?.[0]) setRemoteStream(event.streams[0]) + } + + pc.oniceconnectionstatechange = () => { + console.log('ICE connection state:', pc.iceConnectionState) + if (pc.iceConnectionState === 'connected' || pc.iceConnectionState === 'completed') { + updateCallState('connected') + } else if (pc.iceConnectionState === 'failed' || pc.iceConnectionState === 'disconnected') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + // Trickle ICE: 候補が見つかる都度送信 + pc.onicecandidate = (event) => { + if (socket.readyState !== WebSocket.OPEN) return + socket.send(JSON.stringify({ + type: 'ice', + callId, + candidate: event.candidate ? event.candidate.toJSON() : null, + })) + } + + pc.createOffer() + .then(offer => pc.setLocalDescription(offer)) + .then(() => { + if (socket.readyState !== WebSocket.OPEN || !pc.localDescription) return + socket.send(JSON.stringify({ type: 'offer', callId, sdp: pc.localDescription.sdp })) + updateCallState('connecting') + }) + .catch(err => { + console.error('SDP offer error:', err) + updateCallState('failed') + setErrorMessage('接続の開始に失敗しました') + }) + }) + .catch(err => { + console.error('getUserMedia error:', err) + updateCallState('failed') + setErrorMessage('カメラ・マイクへのアクセスが拒否されました') + }) + } + + socket.onmessage = async (event: MessageEvent) => { + let msg: { type: string; sdp?: string; candidate?: RTCIceCandidateInit | null; message?: string } + try { msg = JSON.parse(event.data) } catch { return } + console.log('WebSocket message:', msg.type) + + const pc = pcRef.current + switch (msg.type) { + case 'answer': + if (!pc || !msg.sdp) break + await pc.setRemoteDescription({ type: 'answer', sdp: msg.sdp }).catch(console.error) + for (const c of pendingCandidatesRef.current) { + await pc.addIceCandidate(c).catch(console.error) + } + pendingCandidatesRef.current = [] + break + case 'ice': + if (!pc || msg.candidate == null) break + if (pc.remoteDescription) { + await pc.addIceCandidate(msg.candidate).catch(console.error) + } else { + pendingCandidatesRef.current.push(msg.candidate) + } + break + case 'hangup': + cleanup() + updateCallState('ended') + onHangup?.() + break + case 'error': + updateCallState('failed') + setErrorMessage(msg.message ?? '接続エラーが発生しました') + break + } + } + + socket.onerror = () => { + if (callStateRef.current !== 'ended') { + updateCallState('failed') + setErrorMessage('通信エラーが発生しました') + } + } + + socket.onclose = () => { + if (callStateRef.current !== 'ended' && callStateRef.current !== 'failed') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + return () => { cleanup() } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [wsUrl, callId]) + + const hangup = useCallback(() => { + if (wsRef.current?.readyState === WebSocket.OPEN) { + wsRef.current.send(JSON.stringify({ type: 'hangup', callId })) + } + cleanup() + updateCallState('ended') + }, [callId, cleanup, updateCallState]) + + const toggleMute = useCallback(() => { + const track = localStreamRef.current?.getAudioTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsMuted(!track.enabled) + }, []) + + const toggleCamera = useCallback(() => { + const track = localStreamRef.current?.getVideoTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsCameraOff(!track.enabled) + }, []) + + return { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup, errorMessage } } diff --git a/node/src/types/globals.d.ts b/node/src/types/globals.d.ts index ca54560..ff05c42 100755 --- a/node/src/types/globals.d.ts +++ b/node/src/types/globals.d.ts @@ -1,3 +1,5 @@ +declare module '*.css' {} + export {} declare global { diff --git a/node/src/utils/index.ts b/node/src/utils/index.ts index cf37f87..5644c75 100644 --- a/node/src/utils/index.ts +++ b/node/src/utils/index.ts @@ -5,13 +5,31 @@ if (/android/i.test(ua)) { return "Android" } - else if (/iPad|iPhone|iPod/.test(ua)) { + else if (/iPad|iPhone|iPod/.test(ua) || (/Macintosh/.test(ua) && navigator.maxTouchPoints > 1)) { return "iOS" } return "Other" } +// iOS の major version を返す。取得できない場合は null。 +// iOS 26 以降、Apple は "CPU iPhone OS" トークンを 18_7 で凍結しており +// (フィンガープリンティング対策)、実バージョンは Safari の "Version/26.x" 側にしか +// 出ない。逆に WebView 等では "Version/" が無い。そのため両方を見て大きい方を採用する。 +// iPad (iPadOS 13+) は UA が Macintosh 偽装で "iPhone OS" トークンが無く、 +// "Version/" のみが手がかりになる。 +export const getIOSVersion = (): number | null => { + if (typeof window === 'undefined') return null + const ua = window.navigator.userAgent + const osMatch = ua.match(/OS (\d+)_/) + const versionMatch = ua.match(/Version\/(\d+)/) + const candidates = [osMatch, versionMatch] + .map(m => (m ? parseInt(m[1], 10) : NaN)) + .filter(n => !isNaN(n)) + if (candidates.length === 0) return null + return Math.max(...candidates) +} + export const getBrowser = (): string => { if (typeof window === 'undefined') return 'Other' diff --git a/node/ssh/authorized_keys b/node/ssh/authorized_keys new file mode 100755 index 0000000..306005e --- /dev/null +++ b/node/ssh/authorized_keys @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO/cW740yjBdFlyGXuYsSZOd7CJEneHiJswkPCHuaNLP raikyakun-codex diff --git a/public.tar.gz b/public.tar.gz index 6e5e922..616135a 100644 --- a/public.tar.gz +++ b/public.tar.gz Binary files differ diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/node/src/app/call/page.tsx b/node/src/app/call/page.tsx new file mode 100644 index 0000000..4075387 --- /dev/null +++ b/node/src/app/call/page.tsx @@ -0,0 +1,128 @@ +'use client' +import { Suspense, useEffect, useRef } from 'react' +import { useSearchParams, useRouter } from 'next/navigation' +import { IconButton, Typography } from '@mui/material' +import { + Mic as MicIcon, + MicOff as MicOffIcon, + Videocam as VideocamIcon, + VideocamOff as VideocamOffIcon, + CallEnd as CallEndIcon, +} from '@mui/icons-material' +import { useWebRTC } from '@/hooks' +import './page.css' + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 +function CallPageInner() { + const searchParams = useSearchParams() + const router = useRouter() + const callId = searchParams.get('callId') ?? '' + const accessKey = searchParams.get('accessKey') ?? '' + + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? '' + const wsUrl = callId && accessKey + ? baseUrl.replace(/^https?:\/\//, 'wss://') + `/api/mobile/${accessKey}/call/${callId}` + : '' + + const { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup } = + useWebRTC({ callId, wsUrl, onHangup: () => {} }) + + const remoteVideoRef = useRef(null) + const localVideoRef = useRef(null) + + useEffect(() => { + if (remoteVideoRef.current && remoteStream) { + remoteVideoRef.current.srcObject = remoteStream + } + }, [remoteStream]) + + useEffect(() => { + if (localVideoRef.current && localStream) { + localVideoRef.current.srcObject = localStream + } + }, [localStream]) + + // 通話終了・失敗時は2秒後に前のページへ戻る + useEffect(() => { + if (callState === 'ended' || callState === 'failed') { + const timer = setTimeout(() => router.back(), 2000) + return () => clearTimeout(timer) + } + }, [callState, router]) + + const statusText: Record = { + connecting: '接続中…', + failed: '接続に失敗しました', + ended: '通話終了', + } + + const isEnded = callState === 'ended' || callState === 'failed' + + return ( +
+ {/* リモート映像(全画面) */} +
+ ) +} + +export default function CallPage() { + return ( + }> + + + ) +} diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100644 new mode 100755 index 50bc743..8d56ba1 --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -28,7 +28,8 @@ - + + (null) const [osDetected, setOsDetected] = useState(false) const [installPrompt, setInstallPrompt] = useState(null) @@ -37,9 +36,15 @@ const browser = getBrowser() setOS(os) setBrowser(browser) + setIosVersion(getIOSVersion()) setOsDetected(true) - setIsStandalone(window.matchMedia('(display-mode: standalone)').matches) + // iOS は display-mode メディアクエリが home screen 起動でも false を返すことがある。 + // iOS の正規シグナルは navigator.standalone なので両方を OR で判定する。 + setIsStandalone( + window.matchMedia('(display-mode: standalone)').matches || + (window.navigator as { standalone?: boolean }).standalone === true, + ) navigator.getInstalledRelatedApps?.().then(apps => { setIsInstalled(apps.length > 0) @@ -102,7 +107,7 @@ const registerMode = isStandalone || (!installPrompt && !isInstalled) ? 'allowed' : installPrompt ? 'install-required' : 'hidden' - const { Subscribe, errorMessage, accessKey, isSubscribed, canSubscribe, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) + const { Subscribe, errorMessage, accessKey, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) @@ -218,7 +223,7 @@ )} - {os === 'iOS' && browser === 'Safari' && !isStandalone && } + {os === 'iOS' && browser === 'Safari' && !isStandalone && = 26 ? '/images/install_for_ios26.svg' : '/images/install_for_ios.png'} />} {os === 'Android' && (isStandalone || isInstalled) && 通知が届かなくなった場合
@@ -231,36 +236,3 @@ ) } - - -const ServiceWorkerStatus: React.FC = () => { - const [registrations, setRegistrations] = useState(['確認中...']); - - useEffect(() => { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.getRegistrations().then(regs => { - if (regs.length === 0) { - setRegistrations(['サービスワーカーは登録されていません。']); - } else { - const swInfo = regs.map((reg, index) => - `(${index + 1}) スコープ: ${reg.scope}, 状態: ${reg.active ? 'アクティブ' : '非アクティブ'}` - ); - setRegistrations(swInfo); - } - }); - } else { - setRegistrations(['このブラウザはサービスワーカーをサポートしていません。']); - } - }, []); - - return ( -
-

Service Workerの状態

-
    - {registrations.map((reg, index) => ( -
  • {reg}
  • - ))} -
-
- ); - }; \ No newline at end of file diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx old mode 100755 new mode 100644 index 540d330..4a8dc66 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -1,5 +1,5 @@ 'use client' -import { useEffect, useMemo, useState, useCallback } from 'react' +import { useEffect, useMemo, useState, useCallback, useRef } from 'react' import webpush from 'web-push' import { Button, FormHelperText, Alert, FormControl, InputLabel, OutlinedInput, InputAdornment, IconButton, Tooltip, ClickAwayListener, Tabs, CircularProgress } from '@mui/material' import { ContentPasteGo as ContentPasteGoIcon } from '@mui/icons-material' @@ -30,9 +30,12 @@ const [isLoading, setIsLoading] = useState(true) const [pushSupported, setPushSupported] = useState(null) const [state, setState] = useState<{status: string, token: string | null}>({ status: 'unknown', token: null }) + // 最後に checkAccessKey へ渡したキー。手入力 blur 時の二重照会 (ペースト → blur 等) を防ぐ。 + const lastCheckedAccessKeyRef = useRef('') // アクセスキーが入力されたらサーバへ問い合わせる const checkAccessKey = useCallback((newAccessKey: string) => { + lastCheckedAccessKeyRef.current = newAccessKey setAccessKey(newAccessKey) setIsLoading(true) setAccessKeyError(null) @@ -83,10 +86,11 @@ console.error('GET /accessKey failed', e) } - // 2. URLハッシュのキーを取得し、即座に消去 + // 2. URLハッシュのキーを取得 (ハッシュは URL に残す。 + // deep link / bookmark / タブ復元で再適用できるようにするため。 + // キー変更をキャンセルした時のみ後段で消去する)。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - if (hashKey) history.replaceState(null, '', location.pathname + location.search) // 3. localStorageからCookieへ移行(CookieもURLハッシュもない場合) let migratedKey: string | null = null @@ -172,7 +176,10 @@ checkAccessKey(hashKey) return } - // キャンセル: 旧キーのまま継続(hashKeyは消去済み、CookieはcookieKeyのまま) + // キャンセル: 旧キーのまま継続(Cookie は cookieKey のまま)。 + // 拒否したキーが URL ハッシュに残ると reload のたびに再プロンプトになるため、 + // このケースだけハッシュを消去する。 + history.replaceState(null, '', location.pathname + location.search) keyChangeCancelled = true } @@ -380,9 +387,21 @@ : undefined } label="アクセスキー" - placeholder="(タップしてペースト)" + placeholder="(タップしてペースト、または入力)" onPaste={e => !isLoading && !isSubscribed && checkAccessKey(e.clipboardData.getData('text'))} - readOnly + onChange={e => { + // 手入力中は値の更新のみ。サーバ照会は blur 時にまとめて行う。 + if (isLoading || isSubscribed) return + setAccessKey(e.target.value) + setAccessKeyError(null) + }} + onBlur={() => { + // 手入力でフォーカスが外れたタイミングで照会。 + // ペースト経路 (onPaste / ペーストボタン) は既に checkAccessKey 済みなので + // lastCheckedAccessKeyRef との比較で二重照会を防ぐ。 + if (isLoading || isSubscribed) return + if (accessKey && accessKey !== lastCheckedAccessKeyRef.current) checkAccessKey(accessKey) + }} disabled={isLoading} inputProps={{ size: 20 }} sx={{fontFamily: 'monospace'}} /> @@ -399,7 +418,8 @@ プッシュ通知にはSafariで開く必要があります } - {pushSupported === false && os !== 'iOS' && このブラウザはプッシュ通知に対応していません。AndroidはChromeでお開きください。} + {pushSupported === false && os === 'Android' && このブラウザはプッシュ通知に対応していません。Chromeでお開きください。} + {pushSupported === false && os !== 'iOS' && os !== 'Android' && このブラウザはプッシュ通知に対応していません。} {registerMode === 'allowed' && os === 'iOS' && browser === 'Safari' && !isStandalone && プッシュ通知にはホーム画面への追加が必要です。画面下部の共有ボタン(□↑)から「ホーム画面に追加」を選んでください} {registerMode === 'allowed' && !(os === 'iOS' && browser === 'Safari' && !isStandalone) && pushSupported !== false && } {registerMode === 'install-required' && プッシュ通知を受け取るにはWebアプリとしてインストールしてください} diff --git a/node/src/components/ThemeRegistry/ThemeRegistry.tsx b/node/src/components/ThemeRegistry/ThemeRegistry.tsx index 1c48312..e127dab 100755 --- a/node/src/components/ThemeRegistry/ThemeRegistry.tsx +++ b/node/src/components/ThemeRegistry/ThemeRegistry.tsx @@ -2,15 +2,17 @@ import * as React from 'react'; import { ThemeProvider } from '@mui/material/styles'; +import useMediaQuery from '@mui/material/useMediaQuery'; import CssBaseline from '@mui/material/CssBaseline'; import NextAppDirEmotionCacheProvider from './EmotionCache'; -import theme from './theme'; +import { lightTheme, darkTheme } from './theme'; export default function ThemeRegistry({ children }: { children: React.ReactNode }) { + const prefersDark = useMediaQuery('(prefers-color-scheme: dark)'); + return ( - - {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */} + {children} diff --git a/node/src/components/ThemeRegistry/theme.ts b/node/src/components/ThemeRegistry/theme.ts index 566a51e..dcca54c 100755 --- a/node/src/components/ThemeRegistry/theme.ts +++ b/node/src/components/ThemeRegistry/theme.ts @@ -7,31 +7,39 @@ display: 'swap', }); -const theme = createTheme({ - palette: { - mode: 'light', - }, - typography: { - fontFamily: roboto.style.fontFamily, - }, - components: { - MuiButton: { - styleOverrides: { - root: { - textTransform: 'none', - }, +const sharedComponents = { + MuiButton: { + styleOverrides: { + root: { + textTransform: 'none' as const, }, }, - MuiAlert: { - styleOverrides: { - root: ({ ownerState }) => ({ - ...(ownerState.severity === 'info' && { - backgroundColor: '#60a5fa', - }), + }, + MuiAlert: { + styleOverrides: { + root: ({ ownerState }: { ownerState: { severity?: string } }) => ({ + ...(ownerState.severity === 'info' && { + backgroundColor: '#60a5fa', }), - }, + }), }, }, +}; + +const sharedTypography = { + fontFamily: roboto.style.fontFamily, +}; + +export const lightTheme = createTheme({ + palette: { mode: 'light' }, + typography: sharedTypography, + components: sharedComponents, }); -export default theme; \ No newline at end of file +export const darkTheme = createTheme({ + palette: { mode: 'dark' }, + typography: sharedTypography, + components: sharedComponents, +}); + +export default lightTheme; \ No newline at end of file diff --git a/node/src/hooks/useWebRTC.tsx b/node/src/hooks/useWebRTC.tsx index ba8a142..13c708a 100755 --- a/node/src/hooks/useWebRTC.tsx +++ b/node/src/hooks/useWebRTC.tsx @@ -1,105 +1,207 @@ // useWebRTC.ts import { useState, useEffect, useRef, useCallback } from 'react' -interface useWebRTCReturn { - pc: RTCPeerConnection | null - localStream: MediaStream | null - ws: WebSocket | null - setURL: (wsUrl: string) => () => void +export type CallState = 'idle' | 'connecting' | 'connected' | 'failed' | 'ended' + +interface UseWebRTCOptions { + callId: string + wsUrl: string + onHangup?: () => void } -export function useWebRTC(): useWebRTCReturn { - const [pc, setPc] = useState(null) - const [localStream, setLocalStream] = useState(null) - const [ws, setWs] = useState(null) - const iceServers: RTCIceServer[] = [ - { urls: "stun:stun.l.google.com:19302" }, - { urls: "stun:stun1.l.google.com:19302" }, - { urls: "stun:stun2.l.google.com:19302" }, - { urls: "stun:stun3.l.google.com:19302" }, - { urls: "stun:stun4.l.google.com:19302" } - ] - // ICE候補を格納する配列(シグナリング送信用) - const iceCandidatesRef = useRef([]) +interface UseWebRTCReturn { + callState: CallState + localStream: MediaStream | null + remoteStream: MediaStream | null + isMuted: boolean + isCameraOff: boolean + toggleMute: () => void + toggleCamera: () => void + hangup: () => void + errorMessage: string | null +} - // WebSocket初期化 - const setURL = useCallback((wsUrl: string) => { - const socket = new WebSocket(wsUrl) - socket.onopen = () => { - console.log("WebSocket connected") - // WebSocket接続後にWebRTCの初期化を開始 - initWebRTC(socket) - } - socket.onmessage = (event: MessageEvent) => { - console.log("WebSocket message received:", event.data) - // ここでリモートからのシグナリング(アンサーやICE候補)を処理する - } - socket.onerror = (err) => { - console.error("WebSocket error:", err) - } - socket.onclose = () => { - console.log("WebSocket closed") - } - setWs(socket) - // クリーンアップ - return () => { - socket.close() - pc?.close() - } - // eslint-disable-next-line react-hooks/exhaustive-deps +const ICE_SERVERS: RTCIceServer[] = [ + { urls: 'stun:stun.l.google.com:19302' }, + { urls: 'stun:stun1.l.google.com:19302' }, + { urls: 'stun:stun2.l.google.com:19302' }, + { urls: 'stun:stun3.l.google.com:19302' }, + { urls: 'stun:stun4.l.google.com:19302' }, +] + +export function useWebRTC({ callId, wsUrl, onHangup }: UseWebRTCOptions): UseWebRTCReturn { + const [callState, setCallState] = useState('idle') + const [localStream, setLocalStream] = useState(null) + const [remoteStream, setRemoteStream] = useState(null) + const [isMuted, setIsMuted] = useState(false) + const [isCameraOff, setIsCameraOff] = useState(false) + const [errorMessage, setErrorMessage] = useState(null) + + // useRef でPCとWSを保持(非同期ハンドラ内でも最新値を参照できる) + const pcRef = useRef(null) + const wsRef = useRef(null) + const localStreamRef = useRef(null) + // remoteDescriptionが設定される前に届いたICE候補をバッファリング + const pendingCandidatesRef = useRef([]) + const callStateRef = useRef('idle') + + const updateCallState = useCallback((state: CallState) => { + callStateRef.current = state + setCallState(state) }, []) - // WebRTC初期化関数 - const initWebRTC = useCallback((socket: WebSocket) => { - // ユーザーに映像・音声の許可をリクエスト - navigator.mediaDevices.getUserMedia({ video: true, audio: true }) - .then(stream => { - setLocalStream(stream) - const connection = new RTCPeerConnection({ iceServers }) - // ローカルストリームの各トラックを追加 - stream.getTracks().forEach(track => connection.addTrack(track, stream)) - // ダミーデータチャネルを作成してICE候補収集を促進 - connection.createDataChannel("dummy") - // ICE候補イベントのハンドラ - connection.onicecandidate = (event) => { - console.log("ICE candidate event:", event) - if (event.candidate) { - iceCandidatesRef.current.push(event.candidate.toJSON()) - // 候補が見つかるたびに送信する(例:ここで個別送信) - socket.send(JSON.stringify({ - type: "ice", - candidate: event.candidate.toJSON() - })) - } else { - // ICE候補の収集が完了(candidateがnull) - const signalingMessage = { - type: "offer", - sdp: connection.localDescription ? connection.localDescription.sdp : null, - iceCandidates: iceCandidatesRef.current - } - console.log("Signaling JSON message:", JSON.stringify(signalingMessage, null, 2)) - socket.send(JSON.stringify(signalingMessage)) - } - } - connection.onicegatheringstatechange = () => { - console.log("ICE gathering state:", connection.iceGatheringState) - } - // SDPオファー生成とローカル記述の設定 - connection.createOffer() - .then(offer => { - console.log("Created SDP offer:", offer) - return connection.setLocalDescription(offer) - }) - .then(() => { - // setLocalDescription()実行後、ICE候補収集が開始される - setPc(connection) - }) - .catch(err => console.error("Error during SDP offer creation:", err)) - }) - .catch(err => { - console.error("Error getting user media:", err) - }) - }, [iceServers]) + const cleanup = useCallback(() => { + localStreamRef.current?.getTracks().forEach(track => track.stop()) + localStreamRef.current = null + setLocalStream(null) + if (pcRef.current) { + pcRef.current.close() + pcRef.current = null + } + if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) { + wsRef.current.close() + } + wsRef.current = null + pendingCandidatesRef.current = [] + }, []) - return { pc, localStream, ws, setURL } + useEffect(() => { + if (!callId || !wsUrl) return + + updateCallState('idle') + const socket = new WebSocket(wsUrl) + wsRef.current = socket + + socket.onopen = () => { + console.log('WebSocket connected') + navigator.mediaDevices.getUserMedia({ video: true, audio: true }) + .then(stream => { + localStreamRef.current = stream + setLocalStream(stream) + + const pc = new RTCPeerConnection({ iceServers: ICE_SERVERS }) + pcRef.current = pc + + stream.getTracks().forEach(track => pc.addTrack(track, stream)) + + pc.ontrack = (event) => { + if (event.streams?.[0]) setRemoteStream(event.streams[0]) + } + + pc.oniceconnectionstatechange = () => { + console.log('ICE connection state:', pc.iceConnectionState) + if (pc.iceConnectionState === 'connected' || pc.iceConnectionState === 'completed') { + updateCallState('connected') + } else if (pc.iceConnectionState === 'failed' || pc.iceConnectionState === 'disconnected') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + // Trickle ICE: 候補が見つかる都度送信 + pc.onicecandidate = (event) => { + if (socket.readyState !== WebSocket.OPEN) return + socket.send(JSON.stringify({ + type: 'ice', + callId, + candidate: event.candidate ? event.candidate.toJSON() : null, + })) + } + + pc.createOffer() + .then(offer => pc.setLocalDescription(offer)) + .then(() => { + if (socket.readyState !== WebSocket.OPEN || !pc.localDescription) return + socket.send(JSON.stringify({ type: 'offer', callId, sdp: pc.localDescription.sdp })) + updateCallState('connecting') + }) + .catch(err => { + console.error('SDP offer error:', err) + updateCallState('failed') + setErrorMessage('接続の開始に失敗しました') + }) + }) + .catch(err => { + console.error('getUserMedia error:', err) + updateCallState('failed') + setErrorMessage('カメラ・マイクへのアクセスが拒否されました') + }) + } + + socket.onmessage = async (event: MessageEvent) => { + let msg: { type: string; sdp?: string; candidate?: RTCIceCandidateInit | null; message?: string } + try { msg = JSON.parse(event.data) } catch { return } + console.log('WebSocket message:', msg.type) + + const pc = pcRef.current + switch (msg.type) { + case 'answer': + if (!pc || !msg.sdp) break + await pc.setRemoteDescription({ type: 'answer', sdp: msg.sdp }).catch(console.error) + for (const c of pendingCandidatesRef.current) { + await pc.addIceCandidate(c).catch(console.error) + } + pendingCandidatesRef.current = [] + break + case 'ice': + if (!pc || msg.candidate == null) break + if (pc.remoteDescription) { + await pc.addIceCandidate(msg.candidate).catch(console.error) + } else { + pendingCandidatesRef.current.push(msg.candidate) + } + break + case 'hangup': + cleanup() + updateCallState('ended') + onHangup?.() + break + case 'error': + updateCallState('failed') + setErrorMessage(msg.message ?? '接続エラーが発生しました') + break + } + } + + socket.onerror = () => { + if (callStateRef.current !== 'ended') { + updateCallState('failed') + setErrorMessage('通信エラーが発生しました') + } + } + + socket.onclose = () => { + if (callStateRef.current !== 'ended' && callStateRef.current !== 'failed') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + return () => { cleanup() } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [wsUrl, callId]) + + const hangup = useCallback(() => { + if (wsRef.current?.readyState === WebSocket.OPEN) { + wsRef.current.send(JSON.stringify({ type: 'hangup', callId })) + } + cleanup() + updateCallState('ended') + }, [callId, cleanup, updateCallState]) + + const toggleMute = useCallback(() => { + const track = localStreamRef.current?.getAudioTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsMuted(!track.enabled) + }, []) + + const toggleCamera = useCallback(() => { + const track = localStreamRef.current?.getVideoTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsCameraOff(!track.enabled) + }, []) + + return { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup, errorMessage } } diff --git a/node/src/types/globals.d.ts b/node/src/types/globals.d.ts index ca54560..ff05c42 100755 --- a/node/src/types/globals.d.ts +++ b/node/src/types/globals.d.ts @@ -1,3 +1,5 @@ +declare module '*.css' {} + export {} declare global { diff --git a/node/src/utils/index.ts b/node/src/utils/index.ts index cf37f87..5644c75 100644 --- a/node/src/utils/index.ts +++ b/node/src/utils/index.ts @@ -5,13 +5,31 @@ if (/android/i.test(ua)) { return "Android" } - else if (/iPad|iPhone|iPod/.test(ua)) { + else if (/iPad|iPhone|iPod/.test(ua) || (/Macintosh/.test(ua) && navigator.maxTouchPoints > 1)) { return "iOS" } return "Other" } +// iOS の major version を返す。取得できない場合は null。 +// iOS 26 以降、Apple は "CPU iPhone OS" トークンを 18_7 で凍結しており +// (フィンガープリンティング対策)、実バージョンは Safari の "Version/26.x" 側にしか +// 出ない。逆に WebView 等では "Version/" が無い。そのため両方を見て大きい方を採用する。 +// iPad (iPadOS 13+) は UA が Macintosh 偽装で "iPhone OS" トークンが無く、 +// "Version/" のみが手がかりになる。 +export const getIOSVersion = (): number | null => { + if (typeof window === 'undefined') return null + const ua = window.navigator.userAgent + const osMatch = ua.match(/OS (\d+)_/) + const versionMatch = ua.match(/Version\/(\d+)/) + const candidates = [osMatch, versionMatch] + .map(m => (m ? parseInt(m[1], 10) : NaN)) + .filter(n => !isNaN(n)) + if (candidates.length === 0) return null + return Math.max(...candidates) +} + export const getBrowser = (): string => { if (typeof window === 'undefined') return 'Other' diff --git a/node/ssh/authorized_keys b/node/ssh/authorized_keys new file mode 100755 index 0000000..306005e --- /dev/null +++ b/node/ssh/authorized_keys @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO/cW740yjBdFlyGXuYsSZOd7CJEneHiJswkPCHuaNLP raikyakun-codex diff --git a/public.tar.gz b/public.tar.gz index 6e5e922..616135a 100644 --- a/public.tar.gz +++ b/public.tar.gz Binary files differ diff --git a/standalone.tar.gz b/standalone.tar.gz index bf8f4c6..324d820 100644 --- a/standalone.tar.gz +++ b/standalone.tar.gz Binary files differ diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/node/src/app/call/page.tsx b/node/src/app/call/page.tsx new file mode 100644 index 0000000..4075387 --- /dev/null +++ b/node/src/app/call/page.tsx @@ -0,0 +1,128 @@ +'use client' +import { Suspense, useEffect, useRef } from 'react' +import { useSearchParams, useRouter } from 'next/navigation' +import { IconButton, Typography } from '@mui/material' +import { + Mic as MicIcon, + MicOff as MicOffIcon, + Videocam as VideocamIcon, + VideocamOff as VideocamOffIcon, + CallEnd as CallEndIcon, +} from '@mui/icons-material' +import { useWebRTC } from '@/hooks' +import './page.css' + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 +function CallPageInner() { + const searchParams = useSearchParams() + const router = useRouter() + const callId = searchParams.get('callId') ?? '' + const accessKey = searchParams.get('accessKey') ?? '' + + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? '' + const wsUrl = callId && accessKey + ? baseUrl.replace(/^https?:\/\//, 'wss://') + `/api/mobile/${accessKey}/call/${callId}` + : '' + + const { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup } = + useWebRTC({ callId, wsUrl, onHangup: () => {} }) + + const remoteVideoRef = useRef(null) + const localVideoRef = useRef(null) + + useEffect(() => { + if (remoteVideoRef.current && remoteStream) { + remoteVideoRef.current.srcObject = remoteStream + } + }, [remoteStream]) + + useEffect(() => { + if (localVideoRef.current && localStream) { + localVideoRef.current.srcObject = localStream + } + }, [localStream]) + + // 通話終了・失敗時は2秒後に前のページへ戻る + useEffect(() => { + if (callState === 'ended' || callState === 'failed') { + const timer = setTimeout(() => router.back(), 2000) + return () => clearTimeout(timer) + } + }, [callState, router]) + + const statusText: Record = { + connecting: '接続中…', + failed: '接続に失敗しました', + ended: '通話終了', + } + + const isEnded = callState === 'ended' || callState === 'failed' + + return ( +
+ {/* リモート映像(全画面) */} +
+ ) +} + +export default function CallPage() { + return ( + }> + + + ) +} diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100644 new mode 100755 index 50bc743..8d56ba1 --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -28,7 +28,8 @@ - + + (null) const [osDetected, setOsDetected] = useState(false) const [installPrompt, setInstallPrompt] = useState(null) @@ -37,9 +36,15 @@ const browser = getBrowser() setOS(os) setBrowser(browser) + setIosVersion(getIOSVersion()) setOsDetected(true) - setIsStandalone(window.matchMedia('(display-mode: standalone)').matches) + // iOS は display-mode メディアクエリが home screen 起動でも false を返すことがある。 + // iOS の正規シグナルは navigator.standalone なので両方を OR で判定する。 + setIsStandalone( + window.matchMedia('(display-mode: standalone)').matches || + (window.navigator as { standalone?: boolean }).standalone === true, + ) navigator.getInstalledRelatedApps?.().then(apps => { setIsInstalled(apps.length > 0) @@ -102,7 +107,7 @@ const registerMode = isStandalone || (!installPrompt && !isInstalled) ? 'allowed' : installPrompt ? 'install-required' : 'hidden' - const { Subscribe, errorMessage, accessKey, isSubscribed, canSubscribe, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) + const { Subscribe, errorMessage, accessKey, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) @@ -218,7 +223,7 @@ )} - {os === 'iOS' && browser === 'Safari' && !isStandalone && } + {os === 'iOS' && browser === 'Safari' && !isStandalone && = 26 ? '/images/install_for_ios26.svg' : '/images/install_for_ios.png'} />} {os === 'Android' && (isStandalone || isInstalled) && 通知が届かなくなった場合
@@ -231,36 +236,3 @@ ) } - - -const ServiceWorkerStatus: React.FC = () => { - const [registrations, setRegistrations] = useState(['確認中...']); - - useEffect(() => { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.getRegistrations().then(regs => { - if (regs.length === 0) { - setRegistrations(['サービスワーカーは登録されていません。']); - } else { - const swInfo = regs.map((reg, index) => - `(${index + 1}) スコープ: ${reg.scope}, 状態: ${reg.active ? 'アクティブ' : '非アクティブ'}` - ); - setRegistrations(swInfo); - } - }); - } else { - setRegistrations(['このブラウザはサービスワーカーをサポートしていません。']); - } - }, []); - - return ( -
-

Service Workerの状態

-
    - {registrations.map((reg, index) => ( -
  • {reg}
  • - ))} -
-
- ); - }; \ No newline at end of file diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx old mode 100755 new mode 100644 index 540d330..4a8dc66 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -1,5 +1,5 @@ 'use client' -import { useEffect, useMemo, useState, useCallback } from 'react' +import { useEffect, useMemo, useState, useCallback, useRef } from 'react' import webpush from 'web-push' import { Button, FormHelperText, Alert, FormControl, InputLabel, OutlinedInput, InputAdornment, IconButton, Tooltip, ClickAwayListener, Tabs, CircularProgress } from '@mui/material' import { ContentPasteGo as ContentPasteGoIcon } from '@mui/icons-material' @@ -30,9 +30,12 @@ const [isLoading, setIsLoading] = useState(true) const [pushSupported, setPushSupported] = useState(null) const [state, setState] = useState<{status: string, token: string | null}>({ status: 'unknown', token: null }) + // 最後に checkAccessKey へ渡したキー。手入力 blur 時の二重照会 (ペースト → blur 等) を防ぐ。 + const lastCheckedAccessKeyRef = useRef('') // アクセスキーが入力されたらサーバへ問い合わせる const checkAccessKey = useCallback((newAccessKey: string) => { + lastCheckedAccessKeyRef.current = newAccessKey setAccessKey(newAccessKey) setIsLoading(true) setAccessKeyError(null) @@ -83,10 +86,11 @@ console.error('GET /accessKey failed', e) } - // 2. URLハッシュのキーを取得し、即座に消去 + // 2. URLハッシュのキーを取得 (ハッシュは URL に残す。 + // deep link / bookmark / タブ復元で再適用できるようにするため。 + // キー変更をキャンセルした時のみ後段で消去する)。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - if (hashKey) history.replaceState(null, '', location.pathname + location.search) // 3. localStorageからCookieへ移行(CookieもURLハッシュもない場合) let migratedKey: string | null = null @@ -172,7 +176,10 @@ checkAccessKey(hashKey) return } - // キャンセル: 旧キーのまま継続(hashKeyは消去済み、CookieはcookieKeyのまま) + // キャンセル: 旧キーのまま継続(Cookie は cookieKey のまま)。 + // 拒否したキーが URL ハッシュに残ると reload のたびに再プロンプトになるため、 + // このケースだけハッシュを消去する。 + history.replaceState(null, '', location.pathname + location.search) keyChangeCancelled = true } @@ -380,9 +387,21 @@ : undefined } label="アクセスキー" - placeholder="(タップしてペースト)" + placeholder="(タップしてペースト、または入力)" onPaste={e => !isLoading && !isSubscribed && checkAccessKey(e.clipboardData.getData('text'))} - readOnly + onChange={e => { + // 手入力中は値の更新のみ。サーバ照会は blur 時にまとめて行う。 + if (isLoading || isSubscribed) return + setAccessKey(e.target.value) + setAccessKeyError(null) + }} + onBlur={() => { + // 手入力でフォーカスが外れたタイミングで照会。 + // ペースト経路 (onPaste / ペーストボタン) は既に checkAccessKey 済みなので + // lastCheckedAccessKeyRef との比較で二重照会を防ぐ。 + if (isLoading || isSubscribed) return + if (accessKey && accessKey !== lastCheckedAccessKeyRef.current) checkAccessKey(accessKey) + }} disabled={isLoading} inputProps={{ size: 20 }} sx={{fontFamily: 'monospace'}} /> @@ -399,7 +418,8 @@ プッシュ通知にはSafariで開く必要があります } - {pushSupported === false && os !== 'iOS' && このブラウザはプッシュ通知に対応していません。AndroidはChromeでお開きください。} + {pushSupported === false && os === 'Android' && このブラウザはプッシュ通知に対応していません。Chromeでお開きください。} + {pushSupported === false && os !== 'iOS' && os !== 'Android' && このブラウザはプッシュ通知に対応していません。} {registerMode === 'allowed' && os === 'iOS' && browser === 'Safari' && !isStandalone && プッシュ通知にはホーム画面への追加が必要です。画面下部の共有ボタン(□↑)から「ホーム画面に追加」を選んでください} {registerMode === 'allowed' && !(os === 'iOS' && browser === 'Safari' && !isStandalone) && pushSupported !== false && } {registerMode === 'install-required' && プッシュ通知を受け取るにはWebアプリとしてインストールしてください} diff --git a/node/src/components/ThemeRegistry/ThemeRegistry.tsx b/node/src/components/ThemeRegistry/ThemeRegistry.tsx index 1c48312..e127dab 100755 --- a/node/src/components/ThemeRegistry/ThemeRegistry.tsx +++ b/node/src/components/ThemeRegistry/ThemeRegistry.tsx @@ -2,15 +2,17 @@ import * as React from 'react'; import { ThemeProvider } from '@mui/material/styles'; +import useMediaQuery from '@mui/material/useMediaQuery'; import CssBaseline from '@mui/material/CssBaseline'; import NextAppDirEmotionCacheProvider from './EmotionCache'; -import theme from './theme'; +import { lightTheme, darkTheme } from './theme'; export default function ThemeRegistry({ children }: { children: React.ReactNode }) { + const prefersDark = useMediaQuery('(prefers-color-scheme: dark)'); + return ( - - {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */} + {children} diff --git a/node/src/components/ThemeRegistry/theme.ts b/node/src/components/ThemeRegistry/theme.ts index 566a51e..dcca54c 100755 --- a/node/src/components/ThemeRegistry/theme.ts +++ b/node/src/components/ThemeRegistry/theme.ts @@ -7,31 +7,39 @@ display: 'swap', }); -const theme = createTheme({ - palette: { - mode: 'light', - }, - typography: { - fontFamily: roboto.style.fontFamily, - }, - components: { - MuiButton: { - styleOverrides: { - root: { - textTransform: 'none', - }, +const sharedComponents = { + MuiButton: { + styleOverrides: { + root: { + textTransform: 'none' as const, }, }, - MuiAlert: { - styleOverrides: { - root: ({ ownerState }) => ({ - ...(ownerState.severity === 'info' && { - backgroundColor: '#60a5fa', - }), + }, + MuiAlert: { + styleOverrides: { + root: ({ ownerState }: { ownerState: { severity?: string } }) => ({ + ...(ownerState.severity === 'info' && { + backgroundColor: '#60a5fa', }), - }, + }), }, }, +}; + +const sharedTypography = { + fontFamily: roboto.style.fontFamily, +}; + +export const lightTheme = createTheme({ + palette: { mode: 'light' }, + typography: sharedTypography, + components: sharedComponents, }); -export default theme; \ No newline at end of file +export const darkTheme = createTheme({ + palette: { mode: 'dark' }, + typography: sharedTypography, + components: sharedComponents, +}); + +export default lightTheme; \ No newline at end of file diff --git a/node/src/hooks/useWebRTC.tsx b/node/src/hooks/useWebRTC.tsx index ba8a142..13c708a 100755 --- a/node/src/hooks/useWebRTC.tsx +++ b/node/src/hooks/useWebRTC.tsx @@ -1,105 +1,207 @@ // useWebRTC.ts import { useState, useEffect, useRef, useCallback } from 'react' -interface useWebRTCReturn { - pc: RTCPeerConnection | null - localStream: MediaStream | null - ws: WebSocket | null - setURL: (wsUrl: string) => () => void +export type CallState = 'idle' | 'connecting' | 'connected' | 'failed' | 'ended' + +interface UseWebRTCOptions { + callId: string + wsUrl: string + onHangup?: () => void } -export function useWebRTC(): useWebRTCReturn { - const [pc, setPc] = useState(null) - const [localStream, setLocalStream] = useState(null) - const [ws, setWs] = useState(null) - const iceServers: RTCIceServer[] = [ - { urls: "stun:stun.l.google.com:19302" }, - { urls: "stun:stun1.l.google.com:19302" }, - { urls: "stun:stun2.l.google.com:19302" }, - { urls: "stun:stun3.l.google.com:19302" }, - { urls: "stun:stun4.l.google.com:19302" } - ] - // ICE候補を格納する配列(シグナリング送信用) - const iceCandidatesRef = useRef([]) +interface UseWebRTCReturn { + callState: CallState + localStream: MediaStream | null + remoteStream: MediaStream | null + isMuted: boolean + isCameraOff: boolean + toggleMute: () => void + toggleCamera: () => void + hangup: () => void + errorMessage: string | null +} - // WebSocket初期化 - const setURL = useCallback((wsUrl: string) => { - const socket = new WebSocket(wsUrl) - socket.onopen = () => { - console.log("WebSocket connected") - // WebSocket接続後にWebRTCの初期化を開始 - initWebRTC(socket) - } - socket.onmessage = (event: MessageEvent) => { - console.log("WebSocket message received:", event.data) - // ここでリモートからのシグナリング(アンサーやICE候補)を処理する - } - socket.onerror = (err) => { - console.error("WebSocket error:", err) - } - socket.onclose = () => { - console.log("WebSocket closed") - } - setWs(socket) - // クリーンアップ - return () => { - socket.close() - pc?.close() - } - // eslint-disable-next-line react-hooks/exhaustive-deps +const ICE_SERVERS: RTCIceServer[] = [ + { urls: 'stun:stun.l.google.com:19302' }, + { urls: 'stun:stun1.l.google.com:19302' }, + { urls: 'stun:stun2.l.google.com:19302' }, + { urls: 'stun:stun3.l.google.com:19302' }, + { urls: 'stun:stun4.l.google.com:19302' }, +] + +export function useWebRTC({ callId, wsUrl, onHangup }: UseWebRTCOptions): UseWebRTCReturn { + const [callState, setCallState] = useState('idle') + const [localStream, setLocalStream] = useState(null) + const [remoteStream, setRemoteStream] = useState(null) + const [isMuted, setIsMuted] = useState(false) + const [isCameraOff, setIsCameraOff] = useState(false) + const [errorMessage, setErrorMessage] = useState(null) + + // useRef でPCとWSを保持(非同期ハンドラ内でも最新値を参照できる) + const pcRef = useRef(null) + const wsRef = useRef(null) + const localStreamRef = useRef(null) + // remoteDescriptionが設定される前に届いたICE候補をバッファリング + const pendingCandidatesRef = useRef([]) + const callStateRef = useRef('idle') + + const updateCallState = useCallback((state: CallState) => { + callStateRef.current = state + setCallState(state) }, []) - // WebRTC初期化関数 - const initWebRTC = useCallback((socket: WebSocket) => { - // ユーザーに映像・音声の許可をリクエスト - navigator.mediaDevices.getUserMedia({ video: true, audio: true }) - .then(stream => { - setLocalStream(stream) - const connection = new RTCPeerConnection({ iceServers }) - // ローカルストリームの各トラックを追加 - stream.getTracks().forEach(track => connection.addTrack(track, stream)) - // ダミーデータチャネルを作成してICE候補収集を促進 - connection.createDataChannel("dummy") - // ICE候補イベントのハンドラ - connection.onicecandidate = (event) => { - console.log("ICE candidate event:", event) - if (event.candidate) { - iceCandidatesRef.current.push(event.candidate.toJSON()) - // 候補が見つかるたびに送信する(例:ここで個別送信) - socket.send(JSON.stringify({ - type: "ice", - candidate: event.candidate.toJSON() - })) - } else { - // ICE候補の収集が完了(candidateがnull) - const signalingMessage = { - type: "offer", - sdp: connection.localDescription ? connection.localDescription.sdp : null, - iceCandidates: iceCandidatesRef.current - } - console.log("Signaling JSON message:", JSON.stringify(signalingMessage, null, 2)) - socket.send(JSON.stringify(signalingMessage)) - } - } - connection.onicegatheringstatechange = () => { - console.log("ICE gathering state:", connection.iceGatheringState) - } - // SDPオファー生成とローカル記述の設定 - connection.createOffer() - .then(offer => { - console.log("Created SDP offer:", offer) - return connection.setLocalDescription(offer) - }) - .then(() => { - // setLocalDescription()実行後、ICE候補収集が開始される - setPc(connection) - }) - .catch(err => console.error("Error during SDP offer creation:", err)) - }) - .catch(err => { - console.error("Error getting user media:", err) - }) - }, [iceServers]) + const cleanup = useCallback(() => { + localStreamRef.current?.getTracks().forEach(track => track.stop()) + localStreamRef.current = null + setLocalStream(null) + if (pcRef.current) { + pcRef.current.close() + pcRef.current = null + } + if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) { + wsRef.current.close() + } + wsRef.current = null + pendingCandidatesRef.current = [] + }, []) - return { pc, localStream, ws, setURL } + useEffect(() => { + if (!callId || !wsUrl) return + + updateCallState('idle') + const socket = new WebSocket(wsUrl) + wsRef.current = socket + + socket.onopen = () => { + console.log('WebSocket connected') + navigator.mediaDevices.getUserMedia({ video: true, audio: true }) + .then(stream => { + localStreamRef.current = stream + setLocalStream(stream) + + const pc = new RTCPeerConnection({ iceServers: ICE_SERVERS }) + pcRef.current = pc + + stream.getTracks().forEach(track => pc.addTrack(track, stream)) + + pc.ontrack = (event) => { + if (event.streams?.[0]) setRemoteStream(event.streams[0]) + } + + pc.oniceconnectionstatechange = () => { + console.log('ICE connection state:', pc.iceConnectionState) + if (pc.iceConnectionState === 'connected' || pc.iceConnectionState === 'completed') { + updateCallState('connected') + } else if (pc.iceConnectionState === 'failed' || pc.iceConnectionState === 'disconnected') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + // Trickle ICE: 候補が見つかる都度送信 + pc.onicecandidate = (event) => { + if (socket.readyState !== WebSocket.OPEN) return + socket.send(JSON.stringify({ + type: 'ice', + callId, + candidate: event.candidate ? event.candidate.toJSON() : null, + })) + } + + pc.createOffer() + .then(offer => pc.setLocalDescription(offer)) + .then(() => { + if (socket.readyState !== WebSocket.OPEN || !pc.localDescription) return + socket.send(JSON.stringify({ type: 'offer', callId, sdp: pc.localDescription.sdp })) + updateCallState('connecting') + }) + .catch(err => { + console.error('SDP offer error:', err) + updateCallState('failed') + setErrorMessage('接続の開始に失敗しました') + }) + }) + .catch(err => { + console.error('getUserMedia error:', err) + updateCallState('failed') + setErrorMessage('カメラ・マイクへのアクセスが拒否されました') + }) + } + + socket.onmessage = async (event: MessageEvent) => { + let msg: { type: string; sdp?: string; candidate?: RTCIceCandidateInit | null; message?: string } + try { msg = JSON.parse(event.data) } catch { return } + console.log('WebSocket message:', msg.type) + + const pc = pcRef.current + switch (msg.type) { + case 'answer': + if (!pc || !msg.sdp) break + await pc.setRemoteDescription({ type: 'answer', sdp: msg.sdp }).catch(console.error) + for (const c of pendingCandidatesRef.current) { + await pc.addIceCandidate(c).catch(console.error) + } + pendingCandidatesRef.current = [] + break + case 'ice': + if (!pc || msg.candidate == null) break + if (pc.remoteDescription) { + await pc.addIceCandidate(msg.candidate).catch(console.error) + } else { + pendingCandidatesRef.current.push(msg.candidate) + } + break + case 'hangup': + cleanup() + updateCallState('ended') + onHangup?.() + break + case 'error': + updateCallState('failed') + setErrorMessage(msg.message ?? '接続エラーが発生しました') + break + } + } + + socket.onerror = () => { + if (callStateRef.current !== 'ended') { + updateCallState('failed') + setErrorMessage('通信エラーが発生しました') + } + } + + socket.onclose = () => { + if (callStateRef.current !== 'ended' && callStateRef.current !== 'failed') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + return () => { cleanup() } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [wsUrl, callId]) + + const hangup = useCallback(() => { + if (wsRef.current?.readyState === WebSocket.OPEN) { + wsRef.current.send(JSON.stringify({ type: 'hangup', callId })) + } + cleanup() + updateCallState('ended') + }, [callId, cleanup, updateCallState]) + + const toggleMute = useCallback(() => { + const track = localStreamRef.current?.getAudioTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsMuted(!track.enabled) + }, []) + + const toggleCamera = useCallback(() => { + const track = localStreamRef.current?.getVideoTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsCameraOff(!track.enabled) + }, []) + + return { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup, errorMessage } } diff --git a/node/src/types/globals.d.ts b/node/src/types/globals.d.ts index ca54560..ff05c42 100755 --- a/node/src/types/globals.d.ts +++ b/node/src/types/globals.d.ts @@ -1,3 +1,5 @@ +declare module '*.css' {} + export {} declare global { diff --git a/node/src/utils/index.ts b/node/src/utils/index.ts index cf37f87..5644c75 100644 --- a/node/src/utils/index.ts +++ b/node/src/utils/index.ts @@ -5,13 +5,31 @@ if (/android/i.test(ua)) { return "Android" } - else if (/iPad|iPhone|iPod/.test(ua)) { + else if (/iPad|iPhone|iPod/.test(ua) || (/Macintosh/.test(ua) && navigator.maxTouchPoints > 1)) { return "iOS" } return "Other" } +// iOS の major version を返す。取得できない場合は null。 +// iOS 26 以降、Apple は "CPU iPhone OS" トークンを 18_7 で凍結しており +// (フィンガープリンティング対策)、実バージョンは Safari の "Version/26.x" 側にしか +// 出ない。逆に WebView 等では "Version/" が無い。そのため両方を見て大きい方を採用する。 +// iPad (iPadOS 13+) は UA が Macintosh 偽装で "iPhone OS" トークンが無く、 +// "Version/" のみが手がかりになる。 +export const getIOSVersion = (): number | null => { + if (typeof window === 'undefined') return null + const ua = window.navigator.userAgent + const osMatch = ua.match(/OS (\d+)_/) + const versionMatch = ua.match(/Version\/(\d+)/) + const candidates = [osMatch, versionMatch] + .map(m => (m ? parseInt(m[1], 10) : NaN)) + .filter(n => !isNaN(n)) + if (candidates.length === 0) return null + return Math.max(...candidates) +} + export const getBrowser = (): string => { if (typeof window === 'undefined') return 'Other' diff --git a/node/ssh/authorized_keys b/node/ssh/authorized_keys new file mode 100755 index 0000000..306005e --- /dev/null +++ b/node/ssh/authorized_keys @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO/cW740yjBdFlyGXuYsSZOd7CJEneHiJswkPCHuaNLP raikyakun-codex diff --git a/public.tar.gz b/public.tar.gz index 6e5e922..616135a 100644 --- a/public.tar.gz +++ b/public.tar.gz Binary files differ diff --git a/standalone.tar.gz b/standalone.tar.gz index bf8f4c6..324d820 100644 --- a/standalone.tar.gz +++ b/standalone.tar.gz Binary files differ diff --git a/static.tar.gz b/static.tar.gz index 6f2c7b7..0c4cdc9 100644 --- a/static.tar.gz +++ b/static.tar.gz Binary files differ diff --git a/AGENTS.md b/AGENTS.md new file mode 100755 index 0000000..e0946df --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,10 @@ +# AGENTS.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Codex-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Prefer checking pages, TypeScript, and logs from inside the mobile container. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100755 index 0000000..d794c77 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,10 @@ +# CLAUDE.md + +Use `DEVELOPMENT.md` for the shared mobile runtime and verification workflow. + +Claude Code-specific guidance: + +- Read `DEVELOPMENT.md` before editing or testing this mobile project. +- Edit files in this workspace, but verify through the mobile container with `ssh raikyakun-mobile`. +- Do not treat macOS-side `npm`, `yarn`, `next`, or `tsc` failures as authoritative for this project. +- Keep Docker, SSH, test, and log workflow details in `DEVELOPMENT.md` so Codex and Claude Code stay aligned. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..6319c5f --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,127 @@ +# Development Notes + +## Runtime + +Next.js runs inside the Docker container `Raikyakun-Mobile-Node`. + +The macOS workspace is mounted over SMB. Do not use macOS-side `npm`, `yarn`, `next`, or `tsc` results as the source of truth because `node_modules` and `.next` belong to the Linux container environment. + +Use SSH into the container for runtime checks. + +## SSH + +Connect to the mobile container: + +```bash +ssh raikyakun-mobile +``` + +Run a command inside the app: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && ' +``` + +The mobile development container is rebuilt often, so its SSH host key can change. +For development-only SSH config, it is acceptable to disable known_hosts checks for this host: + +```sshconfig +Host raikyakun-mobile + HostName 192.168.10.253 + Port 2225 + User codex + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR +``` + +If the VPN address is preferred in your environment, use `HostName 10.3.0.3` instead. + +## Dev Server + +By default `yarn dev` is started by Docker Compose. The startup command checks for a +`node/.prod-mode` marker file: if present it runs `yarn build && yarn start` (production +build), otherwise `yarn dev`. + +The server log (both modes) is mirrored inside the container at: + +```bash +/tmp/next-dev.log +``` + +## Switching dev / prod build mode + +Use `switch-mode.sh` on the Docker host (run from the `mobile/` directory): + +```bash +./switch-mode.sh prod # 本番ビルドへ (yarn build && yarn start) +./switch-mode.sh dev # dev へ (yarn dev) +./switch-mode.sh status # 現在のモード表示 (restart しない) +./switch-mode.sh package # 本番ビルド成果物を tar に固める (restart しない) +``` + +`prod`/`dev` touches/removes `node/.prod-mode` then runs `docker compose restart node`. +`status`/`package` do not restart. + +`prod` does not return immediately: after the restart it polls the container log +(`/tmp/next-dev.log`) and **waits until `yarn build` finishes and `next start` reports +"Ready"** (or fails / times out after `BUILD_TIMEOUT`, default 900s). So once `prod` +returns successfully you can run `package` right away — no manual wait needed. + +`package` calls `./build` and produces `standalone.tar.gz` / `static.tar.gz` / +`public.tar.gz` in `mobile/`. It requires a completed prod build (`node/build/standalone` +must exist) — run `./switch-mode.sh prod` first. `yarn start` does not mutate the packaged +directories, so running `package` while the prod server is up is safe. Deploy flow: +`prod` → 動作確認 → `package` → 本番先へ3つの tar.gz を展開. +(`package` という名前は、Node サーバーを使わない静的出力を指す Next.js の `next export` +と紛らわしいため `export` を避けたもの。) + +Notes: +- `yarn build` takes a few minutes; the server is down during the build. +- If `yarn build` fails the container restarts and rebuilds in a loop — run + `./switch-mode.sh dev` to recover. +- Production build runs with `NODE_ENV=production`, so it reads `.env.production` + (`NEXT_PUBLIC_BASE_URL=https://mobile.raikyakun.app`). To keep the dev URL while + testing a prod build, add `NEXT_PUBLIC_BASE_URL` to `environment:` in + `docker-compose.yml`. +- `node/.prod-mode` is a per-machine local marker and is gitignored. + +Check recent logs: + +```bash +ssh raikyakun-mobile 'tail -n 120 /tmp/next-dev.log' +``` + +Follow logs: + +```bash +ssh raikyakun-mobile 'tail -f /tmp/next-dev.log' +``` + +## Page Check + +Trigger a page compile and check the HTTP response from inside the container: + +```bash +ssh raikyakun-mobile 'curl -I http://127.0.0.1:3000/' +``` + +## TypeScript Check + +Run TypeScript inside the container. The container user cannot write `tsconfig.tsbuildinfo`, so pass `--incremental false` to avoid `EACCES`: + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && node node_modules/typescript/lib/tsc.js --noEmit --incremental false --pretty false' +``` + +As of 2026-05-12, this command passes cleanly. + +## Lint Check + +The mobile container does not provide `sudo`, and ESLint has not been initialized yet (running `yarn lint` triggers `next lint`'s interactive setup prompt asking for Strict/Base/Cancel). As of 2026-05-12, lint is **not yet configured** for this project. When initializing, prefer `Strict`. Run as the container user (no sudo): + +```bash +ssh raikyakun-mobile 'cd /usr/src/node && yarn lint' +``` + +Keep this file updated when the mobile verification workflow changes so both Codex and Claude Code use the same test knowledge. diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index d60a680..670de8b --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,26 +1,31 @@ -version: '3.5' -services: - node: - build: ./node - container_name: Raikyakun-Mobile-Node - restart: always - ports: - - 127.0.0.1::3000 - volumes: - - yarn-cache:/usr/local/share/.cache/yarn/v6 - - ./node:/usr/src/node - networks: - proxy-net: - ipv4_address: 172.18.2.102 - environment: - VIRTUAL_HOST: dev.mobile.raikyakun.app - VIRTUAL_PORT: 3000 - LETSENCRYPT_HOST: dev.mobile.raikyakun.app - LETSENCRYPT_EMAIL: tohyama@office-gate.com - tty: true - command: bash -c 'cd /usr/src/node && node' -volumes: - yarn-cache: -networks: - proxy-net: - external: true \ No newline at end of file +version: '3.5' +services: + node: + build: ./node + container_name: Raikyakun-Mobile-Node + restart: always + ports: + - 127.0.0.1::3000 + - 10.3.0.3:2225:22 + - 192.168.10.253:2225:22 + volumes: + - yarn-cache:/usr/local/share/.cache/yarn/v6 + - ./node:/usr/src/node + - ./node/ssh:/ssh-authorized-keys:ro + networks: + proxy-net: + ipv4_address: 172.18.2.102 + environment: + VIRTUAL_HOST: dev.mobile.raikyakun.app + VIRTUAL_PORT: 3000 + LETSENCRYPT_HOST: dev.mobile.raikyakun.app + LETSENCRYPT_EMAIL: tohyama@office-gate.com + tty: true + # /usr/src/node/.prod-mode が在れば本番ビルド (yarn build && yarn start)、無ければ yarn dev。 + # 切り替えは .prod-mode を touch / rm して `docker compose restart node` するだけ。 + command: bash -c 'if [ -f /ssh-authorized-keys/authorized_keys ]; then cp /ssh-authorized-keys/authorized_keys /home/codex/.ssh/authorized_keys && chown codex:codex /home/codex/.ssh/authorized_keys && chmod 600 /home/codex/.ssh/authorized_keys; fi && mkdir -p /run/sshd && /usr/sbin/sshd && cd /usr/src/node && (if [ -f .prod-mode ]; then echo "[run] prod build mode (yarn build && yarn start)" && yarn build && yarn start; else echo "[run] dev mode (yarn dev)" && yarn dev; fi) 2>&1 | tee /tmp/next-dev.log' +volumes: + yarn-cache: +networks: + proxy-net: + external: true diff --git a/node/.env.development b/node/.env.development index de0b4af..0ed3d5f 100755 --- a/node/.env.development +++ b/node/.env.development @@ -1 +1,2 @@ NEXT_PUBLIC_BASE_URL=https://dev.mobile.raikyakun.app +NEXT_PUBLIC_ENABLE_WEBRTC=true diff --git a/node/.gitignore b/node/.gitignore old mode 100755 new mode 100644 index 8f322f0..ec9dd8e --- a/node/.gitignore +++ b/node/.gitignore @@ -15,6 +15,9 @@ # production /build +# docker-compose の dev/prod 切り替えマーカー (ローカル限定、コミットしない) +.prod-mode + # misc .DS_Store *.pem diff --git a/node/Dockerfile b/node/Dockerfile index b9cc4bd..9a92c95 100755 --- a/node/Dockerfile +++ b/node/Dockerfile @@ -1,8 +1,20 @@ -FROM node:21 - -# アプリケーションディレクトリを作成する -RUN mkdir -p /usr/src/node -WORKDIR /usr/src/node - -RUN yarn install -EXPOSE 8080 +FROM node:21 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssh-server \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /var/run/sshd \ + && useradd -m -s /bin/bash codex \ + && mkdir -p /home/codex/.ssh \ + && chown -R codex:codex /home/codex/.ssh \ + && chmod 700 /home/codex/.ssh \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \ + && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + +# アプリケーションディレクトリを作成する +RUN mkdir -p /usr/src/node +WORKDIR /usr/src/node + +RUN yarn install +EXPOSE 3000 +EXPOSE 22 diff --git a/node/package-lock.json b/node/package-lock.json index 9ccde6b..8f0a6ae 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -22,9 +22,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -1790,23 +1790,26 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1947,6 +1950,47 @@ "next": ">=9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2245,22 +2289,66 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz", - "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.35.tgz", + "integrity": "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==", "dependencies": { - "glob": "7.1.7" + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -2273,9 +2361,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", "cpu": [ "x64" ], @@ -2288,9 +2376,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", "cpu": [ "arm64" ], @@ -2303,9 +2391,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", "cpu": [ "arm64" ], @@ -2318,9 +2406,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", "cpu": [ "x64" ], @@ -2333,9 +2421,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", "cpu": [ "x64" ], @@ -2348,9 +2436,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", "cpu": [ "arm64" ], @@ -2363,9 +2451,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", "cpu": [ "ia32" ], @@ -2378,9 +2466,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", "cpu": [ "x64" ], @@ -2424,6 +2512,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2523,11 +2620,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2649,149 +2752,51 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@webassemblyjs/ast": { @@ -3414,9 +3419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "funding": [ { "type": "opencollective", @@ -3569,9 +3574,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3609,11 +3614,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3764,6 +3769,11 @@ "csstype": "^3.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -4005,19 +4015,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz", - "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.35.tgz", + "integrity": "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.12", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "14.2.35", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4029,6 +4040,234 @@ } } }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4616,6 +4855,21 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4780,7 +5034,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "peer": true }, "node_modules/globals": { "version": "11.12.0", @@ -5107,6 +5362,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5372,6 +5635,23 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -5801,15 +6081,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5835,39 +6123,38 @@ "peer": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dependencies": { - "@next/env": "13.4.7", - "@swc/helpers": "0.5.1", + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -5876,7 +6163,7 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { + "@playwright/test": { "optional": true }, "sass": { @@ -6128,6 +6415,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -6239,9 +6546,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -6250,10 +6557,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6800,6 +7111,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6822,9 +7144,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6860,6 +7182,66 @@ "node": ">=10.0.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -6945,6 +7327,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7126,6 +7520,48 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7153,6 +7589,17 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -7180,25 +7627,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7413,6 +7841,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -7909,6 +8338,123 @@ "workbox-core": "6.5.4" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7937,14 +8483,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/node/package.json b/node/package.json index 3dae0f9..9dac5c4 100644 --- a/node/package.json +++ b/node/package.json @@ -23,9 +23,9 @@ "axios": "^1.6.1", "date-fns": "^3.6.0", "eslint": "8.45.0", - "eslint-config-next": "13.4.12", + "eslint-config-next": "14.2.35", "jssha": "^3.3.1", - "next": "13.4.7", + "next": "14.2.35", "qrcode.react": "^4.2.0", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/node/package.json.bak b/node/package.json.bak new file mode 100644 index 0000000..3dae0f9 --- /dev/null +++ b/node/package.json.bak @@ -0,0 +1,38 @@ +{ + "name": "raikyakun-smartphone", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@imbios/next-pwa": "^1.1.1", + "@mui/icons-material": "^5.14.1", + "@mui/material": "^5.14.2", + "@types/node": "20.4.5", + "@types/react": "18.2.17", + "@types/react-dom": "18.2.7", + "axios": "^1.6.1", + "date-fns": "^3.6.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "jssha": "^3.3.1", + "next": "13.4.7", + "qrcode.react": "^4.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.51.5", + "typescript": "5.1.6" + }, + "devDependencies": { + "@types/web-push": "^3.3.2" + } +} diff --git a/node/public/images/._install_for_ios26.svg b/node/public/images/._install_for_ios26.svg new file mode 100644 index 0000000..40af718 --- /dev/null +++ b/node/public/images/._install_for_ios26.svg Binary files differ diff --git a/node/public/images/install_for_ios26.svg b/node/public/images/install_for_ios26.svg new file mode 100644 index 0000000..cdfd3c5 --- /dev/null +++ b/node/public/images/install_for_ios26.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index 240beba..ec808d4 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'c402fc7e5ec273f2426722b89afea58a','url':'/_next/app-build-manifest.json'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/138-7e73bd80a974c846.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/212-f854a6d764cb4e9c.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/307-8c8f6ce7b0973788.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/625-b4599b8aef945112.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/91-f7e8a0fbd32994bc.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/actions/page-fb4efecec90a6d97.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/layout-0ba6141c13d4b6d7.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/app/page-6516f59e532f6fa5.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/bce60fc1-3796239d190b3b86.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/framework-8883d1e9be70c3da.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-app-8e36dfb2634fcb78.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/main-c6d8d4626ca856cb.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_app-998b8fceeadee23e.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/pages/_error-e8b35f8a0cf92802.js'},{'revision':'79330112775102f91e1010318bae2bd3','url':'/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js'},{'revision':'riDS77sw5Sl-mus-AUTS4','url':'/_next/static/chunks/webpack-838ea4bca6f6c7d2.js'},{'revision':'62953a87cc49d3a7','url':'/_next/static/css/62953a87cc49d3a7.css'},{'revision':'922f92dac52cd9b3','url':'/_next/static/css/922f92dac52cd9b3.css'},{'revision':'b6802c76992d71e7','url':'/_next/static/css/b6802c76992d71e7.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'b78f2f95f712fdbfd1149569fa52161f','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/riDS77sw5Sl-mus-AUTS4/_ssgManifest.js'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'1c4ca837c40e96a6c2b3b57445dfd099','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite"),s=r.objectStore(e),c=s.put(o);c.onerror=e=>i(e.target.errorCode),c.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){console.log(e);let t=await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})});if(!t.ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'bba7affdc37f7bc18f5d4f695e7677d6','url':'/_next/app-build-manifest.json'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/Kf5msmo6le0bHgtWC2LPY/_ssgManifest.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/actions/page-26175c66c6099729.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/call/page-01095f368fda42cc.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/app/page-b9dcee04ff2d68a3.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'Kf5msmo6le0bHgtWC2LPY','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-Kf5msmo6le0bHgtWC2LPY.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js b/node/public/worker-riDS77sw5Sl-mus-AUTS4.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-riDS77sw5Sl-mus-AUTS4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.css b/node/src/app/actions/page.css index d1a6b4c..9541176 100755 --- a/node/src/app/actions/page.css +++ b/node/src/app/actions/page.css @@ -67,4 +67,65 @@ .disabled { opacity: 0.3; cursor: not-allowed; +} + +/* ステータスボックス */ +.statusBox { + width: 80%; + margin: auto; + border-radius: 5px; + padding: 7px; + margin-top: 30px; +} +.statusBox.ok { + border: 1px solid dodgerblue; + color: dodgerblue; + background: azure; +} +.statusBox.error { + border: 1px solid crimson; + color: crimson; + background: mistyrose; +} +.statusBox.timeout { + border: 1px solid darkorange; + color: darkorange; + background: oldlace; +} + +@media (prefers-color-scheme: dark) { + .accept { + border-color: #4caf50; + background: linear-gradient(0deg, #1b5e20, #2e7d32); + color: #a5d6a7; + } + .reject { + border-color: #f44336; + background: linear-gradient(0deg, #b71c1c, #c62828); + color: #ef9a9a; + } + .selected { + box-shadow: 0px 0px 3px rgba(255,255,255,0.4) inset !important; + } + .accept.selected { + background: linear-gradient(180deg, #2e7d32, #388e3c); + } + .reject.selected { + background: linear-gradient(180deg, #c62828, #d32f2f); + } + .statusBox.ok { + background: #0d2137; + border-color: #1e88e5; + color: #90caf9; + } + .statusBox.error { + background: #2c0a0a; + border-color: #e53935; + color: #ef9a9a; + } + .statusBox.timeout { + background: #2c1a00; + border-color: #f57c00; + color: #ffcc80; + } } \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx old mode 100755 new mode 100644 index d5bc815..e60a5e7 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -1,16 +1,16 @@ 'use client' -import React, { useMemo, useState, useEffect, useRef } from 'react' +import React, { Suspense, useMemo, useState, useEffect, useRef } from 'react' import { Container, Box, Grid, Alert, ButtonGroup, RadioGroup, Radio, FormControlLabel, Button, TextField, Typography, InputAdornment, IconButton, FormControl, InputLabel, OutlinedInput, FormHelperText, CircularProgress, Select, MenuItem, AppBar, Toolbar } from '@mui/material' -import {ArrowBackIosNew as ArrowBackIosNewIcon} from '@mui/icons-material' +import {ArrowBackIosNew as ArrowBackIosNewIcon, VideoCall as VideoCallIcon} from '@mui/icons-material' import { CircularProgressProps } from '@mui/material/CircularProgress' import { useSearchParams } from 'next/navigation' import { User } from '@/types' import axios, { AxiosError } from 'axios' import { useRouter } from 'next/navigation' import './page.css' -import { useIndexedDB, useWebRTC } from '@/hooks' +import { useIndexedDB } from '@/hooks' interface Notification { title: string @@ -36,7 +36,21 @@ } const TIMEOUT = 59 + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 export default function Actions(){ + return ( + + + + }> + + + ) +} + +function ActionsInner(){ const searchParams = useSearchParams() const action = searchParams.get('action') const router = useRouter() @@ -251,16 +265,29 @@ } - {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} - {submitResult === 'ok' &&
送信成功しました
} - {submitResult === 'error' &&
送信失敗しました
} - {submitResult === 'timeout' &&
有効期限が過ぎました
} - {accessKeyError &&
{accessKeyError}
} + {(submitResult === '' || submitResult === 'pending') &&
制限時間内に選択してください
} + {submitResult === 'ok' &&
送信成功しました
} + {submitResult === 'error' &&
送信失敗しました
} + {submitResult === 'timeout' &&
有効期限が過ぎました
} + {accessKeyError &&
{accessKeyError}
} {isLoading &&
読み込み中…
} {!isLoading &&
isAccept === null && handleSubmit(true)} className={isAccept != null?isAccept == true?'accept selected':'accept disabled':'accept enable'}>対応可能 isAccept === null && handleSubmit(false)} className={isAccept != null?isAccept == false?'reject selected':'reject disabled':'reject enable'}>対応不可
} + {!isLoading && submitResult === 'ok' && isAccept === true && process.env.NEXT_PUBLIC_ENABLE_WEBRTC === 'true' && notification && accessKey && ( +
+ +
+ )} diff --git a/node/src/app/call/page.css b/node/src/app/call/page.css new file mode 100755 index 0000000..174abea --- /dev/null +++ b/node/src/app/call/page.css @@ -0,0 +1,53 @@ +.callContainer { + position: fixed; + inset: 0; + background: #000; + overflow: hidden; +} + +.remoteVideo { + width: 100%; + height: 100%; + object-fit: cover; +} + +.localVideo { + position: absolute; + bottom: 110px; + right: 16px; + width: 25vw; + max-width: 120px; + aspect-ratio: 3 / 4; + object-fit: cover; + border-radius: 8px; + border: 2px solid rgba(255, 255, 255, 0.5); + z-index: 10; + background: #111; +} + +.statusOverlay { + position: absolute; + top: 24px; + left: 0; + right: 0; + text-align: center; + color: #fff; + font-size: 4vw; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8); + z-index: 10; + pointer-events: none; +} + +.controlBar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.7)); + z-index: 20; +} diff --git a/node/src/app/call/page.tsx b/node/src/app/call/page.tsx new file mode 100644 index 0000000..4075387 --- /dev/null +++ b/node/src/app/call/page.tsx @@ -0,0 +1,128 @@ +'use client' +import { Suspense, useEffect, useRef } from 'react' +import { useSearchParams, useRouter } from 'next/navigation' +import { IconButton, Typography } from '@mui/material' +import { + Mic as MicIcon, + MicOff as MicOffIcon, + Videocam as VideocamIcon, + VideocamOff as VideocamOffIcon, + CallEnd as CallEndIcon, +} from '@mui/icons-material' +import { useWebRTC } from '@/hooks' +import './page.css' + +// useSearchParams() を使うため Suspense 境界の内側に置く (静的 prerender 要件)。 +function CallPageInner() { + const searchParams = useSearchParams() + const router = useRouter() + const callId = searchParams.get('callId') ?? '' + const accessKey = searchParams.get('accessKey') ?? '' + + const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? '' + const wsUrl = callId && accessKey + ? baseUrl.replace(/^https?:\/\//, 'wss://') + `/api/mobile/${accessKey}/call/${callId}` + : '' + + const { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup } = + useWebRTC({ callId, wsUrl, onHangup: () => {} }) + + const remoteVideoRef = useRef(null) + const localVideoRef = useRef(null) + + useEffect(() => { + if (remoteVideoRef.current && remoteStream) { + remoteVideoRef.current.srcObject = remoteStream + } + }, [remoteStream]) + + useEffect(() => { + if (localVideoRef.current && localStream) { + localVideoRef.current.srcObject = localStream + } + }, [localStream]) + + // 通話終了・失敗時は2秒後に前のページへ戻る + useEffect(() => { + if (callState === 'ended' || callState === 'failed') { + const timer = setTimeout(() => router.back(), 2000) + return () => clearTimeout(timer) + } + }, [callState, router]) + + const statusText: Record = { + connecting: '接続中…', + failed: '接続に失敗しました', + ended: '通話終了', + } + + const isEnded = callState === 'ended' || callState === 'failed' + + return ( +
+ {/* リモート映像(全画面) */} +
+ ) +} + +export default function CallPage() { + return ( + }> + + + ) +} diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100644 new mode 100755 index 50bc743..8d56ba1 --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -28,7 +28,8 @@ - + + (null) const [osDetected, setOsDetected] = useState(false) const [installPrompt, setInstallPrompt] = useState(null) @@ -37,9 +36,15 @@ const browser = getBrowser() setOS(os) setBrowser(browser) + setIosVersion(getIOSVersion()) setOsDetected(true) - setIsStandalone(window.matchMedia('(display-mode: standalone)').matches) + // iOS は display-mode メディアクエリが home screen 起動でも false を返すことがある。 + // iOS の正規シグナルは navigator.standalone なので両方を OR で判定する。 + setIsStandalone( + window.matchMedia('(display-mode: standalone)').matches || + (window.navigator as { standalone?: boolean }).standalone === true, + ) navigator.getInstalledRelatedApps?.().then(apps => { setIsInstalled(apps.length > 0) @@ -102,7 +107,7 @@ const registerMode = isStandalone || (!installPrompt && !isInstalled) ? 'allowed' : installPrompt ? 'install-required' : 'hidden' - const { Subscribe, errorMessage, accessKey, isSubscribed, canSubscribe, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) + const { Subscribe, errorMessage, accessKey, isLoading } = useWebpush({ registerMode, os, browser, isStandalone }) @@ -218,7 +223,7 @@ )} - {os === 'iOS' && browser === 'Safari' && !isStandalone && } + {os === 'iOS' && browser === 'Safari' && !isStandalone && = 26 ? '/images/install_for_ios26.svg' : '/images/install_for_ios.png'} />} {os === 'Android' && (isStandalone || isInstalled) && 通知が届かなくなった場合
@@ -231,36 +236,3 @@ ) } - - -const ServiceWorkerStatus: React.FC = () => { - const [registrations, setRegistrations] = useState(['確認中...']); - - useEffect(() => { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.getRegistrations().then(regs => { - if (regs.length === 0) { - setRegistrations(['サービスワーカーは登録されていません。']); - } else { - const swInfo = regs.map((reg, index) => - `(${index + 1}) スコープ: ${reg.scope}, 状態: ${reg.active ? 'アクティブ' : '非アクティブ'}` - ); - setRegistrations(swInfo); - } - }); - } else { - setRegistrations(['このブラウザはサービスワーカーをサポートしていません。']); - } - }, []); - - return ( -
-

Service Workerの状態

-
    - {registrations.map((reg, index) => ( -
  • {reg}
  • - ))} -
-
- ); - }; \ No newline at end of file diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx old mode 100755 new mode 100644 index 540d330..4a8dc66 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -1,5 +1,5 @@ 'use client' -import { useEffect, useMemo, useState, useCallback } from 'react' +import { useEffect, useMemo, useState, useCallback, useRef } from 'react' import webpush from 'web-push' import { Button, FormHelperText, Alert, FormControl, InputLabel, OutlinedInput, InputAdornment, IconButton, Tooltip, ClickAwayListener, Tabs, CircularProgress } from '@mui/material' import { ContentPasteGo as ContentPasteGoIcon } from '@mui/icons-material' @@ -30,9 +30,12 @@ const [isLoading, setIsLoading] = useState(true) const [pushSupported, setPushSupported] = useState(null) const [state, setState] = useState<{status: string, token: string | null}>({ status: 'unknown', token: null }) + // 最後に checkAccessKey へ渡したキー。手入力 blur 時の二重照会 (ペースト → blur 等) を防ぐ。 + const lastCheckedAccessKeyRef = useRef('') // アクセスキーが入力されたらサーバへ問い合わせる const checkAccessKey = useCallback((newAccessKey: string) => { + lastCheckedAccessKeyRef.current = newAccessKey setAccessKey(newAccessKey) setIsLoading(true) setAccessKeyError(null) @@ -83,10 +86,11 @@ console.error('GET /accessKey failed', e) } - // 2. URLハッシュのキーを取得し、即座に消去 + // 2. URLハッシュのキーを取得 (ハッシュは URL に残す。 + // deep link / bookmark / タブ復元で再適用できるようにするため。 + // キー変更をキャンセルした時のみ後段で消去する)。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - if (hashKey) history.replaceState(null, '', location.pathname + location.search) // 3. localStorageからCookieへ移行(CookieもURLハッシュもない場合) let migratedKey: string | null = null @@ -172,7 +176,10 @@ checkAccessKey(hashKey) return } - // キャンセル: 旧キーのまま継続(hashKeyは消去済み、CookieはcookieKeyのまま) + // キャンセル: 旧キーのまま継続(Cookie は cookieKey のまま)。 + // 拒否したキーが URL ハッシュに残ると reload のたびに再プロンプトになるため、 + // このケースだけハッシュを消去する。 + history.replaceState(null, '', location.pathname + location.search) keyChangeCancelled = true } @@ -380,9 +387,21 @@ : undefined } label="アクセスキー" - placeholder="(タップしてペースト)" + placeholder="(タップしてペースト、または入力)" onPaste={e => !isLoading && !isSubscribed && checkAccessKey(e.clipboardData.getData('text'))} - readOnly + onChange={e => { + // 手入力中は値の更新のみ。サーバ照会は blur 時にまとめて行う。 + if (isLoading || isSubscribed) return + setAccessKey(e.target.value) + setAccessKeyError(null) + }} + onBlur={() => { + // 手入力でフォーカスが外れたタイミングで照会。 + // ペースト経路 (onPaste / ペーストボタン) は既に checkAccessKey 済みなので + // lastCheckedAccessKeyRef との比較で二重照会を防ぐ。 + if (isLoading || isSubscribed) return + if (accessKey && accessKey !== lastCheckedAccessKeyRef.current) checkAccessKey(accessKey) + }} disabled={isLoading} inputProps={{ size: 20 }} sx={{fontFamily: 'monospace'}} /> @@ -399,7 +418,8 @@ プッシュ通知にはSafariで開く必要があります } - {pushSupported === false && os !== 'iOS' && このブラウザはプッシュ通知に対応していません。AndroidはChromeでお開きください。} + {pushSupported === false && os === 'Android' && このブラウザはプッシュ通知に対応していません。Chromeでお開きください。} + {pushSupported === false && os !== 'iOS' && os !== 'Android' && このブラウザはプッシュ通知に対応していません。} {registerMode === 'allowed' && os === 'iOS' && browser === 'Safari' && !isStandalone && プッシュ通知にはホーム画面への追加が必要です。画面下部の共有ボタン(□↑)から「ホーム画面に追加」を選んでください} {registerMode === 'allowed' && !(os === 'iOS' && browser === 'Safari' && !isStandalone) && pushSupported !== false && } {registerMode === 'install-required' && プッシュ通知を受け取るにはWebアプリとしてインストールしてください} diff --git a/node/src/components/ThemeRegistry/ThemeRegistry.tsx b/node/src/components/ThemeRegistry/ThemeRegistry.tsx index 1c48312..e127dab 100755 --- a/node/src/components/ThemeRegistry/ThemeRegistry.tsx +++ b/node/src/components/ThemeRegistry/ThemeRegistry.tsx @@ -2,15 +2,17 @@ import * as React from 'react'; import { ThemeProvider } from '@mui/material/styles'; +import useMediaQuery from '@mui/material/useMediaQuery'; import CssBaseline from '@mui/material/CssBaseline'; import NextAppDirEmotionCacheProvider from './EmotionCache'; -import theme from './theme'; +import { lightTheme, darkTheme } from './theme'; export default function ThemeRegistry({ children }: { children: React.ReactNode }) { + const prefersDark = useMediaQuery('(prefers-color-scheme: dark)'); + return ( - - {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */} + {children} diff --git a/node/src/components/ThemeRegistry/theme.ts b/node/src/components/ThemeRegistry/theme.ts index 566a51e..dcca54c 100755 --- a/node/src/components/ThemeRegistry/theme.ts +++ b/node/src/components/ThemeRegistry/theme.ts @@ -7,31 +7,39 @@ display: 'swap', }); -const theme = createTheme({ - palette: { - mode: 'light', - }, - typography: { - fontFamily: roboto.style.fontFamily, - }, - components: { - MuiButton: { - styleOverrides: { - root: { - textTransform: 'none', - }, +const sharedComponents = { + MuiButton: { + styleOverrides: { + root: { + textTransform: 'none' as const, }, }, - MuiAlert: { - styleOverrides: { - root: ({ ownerState }) => ({ - ...(ownerState.severity === 'info' && { - backgroundColor: '#60a5fa', - }), + }, + MuiAlert: { + styleOverrides: { + root: ({ ownerState }: { ownerState: { severity?: string } }) => ({ + ...(ownerState.severity === 'info' && { + backgroundColor: '#60a5fa', }), - }, + }), }, }, +}; + +const sharedTypography = { + fontFamily: roboto.style.fontFamily, +}; + +export const lightTheme = createTheme({ + palette: { mode: 'light' }, + typography: sharedTypography, + components: sharedComponents, }); -export default theme; \ No newline at end of file +export const darkTheme = createTheme({ + palette: { mode: 'dark' }, + typography: sharedTypography, + components: sharedComponents, +}); + +export default lightTheme; \ No newline at end of file diff --git a/node/src/hooks/useWebRTC.tsx b/node/src/hooks/useWebRTC.tsx index ba8a142..13c708a 100755 --- a/node/src/hooks/useWebRTC.tsx +++ b/node/src/hooks/useWebRTC.tsx @@ -1,105 +1,207 @@ // useWebRTC.ts import { useState, useEffect, useRef, useCallback } from 'react' -interface useWebRTCReturn { - pc: RTCPeerConnection | null - localStream: MediaStream | null - ws: WebSocket | null - setURL: (wsUrl: string) => () => void +export type CallState = 'idle' | 'connecting' | 'connected' | 'failed' | 'ended' + +interface UseWebRTCOptions { + callId: string + wsUrl: string + onHangup?: () => void } -export function useWebRTC(): useWebRTCReturn { - const [pc, setPc] = useState(null) - const [localStream, setLocalStream] = useState(null) - const [ws, setWs] = useState(null) - const iceServers: RTCIceServer[] = [ - { urls: "stun:stun.l.google.com:19302" }, - { urls: "stun:stun1.l.google.com:19302" }, - { urls: "stun:stun2.l.google.com:19302" }, - { urls: "stun:stun3.l.google.com:19302" }, - { urls: "stun:stun4.l.google.com:19302" } - ] - // ICE候補を格納する配列(シグナリング送信用) - const iceCandidatesRef = useRef([]) +interface UseWebRTCReturn { + callState: CallState + localStream: MediaStream | null + remoteStream: MediaStream | null + isMuted: boolean + isCameraOff: boolean + toggleMute: () => void + toggleCamera: () => void + hangup: () => void + errorMessage: string | null +} - // WebSocket初期化 - const setURL = useCallback((wsUrl: string) => { - const socket = new WebSocket(wsUrl) - socket.onopen = () => { - console.log("WebSocket connected") - // WebSocket接続後にWebRTCの初期化を開始 - initWebRTC(socket) - } - socket.onmessage = (event: MessageEvent) => { - console.log("WebSocket message received:", event.data) - // ここでリモートからのシグナリング(アンサーやICE候補)を処理する - } - socket.onerror = (err) => { - console.error("WebSocket error:", err) - } - socket.onclose = () => { - console.log("WebSocket closed") - } - setWs(socket) - // クリーンアップ - return () => { - socket.close() - pc?.close() - } - // eslint-disable-next-line react-hooks/exhaustive-deps +const ICE_SERVERS: RTCIceServer[] = [ + { urls: 'stun:stun.l.google.com:19302' }, + { urls: 'stun:stun1.l.google.com:19302' }, + { urls: 'stun:stun2.l.google.com:19302' }, + { urls: 'stun:stun3.l.google.com:19302' }, + { urls: 'stun:stun4.l.google.com:19302' }, +] + +export function useWebRTC({ callId, wsUrl, onHangup }: UseWebRTCOptions): UseWebRTCReturn { + const [callState, setCallState] = useState('idle') + const [localStream, setLocalStream] = useState(null) + const [remoteStream, setRemoteStream] = useState(null) + const [isMuted, setIsMuted] = useState(false) + const [isCameraOff, setIsCameraOff] = useState(false) + const [errorMessage, setErrorMessage] = useState(null) + + // useRef でPCとWSを保持(非同期ハンドラ内でも最新値を参照できる) + const pcRef = useRef(null) + const wsRef = useRef(null) + const localStreamRef = useRef(null) + // remoteDescriptionが設定される前に届いたICE候補をバッファリング + const pendingCandidatesRef = useRef([]) + const callStateRef = useRef('idle') + + const updateCallState = useCallback((state: CallState) => { + callStateRef.current = state + setCallState(state) }, []) - // WebRTC初期化関数 - const initWebRTC = useCallback((socket: WebSocket) => { - // ユーザーに映像・音声の許可をリクエスト - navigator.mediaDevices.getUserMedia({ video: true, audio: true }) - .then(stream => { - setLocalStream(stream) - const connection = new RTCPeerConnection({ iceServers }) - // ローカルストリームの各トラックを追加 - stream.getTracks().forEach(track => connection.addTrack(track, stream)) - // ダミーデータチャネルを作成してICE候補収集を促進 - connection.createDataChannel("dummy") - // ICE候補イベントのハンドラ - connection.onicecandidate = (event) => { - console.log("ICE candidate event:", event) - if (event.candidate) { - iceCandidatesRef.current.push(event.candidate.toJSON()) - // 候補が見つかるたびに送信する(例:ここで個別送信) - socket.send(JSON.stringify({ - type: "ice", - candidate: event.candidate.toJSON() - })) - } else { - // ICE候補の収集が完了(candidateがnull) - const signalingMessage = { - type: "offer", - sdp: connection.localDescription ? connection.localDescription.sdp : null, - iceCandidates: iceCandidatesRef.current - } - console.log("Signaling JSON message:", JSON.stringify(signalingMessage, null, 2)) - socket.send(JSON.stringify(signalingMessage)) - } - } - connection.onicegatheringstatechange = () => { - console.log("ICE gathering state:", connection.iceGatheringState) - } - // SDPオファー生成とローカル記述の設定 - connection.createOffer() - .then(offer => { - console.log("Created SDP offer:", offer) - return connection.setLocalDescription(offer) - }) - .then(() => { - // setLocalDescription()実行後、ICE候補収集が開始される - setPc(connection) - }) - .catch(err => console.error("Error during SDP offer creation:", err)) - }) - .catch(err => { - console.error("Error getting user media:", err) - }) - }, [iceServers]) + const cleanup = useCallback(() => { + localStreamRef.current?.getTracks().forEach(track => track.stop()) + localStreamRef.current = null + setLocalStream(null) + if (pcRef.current) { + pcRef.current.close() + pcRef.current = null + } + if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) { + wsRef.current.close() + } + wsRef.current = null + pendingCandidatesRef.current = [] + }, []) - return { pc, localStream, ws, setURL } + useEffect(() => { + if (!callId || !wsUrl) return + + updateCallState('idle') + const socket = new WebSocket(wsUrl) + wsRef.current = socket + + socket.onopen = () => { + console.log('WebSocket connected') + navigator.mediaDevices.getUserMedia({ video: true, audio: true }) + .then(stream => { + localStreamRef.current = stream + setLocalStream(stream) + + const pc = new RTCPeerConnection({ iceServers: ICE_SERVERS }) + pcRef.current = pc + + stream.getTracks().forEach(track => pc.addTrack(track, stream)) + + pc.ontrack = (event) => { + if (event.streams?.[0]) setRemoteStream(event.streams[0]) + } + + pc.oniceconnectionstatechange = () => { + console.log('ICE connection state:', pc.iceConnectionState) + if (pc.iceConnectionState === 'connected' || pc.iceConnectionState === 'completed') { + updateCallState('connected') + } else if (pc.iceConnectionState === 'failed' || pc.iceConnectionState === 'disconnected') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + // Trickle ICE: 候補が見つかる都度送信 + pc.onicecandidate = (event) => { + if (socket.readyState !== WebSocket.OPEN) return + socket.send(JSON.stringify({ + type: 'ice', + callId, + candidate: event.candidate ? event.candidate.toJSON() : null, + })) + } + + pc.createOffer() + .then(offer => pc.setLocalDescription(offer)) + .then(() => { + if (socket.readyState !== WebSocket.OPEN || !pc.localDescription) return + socket.send(JSON.stringify({ type: 'offer', callId, sdp: pc.localDescription.sdp })) + updateCallState('connecting') + }) + .catch(err => { + console.error('SDP offer error:', err) + updateCallState('failed') + setErrorMessage('接続の開始に失敗しました') + }) + }) + .catch(err => { + console.error('getUserMedia error:', err) + updateCallState('failed') + setErrorMessage('カメラ・マイクへのアクセスが拒否されました') + }) + } + + socket.onmessage = async (event: MessageEvent) => { + let msg: { type: string; sdp?: string; candidate?: RTCIceCandidateInit | null; message?: string } + try { msg = JSON.parse(event.data) } catch { return } + console.log('WebSocket message:', msg.type) + + const pc = pcRef.current + switch (msg.type) { + case 'answer': + if (!pc || !msg.sdp) break + await pc.setRemoteDescription({ type: 'answer', sdp: msg.sdp }).catch(console.error) + for (const c of pendingCandidatesRef.current) { + await pc.addIceCandidate(c).catch(console.error) + } + pendingCandidatesRef.current = [] + break + case 'ice': + if (!pc || msg.candidate == null) break + if (pc.remoteDescription) { + await pc.addIceCandidate(msg.candidate).catch(console.error) + } else { + pendingCandidatesRef.current.push(msg.candidate) + } + break + case 'hangup': + cleanup() + updateCallState('ended') + onHangup?.() + break + case 'error': + updateCallState('failed') + setErrorMessage(msg.message ?? '接続エラーが発生しました') + break + } + } + + socket.onerror = () => { + if (callStateRef.current !== 'ended') { + updateCallState('failed') + setErrorMessage('通信エラーが発生しました') + } + } + + socket.onclose = () => { + if (callStateRef.current !== 'ended' && callStateRef.current !== 'failed') { + updateCallState('failed') + setErrorMessage('接続が切断されました') + } + } + + return () => { cleanup() } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [wsUrl, callId]) + + const hangup = useCallback(() => { + if (wsRef.current?.readyState === WebSocket.OPEN) { + wsRef.current.send(JSON.stringify({ type: 'hangup', callId })) + } + cleanup() + updateCallState('ended') + }, [callId, cleanup, updateCallState]) + + const toggleMute = useCallback(() => { + const track = localStreamRef.current?.getAudioTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsMuted(!track.enabled) + }, []) + + const toggleCamera = useCallback(() => { + const track = localStreamRef.current?.getVideoTracks()[0] + if (!track) return + track.enabled = !track.enabled + setIsCameraOff(!track.enabled) + }, []) + + return { callState, localStream, remoteStream, isMuted, isCameraOff, toggleMute, toggleCamera, hangup, errorMessage } } diff --git a/node/src/types/globals.d.ts b/node/src/types/globals.d.ts index ca54560..ff05c42 100755 --- a/node/src/types/globals.d.ts +++ b/node/src/types/globals.d.ts @@ -1,3 +1,5 @@ +declare module '*.css' {} + export {} declare global { diff --git a/node/src/utils/index.ts b/node/src/utils/index.ts index cf37f87..5644c75 100644 --- a/node/src/utils/index.ts +++ b/node/src/utils/index.ts @@ -5,13 +5,31 @@ if (/android/i.test(ua)) { return "Android" } - else if (/iPad|iPhone|iPod/.test(ua)) { + else if (/iPad|iPhone|iPod/.test(ua) || (/Macintosh/.test(ua) && navigator.maxTouchPoints > 1)) { return "iOS" } return "Other" } +// iOS の major version を返す。取得できない場合は null。 +// iOS 26 以降、Apple は "CPU iPhone OS" トークンを 18_7 で凍結しており +// (フィンガープリンティング対策)、実バージョンは Safari の "Version/26.x" 側にしか +// 出ない。逆に WebView 等では "Version/" が無い。そのため両方を見て大きい方を採用する。 +// iPad (iPadOS 13+) は UA が Macintosh 偽装で "iPhone OS" トークンが無く、 +// "Version/" のみが手がかりになる。 +export const getIOSVersion = (): number | null => { + if (typeof window === 'undefined') return null + const ua = window.navigator.userAgent + const osMatch = ua.match(/OS (\d+)_/) + const versionMatch = ua.match(/Version\/(\d+)/) + const candidates = [osMatch, versionMatch] + .map(m => (m ? parseInt(m[1], 10) : NaN)) + .filter(n => !isNaN(n)) + if (candidates.length === 0) return null + return Math.max(...candidates) +} + export const getBrowser = (): string => { if (typeof window === 'undefined') return 'Other' diff --git a/node/ssh/authorized_keys b/node/ssh/authorized_keys new file mode 100755 index 0000000..306005e --- /dev/null +++ b/node/ssh/authorized_keys @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO/cW740yjBdFlyGXuYsSZOd7CJEneHiJswkPCHuaNLP raikyakun-codex diff --git a/public.tar.gz b/public.tar.gz index 6e5e922..616135a 100644 --- a/public.tar.gz +++ b/public.tar.gz Binary files differ diff --git a/standalone.tar.gz b/standalone.tar.gz index bf8f4c6..324d820 100644 --- a/standalone.tar.gz +++ b/standalone.tar.gz Binary files differ diff --git a/static.tar.gz b/static.tar.gz index 6f2c7b7..0c4cdc9 100644 --- a/static.tar.gz +++ b/static.tar.gz Binary files differ diff --git a/switch-mode.sh b/switch-mode.sh new file mode 100755 index 0000000..2cc84d5 --- /dev/null +++ b/switch-mode.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +# mobile コンテナのビルドモード切り替え & 本番成果物のパッケージング。 +# +# ./switch-mode.sh prod 本番ビルドモードへ +# ./switch-mode.sh dev dev モードへ +# ./switch-mode.sh status 現在のモードを表示 (restart しない) +# ./switch-mode.sh package 本番ビルド成果物を tar に固める (restart しない) +# +# prod/dev: node/.prod-mode マーカーの有無を docker-compose.yml の command が判定する。 +# このスクリプトはマーカーを set/clear して `docker compose restart node` する。 +# prod は restart 後、コンテナ内の yarn build 完了 (next start の "Ready") まで待つ +# ので、戻ってきたらそのまま package できる。 +# package: ./build を呼び、standalone/static/public の3つを tar.gz 化する +# (モード切り替えとは別の責務だが、本番反映フローを1コマンドに集約するため同居。 +# Next.js の `next export` (静的HTML出力) とは無関係なので名前を package にしている)。 +set -euo pipefail +cd "$(dirname "$0")" + +MARKER=node/.prod-mode +BUILD_TIMEOUT=900 # ビルド完了待ちのタイムアウト (秒) + +case "${1:-}" in + prod) + touch "$MARKER" + echo "→ prod build mode (yarn build && yarn start)" + docker compose restart node + echo "→ コンテナ内で yarn build 実行中… 完了まで待機します (数分かかります)" + deadline=$(( $(date +%s) + BUILD_TIMEOUT )) + while true; do + # tee がログを truncate するので [run] 行が見えれば再起動後の新しい run。 + log=$(docker compose exec -T node tail -n 200 /tmp/next-dev.log 2>/dev/null || true) + if echo "$log" | grep -q '\[run\] prod build mode'; then + if echo "$log" | grep -qE 'Ready in|✓ Ready'; then + echo "✓ build 完了・サーバー起動済み" + break + fi + if echo "$log" | grep -qE 'Failed to compile|error Command failed|Build error occurred'; then + echo "✗ build 失敗。ログ: docker compose logs --tail=80 node" >&2 + exit 1 + fi + fi + if [ "$(date +%s)" -ge "$deadline" ]; then + echo "✗ タイムアウト ($((BUILD_TIMEOUT/60))分)。ログ: docker compose logs --tail=80 node" >&2 + exit 1 + fi + sleep 5 + done + echo "次: ./switch-mode.sh package で成果物を tar 化" + exit 0 + ;; + dev) + rm -f "$MARKER" + echo "→ dev mode (yarn dev)" + docker compose restart node + echo "done. ログ: docker compose logs -f node (または ssh raikyakun-mobile 'tail -f /tmp/next-dev.log')" + exit 0 + ;; + status) + if [ -f "$MARKER" ]; then + echo "current: prod build mode" + else + echo "current: dev mode" + fi + exit 0 + ;; + package) + if [ ! -d node/build/standalone ]; then + echo "error: node/build/standalone が無い。先に './switch-mode.sh prod' で本番ビルドを完了させてください。" >&2 + exit 1 + fi + echo "→ 本番成果物を tar に固めます (standalone / static / public)" + ./build + ls -lh standalone.tar.gz static.tar.gz public.tar.gz + echo "done. この3つを本番先へ展開してください。" + exit 0 + ;; + *) + echo "usage: $0 {prod|dev|status|package}" >&2 + exit 1 + ;; +esac