diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..e69de29 diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..767dfa9 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,25 @@ +{ + "name": "CommDesk Tauri Dev ", + "dockerComposeFile": "../docker-compose.yml", + "service": "tauri-app", + "workspaceFolder": "/app", + + "customizations": { + "vscode": { + "extensions": [ + "rust-lang.rust-analyzer", + "vadimcn.vscode-lldb", + "tauri-apps.tauri-vscode", + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint" + ], + "settings": { + "editor.formatOnSave": true, + "[rust]": { + "editor.defaultFormatter": "rust-lang.rust-analyzer" + } + } + } + }, + "remoteUser": "developer" +} \ No newline at end of file diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..b57edbd --- /dev/null +++ b/.dockerignore @@ -0,0 +1,21 @@ +node_modules +**/node_modules +src-tauri/target +target +dist +build +.cache +.git +.github +.vscode +.idea + +*.log +.env +.env.* +!.env.example +.DS_Store + +coverage +test-results +docs \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..89c509f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,83 @@ +#Base Builder Image +FROM rust:1.88-slim AS base + +ENV DEBIAN_FRONTEND=noninteractive \ + CARGO_HOME=/usr/local/cargo \ + PNPM_HOME=/usr/local/share/pnpm \ + PATH=/usr/local/share/pnpm:/usr/local/cargo/bin:$PATH + +# Install Node.js LTS +RUN apt-get update && apt-get install -y --no-install-recommends \ + curl git wget pkg-config build-essential libssl-dev \ + libgtk-3-dev libwebkit2gtk-4.1-dev libappindicator3-dev \ + librsvg2-dev patchelf openssl ca-certificates xdg-utils \ + file libxdo-dev \ + && rm -rf /var/lib/apt/lists/* + +# Install Node.js +RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ + apt-get update && apt-get install -y --no-install-recommends nodejs && \ + rm -rf /var/lib/apt/lists/* + +# Install package managers +RUN npm install -g \ + pnpm \ + yarn + +# Create non-root user +RUN useradd -ms /bin/bash developer && \ + mkdir -p /app "$PNPM_HOME" && \ + chown -R developer:developer /app "$CARGO_HOME" "$PNPM_HOME" + +WORKDIR /app + + +# Dependency Cache Stage +FROM base AS dependencies + +COPY --chown=developer:devloper \ + package.json \ + package-lock.json* \ + pnpm-lock.yaml* \ + yarn.lock* \ + ./ + +RUN \ + if [ -f pnpm-lock.yaml ]; then pnpm install --frozen-lockfile; \ + elif [ -f yarn.lock ]; then yarn install --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + else echo "No lockfile found" && exit 1; fi + +COPY --chown=developer:developer src-tauri/Cargo.toml src-tauri/Cargo.lock ./src-tauri/ +RUN mkdir -p /app/src-tauri/src && touch /app/src-tauri/src/lib.rs +RUN cd src-tauri && cargo fetch + +# Development Stage +FROM base AS development + +COPY --from=dependencies --chown=developer:developer /usr/local/cargo /usr/local/cargo +COPY --from=dependencies --chown=developer:developer /usr/local/share/pnpm /usr/local/share/pnpm +COPY --from=dependencies --chown=developer:developer /app /app + +#USER developer + +USER root +RUN mkdir -p /app/src-tauri/target && \ + chown -R developer:developer /app/src-tauri/target && \ + chmod -R 777 /app/src-tauri/target + +USER developer + +EXPOSE 1420 +EXPOSE 1421 +EXPOSE 5173 + +CMD ["pnpm", "tauri", "dev"] + +FROM dependencies AS builder + +COPY --chown=developer:developer . . + +RUN if [ -f pnpm-lock.yaml ]; then pnpm tauri build; \ + elif [ -f yarn.lock ]; then yarn tauri build; \ + else npm run tauri build; fi \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3149793 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,40 @@ +services: + tauri: + build: + context: . + dockerfile: Dockerfile + target: development + + container_name: commdesk-dev + working_dir: /app + command: pnpm run dev + + volumes: + - type: bind + source: ${PWD} + target: /app + + - node_modules:/app/node_modules + - cargo_registry:/usr/local/cargo/registry + - cargo_git:/usr/local/share/pnpm/store + - pnpm_store:/usr/local/share/pnpm/store + - rust_target:/app/src-tauri/target + + ports: + - "1420:1420" + - "1421:1421" + - "5173:5173" + + environment: + - TAURI_SKIP_DEVSERVER_CHECK=true + + stdin_open: true + tty: true + +volumes: + node_modules: + cargo_registry: + cargo-git: + pnpm_store: + rust_target: + \ No newline at end of file diff --git a/docker/.dockerignore b/docker/.dockerignore new file mode 100644 index 0000000..ca7a5fb --- /dev/null +++ b/docker/.dockerignore @@ -0,0 +1,17 @@ +node_modules +target +dist +build +.cache +.git +.github +.vscode +.idea + +*.log +.env +.env.* +.DS_Store + +src-tauri/target +coverage \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..8c3d96b --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,85 @@ +#Base Builder Image +FROM rust:1.88-slim AS base + +ENV DEBIAN_FRONTEND=noninteractive + +# Install Node.js LTS +RUN apt-get update && apt-get install -y \ + curl \ + git \ + wget \ + pkg-config \ + build-essential \ + libssl-dev \ + libgtk-3-dev \ + libwebkit2gtk-4.1-dev \ + libappindicator3-dev \ + librsvg2-dev \ + patchelf \ + openssl \ + ca-certificates \ + xdg-utils \ + file \ + libxdo-dev \ + && rm -rf /var/lib/apt/lists/* + +# Install Node.js +RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ + apt-get update && apt-get install -y nodejs && \ + rm -rf /var/lib/apt/lists/* + +# Install package managers +RUN npm install -g \ + pnpm \ + yarn + +# Create non-root user +RUN useradd -ms /bin/bash developer && \ + mkdir -p /app && \ + chown -R developer:developer /app /usr/local/cargo + +WORKDIR /app + + +# Dependency Cache Stage +FROM base AS dependencies + +COPY package.json ./ +COPY package-lock.json* ./ +COPY pnpm-lock.yaml* ./ +COPY yarn.lock* ./ + +RUN \ + if [ -f package-lock.json ]; then npm install; fi && \ + if [ -f pnpm-lock.yaml ]; then pnpm install; fi && \ + if [ -f yarn.lock ]; then yarn install; fi + +COPY src-tauri/Cargo.toml ./src-tauri/Cargo.toml +COPY src-tauri/Cargo.lock ./src-tauri/Cargo.lock + +RUN mkdir -p src-tauri/src && \ + echo "fn main() {}" > src-tauri/src/main.rs && \ + touch src-tauri/src/lib.rs + +RUN cd src-tauri && cargo fetch + +# Development Stage +FROM base AS development + +COPY --from=dependencies --chown=developer:developer /usr/local/cargo /usr/local/cargo +COPY --from=dependencies --chown=developer:developer /app /app + +WORKDIR /app + +#USER developer + +USER root +RUN mkdir -p /tmp/cargo-target && chown -R developer:developer /tmp/cargo-target + +USER developer + +EXPOSE 1420 +EXPOSE 1421 +EXPOSE 5173 + +CMD ["pnpm", "tauri", "dev"] \ No newline at end of file diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000..2f5f783 --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,46 @@ +services: + tauri-app: + build: + context: .. + dockerfile: docker/Dockerfile + target: development + + container_name: tauri-dev + + working_dir: /app + + environment: + - DISPLAY=${DISPLAY} + - WAYLAND_DISPLAY=${WAYLAND_DISPLAY} + - XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR} + - RUST_BACKTRACE=1 + - NODE_ENV=development + - CHOKIDAR_USEPOLLING=true + - WEBKIT_DISABLE_COMPOSITING_MODE=1 + - CARGO_TARGET_DIR=/tmp/cargo-target + + volumes: + - ..:/app + - node_modules:/app/node_modules/ + - cargo-cache:/usr/local/cargo/registry + - cargo-target:/tmp/cargo-target + - /tmp/.X11-unix:/tmp/.X11-unix + + ports: + - "1420:1420" + - "1421:1421" + - "5173:5173" + + stdin_open: true + tty: true + + networks: + - tauri-network +networks: + tauri-network: + +volumes: + cargo-cache: + cargo-target: + node_modules: + \ No newline at end of file diff --git a/docker/scripts/build.sh b/docker/scripts/build.sh new file mode 100644 index 0000000..e69de29 diff --git a/docker/scripts/dev.sh b/docker/scripts/dev.sh new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json index d05dfa7..852e444 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,7 @@ "@playwright/test": "^1.60.0", "@tailwindcss/typography": "^0.5.19", "@tailwindcss/vite": "^4.3.0", - "@tauri-apps/cli": "2.10.1", + "@tauri-apps/cli": "^2.10.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", @@ -4118,9 +4118,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4138,9 +4135,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4158,9 +4152,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4178,9 +4169,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4407,9 +4395,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -4427,9 +4412,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -4447,9 +4429,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -4467,9 +4446,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -4487,9 +4463,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ diff --git a/package.json b/package.json index 2f6bbf4..5f1df30 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "@playwright/test": "^1.60.0", "@tailwindcss/typography": "^0.5.19", "@tailwindcss/vite": "^4.3.0", - "@tauri-apps/cli": "2.10.1", + "@tauri-apps/cli": "^2.10.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2a5fb80..518a7b5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -106,7 +106,7 @@ importers: specifier: ^4.3.0 version: 4.3.0(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)) '@tauri-apps/cli': - specifier: 2.10.1 + specifier: ^2.10.1 version: 2.10.1 '@testing-library/jest-dom': specifier: ^6.9.1 @@ -750,6 +750,10 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + + '@playwright/test@1.61.0': + resolution: {integrity: sha512-cKA5B6lpFEMyMGjxF54QihfYpB4FkEGH+qZhtArDEG+wezQAJY8Pq6C7T1SjWz+FFzt3TbyoXBQYk/0292TdJA==} + '@opentelemetry/api-logs@0.214.0': resolution: {integrity: sha512-40lSJeqYO8Uz2Yj7u94/SJWE/wONa7rmMKjI1ZcIjgf3MHNHv1OZUCrCETGuaRF62d5pQD1wKIW+L4lmSMTzZA==} engines: {node: '>=8.0.0'} @@ -788,6 +792,7 @@ packages: '@playwright/test@1.60.0': resolution: {integrity: sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==} + engines: {node: '>=18'} hasBin: true @@ -1529,79 +1534,66 @@ packages: resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.60.3': resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.60.3': resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.60.3': resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.60.3': resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.60.3': resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==} cpu: [loong64] os: [linux] - libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.60.3': resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.60.3': resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==} cpu: [ppc64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.60.3': resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.60.3': resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.60.3': resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.60.3': resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.60.3': resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openbsd-x64@4.60.3': resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==} @@ -1733,28 +1725,24 @@ packages: engines: {node: '>= 20'} cpu: [arm64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.3.0': resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] - libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.3.0': resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} engines: {node: '>= 20'} cpu: [x64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.3.0': resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} engines: {node: '>= 20'} cpu: [x64] os: [linux] - libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.3.0': resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} @@ -1831,35 +1819,30 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@tauri-apps/cli-linux-arm64-musl@2.10.1': resolution: {integrity: sha512-MIj78PDDGjkg3NqGptDOGgfXks7SYJwhiMh8SBoZS+vfdz7yP5jN18bNaLnDhsVIPARcAhE1TlsZe/8Yxo2zqg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@tauri-apps/cli-linux-riscv64-gnu@2.10.1': resolution: {integrity: sha512-X0lvOVUg8PCVaoEtEAnpxmnkwlE1gcMDTqfhbefICKDnOTJ5Est3qL0SrWxizDackIOKBcvtpejrSiVpuJI1kw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] - libc: [glibc] '@tauri-apps/cli-linux-x64-gnu@2.10.1': resolution: {integrity: sha512-2/12bEzsJS9fAKybxgicCDFxYD1WEI9kO+tlDwX5znWG2GwMBaiWcmhGlZ8fi+DMe9CXlcVarMTYc0L3REIRxw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@tauri-apps/cli-linux-x64-musl@2.10.1': resolution: {integrity: sha512-Y8J0ZzswPz50UcGOFuXGEMrxbjwKSPgXftx5qnkuMs2rmwQB5ssvLb6tn54wDSYxe7S6vlLob9vt0VKuNOaCIQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@tauri-apps/cli-win32-arm64-msvc@2.10.1': resolution: {integrity: sha512-iSt5B86jHYAPJa/IlYw++SXtFPGnWtFJriHn7X0NFBVunF6zu9+/zOn8OgqIWSl8RgzhLGXQEEtGBdR4wzpVgg==} @@ -3162,28 +3145,24 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} @@ -3488,6 +3467,7 @@ packages: resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} engines: {node: '>=16.20.0'} + playwright-core@1.60.0: resolution: {integrity: sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==} engines: {node: '>=18'} @@ -3495,6 +3475,7 @@ packages: playwright@1.60.0: resolution: {integrity: sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==} + engines: {node: '>=18'} hasBin: true @@ -4824,6 +4805,7 @@ snapshots: '@open-draft/until@2.1.0': {} + '@opentelemetry/api-logs@0.214.0': dependencies: '@opentelemetry/api': 1.9.1 @@ -7453,11 +7435,13 @@ snapshots: pkce-challenge@5.0.1: {} + playwright-core@1.60.0: {} playwright@1.60.0: dependencies: playwright-core: 1.60.0 + optionalDependencies: fsevents: 2.3.2