From 85671a32b26d342355378f71740251646499db2f Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Wed, 15 Oct 2025 10:34:47 +0200 Subject: [PATCH 01/14] chore: update version of supertest (@fehmer) (#6839) --- backend/package.json | 4 +- pnpm-lock.yaml | 290 ++++++++++--------------------------------- 2 files changed, 65 insertions(+), 229 deletions(-) diff --git a/backend/package.json b/backend/package.json index 6b5e582ca935..c03c3d4d2277 100644 --- a/backend/package.json +++ b/backend/package.json @@ -80,7 +80,7 @@ "@types/object-hash": "3.0.6", "@types/readline-sync": "1.4.8", "@types/string-similarity": "4.0.2", - "@types/supertest": "2.0.12", + "@types/supertest": "6.0.3", "@types/swagger-stats": "0.95.11", "@types/ua-parser-js": "0.7.36", "@types/uuid": "10.0.0", @@ -91,7 +91,7 @@ "openapi3-ts": "2.0.2", "oxlint": "1.15.0", "readline-sync": "1.4.10", - "supertest": "6.2.3", + "supertest": "7.1.4", "testcontainers": "11.4.0", "tsx": "4.16.2", "typescript": "5.5.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8a113665729..a53bcef8d012 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: link:packages/release '@vitest/coverage-v8': specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) + version: 3.2.4(vitest@3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0)) conventional-changelog: specifier: 6.0.0 version: 6.0.0(conventional-commits-filter@5.0.0) @@ -49,7 +49,7 @@ importers: version: 2.5.6 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) backend: dependencies: @@ -217,8 +217,8 @@ importers: specifier: 4.0.2 version: 4.0.2 '@types/supertest': - specifier: 2.0.12 - version: 2.0.12 + specifier: 6.0.3 + version: 6.0.3 '@types/swagger-stats': specifier: 0.95.11 version: 0.95.11 @@ -230,7 +230,7 @@ importers: version: 10.0.0 '@vitest/coverage-v8': specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) + version: 3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0)) concurrently: specifier: 8.2.2 version: 8.2.2 @@ -250,8 +250,8 @@ importers: specifier: 1.4.10 version: 1.4.10 supertest: - specifier: 6.2.3 - version: 6.2.3 + specifier: 7.1.4 + version: 7.1.4 testcontainers: specifier: 11.4.0 version: 11.4.0 @@ -263,7 +263,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) frontend: dependencies: @@ -535,7 +535,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) packages/eslint-config: devDependencies: @@ -599,7 +599,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) packages/oxlint-config: {} @@ -660,7 +660,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) packages/tsup-config: dependencies: @@ -711,7 +711,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) zod: specifier: 3.23.8 version: 3.23.8 @@ -2541,6 +2541,9 @@ packages: cpu: [x64] os: [win32] + '@paralleldrive/cuid2@2.2.2': + resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -3113,8 +3116,8 @@ packages: '@types/superagent@8.1.8': resolution: {integrity: sha512-nTqHJ2OTa7PFEpLahzSEEeFeqbMpmcN7OeayiOc7v+xk+/vyTKljRe+o4MPqSnPeRCMvtxuLG+5QqluUVQJOnA==} - '@types/supertest@2.0.12': - resolution: {integrity: sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==} + '@types/supertest@6.0.3': + resolution: {integrity: sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==} '@types/swagger-stats@0.95.11': resolution: {integrity: sha512-npTTS5lv0FmkgKeChxUrp9nTqiFdFP5XRlewfGP7JVeFwV7u1yE0SOUh8eXMrgVLE/mJNJuhGoAoVClHc+rsGA==} @@ -4784,10 +4787,6 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -5241,9 +5240,9 @@ packages: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} - formidable@2.1.2: - resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} - deprecated: 'ACTION REQUIRED: SWITCH TO v3 - v1 and v2 are VULNERABLE! v1 is DEPRECATED FOR OVER 2 YEARS! Use formidable@latest or try formidable-mini for fresh projects' + formidable@3.5.4: + resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} + engines: {node: '>=14.0.0'} forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -5340,10 +5339,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -5582,10 +5577,6 @@ packages: resolution: {integrity: sha512-HVqALKZlR95ROkrnesdhbbZJFi/rIVSoNq6f3jA/9u6MIbTsPh3xZwihjeI5+DO/2sOV6HMHooXcEOuwskHpTg==} engines: {node: '>=10.0.0'} - hexoid@1.0.0: - resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} - engines: {node: '>=8'} - highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} @@ -6679,10 +6670,6 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - mime-db@1.53.0: - resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} - engines: {node: '>= 0.6'} - mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} @@ -8633,20 +8620,18 @@ packages: summary@2.1.0: resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==} - superagent@7.1.6: - resolution: {integrity: sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g==} - engines: {node: '>=6.4.0 <13 || >=14'} - deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net + superagent@10.2.3: + resolution: {integrity: sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==} + engines: {node: '>=14.18.0'} superstatic@9.0.3: resolution: {integrity: sha512-e/tmW0bsnQ/33ivK6y3CapJT0Ovy4pk/ohNPGhIAGU2oasoNLRQ1cv6enua09NU9w6Y0H/fBu07cjzuiWvLXxw==} engines: {node: ^14.18.0 || >=16.4.0} hasBin: true - supertest@6.2.3: - resolution: {integrity: sha512-3GSdMYTMItzsSYjnIcljxMVZKPW1J9kYHZY+7yLfD0wpPwww97GeImZC1oOk0S5+wYl2niJwuFusBJqwLqYM3g==} - engines: {node: '>=6.0.0'} - deprecated: Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net + supertest@7.1.4: + resolution: {integrity: sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==} + engines: {node: '>=14.18.0'} supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} @@ -8721,11 +8706,6 @@ packages: engines: {node: '>=10'} hasBin: true - terser@5.43.1: - resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} - engines: {node: '>=10'} - hasBin: true - terser@5.44.0: resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} engines: {node: '>=10'} @@ -11498,7 +11478,7 @@ snapshots: '@hapi/mimos@7.0.1': dependencies: '@hapi/hoek': 11.0.4 - mime-db: 1.53.0 + mime-db: 1.54.0 '@hapi/nigel@5.0.1': dependencies: @@ -11948,6 +11928,10 @@ snapshots: '@oxlint/win32-x64@1.15.0': optional: true + '@paralleldrive/cuid2@2.2.2': + dependencies: + '@noble/hashes': 1.8.0 + '@pkgjs/parseargs@0.11.0': optional: true @@ -12557,8 +12541,9 @@ snapshots: '@types/node': 20.14.11 form-data: 4.0.0 - '@types/supertest@2.0.12': + '@types/supertest@6.0.3': dependencies: + '@types/methods': 1.1.4 '@types/superagent': 8.1.8 '@types/swagger-stats@0.95.11': @@ -12735,25 +12720,6 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))': - dependencies: - '@ampproject/remapping': 2.3.0 - '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.3 - debug: 4.4.1 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.17 - magicast: 0.3.5 - std-env: 3.9.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - transitivePeerDependencies: - - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))': dependencies: '@ampproject/remapping': 2.3.0 @@ -12773,7 +12739,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -12788,7 +12754,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vitest: 3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) transitivePeerDependencies: - supports-color @@ -12800,14 +12766,6 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.17 - optionalDependencies: - vite: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - '@vitest/mocker@3.2.4(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))': dependencies: '@vitest/spy': 3.2.4 @@ -12816,13 +12774,13 @@ snapshots: optionalDependencies: vite: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) - '@vitest/mocker@3.2.4(vite@6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))': + '@vitest/mocker@3.2.4(vite@6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite: 6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -13064,8 +13022,8 @@ snapshots: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 is-string: 1.0.7 array-last@1.3.0: @@ -13080,7 +13038,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 es-shim-unscopables: 1.0.2 array.prototype.flat@1.3.2: @@ -13773,7 +13731,7 @@ snapshots: compressible@2.0.18: dependencies: - mime-db: 1.53.0 + mime-db: 1.54.0 compression@1.7.4: dependencies: @@ -14561,10 +14519,6 @@ snapshots: es-module-lexer@1.7.0: {} - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -14916,7 +14870,7 @@ snapshots: openapi3-ts: 3.2.0 promise-breaker: 6.0.0 pump: 3.0.0 - qs: 6.13.0 + qs: 6.14.0 raw-body: 2.5.2 semver: 7.7.2 transitivePeerDependencies: @@ -15380,12 +15334,11 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 - formidable@2.1.2: + formidable@3.5.4: dependencies: + '@paralleldrive/cuid2': 2.2.2 dezalgo: 1.0.4 - hexoid: 1.0.0 once: 1.4.0 - qs: 6.13.0 forwarded@0.2.0: {} @@ -15502,14 +15455,6 @@ snapshots: get-caller-file@2.0.5: {} - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.1.0 - hasown: 2.0.2 - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -15722,7 +15667,7 @@ snapshots: extend: 3.0.2 gaxios: 6.7.0(encoding@0.1.13) google-auth-library: 9.12.0(encoding@0.1.13) - qs: 6.13.0 + qs: 6.14.0 url-template: 2.0.8 uuid: 9.0.1 transitivePeerDependencies: @@ -15806,8 +15751,6 @@ snapshots: helmet@4.6.0: {} - hexoid@1.0.0: {} - highlight.js@10.7.3: {} hosted-git-info@2.8.9: {} @@ -16936,8 +16879,6 @@ snapshots: mime-db@1.52.0: {} - mime-db@1.53.0: {} - mime-db@1.54.0: {} mime-types@2.1.35: @@ -17673,7 +17614,7 @@ snapshots: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: @@ -17685,7 +17626,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 ohash@2.0.11: {} @@ -19281,19 +19222,17 @@ snapshots: summary@2.1.0: {} - superagent@7.1.6: + superagent@10.2.3: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 debug: 4.4.1 fast-safe-stringify: 2.1.1 - form-data: 4.0.0 - formidable: 2.1.2 + form-data: 4.0.4 + formidable: 3.5.4 methods: 1.1.2 mime: 2.6.0 - qs: 6.13.0 - readable-stream: 3.6.2 - semver: 7.6.3 + qs: 6.14.0 transitivePeerDependencies: - supports-color @@ -19323,10 +19262,10 @@ snapshots: - encoding - supports-color - supertest@6.2.3: + supertest@7.1.4: dependencies: methods: 1.1.2 - superagent: 7.1.6 + superagent: 10.2.3 transitivePeerDependencies: - supports-color @@ -19460,14 +19399,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - terser@5.43.1: - dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 - commander: 2.20.3 - source-map-support: 0.5.21 - optional: true - terser@5.44.0: dependencies: '@jridgewell/source-map': 0.3.11 @@ -20031,27 +19962,6 @@ snapshots: dependencies: vite: 6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) - vite-node@3.2.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): - dependencies: - cac: 6.7.14 - debug: 4.4.1 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vite-node@3.2.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: cac: 6.7.14 @@ -20073,13 +19983,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): + vite-node@3.2.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.6(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite: 6.3.6(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) transitivePeerDependencies: - '@types/node' - jiti @@ -20160,22 +20070,6 @@ snapshots: transitivePeerDependencies: - supports-color - vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): - dependencies: - esbuild: 0.25.0 - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.3 - rollup: 4.40.0 - tinyglobby: 0.2.13 - optionalDependencies: - '@types/node': 20.14.11 - fsevents: 2.3.3 - sass: 1.70.0 - terser: 5.43.1 - tsx: 4.16.2 - yaml: 2.5.0 - vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: esbuild: 0.25.0 @@ -20192,7 +20086,7 @@ snapshots: tsx: 4.16.2 yaml: 2.5.0 - vite@6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): + vite@6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: esbuild: 0.25.0 fdir: 6.4.4(picomatch@4.0.2) @@ -20204,23 +20098,7 @@ snapshots: '@types/node': 20.5.1 fsevents: 2.3.3 sass: 1.70.0 - terser: 5.43.1 - tsx: 4.16.2 - yaml: 2.5.0 - - vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): - dependencies: - esbuild: 0.25.0 - fdir: 6.4.4(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.3 - rollup: 4.40.0 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 20.14.11 - fsevents: 2.3.3 - sass: 1.70.0 - terser: 5.43.1 + terser: 5.44.0 tsx: 4.16.2 yaml: 2.5.0 @@ -20240,7 +20118,7 @@ snapshots: tsx: 4.16.2 yaml: 2.5.0 - vite@6.3.6(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): + vite@6.3.6(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: esbuild: 0.25.0 fdir: 6.4.4(picomatch@4.0.3) @@ -20252,52 +20130,10 @@ snapshots: '@types/node': 20.5.1 fsevents: 2.3.3 sass: 1.70.0 - terser: 5.43.1 + terser: 5.44.0 tsx: 4.16.2 yaml: 2.5.0 - vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.1 - debug: 4.4.1 - expect-type: 1.2.2 - magic-string: 0.30.17 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.9.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.14 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - vite-node: 3.2.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 20.14.11 - happy-dom: 15.10.2 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: '@types/chai': 5.2.2 @@ -20340,11 +20176,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): + vitest@3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) + '@vitest/mocker': 3.2.4(vite@6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -20362,8 +20198,8 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - vite-node: 3.2.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite: 6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) + vite-node: 3.2.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.5.1 From d6439f045f98ada3f7711bee88ccb8b4130c9622 Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Wed, 15 Oct 2025 10:35:34 +0200 Subject: [PATCH 02/14] ci: improve error messages for check-assets (@fehmer) (#6994) --- frontend/scripts/check-assets.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/frontend/scripts/check-assets.ts b/frontend/scripts/check-assets.ts index 6e2e4bd5cfe2..ac39cbdc1d5f 100644 --- a/frontend/scripts/check-assets.ts +++ b/frontend/scripts/check-assets.ts @@ -137,8 +137,7 @@ async function validateLayouts(): Promise { //no files not defined in LayoutsList const additionalLayoutFiles = fs .readdirSync("./static/layouts") - .map((it) => it.substring(0, it.length - 5)) - .filter((it) => !LayoutsList.some((layout) => layout === it)); + .filter((it) => !LayoutsList.some((layout) => layout + ".json" === it)); if (additionalLayoutFiles.length !== 0) { additionalLayoutFiles.forEach((it) => problems.add("_additional", it)); } @@ -287,8 +286,7 @@ async function validateLanguages(): Promise { //no files not defined in LanguageList fs.readdirSync("./static/languages") - .map((it) => it.substring(0, it.length - 5)) - .filter((it) => !LanguageList.some((language) => language === it)) + .filter((it) => !LanguageList.some((language) => language + ".json" === it)) .forEach((it) => problems.add("_additional", it)); //check groups @@ -381,18 +379,20 @@ async function validateThemes(): Promise { }); //no missing files - const themeFiles = fs - .readdirSync("./static/themes") - .map((it) => it.substring(0, it.length - 4)); + const themeFiles = fs.readdirSync("./static/themes"); //missing theme files - ThemesList.filter((it) => !themeFiles.includes(it.name)).forEach((it) => - problems.add(it.name, `missing file frontend/static/themes/${it.name}.css`) + ThemesList.filter((it) => !themeFiles.includes(it.name + ".css")).forEach( + (it) => + problems.add( + it.name, + `missing file frontend/static/themes/${it.name}.css` + ) ); //additional theme files themeFiles - .filter((it) => !ThemesList.some((theme) => theme.name === it)) + .filter((it) => !ThemesList.some((theme) => theme.name + ".css" === it)) .forEach((it) => problems.add("_additional", it)); console.log(problems.toString()); From 00552366b221bfff39b90fd8e7b4d48f882788b4 Mon Sep 17 00:00:00 2001 From: Legonard <140340885+Legonard@users.noreply.github.com> Date: Wed, 15 Oct 2025 10:36:12 +0200 Subject: [PATCH 03/14] impr(quotes): add german quotes (@Legonard) (#6997) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "Wie soll ich ein Monster stoppen, ohne selbst eins zu werden?" - The Vampire Diaries "How can I stop a monster without becoming one myself?" - The Vampire Diaries Dies ist ein Zitat des Charakters Stefan Salvatore aus der Serie "The Vampire Diaries". This is a quote from the character Stefan Salvatore from the series “The Vampire Diaries.”. --- frontend/static/quotes/german.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/static/quotes/german.json b/frontend/static/quotes/german.json index ba48227c9f5a..e0c8649e41ce 100644 --- a/frontend/static/quotes/german.json +++ b/frontend/static/quotes/german.json @@ -3360,6 +3360,12 @@ "source": "Patent Ochsner - für immer uf di", "length": 217, "id": 588 + }, + { + "text": "Wie soll ich ein Monster stoppen, ohne selbst eins zu werden?", + "source": "Stefan Salvatore - The Vampire Diaries", + "length": 61, + "id": 589 } ] } From 820ac7148e1fae3fef94c49a2ab8fb46b06059a8 Mon Sep 17 00:00:00 2001 From: informal-stripes-condo Date: Wed, 15 Oct 2025 09:38:03 +0100 Subject: [PATCH 04/14] feat(languages): add code ocaml language (@informal-stripes-condo) (#7000) ### Description Add Code OCaml Language ### Checks - [x] Adding a language? - Make sure to follow the [languages documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LANGUAGES.md) - [x] Add language to `packages/schemas/src/languages.ts` - [x] Add language to exactly one group in `frontend/src/ts/constants/languages.ts` - [x] Add language json file to `frontend/static/languages` - [x] Check if any open issues are related to this PR; if so, be sure to tag them below. - [x] Make sure the PR title follows the Conventional Commits standard. (https://www.conventionalcommits.org for more info) - [x] Make sure to include your GitHub username prefixed with @ inside parentheses at the end of the PR title. --- frontend/src/ts/constants/languages.ts | 1 + frontend/static/languages/code_ocaml.json | 501 ++++++++++++++++++++++ packages/schemas/src/languages.ts | 1 + 3 files changed, 503 insertions(+) create mode 100644 frontend/static/languages/code_ocaml.json diff --git a/frontend/src/ts/constants/languages.ts b/frontend/src/ts/constants/languages.ts index 7768217621e8..9826154ff745 100644 --- a/frontend/src/ts/constants/languages.ts +++ b/frontend/src/ts/constants/languages.ts @@ -352,6 +352,7 @@ export const LanguageGroups: Record = { "code_typescript", "code_cobol", "code_common_lisp", + "code_ocaml", "code_odin", "code_fortran", "code_abap", diff --git a/frontend/static/languages/code_ocaml.json b/frontend/static/languages/code_ocaml.json new file mode 100644 index 000000000000..4b049d26e437 --- /dev/null +++ b/frontend/static/languages/code_ocaml.json @@ -0,0 +1,501 @@ +{ + "name": "code_ocaml", + "noLazyMode": true, + "words": [ + "!", + "#", + "&", + "&&", + "'", + "(*", + "*)", + "(**", + "(", + ")", + "*", + "*.", + "**", + "+", + "+.", + ",", + "-", + "-.", + "->", + ".", + ".field", + "..", + "/", + "/.", + ":", + "::", + ":=", + ":>", + ";", + ";;", + "<", + "<-", + "<=", + "<>", + "=", + "==", + ">", + ">=", + ">>", + ">>=", + ">>|", + ">|", + ">>?", + ">|?", + "@@", + "@@@", + "@", + "[", + "[|", + "]", + "^", + "_", + "`", + "`Ok", + "`Error", + "`Left", + "`Right", + "`Some", + "`None", + "{", + "{ field =", + "; field =", + "{ record with", + "{<", + "{|", + "|}", + "|}]", + "|", + "|>", + "|> fun x ->", + "|> List.map ~f:", + "||", + "|]", + "}", + "~", + "~f:", + "~f:(fun", + "~key:", + "~data:", + "~init:", + "~compare:", + "~equal:", + "~hash:", + "~sexp_of:", + "~of_sexp:", + "?exn", + "?exn:", + "?(exn", + "?timeout", + "?timeout:", + "?(timeout", + "?buffer_size", + "?buffer_size:", + "?(buffer_size", + "?pos", + "?pos:", + "?(pos", + "?len", + "?len:", + "?(len", + "?default", + "?default:", + "?(default", + "\"%s\"", + "\"%d\"", + "\"%f\"", + "\"%b\"", + "\"%i\"", + "\"%ld\"", + "\"%Ld\"", + "and", + "as", + "assert", + "assert (", + "assert false", + "asr", + "begin", + "class", + "constraint", + "do", + "done", + "downto", + "else", + "end", + "exception", + "external", + "false", + "for", + "fun", + "function", + "functor", + "if", + "in", + "include", + "include module type of", + "inherit", + "initializer", + "land", + "lazy", + "let", + "let%bind", + "let%map", + "let%map2", + "let%map3", + "let%mapn", + "let%sub", + "let%arr", + "let%pattern_bind", + "let%tydi", + "let%expect_test", + "let%test", + "let%test_unit", + "let%test_module", + "let%bench", + "let%bench_fun", + "let%bench_module", + "match%bind", + "match%map", + "if%bind", + "if%map", + "while%bind", + "for%bind", + "lor", + "lsl", + "lsr", + "lxor", + "match", + "method", + "mod", + "module", + "module Make", + "module Make (", + ") =", + ") : S =", + "module type", + "module type S =", + "mutable", + "new", + "nonrec", + "not", + "object", + "of", + "open", + "open!", + "or", + "private", + "rec", + "sig", + "struct", + "then", + "to", + "true", + "try", + "type", + "type t =", + "type 'a t =", + "val", + "virtual", + "when", + "while", + "with", + "[@@deriving sexp]", + "[@@deriving compare]", + "[@@deriving equal]", + "[@@deriving hash]", + "[@@deriving yojson]", + "[@@deriving show]", + "[@@deriving ord]", + "[@@deriving enum]", + "[@default", + "[@key", + "[@tailcall]", + "[@inline]", + "[@cold]", + "[@warning", + "[@alert", + "[@sexp.option]", + "[@sexp.list]", + "[@sexp.opaque]", + "[%sexp", + "[%compare:", + "[%equal:", + "[%hash:", + "[%sexp_of:", + "[%of_sexp:", + "[%message", + "[%log.debug", + "[%log.info", + "[%log.error", + "[%log", + "[%log.global.debug", + "[%log.global.info", + "[%log.global.error", + "[%string", + "[%expr", + "[%type:", + "[%pat?", + "[%expect {|", + "[%test", + "[%test_result:", + "[%test_eq:", + "[%test_pred", + "int", + "float", + "bool", + "char", + "string", + "unit", + "list", + "array", + "option", + "ref", + "exn", + "int32", + "int64", + "nativeint", + "bytes", + "result", + "Or_error.t", + "Sexp.t", + "Error.t", + "String.t", + "Int.t", + "Float.t", + "'a", + "'b", + "'c", + "'key", + "'value", + "'data", + "'msg", + "'error", + "Some", + "None", + "Ok", + "Error", + "[]", + "()", + "(fun", + "(fun x ->", + "(fun () ->", + "(fun ~key ~data ->", + "(function", + "| [] ->", + "| h :: t ->", + "| Some x ->", + "| None ->", + "| Ok x ->", + "| Error e ->", + "| 0 ->", + "| n ->", + "| _ ->", + "| exception", + "x ->", + "y ->", + "acc ->", + "~f:( fun", + "~init:0", + "~init:[]", + "~init:\"\"", + "~compare:String.compare", + "~compare:Int.compare", + "~equal:String.equal", + "~equal:Int.equal", + ": int =", + ": string =", + ": bool =", + ": unit =", + ": 'a list =", + ": 'a option =", + ": ('a, 'b) result =", + "int ->", + "string ->", + "bool ->", + "unit ->", + "'a ->", + "'a list ->", + "'a option ->", + "?exn:exn ->", + "List.map", + "List.filter", + "List.fold", + "List.fold_left", + "List.fold_right", + "List.iter", + "List.length", + "List.rev", + "List.append", + "List.concat", + "List.hd", + "List.tl", + "List.nth", + "List.mem", + "List.find", + "List.find_opt", + "List.find_map", + "List.exists", + "List.for_all", + "List.sort", + "List.partition", + "List.flatten", + "Array.make", + "Array.init", + "Array.get", + "Array.set", + "Array.length", + "Array.map", + "Array.iter", + "Array.fold_left", + "Array.fold_right", + "Array.sort", + "String.length", + "String.get", + "String.sub", + "String.concat", + "String.split_on_char", + "String.uppercase_ascii", + "String.lowercase_ascii", + "String.trim", + "String.map", + "String.iter", + "String.index_opt", + "String.contains", + "String.starts_with", + "String.ends_with", + "Option.map", + "Option.bind", + "Option.value", + "Option.get", + "Option.is_some", + "Option.is_none", + "Option.value_exn", + "Option.join", + "Result.map", + "Result.bind", + "Result.map_error", + "Result.is_ok", + "Result.is_error", + "Result.get_ok", + "Result.get_error", + "Hashtbl.create", + "Hashtbl.add", + "Hashtbl.find", + "Hashtbl.find_opt", + "Hashtbl.mem", + "Hashtbl.remove", + "Hashtbl.iter", + "Map.empty", + "Map.add", + "Map.find", + "Map.find_opt", + "Map.mem", + "Map.remove", + "Map.iter", + "Map.fold", + "Set.empty", + "Set.add", + "Set.mem", + "Set.remove", + "Set.union", + "Set.inter", + "Set.diff", + "Set.iter", + "Queue.create", + "Queue.add", + "Queue.take", + "Queue.peek", + "Queue.is_empty", + "Stack.create", + "Stack.push", + "Stack.pop", + "Stack.top", + "Stack.is_empty", + "Sys.argv", + "Sys.file_exists", + "Sys.is_directory", + "Sys.remove", + "Sys.rename", + "Sys.getenv", + "Sys.getenv_opt", + "abs", + "abs_float", + "acos", + "asin", + "atan", + "ceil", + "cos", + "exp", + "floor", + "fst", + "snd", + "ignore", + "incr", + "decr", + "max", + "min", + "max_int", + "min_int", + "mod_float", + "nan", + "infinity", + "neg_infinity", + "pred", + "succ", + "sqrt", + "sin", + "tan", + "log", + "log10", + "print_string", + "print_int", + "print_float", + "print_endline", + "print_newline", + "prerr_string", + "prerr_int", + "prerr_endline", + "read_line", + "read_int", + "read_float", + "open_in", + "open_out", + "close_in", + "close_out", + "input_line", + "output_string", + "flush", + "raise", + "failwith", + "invalid_arg", + "compare", + "Printf.printf", + "Printf.sprintf", + "Printf.fprintf", + "Printf.eprintf", + "Format.printf", + "Format.sprintf", + "Format.fprintf", + "Format.eprintf", + "Lwt.return", + "Lwt.bind", + "Lwt.map", + "Lwt.catch", + "Lwt.async", + "Lwt.pick", + "Lwt.choose", + "Lwt.join", + "Lwt_main.run", + "Async.return", + "Async.bind", + "Async.map", + "Deferred.return", + "Deferred.bind", + "Deferred.map", + "Deferred.all" + ] +} diff --git a/packages/schemas/src/languages.ts b/packages/schemas/src/languages.ts index afa1134e2552..a54594a460cd 100644 --- a/packages/schemas/src/languages.ts +++ b/packages/schemas/src/languages.ts @@ -409,6 +409,7 @@ export const LanguageSchema = z.enum( "code_v", "code_ook", "code_typescript", + "code_ocaml", "code_odin", "xhosa", "xhosa_3k", From 79f557f5d6f02b84556df7c57b11a32af26941fa Mon Sep 17 00:00:00 2001 From: nyx Date: Wed, 15 Oct 2025 18:38:56 +1000 Subject: [PATCH 05/14] style(quotes): standardise number of tabs for rust quotes (@nyxmeowmeow) (#7001) ### Description changed the rust quotes to use one tab of indentation instead of two, a mixture of one or two, or even eight for some reason ### Checks - [ ] Adding quotes? - [ ] Make sure to include translations for the quotes in the description (or another comment) so we can verify their content. - [ ] Adding a language? - Make sure to follow the [languages documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LANGUAGES.md) - [ ] Add language to `packages/schemas/src/languages.ts` - [ ] Add language to exactly one group in `frontend/src/ts/constants/languages.ts` - [ ] Add language json file to `frontend/static/languages` - [ ] Adding a theme? - Make sure to follow the [themes documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/THEMES.md) - [ ] Add theme to `packages/schemas/src/themes.ts` - [ ] Add theme to `frontend/src/ts/constants/themes.ts` - [ ] Add theme css file to `frontend/static/themes` - [ ] Add some screenshot of the theme, especially with different test settings (colorful, flip colors) to your pull request - [ ] Adding a layout? - [ ] Make sure to follow the [layouts documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LAYOUTS.md) - [ ] Add layout to `packages/schemas/src/layouts.ts` - [ ] Add layout json file to `frontend/static/layouts` - [ ] Adding a font? - Make sure to follow the [themes documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/FONTS.md) - [ ] Add font file to `frontend/static/webfonts` - [ ] Add font to `packages/schemas/src/fonts.ts` - [ ] Add font to `frontend/src/ts/constants/fonts.ts` - [x] Check if any open issues are related to this PR; if so, be sure to tag them below. - [x] Make sure the PR title follows the Conventional Commits standard. (https://www.conventionalcommits.org for more info) - [x] Make sure to include your GitHub username prefixed with @ inside parentheses at the end of the PR title. --- frontend/static/quotes/code_rust.json | 60 +++++++++++++-------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/frontend/static/quotes/code_rust.json b/frontend/static/quotes/code_rust.json index a30a550b0b71..bbdbbbb23c38 100644 --- a/frontend/static/quotes/code_rust.json +++ b/frontend/static/quotes/code_rust.json @@ -51,9 +51,9 @@ }, { "id": 8, - "length": 37, + "length": 36, "source": "Iterate over list values - programming-idioms.org", - "text": "for x in items {\n\t\tdo_something(x);\n}" + "text": "for x in items {\n\tdo_something(x);\n}" }, { "id": 9, @@ -255,9 +255,9 @@ }, { "id": 43, - "length": 145, + "length": 143, "source": "Parallelize execution of 1000 independent tasks - programming-idioms.org", - "text": "use std::thread;\nlet threads: Vec<_> = (0..1000).map(|i| {\n\t\tthread::spawn(move || f(i))\n}).collect();\nfor thread in threads {\n\t\tthread.join();\n}" + "text": "use std::thread;\nlet threads: Vec<_> = (0..1000).map(|i| {\n\tthread::spawn(move || f(i))\n}).collect();\nfor thread in threads {\n\tthread.join();\n}" }, { "id": 44, @@ -297,9 +297,9 @@ }, { "id": 50, - "length": 149, + "length": 147, "source": "First-class function : compose - programming-idioms.org", - "text": "fn compose<'a, A, B, C, G, F>(f: F, g: G) -> Box C + 'a>\n\t\twhere F: 'a + Fn(A) -> B, G: 'a + Fn(B) -> C\n{\n\t\tBox::new(move |x| g(f(x)))\n}" + "text": "fn compose<'a, A, B, C, G, F>(f: F, g: G) -> Box C + 'a>\n\twhere F: 'a + Fn(A) -> B, G: 'a + Fn(B) -> C\n{\n\tBox::new(move |x| g(f(x)))\n}" }, { "id": 51, @@ -309,9 +309,9 @@ }, { "id": 52, - "length": 149, + "length": 147, "source": "First-class function : generic composition - programming-idioms.org", - "text": "fn compose<'a, A, B, C, G, F>(f: F, g: G) -> Box C + 'a>\n\t\twhere F: 'a + Fn(A) -> B, G: 'a + Fn(B) -> C\n{\n\t\tBox::new(move |x| g(f(x)))\n}" + "text": "fn compose<'a, A, B, C, G, F>(f: F, g: G) -> Box C + 'a>\n\twhere F: 'a + Fn(A) -> B, G: 'a + Fn(B) -> C\n{\n\tBox::new(move |x| g(f(x)))\n}" }, { "id": 53, @@ -459,9 +459,9 @@ }, { "id": 77, - "length": 129, + "length": 128, "source": "Launch 1000 parallel tasks and wait for completion - programming-idioms.org", - "text": "use std::thread;\nlet threads: Vec<_> = (0..1000).map(|i| thread::spawn(move || f(i))).collect();\nfor t in threads {\n\t\tt.join();\n}" + "text": "use std::thread;\nlet threads: Vec<_> = (0..1000).map(|i| thread::spawn(move || f(i))).collect();\nfor t in threads {\n\tt.join();\n}" }, { "id": 78, @@ -813,9 +813,9 @@ }, { "id": 136, - "length": 108, + "length": 107, "source": "Iterate over map entries, ordered by values - programming-idioms.org", - "text": "use itertools::Itertools;\nfor (k, x) in mymap.iter().sorted_by_key(|x| x.1) {\n\t\tprintln!(\"[{},{}]\", k, x);\n}" + "text": "use itertools::Itertools;\nfor (k, x) in mymap.iter().sorted_by_key(|x| x.1) {\n\tprintln!(\"[{},{}]\", k, x);\n}" }, { "id": 137, @@ -939,15 +939,15 @@ }, { "id": 157, - "length": 497, + "length": 482, "source": "Breadth-first traversing in a graph - programming-idioms.org", - "text": "use std::rc::{Rc, Weak};\nuse std::cell::RefCell;\nstruct Vertex {\n\t\tvalue: V,\n\t\tneighbours: Vec>>>,\n}\n// ...\nfn bft(start: Rc>>, f: impl Fn(&V)) {\n\t\tlet mut q = vec![start];\n\t\tlet mut i = 0;\n\t\twhile i < q.len() {\n\t\t\tlet v = Rc::clone(&q[i]);\n\t\t\ti += 1;\n\t\t\t(f)(&v.borrow().value);\n\t\t\tfor n in &v.borrow().neighbours {\n\t\t\t\tlet n = n.upgrade().expect(\"Invalid neighbour\");\n\t\t\t\tif q.iter().all(|v| v.as_ptr() != n.as_ptr()) {\n\t\t\t\t\tq.push(n);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n}" + "text": "use std::rc::{Rc, Weak};\nuse std::cell::RefCell;\nstruct Vertex {\n\tvalue: V,\n\tneighbours: Vec>>>,\n}\n// ...\nfn bft(start: Rc>>, f: impl Fn(&V)) {\n\tlet mut q = vec![start];\n\tlet mut i = 0;\n\twhile i < q.len() {\n\t\tlet v = Rc::clone(&q[i]);\n\t\ti += 1;\n\t\t(f)(&v.borrow().value);\n\t\tfor n in &v.borrow().neighbours {\n\t\t\tlet n = n.upgrade().expect(\"Invalid neighbour\");\n\t\t\tif q.iter().all(|v| v.as_ptr() != n.as_ptr()) {\n\t\t\t\tq.push(n);\n\t\t\t}\n\t\t}\n\t}\n}" }, { "id": 158, - "length": 465, + "length": 450, "source": "Depth-first traversing in a graph - programming-idioms.org", - "text": "use std::rc::{Rc, Weak};\nuse std::cell::RefCell;\nstruct Vertex {\n\t\tvalue: V,\n\t\tneighbours: Vec>>>,\n}\n// ...\nfn dft_helper(start: Rc>>, f: &impl Fn(&V), s: &mut Vec<*const Vertex>) {\n\t\ts.push(start.as_ptr());\n\t\t(f)(&start.borrow().value);\n\t\tfor n in &start.borrow().neighbours {\n\t\t\t\tlet n = n.upgrade().expect(\"Invalid neighbor\");\n\t\t\t\tif s.iter().all(|&p| p != n.as_ptr()) {\n\t\t\t\t\t\tSelf::dft_helper(n, f, s);\n\t\t\t\t}\n\t\t}\n}" + "text": "use std::rc::{Rc, Weak};\nuse std::cell::RefCell;\nstruct Vertex {\n\tvalue: V,\n\tneighbours: Vec>>>,\n}\n// ...\nfn dft_helper(start: Rc>>, f: &impl Fn(&V), s: &mut Vec<*const Vertex>) {\n\ts.push(start.as_ptr());\n\t(f)(&start.borrow().value);\n\tfor n in &start.borrow().neighbours {\n\t\tlet n = n.upgrade().expect(\"Invalid neighbor\");\n\t\tif s.iter().all(|&p| p != n.as_ptr()) {\n\t\t\tSelf::dft_helper(n, f, s);\n\t\t}\n\t}\n}" }, { "id": 159, @@ -1005,9 +1005,9 @@ }, { "id": 168, - "length": 141, + "length": 127, "source": "Check if string contains only digits - programming-idioms.org", - "text": "let chars_are_numeric: Vec = s.chars()\n\t\t\t\t\t\t\t\t.map(|c|c.is_numeric())\n\t\t\t\t\t\t\t\t.collect();\nlet b = !chars_are_numeric.contains(&false);" + "text": "let chars_are_numeric: Vec = s.chars()\n\t.map(|c|c.is_numeric())\n\t.collect();\nlet b = !chars_are_numeric.contains(&false);" }, { "id": 169, @@ -1347,9 +1347,9 @@ }, { "id": 225, - "length": 63, + "length": 60, "source": "Filter and transform list - programming-idioms.org", - "text": "let y = x.iter()\n\t\t.filter(P)\n\t\t.map(T)\n\t\t.collect::>();" + "text": "let y = x.iter()\n\t.filter(P)\n\t.map(T)\n\t.collect::>();" }, { "id": 226, @@ -1377,9 +1377,9 @@ }, { "id": 230, - "length": 129, + "length": 127, "source": "Get a list of lines from a file - programming-idioms.org", - "text": "use std::io::prelude::*;\nuse std::io::BufReader;\nlet lines = BufReader::new(File::open(path)?)\n\t\t.lines()\n\t\t.collect::>();" + "text": "use std::io::prelude::*;\nuse std::io::BufReader;\nlet lines = BufReader::new(File::open(path)?)\n\t.lines()\n\t.collect::>();" }, { "id": 231, @@ -1431,15 +1431,15 @@ }, { "id": 239, - "length": 74, + "length": 73, "source": "Formula with arrays - programming-idioms.org", - "text": "for i in range 0..a.len() {\n\t\ta[i] = e*(a[i] + b[i] + c[i] + d[i].cos())\n}" + "text": "for i in range 0..a.len() {\n\ta[i] = e*(a[i] + b[i] + c[i] + d[i].cos())\n}" }, { "id": 240, - "length": 131, + "length": 121, "source": "Type with automatic deep deallocation - programming-idioms.org", - "text": "struct T {\n\t\ts: String,\n\t\tn: Vec,\n}\nfn main() {\n\t\tlet v = T {\n\t\t\t\ts: \"Hello, world!\".into(),\n\t\t\t\tn: vec![1,4,9,16,25]\n\t\t};\n}" + "text": "struct T {\n\ts: String,\n\tn: Vec,\n}\nfn main() {\n\tlet v = T {\n\ts: \"Hello, world!\".into(),\n\tn: vec![1,4,9,16,25]\n\t};\n}" }, { "id": 241, @@ -1473,9 +1473,9 @@ }, { "id": 246, - "length": 138, + "length": 136, "source": "Pad a string on both sides - programming-idioms.org", - "text": "use std::iter;\nlet s2 = iter::repeat(c).take((m + 1) / 2).collect::()\n\t\t+ &s\n\t\t+ &iter::repeat(c).take(m / 2).collect::();" + "text": "use std::iter;\nlet s2 = iter::repeat(c).take((m + 1) / 2).collect::()\n\t+ &s\n\t+ &iter::repeat(c).take(m / 2).collect::();" }, { "id": 247, @@ -1539,9 +1539,9 @@ }, { "id": 257, - "length": 101, + "length": 99, "source": "for else loop - programming-idioms.org", - "text": "if let None = items.iter().find(|&&item| item == \"rockstar programmer\") {\n\t\tprintln!(\"NotFound\");\n\t};" + "text": "if let None = items.iter().find(|&&item| item == \"rockstar programmer\") {\n\tprintln!(\"NotFound\");\n};" }, { "id": 258, From 9e48142495f40e037614f673204a643a61ed5b53 Mon Sep 17 00:00:00 2001 From: Eric Zhang <57819328+Eric-Zhang-Developer@users.noreply.github.com> Date: Wed, 15 Oct 2025 04:40:13 -0400 Subject: [PATCH 06/14] impr(quotes): add quotes from the book How to Win Friends and Influence People (@Eric-Zhang-Developer) (#7005) ### Description Added 7 of the most popular quotes on Goodreads from *How to Win Friends & Influence People* by Dale Carnegie ### Checks - [x] Adding quotes? - [ ] Make sure to include translations for the quotes in the description (or another comment) so we can verify their content. - [ ] Adding a language? - Make sure to follow the [languages documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LANGUAGES.md) - [ ] Add language to `packages/contracts/src/schemas/languages.ts` - [ ] Add language to exactly one group in `frontend/src/ts/constants/languages.ts` - [ ] Add language json file to `frontend/static/languages` - [ ] Adding a theme? - Make sure to follow the [themes documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/THEMES.md) - [ ] Add theme to `packages/contracts/src/schemas/themes.ts` - [ ] Add theme to `frontend/src/ts/constants/themes.ts` - [ ] Add theme css file to `frontend/static/themes` - Also please add a screenshot of the theme, it would be extra awesome if you do so! - [ ] Adding a layout? - [ ] Make sure to follow the [layouts documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LAYOUTS.md) - [ ] Add layout to `packages/contracts/src/schemas/layouts.ts` - [ ] Add layout json file to `frontend/static/layouts` - [x] Check if any open issues are related to this PR; if so, be sure to tag them below. - [x] Make sure the PR title follows the Conventional Commits standard. (https://www.conventionalcommits.org for more info) - [x] Make sure to include your GitHub username prefixed with @ inside parentheses at the end of the PR title. --- frontend/static/quotes/english.json | 42 +++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/frontend/static/quotes/english.json b/frontend/static/quotes/english.json index e5556da3ac0b..8bc336c0d52f 100644 --- a/frontend/static/quotes/english.json +++ b/frontend/static/quotes/english.json @@ -38901,6 +38901,48 @@ "source": "Kung Fu Panda 2 (2011)", "id": 7696, "length": 138 + }, + { + "text": "It isn't what you have or who you are or where you are or what you are doing that makes you happy or unhappy. It is what you think about it.", + "source": "Dale Carnegie, How to Win Friends & Influence People", + "id": 7697, + "length": 140 + }, + { + "text": "Don't be afraid of enemies who attack you. Be afraid of the friends who flatter you.", + "source": "Dale Carnegie, How to Win Friends & Influence People", + "id": 7698, + "length": 84 + }, + { + "text": "You can make more friends in two months by becoming interested in other people than you can in two years by trying to get other people interested in you.", + "source": "Dale Carnegie, How to Win Friends & Influence People", + "id": 7699, + "length": 153 + }, + { + "text": "Any fool can criticize, complain, and condemn—and most fools do. But it takes character and self-control to be understanding and forgiving.", + "source": "Dale Carnegie, How to Win Friends & Influence People", + "id": 7700, + "length": 139 + }, + { + "text": "When dealing with people, remember you are not dealing with creatures of logic, but with creatures bristling with prejudice and motivated by pride and vanity.", + "source": "Dale Carnegie, How to Win Friends & Influence People", + "id": 7701, + "length": 158 + }, + { + "text": "Actions speak louder than words, and a smile says, 'I like you. You make me happy. I am glad to see you.' That is why dogs make such a hit. They are so glad to see us that they almost jump out of their skins. So, naturally, we are glad to see them.", + "source": "Dale Carnegie, How to Win Friends & Influence People", + "id": 7702, + "length": 248 + }, + { + "text": "I have come to the conclusion that there is only one way under high heaven to get the best of an argument — and that is to avoid it. Avoid it as you would avoid rattlesnakes and earthquakes.", + "source": "Dale Carnegie, How to Win Friends & Influence People", + "id": 7703, + "length": 190 } ] } From 4e5ba24a3eaa546284672d09b88b02cb43f813d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Oct 2025 10:42:46 +0200 Subject: [PATCH 07/14] build(deps): bump nodemailer from 6.9.14 to 7.0.7 in /backend (#7011) Bumps [nodemailer](https://github.com/nodemailer/nodemailer) from 6.9.14 to 7.0.7.
Release notes

Sourced from nodemailer's releases.

v7.0.7

7.0.7 (2025-10-05)

Bug Fixes

  • addressparser: Fixed addressparser handling of quoted nested email addresses (1150d99)
  • dns: add memory leak prevention for DNS cache (0240d67)
  • linter: Updated eslint and created prettier formatting task (df13b74)
  • refresh expired DNS cache on error (#1759) (ea0fc5a)
  • resolve linter errors in DNS cache tests (3b8982c)

v7.0.6

7.0.6 (2025-08-27)

Bug Fixes

  • encoder: avoid silent data loss by properly flushing trailing base64 (#1747) (01ae76f)
  • handle multiple XOAUTH2 token requests correctly (#1754) (dbe0028)
  • ReDoS vulnerability in parseDataURI and _processDataUrl (#1755) (90b3e24)

v7.0.5

7.0.5 (2025-07-07)

Bug Fixes

  • updated well known delivery service list (fa2724b)

v7.0.4

7.0.4 (2025-06-29)

Bug Fixes

  • pools: Emit 'clear' once transporter is idle and all connections are closed (839e286)
  • smtp-connection: jsdoc public annotation for socket (#1741) (c45c84f)
  • well-known-services: Added AliyunQiye (bb9e6da)

v7.0.3

7.0.3 (2025-05-08)

Bug Fixes

  • attachments: Set the default transfer encoding for message/rfc822 attachments as '7bit' (007d5f3)

v7.0.2

7.0.2 (2025-05-04)

... (truncated)

Changelog

Sourced from nodemailer's changelog.

7.0.7 (2025-10-05)

Bug Fixes

  • addressparser: Fixed addressparser handling of quoted nested email addresses (1150d99)
  • dns: add memory leak prevention for DNS cache (0240d67)
  • linter: Updated eslint and created prettier formatting task (df13b74)
  • refresh expired DNS cache on error (#1759) (ea0fc5a)
  • resolve linter errors in DNS cache tests (3b8982c)

7.0.6 (2025-08-27)

Bug Fixes

  • encoder: avoid silent data loss by properly flushing trailing base64 (#1747) (01ae76f)
  • handle multiple XOAUTH2 token requests correctly (#1754) (dbe0028)
  • ReDoS vulnerability in parseDataURI and _processDataUrl (#1755) (90b3e24)

7.0.5 (2025-07-07)

Bug Fixes

  • updated well known delivery service list (fa2724b)

7.0.4 (2025-06-29)

Bug Fixes

  • pools: Emit 'clear' once transporter is idle and all connections are closed (839e286)
  • smtp-connection: jsdoc public annotation for socket (#1741) (c45c84f)
  • well-known-services: Added AliyunQiye (bb9e6da)

7.0.3 (2025-05-08)

Bug Fixes

  • attachments: Set the default transfer encoding for message/rfc822 attachments as '7bit' (007d5f3)

7.0.2 (2025-05-04)

Bug Fixes

  • ses: Fixed structured from header (faa9a5e)

7.0.1 (2025-05-04)

Bug Fixes

  • ses: Use formatted FromEmailAddress for SES emails (821cd09)

... (truncated)

Commits
  • 9357a71 chore(master): release 7.0.7 [skip-ci] (#1761)
  • df13b74 fix(linter): Updated eslint and created prettier formatting task
  • 62629a0 Updated tests for addressparser
  • 1150d99 fix(addressparser): Fixed addressparser handling of quoted nested email addre...
  • 3b8982c fix: resolve linter errors in DNS cache tests
  • 0240d67 fix(dns): add memory leak prevention for DNS cache
  • ea0fc5a fix: refresh expired DNS cache on error (#1759)
  • 430ca75 chore(master): release 7.0.6 [skip-ci] (#1753)
  • e3e700c Bumped deps
  • f322c38 replaced escaped single quotes with unescaped ones
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=nodemailer&package-manager=npm_and_yarn&previous-version=6.9.14&new-version=7.0.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/monkeytypegame/monkeytype/network/alerts).
--------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Christian Fehmer --- backend/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/package.json b/backend/package.json index c03c3d4d2277..19b57d51d331 100644 --- a/backend/package.json +++ b/backend/package.json @@ -49,7 +49,7 @@ "mjml": "4.15.0", "mongodb": "6.3.0", "mustache": "4.2.0", - "nodemailer": "6.9.14", + "nodemailer": "7.0.7", "object-hash": "3.0.0", "prom-client": "15.1.3", "rate-limiter-flexible": "5.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a53bcef8d012..fdbd54e2de7d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -129,8 +129,8 @@ importers: specifier: 4.2.0 version: 4.2.0 nodemailer: - specifier: 6.9.14 - version: 6.9.14 + specifier: 7.0.7 + version: 7.0.7 object-hash: specifier: 3.0.0 version: 3.0.0 @@ -7113,8 +7113,8 @@ packages: resolution: {integrity: sha512-1uiY543L+N7Og4yswvlm5NCKgPKDEXd9AUR9Jh3gen6oOeBsesr6LqhXom1er3eRzSUcVRWXzhv8tSNrIfGHKw==} engines: {node: '>=18'} - nodemailer@6.9.14: - resolution: {integrity: sha512-Dobp/ebDKBvz91sbtRKhcznLThrKxKt97GI2FAlAyy+fk19j73Uz3sBXolVtmcXjaorivqsbbbjDY+Jkt4/bQA==} + nodemailer@7.0.7: + resolution: {integrity: sha512-jGOaRznodf62TVzdyhKt/f1Q/c3kYynk8629sgJHpRzGZj01ezbgMMWJSAjHADcwTKxco3B68/R+KHJY2T5BaA==} engines: {node: '>=6.0.0'} nodemon@3.1.4: @@ -17478,7 +17478,7 @@ snapshots: dependencies: '@babel/parser': 7.28.3 - nodemailer@6.9.14: {} + nodemailer@7.0.7: {} nodemon@3.1.4: dependencies: From 260c3a94c3b3479d9c21a067caef5257eef596c8 Mon Sep 17 00:00:00 2001 From: Ryan Souza <76923948+Ryrden@users.noreply.github.com> Date: Wed, 15 Oct 2025 05:43:14 -0300 Subject: [PATCH 08/14] feat(language): add Clojure programming language support (@Ryrden) (#7012) ### Description This PR adds support for the Clojure programming language to Monkeytype, providing developers with a comprehensive set of essential Clojure keywords and constructs for typing practice. **Changes made:** - Add `code_clojure` to language schema (`packages/schemas/src/languages.ts`) - Add `code_clojure` to frontend constants in the `code` language group (`frontend/src/ts/constants/languages.ts`) - Create `code_clojure.json` with 212 essential Clojure keywords and functions - Includes core language constructs (def, defn, let, fn), control flow (if, when, cond), data manipulation (map, filter, reduce), concurrency primitives (atom, ref, agent), and utility functions ### Checks - [ ] Adding quotes? - [ ] Make sure to include translations for the quotes in the description (or another comment) so we can verify their content. - [x] Adding a language? - Make sure to follow the [languages documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LANGUAGES.md) - [x] Add language to `packages/schemas/src/languages.ts` - [x] Add language to exactly one group in `frontend/src/ts/constants/languages.ts` - [x] Add language json file to `frontend/static/languages` - [ ] Adding a theme? - Make sure to follow the [themes documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/THEMES.md) - [ ] Add theme to `packages/schemas/src/themes.ts` - [ ] Add theme to `frontend/src/ts/constants/themes.ts` - [ ] Add theme css file to `frontend/static/themes` - [ ] Add some screenshot of the theme, especially with different test settings (colorful, flip colors) to your pull request - [ ] Adding a layout? - [ ] Make sure to follow the [layouts documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LAYOUTS.md) - [ ] Add layout to `packages/schemas/src/layouts.ts` - [ ] Add layout json file to `frontend/static/layouts` - [ ] Adding a font? - Make sure to follow the [themes documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/FONTS.md) - [ ] Add font file to `frontend/static/webfonts` - [ ] Add font to `packages/schemas/src/fonts.ts` - [ ] Add font to `frontend/src/ts/constants/fonts.ts` - [x] Check if any open issues are related to this PR; if so, be sure to tag them below. - [x] Make sure the PR title follows the Conventional Commits standard. (https://www.conventionalcommits.org for more info) - [x] Make sure to include your GitHub username prefixed with @ inside parentheses at the end of the PR title. Note: Please, is it possible to add the label `hacktoberfest-accepted` to this PR? --- frontend/src/ts/constants/languages.ts | 1 + frontend/static/languages/code_clojure.json | 218 ++++++++++++++++++++ packages/schemas/src/languages.ts | 1 + 3 files changed, 220 insertions(+) create mode 100644 frontend/static/languages/code_clojure.json diff --git a/frontend/src/ts/constants/languages.ts b/frontend/src/ts/constants/languages.ts index 9826154ff745..86fc2073b672 100644 --- a/frontend/src/ts/constants/languages.ts +++ b/frontend/src/ts/constants/languages.ts @@ -351,6 +351,7 @@ export const LanguageGroups: Record = { "code_ook", "code_typescript", "code_cobol", + "code_clojure", "code_common_lisp", "code_ocaml", "code_odin", diff --git a/frontend/static/languages/code_clojure.json b/frontend/static/languages/code_clojure.json new file mode 100644 index 000000000000..540032423c88 --- /dev/null +++ b/frontend/static/languages/code_clojure.json @@ -0,0 +1,218 @@ +{ + "name": "code_clojure", + "noLazyMode": true, + "words": [ + "def", + "defn", + "defmacro", + "defonce", + "defn-", + "defmulti", + "defmethod", + "defprotocol", + "defrecord", + "defstruct", + "deftype", + "fn", + "let", + "loop", + "recur", + "if", + "when", + "when-not", + "cond", + "case", + "condp", + "do", + "and", + "or", + "not", + "nil", + "true", + "false", + "ns", + "require", + "import", + "use", + "refer", + "map", + "filter", + "reduce", + "apply", + "comp", + "partial", + "constantly", + "identity", + "first", + "rest", + "last", + "butlast", + "next", + "take", + "drop", + "take-while", + "drop-while", + "conj", + "cons", + "concat", + "reverse", + "sort", + "sort-by", + "count", + "empty?", + "seq", + "vec", + "list", + "set", + "hash-map", + "hash-set", + "assoc", + "dissoc", + "get", + "get-in", + "assoc-in", + "update-in", + "merge", + "keys", + "vals", + "contains?", + "find", + "select-keys", + "zipmap", + "into", + "group-by", + "frequencies", + "distinct", + "remove", + "keep", + "keep-indexed", + "map-indexed", + "doall", + "dorun", + "doseq", + "dotimes", + "for", + "while", + "repeatedly", + "iterate", + "cycle", + "range", + "repeat", + "lazy-seq", + "try", + "catch", + "finally", + "throw", + "str", + "pr-str", + "print", + "println", + "prn", + "with-open", + "slurp", + "spit", + "read-string", + "atom", + "ref", + "agent", + "var", + "deref", + "swap!", + "reset!", + "alter", + "commute", + "send", + "send-off", + "future", + "promise", + "deliver", + "delay", + "force", + "pmap", + "pcalls", + "pvalues", + "binding", + "with-redefs", + "with-meta", + "meta", + "vary-meta", + "with-out-str", + "with-in-str", + "re-find", + "re-matches", + "re-seq", + "re-pattern", + "subs", + "format", + "join", + "split", + "split-lines", + "trim", + "triml", + "trimr", + "replace", + "upper-case", + "lower-case", + "capitalize", + "inc", + "dec", + "max", + "min", + "abs", + "mod", + "rem", + "quot", + "even?", + "odd?", + "zero?", + "pos?", + "neg?", + "number?", + "integer?", + "float?", + "rational?", + "decimal?", + "string?", + "keyword?", + "symbol?", + "map?", + "vector?", + "list?", + "set?", + "coll?", + "sequential?", + "associative?", + "sorted?", + "counted?", + "reversible?", + "indexed?", + "seqable?", + "fn?", + "ifn?", + "class", + "type", + "instance?", + "isa?", + "cast", + "satisfies?", + "extends?", + "supers", + "bases", + "class?", + "resolve", + "requiring-resolve", + "find-var", + "var-get", + "var-set", + "bound?", + "thread-bound?", + "make-array", + "object-array", + "aclone", + "aget", + "aset", + "alength", + "amap", + "areduce" + ] +} diff --git a/packages/schemas/src/languages.ts b/packages/schemas/src/languages.ts index a54594a460cd..f49ae3dfc66d 100644 --- a/packages/schemas/src/languages.ts +++ b/packages/schemas/src/languages.ts @@ -416,6 +416,7 @@ export const LanguageSchema = z.enum( "tibetan", "tibetan_1k", "code_cobol", + "code_clojure", "code_common_lisp", "docker_file", "code_fortran", From 154b88eecf8390da5ec43cf400aa661ffca3f790 Mon Sep 17 00:00:00 2001 From: Ryan Souza <76923948+Ryrden@users.noreply.github.com> Date: Wed, 15 Oct 2025 05:44:50 -0300 Subject: [PATCH 09/14] feat(language): add Erlang programming language support (@Ryrden) (#7013) ### Description This PR adds support for the Erlang programming language to Monkeytype, providing developers with a comprehensive set of essential Erlang keywords, OTP behaviors, and standard library functions for typing practice. **Changes made:** - Add `code_erlang` to language schema (`packages/schemas/src/languages.ts`) - Add `code_erlang` to frontend constants in the `code` language group (`frontend/src/ts/constants/languages.ts`) - Create `code_erlang.json` with 245 essential Erlang keywords and functions - Includes core language constructs (after, and, case, receive, spawn), OTP behaviors (gen_server, supervisor, application), built-in functions (spawn_link, monitor, register), and standard library modules (lists, string, ets, mnesia, file, io) ### Checks - [ ] Adding quotes? - [ ] Make sure to include translations for the quotes in the description (or another comment) so we can verify their content. - [x] Adding a language? - Make sure to follow the [languages documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LANGUAGES.md) - [x] Add language to `packages/schemas/src/languages.ts` - [x] Add language to exactly one group in `frontend/src/ts/constants/languages.ts` - [x] Add language json file to `frontend/static/languages` - [ ] Adding a theme? - Make sure to follow the [themes documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/THEMES.md) - [ ] Add theme to `packages/schemas/src/themes.ts` - [ ] Add theme to `frontend/src/ts/constants/themes.ts` - [ ] Add theme css file to `frontend/static/themes` - [ ] Add some screenshot of the theme, especially with different test settings (colorful, flip colors) to your pull request - [ ] Adding a layout? - [ ] Make sure to follow the [layouts documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LAYOUTS.md) - [ ] Add layout to `packages/schemas/src/layouts.ts` - [ ] Add layout json file to `frontend/static/layouts` - [ ] Adding a font? - Make sure to follow the [themes documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/FONTS.md) - [ ] Add font file to `frontend/static/webfonts` - [ ] Add font to `packages/schemas/src/fonts.ts` - [ ] Add font to `frontend/src/ts/constants/fonts.ts` - [x] Check if any open issues are related to this PR; if so, be sure to tag them below. - [x] Make sure the PR title follows the Conventional Commits standard. (https://www.conventionalcommits.org for more info) - [x] Make sure to include your GitHub username prefixed with @ inside parentheses at the end of the PR title. Note: Please, is it possible to add the label `hacktoberfest-accepted` to this PR? Co-authored-by: Jack --- frontend/src/ts/constants/languages.ts | 1 + frontend/static/languages/code_erlang.json | 251 +++++++++++++++++++++ packages/schemas/src/languages.ts | 1 + 3 files changed, 253 insertions(+) create mode 100644 frontend/static/languages/code_erlang.json diff --git a/frontend/src/ts/constants/languages.ts b/frontend/src/ts/constants/languages.ts index 86fc2073b672..eda60c374c2f 100644 --- a/frontend/src/ts/constants/languages.ts +++ b/frontend/src/ts/constants/languages.ts @@ -353,6 +353,7 @@ export const LanguageGroups: Record = { "code_cobol", "code_clojure", "code_common_lisp", + "code_erlang", "code_ocaml", "code_odin", "code_fortran", diff --git a/frontend/static/languages/code_erlang.json b/frontend/static/languages/code_erlang.json new file mode 100644 index 000000000000..c11904df3cf1 --- /dev/null +++ b/frontend/static/languages/code_erlang.json @@ -0,0 +1,251 @@ +{ + "name": "code_erlang", + "noLazyMode": true, + "words": [ + "after", + "and", + "andalso", + "band", + "begin", + "bnot", + "bor", + "bsl", + "bsr", + "bxor", + "case", + "catch", + "cond", + "div", + "end", + "fun", + "if", + "let", + "not", + "of", + "or", + "orelse", + "query", + "receive", + "rem", + "try", + "when", + "xor", + "module", + "export", + "import", + "compile", + "vsn", + "author", + "behaviour", + "behavior", + "record", + "define", + "ifdef", + "ifndef", + "else", + "endif", + "include", + "include_lib", + "undef", + "spec", + "type", + "opaque", + "callback", + "optional_callbacks", + "spawn", + "spawn_link", + "spawn_monitor", + "spawn_opt", + "link", + "unlink", + "monitor", + "demonitor", + "process_flag", + "register", + "unregister", + "whereis", + "registered", + "send", + "exit", + "throw", + "error", + "apply", + "make_ref", + "node", + "nodes", + "self", + "pid_to_list", + "list_to_pid", + "atom_to_list", + "list_to_atom", + "binary_to_list", + "list_to_binary", + "term_to_binary", + "binary_to_term", + "integer_to_list", + "list_to_integer", + "float_to_list", + "list_to_float", + "tuple_to_list", + "list_to_tuple", + "size", + "byte_size", + "bit_size", + "length", + "hd", + "tl", + "element", + "setelement", + "tuple_size", + "is_atom", + "is_binary", + "is_bitstring", + "is_boolean", + "is_float", + "is_function", + "is_integer", + "is_list", + "is_number", + "is_pid", + "is_port", + "is_record", + "is_reference", + "is_tuple", + "abs", + "round", + "trunc", + "max", + "min", + "gen_server", + "gen_statem", + "gen_fsm", + "gen_event", + "supervisor", + "application", + "start", + "stop", + "init", + "handle_call", + "handle_cast", + "handle_info", + "terminate", + "code_change", + "start_link", + "call", + "cast", + "reply", + "noreply", + "normal", + "shutdown", + "brutal_kill", + "permanent", + "temporary", + "transient", + "worker", + "one_for_one", + "one_for_all", + "rest_for_one", + "simple_one_for_one", + "infinity", + "timer", + "sleep", + "send_after", + "send_interval", + "cancel", + "now", + "date", + "time", + "localtime", + "universaltime", + "calendar", + "datetime_to_gregorian_seconds", + "gregorian_seconds_to_datetime", + "erlang", + "system_info", + "memory", + "garbage_collect", + "process_info", + "statistics", + "trace", + "trace_pattern", + "dbg", + "ets", + "new", + "insert", + "lookup", + "delete", + "match", + "select", + "foldl", + "foldr", + "tab2list", + "info", + "dets", + "open_file", + "close", + "sync", + "mnesia", + "create_schema", + "create_table", + "delete_table", + "write", + "read", + "transaction", + "activity", + "dirty_write", + "dirty_read", + "dirty_delete", + "file", + "open", + "position", + "consult", + "eval", + "script", + "io", + "format", + "fwrite", + "nl", + "get_line", + "get_chars", + "put_chars", + "lists", + "append", + "concat", + "reverse", + "sort", + "keysort", + "member", + "filter", + "map", + "foreach", + "all", + "any", + "partition", + "splitwith", + "takewhile", + "dropwhile", + "zip", + "unzip", + "flatten", + "string", + "len", + "equal", + "chr", + "str", + "rstr", + "span", + "cspan", + "substr", + "tokens", + "chars", + "copies", + "words", + "sub_word", + "strip", + "left", + "right", + "centre", + "to_upper", + "to_lower" + ] +} diff --git a/packages/schemas/src/languages.ts b/packages/schemas/src/languages.ts index f49ae3dfc66d..c5279e6176cf 100644 --- a/packages/schemas/src/languages.ts +++ b/packages/schemas/src/languages.ts @@ -418,6 +418,7 @@ export const LanguageSchema = z.enum( "code_cobol", "code_clojure", "code_common_lisp", + "code_erlang", "docker_file", "code_fortran", "viossa", From 0311da26db4cdff94abd1f86be3f10c9c487cd35 Mon Sep 17 00:00:00 2001 From: Omar Emad Date: Wed, 15 Oct 2025 11:45:45 +0300 Subject: [PATCH 10/14] impr(quotes): add French quotes (@OM3X4) (#7017) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description Added a new Egyptian Arabic Quote , this is the translation: > Life, my son, has two faces — white and black. When it shows you its white face, remember the black one so you can stay cautious. And when it turns black, remember the white one so you can endure and live for tomorrow. ### Checks - [x] Adding quotes? - [x] Make sure to include translations for the quotes in the description (or another comment) so we can verify their content. - [ ] Adding a language? - Make sure to follow the [languages documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LANGUAGES.md) - [ ] Add language to `packages/schemas/src/languages.ts` - [ ] Add language to exactly one group in `frontend/src/ts/constants/languages.ts` - [ ] Add language json file to `frontend/static/languages` - [ ] Adding a theme? - Make sure to follow the [themes documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/THEMES.md) - [ ] Add theme to `packages/schemas/src/themes.ts` - [ ] Add theme to `frontend/src/ts/constants/themes.ts` - [ ] Add theme css file to `frontend/static/themes` - [ ] Add some screenshot of the theme, especially with different test settings (colorful, flip colors) to your pull request - [ ] Adding a layout? - [ ] Make sure to follow the [layouts documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LAYOUTS.md) - [ ] Add layout to `packages/schemas/src/layouts.ts` - [ ] Add layout json file to `frontend/static/layouts` - [ ] Adding a font? - Make sure to follow the [themes documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/FONTS.md) - [ ] Add font file to `frontend/static/webfonts` - [ ] Add font to `packages/schemas/src/fonts.ts` - [ ] Add font to `frontend/src/ts/constants/fonts.ts` - [ ] Check if any open issues are related to this PR; if so, be sure to tag them below. - [ ] Make sure the PR title follows the Conventional Commits standard. (https://www.conventionalcommits.org for more info) - [ ] Make sure to include your GitHub username prefixed with @ inside parentheses at the end of the PR title. --- frontend/static/quotes/arabic_egypt.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/static/quotes/arabic_egypt.json b/frontend/static/quotes/arabic_egypt.json index c5251d7dffe0..89999d3b59b0 100644 --- a/frontend/static/quotes/arabic_egypt.json +++ b/frontend/static/quotes/arabic_egypt.json @@ -492,6 +492,12 @@ "source": "طه حسين - الأيام", "length": 258, "id": 81 + }, + { + "text": "الدنيا يا ولدي ليها وشين، أبيض وأسود، لما تبقى بيضا قدامك افتكر الأسود عشان تسلك، ولما تبقى سودة افتكر الأبيض عشان تقدر تعيش لبكرة.", + "source": "علي الشريف - فيلم الإنسان يعيش مرة واحدة", + "length": 131, + "id": 82 } ] } From 06a20e7b8d0bb6b73308960bdc78cf54ac9d85e5 Mon Sep 17 00:00:00 2001 From: Noah <70314622+ixnoahlive@users.noreply.github.com> Date: Wed, 15 Oct 2025 10:59:34 +0200 Subject: [PATCH 11/14] impr(quotes): add 6 new english quotes (@ixnoahlive) (#7009) ### Description Adds some quotes from media I particularly like and would like to see more of! Translations not applicable. ### Checks - [x] Adding quotes? - [x] Make sure to include translations for the quotes in the description (or another comment) so we can verify their content. - [x] Check if any open issues are related to this PR; if so, be sure to tag them below. - [x] Make sure the PR title follows the Conventional Commits standard. (https://www.conventionalcommits.org for more info) - [x] Make sure to include your GitHub username prefixed with @ inside parentheses at the end of the PR title. Co-authored-by: Miodec --- frontend/static/quotes/english.json | 36 +++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/frontend/static/quotes/english.json b/frontend/static/quotes/english.json index 8bc336c0d52f..6a58ecc53798 100644 --- a/frontend/static/quotes/english.json +++ b/frontend/static/quotes/english.json @@ -38943,6 +38943,42 @@ "source": "Dale Carnegie, How to Win Friends & Influence People", "id": 7703, "length": 190 + }, + { + "text": "The streets are empty. Wind skims the voids keeping neighbors apart, as if grazing the hollow of a cut reed, or say, a plundered mailbox. A familiar note is produced. It's the one Desolation plays to keep its instrument in tune.", + "source": "Homestuck", + "id": 7704, + "length": 228 + }, + { + "text": "When the sun comes up again... I want tomorrow to be the same as yesterday. And the next day to be just the same as that. That in the end, we can always go back to how things were.", + "source": "Deltarune", + "id": 7705, + "length": 180 + }, + { + "text": "It's hard to put into words, but for some reason, seeing Susie next to you... You felt like, whatever you were, for just right now, it might be okay.", + "source": "Deltarune", + "id": 7706, + "length": 149 + }, + { + "text": "You may forget me, I may forget myself, but I will remember your kindness. Now, this island will disappear soon. You must depart. If you will it, we shall meet again at that place... Whether 11 hours or 11 years, DELTARUNE will be waiting. So take your time, wash your face and get dressed!", + "source": "Deltarune", + "id": 7707, + "length": 290 + }, + { + "text": "And the game was over and the player woke up from the dream. And the player began a new dream. And the player dreamed again, dreamed better. And the player was the universe. And the player was love. You are the player. Wake up.", + "source": "Minecraft", + "id": 7708, + "length": 227 + }, + { + "text": "I understand you don't feel it's working out for you here at Lumon. While disappointed, I'd hate to keep you somewhere you're not happy. So, let's get you outta here.", + "source": "Severance", + "id": 7709, + "length": 166 } ] } From 865631db18d1663b1a145cf344a80d060e0a777b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Oct 2025 10:59:47 +0200 Subject: [PATCH 12/14] build(deps-dev): bump happy-dom from 15.10.2 to 20.0.0 in /frontend (#7018) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 15.10.2 to 20.0.0.
Release notes

Sourced from happy-dom's releases.

v20.0.0

I avoid making breaking changes as much as possible in Happy DOM. When I have to make a breaking change, I try to keep it as minimal as possible. This could be a breaking change that impacts many projects, and I am truly sorry if you are negatively affected by this.

:bomb: Breaking Changes

  • Due to security risks, JavaScript evaluation is now disabled by default - By @​capricorn86 in task #1930
    • A security advisory (GHSA-37j7-fg3j-429f) has been reported that shows a security vulnerability where it's possible to escape the VM context and get access to process level functionality. Big thanks to @​Mas0nShi for reporting this!
    • Due to this security risk, JavaScript evaluation is now disabled by default to prevent that consumers accidentally executes untrusted code without taking precautions
    • JavaScript evaluation can be enabled by setting enableJavaScriptEvaluation to "true". Read more about how to enable this in a safer way in the Wiki

v19.0.2

:construction_worker_man: Patch fixes

  • Fixes issue related to CSS pseudo selector :scope that didn't work correctly for direct descendants to root - By @​capricorn86 in task #1620

v19.0.1

:construction_worker_man: Patch fixes

  • Fixes issue with sending in URLs as string in @happy-dom/server-renderer config using CLI - By @​capricorn86 in task #1908

v19.0.0

:bomb: Breaking Changes

  • Removes support for CommonJS - By @​capricorn86 in task #1730
    • Support for CommonJS is no longer needed as Node.js v18 is deprecated and v20 and above supports loading ES modules from CommonJS using require()
  • Updates Jest to v30 in the @happy-dom/jest-environment package - By @​capricorn86 in task #1730
  • Makes Jest packages peer dependencies to make it easier to align versions with the project using @happy-dom/jest-environment - By @​capricorn86 in task #1730

:art: Features

  • Adds a new package called @happy-dom/server-renderer - By @​capricorn86 in task #1730
    • This package provides a simple way to statically render (SSG) or server-side render (SSR) your client-side application
    • Read more in the Wiki under Server-Renderer
  • Adds support for import.meta to the ESM compiler - By @​capricorn86 in task #1730
  • Adds support for the CSS pseudo selector :scope - By @​capricorn86 in task #1620
  • Improves support for MediaList - By @​capricorn86 in task #1730
  • Adds support for CSSKeywordValue, CSSStyleValue, StylePropertyMap, StylePropertyMap, StylePropertyMapReadOnly - By @​capricorn86 in task #1730
  • Improves debug information in the ESM compiler - By @​capricorn86 in task #1730
  • Adds validation of browser settings when creating a new Browser instance - By @​capricorn86 in task #1730
  • Adds support for the browser setting navigation.beforeContentCallback which makes it possible to inject event listeners or logic before content is loaded to the document when navigating a browser frame - By @​capricorn86 in task #1730
  • Adds support for the browser setting fetch.requestHeaders which provides with a declarative and simple way to add request headers - By @​capricorn86 in task #1730
  • Adds support for setting an object to timer.preventTimerLoops which makes it possible to define different settings for setTimeout() and requestAnimationFrame() - By @​capricorn86 in task #1730
  • Adds support for the browser setting viewport which makes it possible to define a default viewport size - By @​capricorn86 in task #1730
  • Adds support for the parameters beforeContentCallback and headers to BrowserFrame.goto(), BrowserFrame.goBack(), BrowserFrame.goForward(), BrowserFrame.goSteps() and BrowserFrame.reload() - By @​capricorn86 in task #1730
  • Adds support for PopStateEvent and trigger the event when navigating the page history using History.pushState() - By @​capricorn86 in task #1730
  • Use local file paths for virtual server files in stack traces - By @​capricorn86 in task #1730
  • Adds support for ResponseCache.fileSystem.load() and ResponseCache.fileSystem.save() for storing and loading cache from the file system - By @​capricorn86 in task #1730

:construction_worker_man: Patch fixes

  • Fixes a bug in the ESM compiler that caused it to fail to parse certain code - By @​capricorn86 in task #1730
  • Disables the same origin policy when navigating a browser frame using BrowserFrame.goto() - By @​capricorn86 in task #1730
  • Fixes bug where CSS selectors with the pseudos "+" and ">" failed for selectors without arguments - By @​capricorn86 in task #1730

... (truncated)

Commits
  • 819d15b BREAKING CHANGE: #0 Changes JavaScript evaluation to be disabled by default...
  • c80a08f fix: #1620 Fixes issue related to CSS pseudo selector :scope (#1911)
  • 220df23 fix: #1908 Fixes issue with sending in URLs as string in server-renderer co...
  • 9849f8b chore: #1906 Fixes failing unit test caused by package version (#1907)
  • 48d174e chore: #1904 Updates conventional commit package (#1905)
  • 275efe5 BREAKING CHANGE: #1620 Release v18.0.0
  • cf74f5f fix: #1841 Addresses an issue where an error occurred if the Element ID was...
  • bfd0fff chore: #1154 Fixes failing unit test (#1843)
  • 99ebbfc BREAKING CHANGE: #1154 Makes the types for Happy DOM strict (#1842)
  • a94d780 fix: #1154 Removes global typescript definition that was used for custom el...
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=happy-dom&package-manager=npm_and_yarn&previous-version=15.10.2&new-version=20.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/monkeytypegame/monkeytype/network/alerts).
--------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Christian Fehmer Co-authored-by: Miodec --- frontend/package.json | 2 +- pnpm-lock.yaml | 101 +++++++++++++++++++++++++++--------------- 2 files changed, 67 insertions(+), 36 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 1eaea70c4c3e..b43aa9ed0579 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -54,7 +54,7 @@ "eslint-plugin-compat": "6.0.2", "firebase-tools": "13.15.1", "fontawesome-subset": "4.4.0", - "happy-dom": "15.10.2", + "happy-dom": "20.0.0", "madge": "8.0.0", "magic-string": "0.30.17", "normalize.css": "8.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fdbd54e2de7d..87cde1ab20e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: link:packages/release '@vitest/coverage-v8': specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0)) + version: 3.2.4(vitest@3.2.4(@types/node@20.5.1)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0)) conventional-changelog: specifier: 6.0.0 version: 6.0.0(conventional-commits-filter@5.0.0) @@ -49,7 +49,7 @@ importers: version: 2.5.6 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.5.1)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) backend: dependencies: @@ -230,7 +230,7 @@ importers: version: 10.0.0 '@vitest/coverage-v8': specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0)) + version: 3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0)) concurrently: specifier: 8.2.2 version: 8.2.2 @@ -263,7 +263,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) frontend: dependencies: @@ -411,7 +411,7 @@ importers: version: 5.0.2 '@vitest/coverage-v8': specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0)) + version: 3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0)) autoprefixer: specifier: 10.4.20 version: 10.4.20(postcss@8.4.31) @@ -434,8 +434,8 @@ importers: specifier: 4.4.0 version: 4.4.0(@fortawesome/fontawesome-free@5.15.4) happy-dom: - specifier: 15.10.2 - version: 15.10.2 + specifier: 20.0.0 + version: 20.0.0 madge: specifier: 8.0.0 version: 8.0.0(typescript@5.5.4) @@ -495,7 +495,7 @@ importers: version: 1.0.0(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))(workbox-build@7.1.1)(workbox-window@7.1.0) vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) packages/contracts: dependencies: @@ -535,7 +535,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) packages/eslint-config: devDependencies: @@ -599,7 +599,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) packages/oxlint-config: {} @@ -660,7 +660,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) packages/tsup-config: dependencies: @@ -711,7 +711,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) zod: specifier: 3.23.8 version: 3.23.8 @@ -3143,6 +3143,9 @@ packages: '@types/webidl-conversions@7.0.3': resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} @@ -4787,6 +4790,10 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -5339,6 +5346,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -5506,9 +5517,9 @@ packages: hangul-js@0.2.6: resolution: {integrity: sha512-48axU8LgjCD30FEs66Xc04/8knxMwCMQw0f67l67rlttW7VXT3qRJgQeHmhiuGwWXGvSbk6YM0fhQlcjE1JFQA==} - happy-dom@15.10.2: - resolution: {integrity: sha512-NbA5XrSovenJIIcfixCREX3ZnV7yHP4phhbfuxxf4CPn+LZpz/jIM9EqJ2DrPwgVDSMoAKH3pZwQvkbsSiCrUw==} - engines: {node: '>=18.0.0'} + happy-dom@20.0.0: + resolution: {integrity: sha512-GkWnwIFxVGCf2raNrxImLo397RdGhLapj5cT3R2PT7FwL62Ze1DROhzmYW7+J3p9105DYMVenEejEbnq5wA37w==} + engines: {node: '>=20.0.0'} hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} @@ -6670,6 +6681,10 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} @@ -11478,7 +11493,7 @@ snapshots: '@hapi/mimos@7.0.1': dependencies: '@hapi/hoek': 11.0.4 - mime-db: 1.54.0 + mime-db: 1.53.0 '@hapi/nigel@5.0.1': dependencies: @@ -12539,7 +12554,7 @@ snapshots: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 '@types/node': 20.14.11 - form-data: 4.0.0 + form-data: 4.0.4 '@types/supertest@6.0.3': dependencies: @@ -12571,6 +12586,8 @@ snapshots: '@types/webidl-conversions@7.0.3': {} + '@types/whatwg-mimetype@3.0.2': {} + '@types/whatwg-url@11.0.5': dependencies: '@types/webidl-conversions': 7.0.3 @@ -12720,7 +12737,7 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -12735,11 +12752,11 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) + vitest: 3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.5.1)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -12754,7 +12771,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) + vitest: 3.2.4(@types/node@20.5.1)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) transitivePeerDependencies: - supports-color @@ -13022,8 +13039,8 @@ snapshots: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 is-string: 1.0.7 array-last@1.3.0: @@ -13038,7 +13055,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 array.prototype.flat@1.3.2: @@ -13731,7 +13748,7 @@ snapshots: compressible@2.0.18: dependencies: - mime-db: 1.54.0 + mime-db: 1.53.0 compression@1.7.4: dependencies: @@ -14519,6 +14536,10 @@ snapshots: es-module-lexer@1.7.0: {} + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -14870,7 +14891,7 @@ snapshots: openapi3-ts: 3.2.0 promise-breaker: 6.0.0 pump: 3.0.0 - qs: 6.14.0 + qs: 6.13.0 raw-body: 2.5.2 semver: 7.7.2 transitivePeerDependencies: @@ -15455,6 +15476,14 @@ snapshots: get-caller-file@2.0.5: {} + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.1.0 + hasown: 2.0.2 + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -15701,10 +15730,10 @@ snapshots: hangul-js@0.2.6: {} - happy-dom@15.10.2: + happy-dom@20.0.0: dependencies: - entities: 4.5.0 - webidl-conversions: 7.0.0 + '@types/node': 20.14.11 + '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 hard-rejection@2.1.0: {} @@ -16879,6 +16908,8 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.53.0: {} + mime-db@1.54.0: {} mime-types@2.1.35: @@ -17614,7 +17645,7 @@ snapshots: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 - es-object-atoms: 1.1.1 + es-object-atoms: 1.0.0 object.groupby@1.0.3: dependencies: @@ -17626,7 +17657,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.0.0 ohash@2.0.11: {} @@ -20134,7 +20165,7 @@ snapshots: tsx: 4.16.2 yaml: 2.5.0 - vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): + vitest@3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -20161,7 +20192,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.14.11 - happy-dom: 15.10.2 + happy-dom: 20.0.0 transitivePeerDependencies: - jiti - less @@ -20176,7 +20207,7 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): + vitest@3.2.4(@types/node@20.5.1)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -20203,7 +20234,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.5.1 - happy-dom: 15.10.2 + happy-dom: 20.0.0 transitivePeerDependencies: - jiti - less From b455d49943b2da0ac3a2fa242a390db52fad6389 Mon Sep 17 00:00:00 2001 From: gablilli <167802854+gablilli@users.noreply.github.com> Date: Wed, 15 Oct 2025 11:00:13 +0200 Subject: [PATCH 13/14] impr(quotes): fix italian quote punctuation (@gablilli) (#7019) ### Description Fixed the punctuation on an Italian Oscar Wilde quote. ### Checks - [ ] Adding quotes? - [ ] Make sure to include translations for the quotes in the description (or another comment) so we can verify their content. - [ ] Adding a language? - Make sure to follow the [languages documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LANGUAGES.md) - [ ] Add language to `packages/schemas/src/languages.ts` - [ ] Add language to exactly one group in `frontend/src/ts/constants/languages.ts` - [ ] Add language json file to `frontend/static/languages` - [ ] Adding a theme? - Make sure to follow the [themes documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/THEMES.md) - [ ] Add theme to `packages/schemas/src/themes.ts` - [ ] Add theme to `frontend/src/ts/constants/themes.ts` - [ ] Add theme css file to `frontend/static/themes` - [ ] Add some screenshot of the theme, especially with different test settings (colorful, flip colors) to your pull request - [ ] Adding a layout? - [ ] Make sure to follow the [layouts documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LAYOUTS.md) - [ ] Add layout to `packages/schemas/src/layouts.ts` - [ ] Add layout json file to `frontend/static/layouts` - [ ] Adding a font? - Make sure to follow the [themes documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/FONTS.md) - [ ] Add font file to `frontend/static/webfonts` - [ ] Add font to `packages/schemas/src/fonts.ts` - [ ] Add font to `frontend/src/ts/constants/fonts.ts` - [ ] Check if any open issues are related to this PR; if so, be sure to tag them below. - [X] Make sure the PR title follows the Conventional Commits standard. (https://www.conventionalcommits.org for more info) - [X] Make sure to include your GitHub username prefixed with @ inside parentheses at the end of the PR title. --- frontend/static/quotes/italian.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/quotes/italian.json b/frontend/static/quotes/italian.json index a842e8b864b9..b5e45f5990a9 100644 --- a/frontend/static/quotes/italian.json +++ b/frontend/static/quotes/italian.json @@ -218,7 +218,7 @@ "id": 36 }, { - "text": "La vita è terribile. E lei che ci governa, non noi che la governiamo.", + "text": "La vita è terribile, è lei che ci governa: non noi che la governiamo.", "source": "Oscar Wilde", "length": 69, "id": 37 From acbd1de113fb4288be48dbaaf50acdb4f0b27c96 Mon Sep 17 00:00:00 2001 From: Seif Soliman Date: Wed, 15 Oct 2025 13:43:24 +0300 Subject: [PATCH 14/14] impr(funbox): proper per-language handling in polyglot mode (@byseif21, @fehmer) (#6666) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description #### fixes some polyglot issues * when mixing RTL (e.g. Arabic) with LTR (e.g. English), ligatures were broken if the main `Config.Language` was a LTR lang. * lazy mode: previously, if the main language didn’t support lazy mode, none of the languages would, even if they did individually. closes #6665 --------- Co-authored-by: Jack --- frontend/src/ts/constants/layouts.ts | 2 +- .../src/ts/test/funbox/funbox-functions.ts | 68 ++++++++++++++++--- frontend/src/ts/test/test-logic.ts | 68 +++++++++++++++---- frontend/src/ts/test/words-generator.ts | 43 ++++++++++-- frontend/src/ts/utils/json-data.ts | 6 ++ 5 files changed, 160 insertions(+), 27 deletions(-) diff --git a/frontend/src/ts/constants/layouts.ts b/frontend/src/ts/constants/layouts.ts index ff8f5a9ec340..04f5f09b41ed 100644 --- a/frontend/src/ts/constants/layouts.ts +++ b/frontend/src/ts/constants/layouts.ts @@ -1,3 +1,3 @@ import { LayoutName, LayoutNameSchema } from "@monkeytype/schemas/layouts"; -export const LayoutsList:LayoutName[] = LayoutNameSchema._def.values; \ No newline at end of file +export const LayoutsList: LayoutName[] = LayoutNameSchema._def.values; diff --git a/frontend/src/ts/test/funbox/funbox-functions.ts b/frontend/src/ts/test/funbox/funbox-functions.ts index 154b1722f813..8175981098ee 100644 --- a/frontend/src/ts/test/funbox/funbox-functions.ts +++ b/frontend/src/ts/test/funbox/funbox-functions.ts @@ -1,4 +1,3 @@ -import { Section } from "../../utils/json-data"; import { FunboxWordsFrequency, Wordset } from "../wordset"; import * as GetText from "../../utils/generate"; import Config, * as UpdateConfig from "../../config"; @@ -24,17 +23,18 @@ import * as TestState from "../test-state"; import { WordGenError } from "../../utils/word-gen-error"; import { FunboxName, KeymapLayout, Layout } from "@monkeytype/schemas/configs"; import { Language, LanguageObject } from "@monkeytype/schemas/languages"; + export type FunboxFunctions = { getWord?: (wordset?: Wordset, wordIndex?: number) => string; punctuateWord?: (word: string) => string; - withWords?: (words?: string[]) => Promise; + withWords?: (words?: string[]) => Promise; alterText?: (word: string, wordIndex: number, wordsBound: number) => string; applyConfig?: () => void; applyGlobalCSS?: () => void; clearGlobal?: () => void; rememberSettings?: () => void; toggleScript?: (params: string[]) => void; - pullSection?: (language?: Language) => Promise
; + pullSection?: (language?: Language) => Promise; handleSpace?: () => void; handleChar?: (char: string) => string; isCharCorrect?: (char: string, originalChar: string) => boolean; @@ -151,6 +151,23 @@ class PseudolangWordGenerator extends Wordset { } } +export class PolyglotWordset extends Wordset { + public wordsWithLanguage: Map; + public languageProperties: Map; + + constructor( + wordsWithLanguage: Map, + languageProperties: Map + ) { + // build and shuffle the word array + const wordArray = Array.from(wordsWithLanguage.keys()); + Arrays.shuffle(wordArray); + super(wordArray); + this.wordsWithLanguage = wordsWithLanguage; + this.languageProperties = languageProperties; + } +} + const list: Partial> = { "58008": { getWord(): string { @@ -646,12 +663,12 @@ const list: Partial> = { `Failed to load language: ${language}. It will be ignored.`, 0 ); - return null; // Return null for failed languages + return null; }) ); const languages = (await Promise.all(promises)).filter( - (lang) => lang !== null + (lang): lang is LanguageObject => lang !== null ); if (languages.length === 0) { @@ -679,9 +696,44 @@ const list: Partial> = { throw new WordGenError(""); } - const wordSet = languages.flatMap((it) => it.words); - Arrays.shuffle(wordSet); - return new Wordset(wordSet); + // direction conflict check + const allRightToLeft = languages.every((lang) => lang.rightToLeft); + const allLeftToRight = languages.every((lang) => !lang.rightToLeft); + const mainLanguage = await JSONData.getLanguage(Config.language); + const mainLanguageIsRTL = mainLanguage?.rightToLeft ?? false; + if ( + (mainLanguageIsRTL && allLeftToRight) || + (!mainLanguageIsRTL && allRightToLeft) + ) { + const fallbackLanguage = + languages[0]?.name ?? (allRightToLeft ? "arabic" : "english"); + UpdateConfig.setLanguage(fallbackLanguage); + Notifications.add( + `Language direction conflict: switched to ${fallbackLanguage} for consistency.`, + 0, + { duration: 5 } + ); + throw new WordGenError(""); + } + + // build languageProperties + const languageProperties = new Map( + languages.map((lang) => [ + lang.name, + { + noLazyMode: lang.noLazyMode, + ligatures: lang.ligatures, + rightToLeft: lang.rightToLeft, + additionalAccents: lang.additionalAccents, + }, + ]) + ); + + const wordsWithLanguage = new Map( + languages.flatMap((lang) => lang.words.map((word) => [word, lang.name])) + ); + + return new PolyglotWordset(wordsWithLanguage, languageProperties); }, }, }; diff --git a/frontend/src/ts/test/test-logic.ts b/frontend/src/ts/test/test-logic.ts index 29e68874cac9..7c5c10e2f1dc 100644 --- a/frontend/src/ts/test/test-logic.ts +++ b/frontend/src/ts/test/test-logic.ts @@ -69,6 +69,7 @@ import { findSingleActiveFunboxWithFunction, getActiveFunboxes, getActiveFunboxesWithFunction, + getActiveFunboxNames, isFunboxActive, isFunboxActiveWithProperty, } from "./funbox/list"; @@ -469,14 +470,54 @@ async function init(): Promise { } const allowLazyMode = !language.noLazyMode || Config.mode === "custom"; - if (Config.lazyMode && !allowLazyMode) { - rememberLazyMode = true; - Notifications.add("This language does not support lazy mode.", 0, { - important: true, + + // polyglot mode, check to enable lazy mode if any support it + if (getActiveFunboxNames().includes("polyglot")) { + const polyglotLanguages = Config.customPolyglot; + const languagePromises = polyglotLanguages.map(async (langName) => { + const { data: lang, error } = await tryCatch( + JSONData.getLanguage(langName) + ); + if (error) { + Notifications.add( + Misc.createErrorMessage( + error, + `Failed to load language: ${langName}` + ), + -1 + ); + } + return lang; }); - UpdateConfig.setLazyMode(false, true); - } else if (rememberLazyMode && !language.noLazyMode) { - UpdateConfig.setLazyMode(true, true); + + const anySupportsLazyMode = (await Promise.all(languagePromises)) + .filter((lang) => lang !== null) + .some((lang) => !lang.noLazyMode); + + if (Config.lazyMode && !anySupportsLazyMode) { + rememberLazyMode = true; + Notifications.add( + "None of the selected polyglot languages support lazy mode.", + 0, + { + important: true, + } + ); + UpdateConfig.setLazyMode(false, true); + } else if (rememberLazyMode && anySupportsLazyMode) { + UpdateConfig.setLazyMode(true, true); + } + } else { + // normal mode + if (Config.lazyMode && !allowLazyMode) { + rememberLazyMode = true; + Notifications.add("This language does not support lazy mode.", 0, { + important: true, + }); + UpdateConfig.setLazyMode(false, true); + } else if (rememberLazyMode && !language.noLazyMode) { + UpdateConfig.setLazyMode(true, true); + } } if (!Config.lazyMode && !language.noLazyMode) { @@ -502,16 +543,19 @@ async function init(): Promise { currentQuote: TestWords.currentQuote, }); - let generatedWords: string[]; - let generatedSectionIndexes: number[]; let wordsHaveTab = false; let wordsHaveNewline = false; + let allRightToLeft: boolean | undefined = undefined; + let allLigatures: boolean | undefined = undefined; + let generatedWords: string[] = []; + let generatedSectionIndexes: number[] = []; try { const gen = await WordsGenerator.generateWords(language); generatedWords = gen.words; generatedSectionIndexes = gen.sectionIndexes; wordsHaveTab = gen.hasTab; wordsHaveNewline = gen.hasNewline; + ({ allRightToLeft, allLigatures } = gen); } catch (e) { Loader.hide(); if (e instanceof WordGenError || e instanceof Error) { @@ -570,10 +614,10 @@ async function init(): Promise { ); } Funbox.toggleScript(TestWords.words.getCurrent()); - TestUI.setRightToLeft(language.rightToLeft ?? false); - TestUI.setLigatures(language.ligatures ?? false); + TestUI.setLigatures(allLigatures ?? language.ligatures ?? false); - const isLanguageRTL = language.rightToLeft ?? false; + const isLanguageRTL = allRightToLeft ?? language.rightToLeft ?? false; + TestUI.setRightToLeft(isLanguageRTL); TestState.setIsLanguageRightToLeft(isLanguageRTL); TestState.setIsDirectionReversed( isFunboxActiveWithProperty("reverseDirection") diff --git a/frontend/src/ts/test/words-generator.ts b/frontend/src/ts/test/words-generator.ts index cabde3f63f49..820006e9b04c 100644 --- a/frontend/src/ts/test/words-generator.ts +++ b/frontend/src/ts/test/words-generator.ts @@ -1,6 +1,6 @@ import Config, * as UpdateConfig from "../config"; import * as CustomText from "./custom-text"; -import * as Wordset from "./wordset"; +import { Wordset, FunboxWordsFrequency, withWords } from "./wordset"; import QuotesController, { Quote, QuoteWithTextSplit, @@ -24,6 +24,7 @@ import { } from "./funbox/list"; import { WordGenError } from "../utils/word-gen-error"; import * as Loader from "../elements/loader"; +import { PolyglotWordset } from "./funbox/funbox-functions"; import { LanguageObject } from "@monkeytype/schemas/languages"; //pin implementation @@ -311,7 +312,7 @@ async function applyEnglishPunctuationToWord(word: string): Promise { return EnglishPunctuation.replace(word); } -function getFunboxWordsFrequency(): Wordset.FunboxWordsFrequency | undefined { +function getFunboxWordsFrequency(): FunboxWordsFrequency | undefined { const funbox = findSingleActiveFunboxWithFunction("getWordsFrequencyMode"); if (funbox) { return funbox.functions.getWordsFrequencyMode(); @@ -345,7 +346,7 @@ async function getFunboxSection(): Promise { function getFunboxWord( word: string, wordIndex: number, - wordset?: Wordset.Wordset + wordset?: Wordset ): string { const funbox = findSingleActiveFunboxWithFunction("getWord"); @@ -384,6 +385,21 @@ async function applyBritishEnglishToWord( } function applyLazyModeToWord(word: string, language: LanguageObject): string { + // polyglot mode, use the word's actual language + if (currentWordset && currentWordset instanceof PolyglotWordset) { + const langName = currentWordset.wordsWithLanguage.get(word); + const langProps = langName + ? currentWordset.languageProperties.get(langName) + : undefined; + const allowLazyMode = + (langProps && !langProps.noLazyMode) || Config.mode === "custom"; + if (Config.lazyMode && allowLazyMode && langProps) { + word = LazyMode.replaceAccents(word, langProps.additionalAccents); + } + return word; + } + + // normal mode const allowLazyMode = !language.noLazyMode || Config.mode === "custom"; if (Config.lazyMode && allowLazyMode) { word = LazyMode.replaceAccents(word, language.additionalAccents); @@ -574,7 +590,7 @@ async function getQuoteWordList( return TestWords.currentQuote.textSplit; } -let currentWordset: Wordset.Wordset | null = null; +let currentWordset: Wordset | null = null; let currentLanguage: LanguageObject | null = null; let isCurrentlyUsingFunboxSection = false; @@ -583,6 +599,8 @@ type GenerateWordsReturn = { sectionIndexes: number[]; hasTab: boolean; hasNewline: boolean; + allRightToLeft?: boolean; + allLigatures?: boolean; }; let previousRandomQuote: QuoteWithTextSplit | null = null; @@ -604,6 +622,8 @@ export async function generateWords( sectionIndexes: [], hasTab: false, hasNewline: false, + allRightToLeft: language.rightToLeft, + allLigatures: language.ligatures ?? false, }; isCurrentlyUsingFunboxSection = isFunboxActiveWithFunction("pullSection"); @@ -634,9 +654,20 @@ export async function generateWords( const funbox = findSingleActiveFunboxWithFunction("withWords"); if (funbox) { - currentWordset = await funbox.functions.withWords(wordList); + const result = await funbox.functions.withWords(wordList); + // PolyglotWordset if polyglot otherwise Wordset + if (result instanceof PolyglotWordset) { + const polyglotResult = result; + currentWordset = polyglotResult; + // set allLigatures if any language in languageProperties has ligatures true + ret.allLigatures = Array.from( + polyglotResult.languageProperties.values() + ).some((props) => !!props.ligatures); + } else { + currentWordset = result; + } } else { - currentWordset = await Wordset.withWords(wordList); + currentWordset = await withWords(wordList); } console.debug("Wordset", currentWordset); diff --git a/frontend/src/ts/utils/json-data.ts b/frontend/src/ts/utils/json-data.ts index ab072029a918..4dca4a780c59 100644 --- a/frontend/src/ts/utils/json-data.ts +++ b/frontend/src/ts/utils/json-data.ts @@ -80,6 +80,12 @@ export async function getLayout(layoutName: string): Promise { return await cachedFetchJson(`/layouts/${layoutName}.json`); } +// used for polyglot wordset language-specific properties +export type LanguageProperties = Pick< + LanguageObject, + "noLazyMode" | "ligatures" | "rightToLeft" | "additionalAccents" +>; + let currentLanguage: LanguageObject; /**