diff --git a/.github/workflows/check-app-quality.yml b/.github/workflows/check-app-quality.yml deleted file mode 100644 index 557259d..0000000 --- a/.github/workflows/check-app-quality.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Check App Quality - -on: - pull_request: - branches: [main] - -jobs: - preview: - name: Create deploy preview - if: github.repository == 'KonradSzwarc/devscard' - runs-on: ubuntu-latest - outputs: - deploy-url: ${{ steps.netlify.outputs.deploy-url }} - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 16 - cache: npm - - name: Install dependencies - run: npm ci - - name: Run Astro build command - run: npm run build - - name: Deploy to Netlify - id: netlify - uses: nwtgck/actions-netlify@v2 - with: - publish-dir: dist - production-branch: main - github-token: ${{ secrets.GITHUB_TOKEN }} - alias: deploy-preview-${{ github.event.number }} - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} - timeout-minutes: 1 - - lighthouse: - name: Run Lighthouse tests - if: github.repository == 'KonradSzwarc/devscard' - needs: preview - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Lighthouse - uses: foo-software/lighthouse-check-action@master - with: - urls: ${{ needs.preview.outputs.deploy-url }} - gitAuthor: ${{ github.actor }} - gitBranch: ${{ github.ref }} - gitHubAccessToken: ${{ secrets.GITHUB_TOKEN }} - device: all - prCommentEnabled: true - prCommentSaveOld: false diff --git a/.github/workflows/check-code-quality.yml b/.github/workflows/check-code-quality.yml deleted file mode 100644 index 74f4dbe..0000000 --- a/.github/workflows/check-code-quality.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Check Code Quality - -on: - push: - branches: [main] - pull_request: - branches: [main] - -jobs: - prettier: - name: Run Prettier check - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 16 - cache: npm - - name: Install dependencies - run: npm ci - - name: Run Prettier - run: npm run prettier:check - - typescript: - name: Check TypeScript types - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 16 - cache: npm - - name: Install dependencies - run: npm ci - - name: Run TypeScript types check - run: npm run ts:check - - astro: - name: Run Astro check - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 16 - cache: npm - - name: Install dependencies - run: npm ci - - name: Run Astro check - run: npm run astro:check diff --git a/.github/workflows/main-branch.yml b/.github/workflows/main-branch.yml new file mode 100644 index 0000000..ac0ecec --- /dev/null +++ b/.github/workflows/main-branch.yml @@ -0,0 +1,112 @@ +name: Main Branch + +on: + push: + branches: [main] + +jobs: + prettier: + name: Run Prettier check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16 + cache: npm + - name: Install dependencies + run: npm ci + - name: Run Prettier + run: npm run prettier:check + + typescript: + name: Run TypeScript check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16 + cache: npm + - name: Install dependencies + run: npm ci + - name: Run TypeScript types check + run: npm run ts:check + + astro: + name: Run Astro check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16 + cache: npm + - name: Install dependencies + run: npm ci + - name: Run Astro check + run: npm run astro:check + + percy: + name: Run Percy check + if: github.repository == 'KonradSzwarc/devscard' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16 + cache: npm + - name: Install dependencies + run: npm ci + - name: Run Astro build command + env: + PUBLIC_APP_ENV: snapshot + run: npm run build + - name: Percy check + env: + PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }} + run: npx percy snapshot dist/ + + deploy: + name: Deploy to Netlify + needs: [prettier, typescript, astro] + if: github.repository == 'KonradSzwarc/devscard' + runs-on: ubuntu-latest + outputs: + deploy-url: ${{ steps.netlify.outputs.deploy-url }} + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16 + cache: npm + - name: Install dependencies + run: npm ci + - name: Run Astro build command + run: npm run build + - name: Deploy to Netlify + id: netlify + uses: nwtgck/actions-netlify@v2 + with: + publish-dir: dist + production-branch: main + github-token: ${{ secrets.GITHUB_TOKEN }} + production-deploy: true + env: + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + timeout-minutes: 1 + + lighthouse: + name: Run Lighthouse check + if: github.repository == 'KonradSzwarc/devscard' + needs: deploy + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Lighthouse check + uses: foo-software/lighthouse-check-action@master + with: + urls: ${{ needs.deploy.outputs.deploy-url }} + device: all diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 0000000..d2e1f68 --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,117 @@ +name: Pull Request + +on: + pull_request: + branches: [main] + +jobs: + prettier: + name: Run Prettier check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16 + cache: npm + - name: Install dependencies + run: npm ci + - name: Run Prettier + run: npm run prettier:check + + typescript: + name: Run TypeScript check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16 + cache: npm + - name: Install dependencies + run: npm ci + - name: Run TypeScript types check + run: npm run ts:check + + astro: + name: Run Astro check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16 + cache: npm + - name: Install dependencies + run: npm ci + - name: Run Astro check + run: npm run astro:check + + percy: + name: Run Percy check + if: github.repository == 'KonradSzwarc/devscard' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16 + cache: npm + - name: Install dependencies + run: npm ci + - name: Run Astro build command + env: + PUBLIC_APP_ENV: snapshot + run: npm run build + - name: Percy check + env: + PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }} + run: npx percy snapshot dist/ + + preview: + name: Create deploy preview + needs: [prettier, typescript, astro] + if: github.repository == 'KonradSzwarc/devscard' + runs-on: ubuntu-latest + outputs: + deploy-url: ${{ steps.netlify.outputs.deploy-url }} + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16 + cache: npm + - name: Install dependencies + run: npm ci + - name: Run Astro build command + run: npm run build + - name: Deploy to Netlify + id: netlify + uses: nwtgck/actions-netlify@v2 + with: + publish-dir: dist + production-branch: main + github-token: ${{ secrets.GITHUB_TOKEN }} + alias: deploy-preview-${{ github.event.number }} + env: + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + timeout-minutes: 1 + + lighthouse: + name: Run Lighthouse check + if: github.repository == 'KonradSzwarc/devscard' + needs: preview + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Lighthouse check + uses: foo-software/lighthouse-check-action@master + with: + urls: ${{ needs.preview.outputs.deploy-url }} + gitAuthor: ${{ github.actor }} + gitBranch: ${{ github.ref }} + gitHubAccessToken: ${{ secrets.GITHUB_TOKEN }} + device: all + prCommentEnabled: true + prCommentSaveOld: false diff --git a/.percy.json b/.percy.json new file mode 100644 index 0000000..9c1eb09 --- /dev/null +++ b/.percy.json @@ -0,0 +1,18 @@ +{ + "version": 2, + "snapshot": { + "widths": [375, 1280], + "minHeight": 1024, + "enable-javascript": true + }, + "static": { + "include": ["/index.html"] + }, + "discovery": { + "allowedHostnames": ["api.iconify.design"], + "networkIdleTimeout": 750 + }, + "upload": { + "files": "**/*.{png,jpg,jpeg,svg,webp}" + } +} diff --git a/package-lock.json b/package-lock.json index 1f2ef54..390e84b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@astrojs/image": "0.12.1", "@astrojs/react": "1.2.2", "@astrojs/tailwind": "2.1.3", + "@percy/cli": "1.17.0", "astro": "1.9.2", "astro-compress": "1.1.27", "concurrently": "7.6.0", @@ -791,6 +792,244 @@ "pako": "^1.0.10" } }, + "node_modules/@percy/cli": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli/-/cli-1.17.0.tgz", + "integrity": "sha512-uY755vWT+bx3IVvzZKTbX7UJclPXStp85M9LSaWff1K8nk47c+patB9ydLSZKQu+Qkj1L/5L46plaResn8SfsA==", + "dev": true, + "dependencies": { + "@percy/cli-app": "1.17.0", + "@percy/cli-build": "1.17.0", + "@percy/cli-command": "1.17.0", + "@percy/cli-config": "1.17.0", + "@percy/cli-exec": "1.17.0", + "@percy/cli-snapshot": "1.17.0", + "@percy/cli-upload": "1.17.0", + "@percy/client": "1.17.0", + "@percy/logger": "1.17.0" + }, + "bin": { + "percy": "bin/run.cjs" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-app": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-app/-/cli-app-1.17.0.tgz", + "integrity": "sha512-8Vc/pfaKsubKXRaPNdB3Snd8h7NfGPNio5RtETgQpJHwE+hu4rbjN4WovkjntiUSsQwLGYpXmKqV9n+8Z4oskA==", + "dev": true, + "dependencies": { + "@percy/cli-command": "1.17.0", + "@percy/cli-exec": "1.17.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-build": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-build/-/cli-build-1.17.0.tgz", + "integrity": "sha512-ES5Cwwa4n7/czOObqhG/o2Lr2l4VZFG2DEH/WGarCgsG42yiKqNWUHjFZj2AYfvv24f0b1KpL/Hz7gBauagGZA==", + "dev": true, + "dependencies": { + "@percy/cli-command": "1.17.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-command": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-command/-/cli-command-1.17.0.tgz", + "integrity": "sha512-KmYorWxT+M+Ei/UVZiVx1WVJ4g87D+gvHX5tC4KS8C+oVy31Z01rJ4YChM0OSS92COMX0hCOacOxrFCNGbMgow==", + "dev": true, + "dependencies": { + "@percy/config": "1.17.0", + "@percy/core": "1.17.0", + "@percy/logger": "1.17.0" + }, + "bin": { + "percy-cli-readme": "bin/readme.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-config": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-config/-/cli-config-1.17.0.tgz", + "integrity": "sha512-dpwCLyy9e1ubsZY3QaZj1A3KNHOQOjSuvNCZ01yM+VH5hSPsh9OD50Jhie/6W4BTMbn/THMo5KyHc76ahc0nYA==", + "dev": true, + "dependencies": { + "@percy/cli-command": "1.17.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-exec": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-exec/-/cli-exec-1.17.0.tgz", + "integrity": "sha512-W3Mb3t8dZOaEdvRX7uPStpiBEWFnUGQ2S+2X5nk4aGdikIO1jVwZrXRyFRs/NU6gkDocREJ2MFEwAQGsuCB3qg==", + "dev": true, + "dependencies": { + "@percy/cli-command": "1.17.0", + "cross-spawn": "^7.0.3", + "which": "^2.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-snapshot": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-snapshot/-/cli-snapshot-1.17.0.tgz", + "integrity": "sha512-QYKSqlC3bMjaz9k1ClOUCq6Jwz4FPf1q+x9IlYQsUUOQ68Sx7qBy8edw1iS09BsKkESFHqFIBi7j7laWU/al3g==", + "dev": true, + "dependencies": { + "@percy/cli-command": "1.17.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-snapshot/node_modules/yaml": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", + "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@percy/cli-upload": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-upload/-/cli-upload-1.17.0.tgz", + "integrity": "sha512-vhfi4AXptDLKG2UdE94sI1FZLh6kR1YvDh7UlbxvJmRl6+vkkxEOHkZZ6B575b3Mzm+20LBfw4gU7maajs/16Q==", + "dev": true, + "dependencies": { + "@percy/cli-command": "1.17.0", + "fast-glob": "^3.2.11", + "image-size": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/client": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/client/-/client-1.17.0.tgz", + "integrity": "sha512-7ur4SN/FLf7wPDcJyOMquQT3oCRVZ9Up4Ux3zbRV8eaYgdmnkpYn1+F8uRqwwXLsVngWGqB0x+ckbQ2N0oXA4Q==", + "dev": true, + "dependencies": { + "@percy/env": "1.17.0", + "@percy/logger": "1.17.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/config": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/config/-/config-1.17.0.tgz", + "integrity": "sha512-azAdqWHC3Neb5HC4sThvobuHsawiBBoRO6taBIrB6gO66mzhG76p1avChmsgZTeuAGIUE9gnF3GYW6FJiqnXAQ==", + "dev": true, + "dependencies": { + "@percy/logger": "1.17.0", + "ajv": "^8.6.2", + "cosmiconfig": "^7.0.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/config/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@percy/config/node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@percy/config/node_modules/yaml": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", + "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@percy/core": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/core/-/core-1.17.0.tgz", + "integrity": "sha512-kIzSxKNEjwl+Y+86XHZfEYBFyvPvuISwGzKhmL/03lJRggvmH+eThHvB+P8zX1v/9wHEKA/YwQU8uSggZMN2yA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@percy/client": "1.17.0", + "@percy/config": "1.17.0", + "@percy/dom": "1.17.0", + "@percy/logger": "1.17.0", + "content-disposition": "^0.5.4", + "cross-spawn": "^7.0.3", + "extract-zip": "^2.0.1", + "fast-glob": "^3.2.11", + "micromatch": "^4.0.4", + "mime-types": "^2.1.34", + "path-to-regexp": "^6.2.0", + "rimraf": "^3.0.2", + "ws": "^8.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/dom": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/dom/-/dom-1.17.0.tgz", + "integrity": "sha512-C6qaqOk4p8ax/gPruQtVy+Ml7Yb6nWpKYThk4afy4N0Jq9hZa0qBzlVE1vO4jtxHK8JaZ2lXGG4Gdxz4FOQuMA==", + "dev": true + }, + "node_modules/@percy/env": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/env/-/env-1.17.0.tgz", + "integrity": "sha512-z6O7VauoKXDq66hS8HhVmR2poJZLdM0xVAJ7XBmfdalVnnCSzub1Fjubd12eN12Gt9fZpX8WCeOI8+0PjAAspQ==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/logger": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.17.0.tgz", + "integrity": "sha512-UEzXcoxwDl8SfvJc4Gy0Ib8lYKDxM7WkgVsg/C5bniUyKuqpDnJdvqiV82vzOVI9nmlYikCG09ebZbNIjnXDWg==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pkgr/utils": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", @@ -994,6 +1233,12 @@ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, "node_modules/@types/parse5": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", @@ -1158,6 +1403,22 @@ "node": ">= 6.0.0" } }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -2251,6 +2512,38 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -3270,6 +3563,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -4320,6 +4619,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -5528,6 +5833,27 @@ "node": ">=10.0.0" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", @@ -6479,6 +6805,15 @@ "once": "^1.3.1" } }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/puppeteer": { "version": "19.5.2", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.5.2.tgz", @@ -6818,6 +7153,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -8196,6 +8540,15 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -9676,6 +10029,192 @@ "pako": "^1.0.10" } }, + "@percy/cli": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli/-/cli-1.17.0.tgz", + "integrity": "sha512-uY755vWT+bx3IVvzZKTbX7UJclPXStp85M9LSaWff1K8nk47c+patB9ydLSZKQu+Qkj1L/5L46plaResn8SfsA==", + "dev": true, + "requires": { + "@percy/cli-app": "1.17.0", + "@percy/cli-build": "1.17.0", + "@percy/cli-command": "1.17.0", + "@percy/cli-config": "1.17.0", + "@percy/cli-exec": "1.17.0", + "@percy/cli-snapshot": "1.17.0", + "@percy/cli-upload": "1.17.0", + "@percy/client": "1.17.0", + "@percy/logger": "1.17.0" + } + }, + "@percy/cli-app": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-app/-/cli-app-1.17.0.tgz", + "integrity": "sha512-8Vc/pfaKsubKXRaPNdB3Snd8h7NfGPNio5RtETgQpJHwE+hu4rbjN4WovkjntiUSsQwLGYpXmKqV9n+8Z4oskA==", + "dev": true, + "requires": { + "@percy/cli-command": "1.17.0", + "@percy/cli-exec": "1.17.0" + } + }, + "@percy/cli-build": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-build/-/cli-build-1.17.0.tgz", + "integrity": "sha512-ES5Cwwa4n7/czOObqhG/o2Lr2l4VZFG2DEH/WGarCgsG42yiKqNWUHjFZj2AYfvv24f0b1KpL/Hz7gBauagGZA==", + "dev": true, + "requires": { + "@percy/cli-command": "1.17.0" + } + }, + "@percy/cli-command": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-command/-/cli-command-1.17.0.tgz", + "integrity": "sha512-KmYorWxT+M+Ei/UVZiVx1WVJ4g87D+gvHX5tC4KS8C+oVy31Z01rJ4YChM0OSS92COMX0hCOacOxrFCNGbMgow==", + "dev": true, + "requires": { + "@percy/config": "1.17.0", + "@percy/core": "1.17.0", + "@percy/logger": "1.17.0" + } + }, + "@percy/cli-config": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-config/-/cli-config-1.17.0.tgz", + "integrity": "sha512-dpwCLyy9e1ubsZY3QaZj1A3KNHOQOjSuvNCZ01yM+VH5hSPsh9OD50Jhie/6W4BTMbn/THMo5KyHc76ahc0nYA==", + "dev": true, + "requires": { + "@percy/cli-command": "1.17.0" + } + }, + "@percy/cli-exec": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-exec/-/cli-exec-1.17.0.tgz", + "integrity": "sha512-W3Mb3t8dZOaEdvRX7uPStpiBEWFnUGQ2S+2X5nk4aGdikIO1jVwZrXRyFRs/NU6gkDocREJ2MFEwAQGsuCB3qg==", + "dev": true, + "requires": { + "@percy/cli-command": "1.17.0", + "cross-spawn": "^7.0.3", + "which": "^2.0.2" + } + }, + "@percy/cli-snapshot": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-snapshot/-/cli-snapshot-1.17.0.tgz", + "integrity": "sha512-QYKSqlC3bMjaz9k1ClOUCq6Jwz4FPf1q+x9IlYQsUUOQ68Sx7qBy8edw1iS09BsKkESFHqFIBi7j7laWU/al3g==", + "dev": true, + "requires": { + "@percy/cli-command": "1.17.0", + "yaml": "^2.0.0" + }, + "dependencies": { + "yaml": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", + "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "dev": true + } + } + }, + "@percy/cli-upload": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-upload/-/cli-upload-1.17.0.tgz", + "integrity": "sha512-vhfi4AXptDLKG2UdE94sI1FZLh6kR1YvDh7UlbxvJmRl6+vkkxEOHkZZ6B575b3Mzm+20LBfw4gU7maajs/16Q==", + "dev": true, + "requires": { + "@percy/cli-command": "1.17.0", + "fast-glob": "^3.2.11", + "image-size": "^1.0.0" + } + }, + "@percy/client": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/client/-/client-1.17.0.tgz", + "integrity": "sha512-7ur4SN/FLf7wPDcJyOMquQT3oCRVZ9Up4Ux3zbRV8eaYgdmnkpYn1+F8uRqwwXLsVngWGqB0x+ckbQ2N0oXA4Q==", + "dev": true, + "requires": { + "@percy/env": "1.17.0", + "@percy/logger": "1.17.0" + } + }, + "@percy/config": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/config/-/config-1.17.0.tgz", + "integrity": "sha512-azAdqWHC3Neb5HC4sThvobuHsawiBBoRO6taBIrB6gO66mzhG76p1avChmsgZTeuAGIUE9gnF3GYW6FJiqnXAQ==", + "dev": true, + "requires": { + "@percy/logger": "1.17.0", + "ajv": "^8.6.2", + "cosmiconfig": "^7.0.0", + "yaml": "^2.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "dependencies": { + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } + }, + "yaml": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", + "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "dev": true + } + } + }, + "@percy/core": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/core/-/core-1.17.0.tgz", + "integrity": "sha512-kIzSxKNEjwl+Y+86XHZfEYBFyvPvuISwGzKhmL/03lJRggvmH+eThHvB+P8zX1v/9wHEKA/YwQU8uSggZMN2yA==", + "dev": true, + "requires": { + "@percy/client": "1.17.0", + "@percy/config": "1.17.0", + "@percy/dom": "1.17.0", + "@percy/logger": "1.17.0", + "content-disposition": "^0.5.4", + "cross-spawn": "^7.0.3", + "extract-zip": "^2.0.1", + "fast-glob": "^3.2.11", + "micromatch": "^4.0.4", + "mime-types": "^2.1.34", + "path-to-regexp": "^6.2.0", + "rimraf": "^3.0.2", + "ws": "^8.0.0" + } + }, + "@percy/dom": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/dom/-/dom-1.17.0.tgz", + "integrity": "sha512-C6qaqOk4p8ax/gPruQtVy+Ml7Yb6nWpKYThk4afy4N0Jq9hZa0qBzlVE1vO4jtxHK8JaZ2lXGG4Gdxz4FOQuMA==", + "dev": true + }, + "@percy/env": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/env/-/env-1.17.0.tgz", + "integrity": "sha512-z6O7VauoKXDq66hS8HhVmR2poJZLdM0xVAJ7XBmfdalVnnCSzub1Fjubd12eN12Gt9fZpX8WCeOI8+0PjAAspQ==", + "dev": true + }, + "@percy/logger": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.17.0.tgz", + "integrity": "sha512-UEzXcoxwDl8SfvJc4Gy0Ib8lYKDxM7WkgVsg/C5bniUyKuqpDnJdvqiV82vzOVI9nmlYikCG09ebZbNIjnXDWg==", + "dev": true + }, "@pkgr/utils": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", @@ -9867,6 +10406,12 @@ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, "@types/parse5": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", @@ -10015,6 +10560,18 @@ "debug": "4" } }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, "ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -10810,6 +11367,23 @@ } } }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -11467,6 +12041,12 @@ } } }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, "fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -12217,6 +12797,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -13024,6 +13610,21 @@ "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, "mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", @@ -13692,6 +14293,12 @@ "once": "^1.3.1" } }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, "puppeteer": { "version": "19.5.2", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.5.2.tgz", @@ -13947,6 +14554,12 @@ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -14924,6 +15537,15 @@ "picocolors": "^1.0.0" } }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index 50904af..f852fd1 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@astrojs/image": "0.12.1", "@astrojs/react": "1.2.2", "@astrojs/tailwind": "2.1.3", + "@percy/cli": "1.17.0", "astro": "1.9.2", "astro-compress": "1.1.27", "concurrently": "7.6.0", diff --git a/src/web/components/photo.astro b/src/web/components/photo.astro index 51ff4a4..b3602ab 100644 --- a/src/web/components/photo.astro +++ b/src/web/components/photo.astro @@ -13,6 +13,13 @@ export interface Props { const { src, ...props } = Astro.props; const isRemoteImage = typeof src === 'string'; +const loading = import.meta.env.PUBLIC_APP_ENV === 'snapshot' ? 'eager' : 'lazy'; --- -{isRemoteImage ? : } +{ + isRemoteImage ? ( + + ) : ( + + ) +}