diff --git a/.github/workflows/build-and-deploy-preview.yaml b/.github/workflows/build-and-deploy-preview.yaml new file mode 100644 index 00000000..42496f72 --- /dev/null +++ b/.github/workflows/build-and-deploy-preview.yaml @@ -0,0 +1,81 @@ +name: Build and deploy preview + +on: + pull_request: + types: + - opened + - synchronize + +env: + tag: preview-${{ github.event.number }} + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ vars.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build, tag and push backend + uses: docker/build-push-action@v5 + with: + file: ./apps/backend/Dockerfile + tags: ${{ vars.DOCKERHUB_USERNAME }}/dundring-backend:${{ env.tag }} + push: true + + - name: Build, tag and push frontend + uses: docker/build-push-action@v5 + with: + file: ./apps/frontend/Dockerfile + push: true + tags: ${{ vars.DOCKERHUB_USERNAME }}/dundring-frontend:${{ env.tag }} + + deploy: + runs-on: ubuntu-latest + needs: build + environment: preview + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Add docker compose file to server + uses: appleboy/scp-action@v0.1.4 + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USERNAME }} + key: ${{ secrets.SSH_KEY }} + source: docker/preview/docker-compose.yaml + target: previews/${{ env.tag }} + strip_components: 2 + + - name: Start the containers with Docker Compose + uses: appleboy/ssh-action@v1.0.0 + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USERNAME }} + key: ${{ secrets.SSH_KEY }} + + script: | + cd previews/${{ env.tag }} + + TAG=${{ env.tag }} \ + docker-compose pull + + TAG=${{ env.tag }} \ + DB_USERNAME=dundring \ + DB_PASSWORD=password \ + CLOUDFLARE_DNS_API_TOKEN=${{ secrets.CLOUDFLARE_API_TOKEN }} \ + MAIL_HOST=${{ secrets.MAIL_HOST }} \ + MAIL_PORT=${{ secrets.MAIL_PORT }} \ + MAIL_USER=${{ secrets.MAIL_USER }} \ + MAIL_PASSWORD='${{ secrets.MAIL_PASSWORD }}' \ + docker-compose up -d diff --git a/.github/workflows/build-and-deploy.yaml b/.github/workflows/build-and-deploy.yaml new file mode 100644 index 00000000..c125d329 --- /dev/null +++ b/.github/workflows/build-and-deploy.yaml @@ -0,0 +1,78 @@ +name: Build and deploy dev + +on: + push: + branches: [master] + +env: + tag: dev + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ vars.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build, tag and push backend + uses: docker/build-push-action@v5 + with: + file: ./apps/backend/Dockerfile + tags: ${{ vars.DOCKERHUB_USERNAME }}/dundring-backend:${{ env.tag }} + push: true + + - name: Build, tag and push frontend + uses: docker/build-push-action@v5 + with: + file: ./apps/frontend/Dockerfile + push: true + tags: ${{ vars.DOCKERHUB_USERNAME }}/dundring-frontend:${{ env.tag }} + + deploy: + runs-on: ubuntu-latest + needs: build + environment: dev + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Add docker compose file to server + uses: appleboy/scp-action@v0.1.4 + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USERNAME }} + key: ${{ secrets.SSH_KEY }} + source: docker/dev/docker-compose.yaml + target: dev + strip_components: 2 + + - name: Start the containers with Docker Compose + uses: appleboy/ssh-action@v1.0.0 + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USERNAME }} + key: ${{ secrets.SSH_KEY }} + + script: | + cd dev + + docker-compose pull + + DB_USERNAME=${{ DB_USERNAME }} \ + DB_PASSWORD=${{ DB_PASSWORD }} \ + CLOUDFLARE_DNS_API_TOKEN=${{ secrets.CLOUDFLARE_API_TOKEN }} \ + MAIL_HOST=${{ secrets.MAIL_HOST }} \ + MAIL_PORT=${{ secrets.MAIL_PORT }} \ + MAIL_USER=${{ secrets.MAIL_USER }} \ + MAIL_PASSWORD='${{ secrets.MAIL_PASSWORD }}' \ + TOKEN_SECRET=${{ secrets.TOKEN_SECRET }} \ + docker-compose up -d diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml deleted file mode 100644 index 5a3a15f5..00000000 --- a/.github/workflows/build.yaml +++ /dev/null @@ -1,26 +0,0 @@ -name: Build - -on: - push: - branches: ['master'] - pull_request: - branches: ['master'] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Setup Node 18 environment - uses: actions/setup-node@v4 - with: - node-version: 18 - cache: 'yarn' - - - name: Install dependencies - run: yarn - - - name: Build - run: yarn run build diff --git a/apps/backend/Dockerfile b/apps/backend/Dockerfile new file mode 100644 index 00000000..0d446664 --- /dev/null +++ b/apps/backend/Dockerfile @@ -0,0 +1,43 @@ +FROM node:16-alpine AS base + +FROM base AS builder +RUN apk add --no-cache libc6-compat +RUN apk update +# Set working directory +WORKDIR /app +RUN yarn global add turbo +COPY . . +RUN turbo prune --scope=@dundring/backend --docker + +# Add lockfile and package.json's of isolated subworkspace +FROM base AS installer +RUN apk add --no-cache libc6-compat +RUN apk add --no-cache openssl1.1-compat +RUN apk update +WORKDIR /app + +# First install dependencies (as they change less often) +COPY .gitignore .gitignore +COPY --from=builder /app/out/json/ . +COPY --from=builder /app/out/yarn.lock ./yarn.lock +RUN yarn install --ignore-scripts --frozen-lockfile + +# Build the project and its dependencies +COPY --from=builder /app/out/full/ . +COPY turbo.json turbo.json + +RUN yarn turbo run build --filter=@dundring/backend + +FROM base AS runner +RUN apk add --no-cache openssl1.1-compat +WORKDIR /app + +# Don't run production as root +RUN addgroup --system --gid 1001 expressjs +RUN adduser --system --uid 1001 expressjs +# USER expressjs +COPY --from=installer /app . + +# CMD libs/database && node apps/backend/build/server.js +ENTRYPOINT ["/app/apps/backend/docker-entrypoint.sh"] +CMD node /app/apps/backend/build/server.js diff --git a/apps/backend/docker-entrypoint.sh b/apps/backend/docker-entrypoint.sh new file mode 100755 index 00000000..d74016cd --- /dev/null +++ b/apps/backend/docker-entrypoint.sh @@ -0,0 +1,9 @@ +#!/bin/sh +set -e + +cd libs/database + +# Run the database migration +yarn db:migrate + +exec "$@" diff --git a/apps/backend/src/server.ts b/apps/backend/src/server.ts index cb4a6331..de3257c6 100644 --- a/apps/backend/src/server.ts +++ b/apps/backend/src/server.ts @@ -44,7 +44,7 @@ app.use(cors()); app.use('/api', router); const httpServer = http.createServer(app); -const wss = new WebSocket.Server({ server: httpServer }); +const wss = new WebSocket.Server({ server: httpServer, path: '/api' }); const checkEnvConfig = () => { if (!process.env.PORT) { diff --git a/apps/frontend/Dockerfile b/apps/frontend/Dockerfile new file mode 100644 index 00000000..18bbeb46 --- /dev/null +++ b/apps/frontend/Dockerfile @@ -0,0 +1,42 @@ +FROM node:16-alpine AS base + +FROM base AS builder +RUN apk add --no-cache libc6-compat +RUN apk update +# Set working directory +WORKDIR /app +RUN yarn global add turbo +COPY . . +RUN turbo prune --scope=@dundring/frontend --docker + +# Add lockfile and package.json's of isolated subworkspace +FROM base AS installer +RUN apk add --no-cache libc6-compat +RUN apk add --no-cache openssl1.1-compat +RUN apk update +WORKDIR /app + +# First install dependencies (as they change less often) +COPY .gitignore .gitignore +COPY --from=builder /app/out/json/ . +COPY --from=builder /app/out/yarn.lock ./yarn.lock +RUN yarn install --ignore-scripts --frozen-lockfile + +# Build the project and its dependencies +COPY --from=builder /app/out/full/ . +COPY turbo.json turbo.json + +RUN yarn turbo run build --filter=@dundring/frontend + +# Use a lightweight web server to serve the static files +FROM nginx:1.25.2-alpine AS runner + +# Copy the built React app from the build stage to the NGINX web server +COPY --from=installer /app/apps/frontend/dist /usr/share/nginx/html +COPY /apps/frontend/nginx.conf /etc/nginx/conf.d/default.conf + +# Expose port 80 for incoming HTTP traffic +EXPOSE 80 + +# Start the NGINX web server +CMD ["nginx", "-g", "daemon off;"] diff --git a/apps/frontend/nginx.conf b/apps/frontend/nginx.conf new file mode 100644 index 00000000..81664041 --- /dev/null +++ b/apps/frontend/nginx.conf @@ -0,0 +1,7 @@ +server { + root /usr/share/nginx/html; + + location / { + try_files $uri $uri/ /index.html; + } +} diff --git a/apps/frontend/src/api.ts b/apps/frontend/src/api.ts index 56c3ef03..f06062d8 100644 --- a/apps/frontend/src/api.ts +++ b/apps/frontend/src/api.ts @@ -11,12 +11,12 @@ import { WorkoutRequestBody, WorkoutsResponseBody, } from '@dundring/types'; -export const domain = import.meta.env.VITE_DOMAIN || 'http://localhost:3000'; +import { getEnv } from './utils/environment'; -export const httpUrl = - import.meta.env.VITE_HTTP_URL || 'http://localhost:8080/api'; +export const domain = location.origin; -export const wsUrl = import.meta.env.VITE_WS_URL || 'ws://localhost:8080'; +export const httpUrl = getEnv().dundringHttpServerUrl; +export const wsUrl = getEnv().dundringWsServerUrl; const get = async ( url: string, diff --git a/apps/frontend/src/env.d.ts b/apps/frontend/src/env.d.ts index c33e80f0..03662a40 100644 --- a/apps/frontend/src/env.d.ts +++ b/apps/frontend/src/env.d.ts @@ -2,9 +2,7 @@ interface ImportMetaEnv { readonly VITE_APP_TITLE: string; - readonly VITE_DOMAIN: string; - readonly VITE_HTTP_URL: string; - readonly VITE_WS_URL: string; + readonly VITE_ENV_OVERRIDE: string; } interface ImportMeta { diff --git a/apps/frontend/src/utils/environment.ts b/apps/frontend/src/utils/environment.ts new file mode 100644 index 00000000..64fcb7ec --- /dev/null +++ b/apps/frontend/src/utils/environment.ts @@ -0,0 +1,35 @@ +interface Environment { + dundringHttpServerUrl: string; + dundringWsServerUrl: string; +} + +export const getEnv = (): Environment => { + const envOverride = import.meta.env.VITE_ENV_OVERRIDE || null; + + switch (envOverride) { + case 'test': + return { + dundringHttpServerUrl: 'https://test.dundring.com/api', + dundringWsServerUrl: 'wss://test.dundring.com/api', + }; + case 'prod': + return { + dundringHttpServerUrl: 'https://dundring.com/api', + dundringWsServerUrl: 'wss://dundring.com/api', + }; + default: + if (isSecureConnection()) { + return { + dundringHttpServerUrl: `https://${location.hostname}/api`, + dundringWsServerUrl: `wss://${location.hostname}/api`, + }; + } + + return { + dundringHttpServerUrl: 'http://localhost:8080/api', + dundringWsServerUrl: 'ws://localhost:8080/api', + }; + } +}; + +const isSecureConnection = () => location.protocol === 'https:'; diff --git a/docker/dev/docker-compose.yaml b/docker/dev/docker-compose.yaml new file mode 100644 index 00000000..8fd07e46 --- /dev/null +++ b/docker/dev/docker-compose.yaml @@ -0,0 +1,48 @@ +version: '3.7' +services: + postgres: + image: postgres:16.1-alpine + container_name: postgres-dev + restart: always + environment: + POSTGRES_USER: ${DB_USERNAME} + POSTGRES_PASSWORD: ${DB_PASSWORD} + networks: + - dundring + volumes: + - ~/dev-data:/var/lib/postgresql/data + + backend: + image: sivertschou/dundring-backend:dev + container_name: backend-dev + restart: always + environment: + - DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@postgres:5432/dundring + - MAIL_PORT=${MAIL_PORT} + - MAIL_HOST=${MAIL_HOST} + - MAIL_USER=${MAIL_USER} + - MAIL_PASSWORD=${MAIL_PASSWORD} + - TOKEN_SECRET=${TOKEN_SECRET} + networks: + - caddy + - dundring + labels: + caddy: dev.dundring.com + caddy.reverse_proxy: '/api* {{upstreams 8080}}' + caddy.tls.dns: 'cloudflare ${CLOUDFLARE_DNS_API_TOKEN}' + + frontend: + image: sivertschou/dundring-frontend:dev + container_name: frontend-dev + restart: always + networks: + - caddy + labels: + caddy: dev.dundring.com + caddy.reverse_proxy: '{{upstreams 80}}' + caddy.tls.dns: 'cloudflare ${CLOUDFLARE_DNS_API_TOKEN}' + +networks: + caddy: + external: true + dundring: diff --git a/docker/preview/docker-compose.yaml b/docker/preview/docker-compose.yaml new file mode 100644 index 00000000..fb2889f5 --- /dev/null +++ b/docker/preview/docker-compose.yaml @@ -0,0 +1,42 @@ +version: '3.7' +services: + postgres: + image: postgres:16.1-alpine + container_name: postgres-${TAG} + environment: + POSTGRES_USER: ${DB_USERNAME} + POSTGRES_PASSWORD: ${DB_PASSWORD} + networks: + - dundring + + backend: + image: sivertschou/dundring-backend:${TAG} + container_name: backend-${TAG} + environment: + - DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@postgres:5432/dundring + - MAIL_PORT=${MAIL_PORT} + - MAIL_HOST=${MAIL_HOST} + - MAIL_USER=${MAIL_USER} + - MAIL_PASSWORD=${MAIL_PASSWORD} + networks: + - caddy + - dundring + labels: + caddy: ${TAG}.dundring.com + caddy.reverse_proxy: '/api* {{upstreams 8080}}' + caddy.tls.dns: 'cloudflare ${CLOUDFLARE_DNS_API_TOKEN}' + + frontend: + image: sivertschou/dundring-frontend:${TAG} + container_name: frontend-${TAG} + networks: + - caddy + labels: + caddy: ${TAG}.dundring.com + caddy.reverse_proxy: '{{upstreams 80}}' + caddy.tls.dns: 'cloudflare ${CLOUDFLARE_DNS_API_TOKEN}' + +networks: + caddy: + external: true + dundring: diff --git a/libs/database/package.json b/libs/database/package.json index 954137a1..3ace8b05 100644 --- a/libs/database/package.json +++ b/libs/database/package.json @@ -28,6 +28,7 @@ "@rollup/plugin-typescript": "^9.0.2", "prisma": "^5.6.0", "rollup": "^3.2.5", + "tslib": "^2.6.2", "typescript": "4.8.4" } } diff --git a/libs/database/prisma/migrations/20231125130754_initial/migration.sql b/libs/database/prisma/migrations/20231125130754_initial/migration.sql new file mode 100644 index 00000000..00fabb54 --- /dev/null +++ b/libs/database/prisma/migrations/20231125130754_initial/migration.sql @@ -0,0 +1,55 @@ +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "username" TEXT NOT NULL, + "mail" TEXT NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "FitnessData" ( + "id" TEXT NOT NULL, + "ftp" INTEGER NOT NULL, + "userId" TEXT NOT NULL, + + CONSTRAINT "FitnessData_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Workout" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "userId" TEXT NOT NULL, + + CONSTRAINT "Workout_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "SteadyWorkoutPart" ( + "index" INTEGER NOT NULL, + "duration" INTEGER NOT NULL, + "power" INTEGER NOT NULL, + "workoutId" TEXT NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_username_key" ON "User"("username"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_mail_key" ON "User"("mail"); + +-- CreateIndex +CREATE UNIQUE INDEX "FitnessData_userId_key" ON "FitnessData"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "SteadyWorkoutPart_index_workoutId_key" ON "SteadyWorkoutPart"("index", "workoutId"); + +-- AddForeignKey +ALTER TABLE "FitnessData" ADD CONSTRAINT "FitnessData_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Workout" ADD CONSTRAINT "Workout_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "SteadyWorkoutPart" ADD CONSTRAINT "SteadyWorkoutPart_workoutId_fkey" FOREIGN KEY ("workoutId") REFERENCES "Workout"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/libs/database/prisma/migrations/migration_lock.toml b/libs/database/prisma/migrations/migration_lock.toml new file mode 100644 index 00000000..fbffa92c --- /dev/null +++ b/libs/database/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/libs/database/prisma/schema.prisma b/libs/database/prisma/schema.prisma index ac7a0daf..5468841d 100644 --- a/libs/database/prisma/schema.prisma +++ b/libs/database/prisma/schema.prisma @@ -6,9 +6,8 @@ generator client { } datasource db { - provider = "mysql" - url = env("DATABASE_URL") - relationMode = "prisma" + provider = "postgresql" + url = env("DATABASE_URL") } model User { @@ -32,8 +31,6 @@ model Workout { parts SteadyWorkoutPart[] user User @relation(fields: [userId], references: [id]) userId String - - @@index([userId]) } model SteadyWorkoutPart { @@ -44,5 +41,4 @@ model SteadyWorkoutPart { workoutId String @@unique([index, workoutId]) - @@index([workoutId]) } diff --git a/libs/database/readme.md b/libs/database/readme.md index 83e22769..bb5981e2 100644 --- a/libs/database/readme.md +++ b/libs/database/readme.md @@ -2,22 +2,18 @@ 1. Pull the database image ``` - docker pull mysql:8.2 + docker pull postgres:16.1-alpine ``` 2. Start the database ``` - docker run \ - --name dundring-mysql \ - -e MYSQL_ROOT_PASSWORD=password \ - -e MYSQL_DATABASE=dundring \ - -e MYSQL_USER=mysql \ - -e MYSQL_PASSWORD=password \ - -p 3306:3306 \ - mysql:8.2 + docker run \ + -p 5432:5432 \ + -e POSTGRES_PASSWORD=password \ + postgres:16.1-alpine ``` 3. Push the migrations to the database ``` - DATABASE_URL=mysql://mysql:password@localhost:3306/dundring \ - yarn db:push + DATABASE_URL=postgres://postgres:password@localhost:5432/dundring \ + yarn db:migrate ``` You can also set this in the `.env` file. See `.env.example` diff --git a/libs/types/package.json b/libs/types/package.json index 950e509e..d96f17af 100644 --- a/libs/types/package.json +++ b/libs/types/package.json @@ -4,9 +4,20 @@ "private": true, "description": "", "author": "", - "main": "src/index.ts", - "types": "src/index.ts", + "main": "dist/index.cjs.js", + "module": "dist/index.esm.js", + "types": "dist/index.d.ts", + "files": [ + "dist/**" + ], + "scripts": { + "build": "rollup -c --bundleConfigAsCjs", + "start": "rollup -c -w --bundleConfigAsCjs" + }, "devDependencies": { + "@dundring/tsconfig": "*", + "@rollup/plugin-typescript": "^9.0.2", + "rollup": "^3.2.5", "typescript": "4.8.4" } } diff --git a/libs/types/rollup.config.js b/libs/types/rollup.config.js new file mode 100644 index 00000000..0139b5cc --- /dev/null +++ b/libs/types/rollup.config.js @@ -0,0 +1,16 @@ +import typescript from '@rollup/plugin-typescript'; + +export default { + input: 'src/index.ts', + output: [ + { + file: './dist/index.cjs.js', + format: 'cjs', + }, + { + file: './dist/index.esm.js', + format: 'esm', + }, + ], + plugins: [typescript()], +}; diff --git a/libs/utils/package.json b/libs/utils/package.json index 767522bb..b5ac60e4 100644 --- a/libs/utils/package.json +++ b/libs/utils/package.json @@ -4,10 +4,20 @@ "private": true, "description": "", "author": "", - "main": "src/index.ts", - "types": "src/index.ts", + "main": "dist/index.cjs.js", + "module": "dist/index.esm.js", + "types": "dist/index.d.ts", + "files": [ + "dist/**" + ], + "scripts": { + "build": "rollup -c --bundleConfigAsCjs", + "start": "rollup -c -w --bundleConfigAsCjs" + }, "devDependencies": { "@dundring/types": "*", + "@rollup/plugin-typescript": "^9.0.2", + "rollup": "^3.2.5", "typescript": "4.8.4" } } diff --git a/libs/utils/rollup.config.js b/libs/utils/rollup.config.js new file mode 100644 index 00000000..0139b5cc --- /dev/null +++ b/libs/utils/rollup.config.js @@ -0,0 +1,16 @@ +import typescript from '@rollup/plugin-typescript'; + +export default { + input: 'src/index.ts', + output: [ + { + file: './dist/index.cjs.js', + format: 'cjs', + }, + { + file: './dist/index.esm.js', + format: 'esm', + }, + ], + plugins: [typescript()], +}; diff --git a/package.json b/package.json index 498ad8dc..ceec081b 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,9 @@ "description": "", "author": "sivertschou", "private": true, + "packageManager": "yarn@1.22.18", "scripts": { - "prepare": "husky install && turbo run prepare && bash scripts/print_dundring.sh", + "prepare": "husky install && bash scripts/print_dundring.sh", "start": "FORCE_COLOR=1 turbo run start", "mock": "FORCE_COLOR=1 turbo run mock", "build:mock": "turbo run build:mock", @@ -23,7 +24,7 @@ "lint-staged": "^13.0.3", "node-jq": "^2.3.4", "prettier": "3.0.3", - "turbo": "^1.4.4" + "turbo": "^1.10.15" }, "workspaces": [ "libs/*", diff --git a/yarn.lock b/yarn.lock index 0ede663d..1fe94e71 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2041,9 +2041,9 @@ resolve "^1.22.1" "@rollup/pluginutils@^5.0.1": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.5.tgz#bbb4c175e19ebfeeb8c132c2eea0ecb89941a66c" - integrity sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q== + version "5.0.2" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33" + integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== dependencies: "@types/estree" "^1.0.0" estree-walker "^2.0.2" @@ -2281,9 +2281,9 @@ integrity sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw== "@types/estree@^1.0.0": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== "@types/express-serve-static-core@^4.17.33": version "4.17.41" @@ -6336,9 +6336,9 @@ rollup@^2.79.1: fsevents "~2.3.2" rollup@^3.2.5: - version "3.29.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" - integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== + version "3.2.5" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.2.5.tgz#9452168ac083218c8212bf53d2448bdc6b8b0de7" + integrity sha512-/Ha7HhVVofduy+RKWOQJrxe4Qb3xyZo+chcpYiD8SoQa4AG7llhupUtyfKSSrdBM2mWJjhM8wZwmbY23NmlIYw== optionalDependencies: fsevents "~2.3.2" @@ -6890,7 +6890,7 @@ tslib@^1.0.0, tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -6909,36 +6909,78 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +turbo-darwin-64@1.10.15: + version "1.10.15" + resolved "https://registry.yarnpkg.com/turbo-darwin-64/-/turbo-darwin-64-1.10.15.tgz#8f1d80ca91e46909a2c80e416e475bc44c91ef9f" + integrity sha512-Sik5uogjkRTe1XVP9TC2GryEMOJCaKE2pM/O9uLn4koQDnWKGcLQv+mDU+H+9DXvKLnJnKCD18OVRkwK5tdpoA== + turbo-darwin-64@1.10.16: version "1.10.16" resolved "https://registry.yarnpkg.com/turbo-darwin-64/-/turbo-darwin-64-1.10.16.tgz#5a8717c1372f2a75e8cfe0b4b6455119ce410b19" integrity sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg== +turbo-darwin-arm64@1.10.15: + version "1.10.15" + resolved "https://registry.yarnpkg.com/turbo-darwin-arm64/-/turbo-darwin-arm64-1.10.15.tgz#4b6b29c9d10c8e286b27d372936c09a98f34449a" + integrity sha512-xwqyFDYUcl2xwXyGPmHkmgnNm4Cy0oNzMpMOBGRr5x64SErS7QQLR4VHb0ubiR+VAb8M+ECPklU6vD1Gm+wekg== + turbo-darwin-arm64@1.10.16: version "1.10.16" resolved "https://registry.yarnpkg.com/turbo-darwin-arm64/-/turbo-darwin-arm64-1.10.16.tgz#19b5b63acf7ee0fce7e1fe5850e093c2ac9c73f5" integrity sha512-jqGpFZipIivkRp/i+jnL8npX0VssE6IAVNKtu573LXtssZdV/S+fRGYA16tI46xJGxSAivrZ/IcgZrV6Jk80bw== +turbo-linux-64@1.10.15: + version "1.10.15" + resolved "https://registry.yarnpkg.com/turbo-linux-64/-/turbo-linux-64-1.10.15.tgz#a892aae53946c68f311b2e71504af5b9768dd2c1" + integrity sha512-dM07SiO3RMAJ09Z+uB2LNUSkPp3I1IMF8goH5eLj+d8Kkwoxd/+qbUZOj9RvInyxU/IhlnO9w3PGd3Hp14m/nA== + turbo-linux-64@1.10.16: version "1.10.16" resolved "https://registry.yarnpkg.com/turbo-linux-64/-/turbo-linux-64-1.10.16.tgz#ee97c0011553a96bd7995e7bcc6e65aab8996798" integrity sha512-PpqEZHwLoizQ6sTUvmImcRmACyRk9EWLXGlqceogPZsJ1jTRK3sfcF9fC2W56zkSIzuLEP07k5kl+ZxJd8JMcg== +turbo-linux-arm64@1.10.15: + version "1.10.15" + resolved "https://registry.yarnpkg.com/turbo-linux-arm64/-/turbo-linux-arm64-1.10.15.tgz#9d241414e75c7457ea8371c36c4b9700ec7ca553" + integrity sha512-MkzKLkKYKyrz4lwfjNXH8aTny5+Hmiu4SFBZbx+5C0vOlyp6fV5jZANDBvLXWiDDL4DSEAuCEK/2cmN6FVH1ow== + turbo-linux-arm64@1.10.16: version "1.10.16" resolved "https://registry.yarnpkg.com/turbo-linux-arm64/-/turbo-linux-arm64-1.10.16.tgz#2723cc2a846d89df7484002161b25673f4f04009" integrity sha512-TMjFYz8to1QE0fKVXCIvG/4giyfnmqcQIwjdNfJvKjBxn22PpbjeuFuQ5kNXshUTRaTJihFbuuCcb5OYFNx4uw== +turbo-windows-64@1.10.15: + version "1.10.15" + resolved "https://registry.yarnpkg.com/turbo-windows-64/-/turbo-windows-64-1.10.15.tgz#7d19853634482f01b7c4ae8d5e255321a2f7582c" + integrity sha512-3TdVU+WEH9ThvQGwV3ieX/XHebtYNHv9HARHauPwmVj3kakoALkpGxLclkHFBLdLKkqDvmHmXtcsfs6cXXRHJg== + turbo-windows-64@1.10.16: version "1.10.16" resolved "https://registry.yarnpkg.com/turbo-windows-64/-/turbo-windows-64-1.10.16.tgz#87c46a78502a86dec73634b255a6b3471285969b" integrity sha512-+jsf68krs0N66FfC4/zZvioUap/Tq3sPFumnMV+EBo8jFdqs4yehd6+MxIwYTjSQLIcpH8KoNMB0gQYhJRLZzw== +turbo-windows-arm64@1.10.15: + version "1.10.15" + resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-1.10.15.tgz#c7b0cf8732b02914b415577593afeda4155219fb" + integrity sha512-l+7UOBCbfadvPMYsX08hyLD+UIoAkg6ojfH+E8aud3gcA1padpjCJTh9gMpm3QdMbKwZteT5uUM+wyi6Rbbyww== + turbo-windows-arm64@1.10.16: version "1.10.16" resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-1.10.16.tgz#a6208c2bc27e5e6ef0aa4a3e64389c4285c3f274" integrity sha512-sKm3hcMM1bl0B3PLG4ifidicOGfoJmOEacM5JtgBkYM48ncMHjkHfFY7HrJHZHUnXM4l05RQTpLFoOl/uIo2HQ== +turbo@^1.10.15: + version "1.10.15" + resolved "https://registry.yarnpkg.com/turbo/-/turbo-1.10.15.tgz#356731acb46991b4e337cce2f7ccd3279bc1f1a6" + integrity sha512-mKKkqsuDAQy1wCCIjCdG+jOCwUflhckDMSRoeBPcIL/CnCl7c5yRDFe7SyaXloUUkt4tUR0rvNIhVCcT7YeQpg== + optionalDependencies: + turbo-darwin-64 "1.10.15" + turbo-darwin-arm64 "1.10.15" + turbo-linux-64 "1.10.15" + turbo-linux-arm64 "1.10.15" + turbo-windows-64 "1.10.15" + turbo-windows-arm64 "1.10.15" + turbo@^1.4.4: version "1.10.16" resolved "https://registry.yarnpkg.com/turbo/-/turbo-1.10.16.tgz#51601a65a3aa56d1b9d9cb9a2ab3a5a2eab41e19"