diff --git a/.deploy.gitlab-ci.yml b/.deploy.gitlab-ci.yml index 53ca1708f..07ee4bd8d 100644 --- a/.deploy.gitlab-ci.yml +++ b/.deploy.gitlab-ci.yml @@ -6,7 +6,7 @@ artifacts: false rules: - - if: $CI_COMMIT_REF_PROTECTED && $DEPLOY_TARGET =~ $ENVIRONMENT_PATTERN + if: $CI_COMMIT_TAG =~ /^deploy-.*/ && $CI_COMMIT_TAG_MESSAGE =~ $ENVIRONMENT_PATTERN - if: $CI_COMMIT_REF_PROTECTED == 'true' && $DEPLOY_TARGET =~ $ENVIRONMENT_PATTERN - diff --git a/package.json b/package.json index 97c021950..1440c0524 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "@sentry/cli": "^2.31.0", "@sentry/node": "^7.109.0", "abort-controller": "^3.0.0", - "canvas": "^2.11.2", + "canvas": "^3.1.0", "dotenv": "^16.4.5", "feed": "^4.2.2", "generic-diff": "^1.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d02934004..d40548054 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,8 +33,8 @@ importers: specifier: ^3.0.0 version: 3.0.0 canvas: - specifier: ^2.11.2 - version: 2.11.2(encoding@0.1.13) + specifier: ^3.1.0 + version: 3.1.0 dotenv: specifier: ^16.4.5 version: 16.4.7 @@ -67,7 +67,7 @@ importers: version: 0.7.3 jsdom: specifier: ^24.1.1 - version: 24.1.3(canvas@2.11.2(encoding@0.1.13)) + version: 24.1.3(canvas@3.1.0) luxon: specifier: ^1.28.1 version: 1.28.1 @@ -146,7 +146,7 @@ importers: version: 1.0.1(@vue/compiler-sfc@3.5.13)(eslint@9.13.0(jiti@2.4.2))(magicast@0.3.5)(typescript@5.7.2)(vite@5.4.11(@types/node@20.16.5)(sass@1.32.12)(terser@5.33.0)) '@nuxt/test-utils': specifier: ^3.15.4 - version: 3.15.4(@playwright/test@1.50.0)(@types/node@20.16.5)(@vue/test-utils@2.4.6)(jiti@2.4.2)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(magicast@0.3.5)(playwright-core@1.50.0)(sass@1.32.12)(terser@5.33.0)(typescript@5.7.2)(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(sass@1.32.12)(terser@5.33.0))(yaml@2.7.0) + version: 3.15.4(@playwright/test@1.50.0)(@types/node@20.16.5)(@vue/test-utils@2.4.6)(jiti@2.4.2)(jsdom@24.1.3(canvas@3.1.0))(magicast@0.3.5)(playwright-core@1.50.0)(sass@1.32.12)(terser@5.33.0)(typescript@5.7.2)(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0))(yaml@2.7.0) '@nuxtjs/plausible': specifier: ^1.2.0 version: 1.2.0(magicast@0.3.5) @@ -215,7 +215,7 @@ importers: version: 0.10.6(magicast@0.3.5)(vite@5.4.11(@types/node@20.16.5)(sass@1.32.12)(terser@5.33.0))(workbox-build@7.3.0)(workbox-window@7.3.0) '@vitest/coverage-v8': specifier: ^2.1.9 - version: 2.1.9(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(sass@1.32.12)(terser@5.33.0)) + version: 2.1.9(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0)) '@vue/test-utils': specifier: ^2.4.6 version: 2.4.6 @@ -284,7 +284,7 @@ importers: version: https://codeload.github.com/pixunil/h3-express/tar.gz/0dd96342062c6190cc50101e7b48480587ca9582 html-validate: specifier: ^9.2.2 - version: 9.3.0(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(sass@1.32.12)(terser@5.33.0)) + version: 9.3.0(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0)) markdown-it: specifier: ^14.0.0 version: 14.1.0 @@ -329,7 +329,7 @@ importers: version: 5.7.2 vitest: specifier: ^2.1.9 - version: 2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(sass@1.32.12)(terser@5.33.0) + version: 2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0) vue-component-type-helpers: specifier: ^2.1.6 version: 2.1.6 @@ -1657,10 +1657,6 @@ packages: '@kwsites/promise-deferred@1.1.1': resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - '@mapbox/node-pre-gyp@1.0.11': - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - '@mapbox/node-pre-gyp@2.0.0': resolution: {integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==} engines: {node: '>=18'} @@ -3006,11 +3002,6 @@ packages: resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} engines: {node: '>=14'} - are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - are-we-there-yet@3.0.1: resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -3307,9 +3298,9 @@ packages: caniuse-lite@1.0.30001692: resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==} - canvas@2.11.2: - resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} - engines: {node: '>=6'} + canvas@3.1.0: + resolution: {integrity: sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg==} + engines: {node: ^18.12.0 || >= 20.9.0} capture-stack-trace@1.0.2: resolution: {integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==} @@ -3753,10 +3744,6 @@ packages: decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - decompress-response@4.2.1: - resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} - engines: {node: '>=8'} - decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -4461,11 +4448,6 @@ packages: resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} engines: {node: '>=10'} - gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - gauge@4.0.4: resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -5476,10 +5458,6 @@ packages: magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -5603,10 +5581,6 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - mimic-response@2.1.0: - resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} - engines: {node: '>=8'} - mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -5728,9 +5702,6 @@ packages: multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} - nan@2.20.0: - resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} - nanoid@3.3.8: resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -5867,10 +5838,6 @@ packages: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} - npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. - npmlog@6.0.2: resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -6926,9 +6893,6 @@ packages: simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - simple-get@3.1.1: - resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} - simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} @@ -10012,21 +9976,6 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} - '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': - dependencies: - detect-libc: 2.0.3 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.7.0(encoding@0.1.13) - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.6.3 - tar: 6.2.1 - transitivePeerDependencies: - - encoding - - supports-color - '@mapbox/node-pre-gyp@2.0.0(encoding@0.1.13)': dependencies: consola: 3.4.0 @@ -10306,7 +10255,7 @@ snapshots: - magicast - supports-color - '@nuxt/test-utils@3.15.4(@playwright/test@1.50.0)(@types/node@20.16.5)(@vue/test-utils@2.4.6)(jiti@2.4.2)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(magicast@0.3.5)(playwright-core@1.50.0)(sass@1.32.12)(terser@5.33.0)(typescript@5.7.2)(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(sass@1.32.12)(terser@5.33.0))(yaml@2.7.0)': + '@nuxt/test-utils@3.15.4(@playwright/test@1.50.0)(@types/node@20.16.5)(@vue/test-utils@2.4.6)(jiti@2.4.2)(jsdom@24.1.3(canvas@3.1.0))(magicast@0.3.5)(playwright-core@1.50.0)(sass@1.32.12)(terser@5.33.0)(typescript@5.7.2)(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0))(yaml@2.7.0)': dependencies: '@nuxt/kit': 3.15.4(magicast@0.3.5) '@nuxt/schema': 3.15.4 @@ -10332,14 +10281,14 @@ snapshots: unenv: 1.10.0 unplugin: 2.1.2 vite: 6.1.0(@types/node@20.16.5)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0) - vitest-environment-nuxt: 1.0.1(@playwright/test@1.50.0)(@types/node@20.16.5)(@vue/test-utils@2.4.6)(jiti@2.4.2)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(magicast@0.3.5)(playwright-core@1.50.0)(sass@1.32.12)(terser@5.33.0)(typescript@5.7.2)(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(sass@1.32.12)(terser@5.33.0))(yaml@2.7.0) + vitest-environment-nuxt: 1.0.1(@playwright/test@1.50.0)(@types/node@20.16.5)(@vue/test-utils@2.4.6)(jiti@2.4.2)(jsdom@24.1.3(canvas@3.1.0))(magicast@0.3.5)(playwright-core@1.50.0)(sass@1.32.12)(terser@5.33.0)(typescript@5.7.2)(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0))(yaml@2.7.0) vue: 3.5.13(typescript@5.7.2) optionalDependencies: '@playwright/test': 1.50.0 '@vue/test-utils': 2.4.6 - jsdom: 24.1.3(canvas@2.11.2(encoding@0.1.13)) + jsdom: 24.1.3(canvas@3.1.0) playwright-core: 1.50.0 - vitest: 2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(sass@1.32.12)(terser@5.33.0) + vitest: 2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0) transitivePeerDependencies: - '@types/node' - jiti @@ -11551,7 +11500,7 @@ snapshots: vite: 6.1.0(@types/node@20.16.5)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0) vue: 3.5.13(typescript@5.7.2) - '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(sass@1.32.12)(terser@5.33.0))': + '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -11565,7 +11514,7 @@ snapshots: std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(sass@1.32.12)(terser@5.33.0) + vitest: 2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0) transitivePeerDependencies: - supports-color @@ -11789,7 +11738,8 @@ snapshots: transitivePeerDependencies: - typescript - abbrev@1.1.1: {} + abbrev@1.1.1: + optional: true abbrev@2.0.0: {} @@ -11882,7 +11832,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - aproba@2.0.0: {} + aproba@2.0.0: + optional: true archiver-utils@5.0.2: dependencies: @@ -11906,11 +11857,6 @@ snapshots: are-docs-informative@0.0.2: {} - are-we-there-yet@2.0.0: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - are-we-there-yet@3.0.1: dependencies: delegates: 1.0.0 @@ -12247,14 +12193,10 @@ snapshots: caniuse-lite@1.0.30001692: {} - canvas@2.11.2(encoding@0.1.13): + canvas@3.1.0: dependencies: - '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) - nan: 2.20.0 - simple-get: 3.1.1 - transitivePeerDependencies: - - encoding - - supports-color + node-addon-api: 7.1.1 + prebuild-install: 7.1.2 capture-stack-trace@1.0.2: {} @@ -12386,7 +12328,8 @@ snapshots: color-name: 1.1.4 simple-swizzle: 0.2.2 - color-support@1.1.3: {} + color-support@1.1.3: + optional: true color@4.2.3: dependencies: @@ -12438,7 +12381,8 @@ snapshots: consola@3.4.0: {} - console-control-strings@1.1.0: {} + console-control-strings@1.1.0: + optional: true content-disposition@0.5.4: dependencies: @@ -12681,10 +12625,6 @@ snapshots: decimal.js@10.4.3: {} - decompress-response@4.2.1: - dependencies: - mimic-response: 2.1.0 - decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 @@ -12734,7 +12674,8 @@ snapshots: delegate@3.2.0: {} - delegates@1.0.0: {} + delegates@1.0.0: + optional: true denque@2.1.0: {} @@ -13630,18 +13571,6 @@ snapshots: fuse.js@7.1.0: {} - gauge@3.0.2: - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - gauge@4.0.4: dependencies: aproba: 2.0.0 @@ -13914,7 +13843,8 @@ snapshots: dependencies: has-symbols: 1.1.0 - has-unicode@2.0.1: {} + has-unicode@2.0.1: + optional: true hash.js@1.1.7: dependencies: @@ -13949,7 +13879,7 @@ snapshots: html-tags@3.3.1: {} - html-validate@9.3.0(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(sass@1.32.12)(terser@5.33.0)): + html-validate@9.3.0(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0)): dependencies: '@html-validate/stylish': 4.2.0 '@sidvind/better-ajv-errors': 3.0.1(ajv@8.17.1) @@ -13960,7 +13890,7 @@ snapshots: prompts: 2.4.2 semver: 7.6.3 optionalDependencies: - vitest: 2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(sass@1.32.12)(terser@5.33.0) + vitest: 2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0) html2canvas@1.4.1: dependencies: @@ -14416,7 +14346,7 @@ snapshots: jsdoc-type-pratt-parser@4.1.0: {} - jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)): + jsdom@24.1.3(canvas@3.1.0): dependencies: cssstyle: 4.1.0 data-urls: 5.0.0 @@ -14440,7 +14370,7 @@ snapshots: ws: 8.18.0 xml-name-validator: 5.0.0 optionalDependencies: - canvas: 2.11.2(encoding@0.1.13) + canvas: 3.1.0 transitivePeerDependencies: - bufferutil - supports-color @@ -14716,10 +14646,6 @@ snapshots: '@babel/types': 7.26.8 source-map-js: 1.2.1 - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - make-dir@4.0.0: dependencies: semver: 7.6.3 @@ -14845,8 +14771,6 @@ snapshots: mimic-fn@4.0.0: {} - mimic-response@2.1.0: {} - mimic-response@3.1.0: {} min-indent@1.0.1: {} @@ -14957,8 +14881,6 @@ snapshots: multiformats@9.9.0: {} - nan@2.20.0: {} - nanoid@3.3.8: {} nanoid@5.0.9: {} @@ -15121,6 +15043,7 @@ snapshots: nopt@5.0.0: dependencies: abbrev: 1.1.1 + optional: true nopt@7.2.1: dependencies: @@ -15160,13 +15083,6 @@ snapshots: path-key: 4.0.0 unicorn-magic: 0.3.0 - npmlog@5.0.1: - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - npmlog@6.0.2: dependencies: are-we-there-yet: 3.0.1 @@ -16194,6 +16110,7 @@ snapshots: rimraf@3.0.2: dependencies: glob: 7.2.3 + optional: true rimraf@5.0.10: dependencies: @@ -16449,12 +16366,6 @@ snapshots: simple-concat@1.0.1: {} - simple-get@3.1.1: - dependencies: - decompress-response: 4.2.1 - once: 1.4.0 - simple-concat: 1.0.1 - simple-get@4.0.1: dependencies: decompress-response: 6.0.0 @@ -17469,9 +17380,9 @@ snapshots: terser: 5.33.0 yaml: 2.7.0 - vitest-environment-nuxt@1.0.1(@playwright/test@1.50.0)(@types/node@20.16.5)(@vue/test-utils@2.4.6)(jiti@2.4.2)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(magicast@0.3.5)(playwright-core@1.50.0)(sass@1.32.12)(terser@5.33.0)(typescript@5.7.2)(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(sass@1.32.12)(terser@5.33.0))(yaml@2.7.0): + vitest-environment-nuxt@1.0.1(@playwright/test@1.50.0)(@types/node@20.16.5)(@vue/test-utils@2.4.6)(jiti@2.4.2)(jsdom@24.1.3(canvas@3.1.0))(magicast@0.3.5)(playwright-core@1.50.0)(sass@1.32.12)(terser@5.33.0)(typescript@5.7.2)(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0))(yaml@2.7.0): dependencies: - '@nuxt/test-utils': 3.15.4(@playwright/test@1.50.0)(@types/node@20.16.5)(@vue/test-utils@2.4.6)(jiti@2.4.2)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(magicast@0.3.5)(playwright-core@1.50.0)(sass@1.32.12)(terser@5.33.0)(typescript@5.7.2)(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(sass@1.32.12)(terser@5.33.0))(yaml@2.7.0) + '@nuxt/test-utils': 3.15.4(@playwright/test@1.50.0)(@types/node@20.16.5)(@vue/test-utils@2.4.6)(jiti@2.4.2)(jsdom@24.1.3(canvas@3.1.0))(magicast@0.3.5)(playwright-core@1.50.0)(sass@1.32.12)(terser@5.33.0)(typescript@5.7.2)(vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0))(yaml@2.7.0) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' @@ -17498,7 +17409,7 @@ snapshots: - vitest - yaml - vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@2.11.2(encoding@0.1.13)))(sass@1.32.12)(terser@5.33.0): + vitest@2.1.9(@types/node@20.16.5)(jsdom@24.1.3(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0): dependencies: '@vitest/expect': 2.1.9 '@vitest/mocker': 2.1.9(vite@5.4.11(@types/node@20.16.5)(sass@1.32.12)(terser@5.33.0)) @@ -17522,7 +17433,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.16.5 - jsdom: 24.1.3(canvas@2.11.2(encoding@0.1.13)) + jsdom: 24.1.3(canvas@3.1.0) transitivePeerDependencies: - less - lightningcss @@ -17718,6 +17629,7 @@ snapshots: wide-align@1.1.5: dependencies: string-width: 4.2.3 + optional: true word-wrap@1.2.5: {} diff --git a/server/express/banner.ts b/server/express/banner.ts index aca720242..f17e1586d 100644 --- a/server/express/banner.ts +++ b/server/express/banner.ts @@ -1,6 +1,9 @@ +import fs from 'node:fs/promises'; + import { createCanvas, loadImage } from 'canvas'; import type { CanvasRenderingContext2D, Image } from 'canvas'; import { Router } from 'express'; +import sharp from 'sharp'; import SQL from 'sql-template-strings'; import type { Translations } from '../../locale/translations.ts'; @@ -37,6 +40,12 @@ const drawCircle = (context: CanvasRenderingContext2D, image: Image, x: number, context.restore(); }; +const loadSvgImage = async (svg: string): Promise => { + const pngBuffer = await sharp(await fs.readFile(svg)).png() + .toBuffer(); + return await loadImage(pngBuffer); +}; + const router = Router(); const width = 1200; @@ -79,24 +88,25 @@ const getBannerKey = defineCachedFunction(async (path: string, db: Database) => }, { name: 'banner', getKey: (path) => path, + shouldBypassCache: () => true, maxAge: 24 * 60 * 60, }); const drawDefault = async (context: CanvasRenderingContext2D, fontName: string) => { const leftRatio = 5; - const logo = await loadImage('public/logo/logo.svg'); + const logo = await loadSvgImage('public/logo/logo.svg'); context.drawImage(logo, width / leftRatio - imageSize / 2, height / 2 - imageSize / 2, imageSize, imageSize); - context.font = `regular ${translations.title.length < 10 ? 120 : translations.title.length < 14 ? 80 : 72}pt '${fontName}'`; + context.font = `${translations.title.length < 10 ? 120 : translations.title.length < 14 ? 80 : 72}pt '${fontName}'`; context.fillText(translations.title, width / leftRatio + imageSize / 1.5, height / 2 + (translations.title.length < 10 ? 48 : translations.title.length < 14 ? 36 : 24)); return 'default.png'; }; const drawPronounUsage = async (context: CanvasRenderingContext2D, fontName: string, usage: PronounUsage) => { - const logo = await loadImage('public/logo/logo.svg'); + const logo = await loadSvgImage('public/logo/logo.svg'); context.drawImage(logo, width / leftRatio - imageSize / 2, height / 2 - imageSize / 2, imageSize, imageSize); - context.font = `regular 48pt '${fontName}'`; + context.font = `48pt '${fontName}'`; context.fillText(`${translations.pronouns.intro}:`, width / leftRatio + imageSize / 1.5, height / 2 - 36); context.font = `bold ${usage.short.options.length <= 2 ? '70' : '36'}pt '${fontName}'`; @@ -114,17 +124,17 @@ const drawProfileBanner = async ( user: Pick, db: Database, ) => { - const logoPrimary = await loadImage('public/logo/logo-primary.svg'); + const logoPrimary = await loadSvgImage('public/logo/logo-primary.svg'); try { const avatarImage = await loadImage(await avatar(db, user)); drawCircle(context, avatarImage, width / leftRatio - imageSize / 2, height / 2 - imageSize / 2, imageSize); } catch {} - context.font = `regular 48pt '${fontName}'`; + context.font = `48pt '${fontName}'`; context.fillText(`@${user.username}`, width / leftRatio + imageSize, height / 2); - context.font = `regular 24pt '${fontName}'`; + context.font = `24pt '${fontName}'`; context.fillStyle = '#C71585'; const logoSize = 24 * 1.25; context.drawImage(logoPrimary, width / leftRatio + imageSize, height / 2 + logoSize - 8, logoSize, logoSize); diff --git a/server/express/nouns.ts b/server/express/nouns.ts index 9116df9ce..b561f2f0c 100644 --- a/server/express/nouns.ts +++ b/server/express/nouns.ts @@ -257,7 +257,7 @@ router.get('/nouns/:id.png', async (req, res) => { context.font = `bold 64pt '${fontName}'`; genders.forEach((gender, column) => { - context.font = 'regular 24pt FontAwesome'; + context.font = '24pt FontAwesome'; context.fillText(iconUnicodesByGender[gender], column * (width - 2 * padding) / genders.length + padding, padding * 1.5); context.font = `bold 24pt '${fontName}'`; @@ -265,7 +265,7 @@ router.get('/nouns/:id.png', async (req, res) => { context.fillText(header, column * (width - 2 * padding) / genders.length + padding + 36, padding * 1.5); }); - context.font = `regular 24pt '${fontName}'`; + context.font = `24pt '${fontName}'`; genders.forEach((form, column) => { let i = 0; for (const [key, symbol] of [['', '⋅'], ['Pl', '⁖']] as const) { @@ -278,9 +278,9 @@ router.get('/nouns/:id.png', async (req, res) => { }); context.fillStyle = '#C71585'; - context.font = 'regular 16pt FontAwesome'; + context.font = '16pt FontAwesome'; context.fillText('\uf02c', padding, height - padding + 12); - context.font = `regular 16pt '${fontName}'`; + context.font = `16pt '${fontName}'`; context.fillText( `${translations.domain}/${global.config.nouns.routeMain || global.config.nouns.route}`, padding + 36,