diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a2673eace..5e3b7b663 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,7 +33,7 @@ overrides: '@remix-run/router': '>=1.23.2' hono: '>=4.12.18' deepmerge-ts: ^8.0.1 - '@hono/node-server': 1.19.13 + '@hono/node-server': ^1.19.15 vite: ^8.1.0 basic-ftp: '>=5.3.1' fast-uri: '>=3.1.2' @@ -54,6 +54,8 @@ overrides: webpack: '>=5.104.1' webpackbar: '>=7.0.0' markdown-it: ^14.2.0 + linkify-it: ^5.0.2 + sharp: ^0.35.0 launch-editor: ^2.14.1 ajv: '>=8.18.0' eslint>ajv: ^6.14.0 @@ -157,7 +159,7 @@ importers: dependencies: '@acid-info/docusaurus-og': specifier: 1.0.3-beta.2 - version: 1.0.3-beta.2(patch_hash=beddb9454387dac2126078c1626f4582ba524500d1c488c358685c5365660068)(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(esbuild@0.28.2)(postcss@8.5.28)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3) + version: 1.0.3-beta.2(patch_hash=beddb9454387dac2126078c1626f4582ba524500d1c488c358685c5365660068)(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@types/node@26.4.1)(esbuild@0.28.2)(postcss@8.5.28)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3) '@docusaurus/core': specifier: 3.10.2 version: 3.10.2(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(esbuild@0.28.2)(postcss@8.5.28)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3) @@ -1064,8 +1066,8 @@ importers: specifier: ^1.1.2 version: 1.1.2(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) xlsx: - specifier: ^0.18.5 - version: 0.18.5 + specifier: https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz + version: https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz xml-crypto: specifier: ^6.1.2 version: 6.1.2 @@ -1305,7 +1307,7 @@ importers: specifier: ^4.21.0 version: 4.21.0(babel-plugin-macros@3.1.0)(typescript@6.0.3) sharp: - specifier: ^0.35.4 + specifier: ^0.35.0 version: 0.35.4(@types/node@26.4.1) tailwindcss: specifier: ^4.3.3 @@ -4332,8 +4334,8 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@hono/node-server@1.19.13': - resolution: {integrity: sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ==} + '@hono/node-server@1.19.17': + resolution: {integrity: sha512-dSneS5qhiauZWGDCeK4o695Xd9nUNjviSZCMQrj10eetr8Uln1ucn6bbphOM6UynAMMtNIzZNSpL9vnASJwrPQ==} engines: {node: '>=18.14.1'} peerDependencies: hono: '>=4.12.18' @@ -8257,10 +8259,6 @@ packages: resolution: {integrity: sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA==} engines: {node: '>= 16.0.0'} - adler-32@1.3.1: - resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} - engines: {node: '>=0.8'} - adm-zip@0.6.0: resolution: {integrity: sha512-XleryMhbuksdKtofnWZ9Sk+4CUTbms4Mb/EU32SZwToAyZ5RgVos/ki8n+yr0LWHOGKuakbXTuuYNHLQjhddgg==} engines: {node: '>=14.0'} @@ -8914,10 +8912,6 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - cfb@1.2.2: - resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} - engines: {node: '>=0.8'} - chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} @@ -9109,10 +9103,6 @@ packages: code-block-writer@13.0.3: resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} - codepage@1.15.0: - resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} - engines: {node: '>=0.8'} - collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} @@ -9129,13 +9119,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - colord@2.10.0: resolution: {integrity: sha512-AidJptpBJmjTclAp9BkLwJi0T93fo5epJnbaZslpg6QVzpHjAiveF55mE9AcUJiGMqRHgMDY8soMsQtuNYMHfw==} @@ -10819,10 +10802,6 @@ packages: fp-ts@2.16.11: resolution: {integrity: sha512-LaI+KaX2NFkfn1ZGHoKCmcfv7yrZsC3b8NtWsTVQeHkq4F27vI5igUuO53sxqDEa2gNQMHFPmpojDw/1zmUK7w==} - frac@1.1.2: - resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} - engines: {node: '>=0.8'} - fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} @@ -11510,9 +11489,6 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.4: - resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} - is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -12183,12 +12159,6 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - linkify-it@2.2.0: - resolution: {integrity: sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==} - - linkify-it@3.0.3: - resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} - linkify-it@5.0.2: resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==} @@ -12997,9 +12967,6 @@ packages: node-addon-api@4.3.0: resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} - node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} @@ -15389,10 +15356,6 @@ packages: shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - sharp@0.32.6: - resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} - engines: {node: '>=14.15.0'} - sharp@0.35.4: resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==} engines: {node: '>=20.9.0'} @@ -15458,9 +15421,6 @@ packages: resolution: {integrity: sha512-4H94f5ZgcCcgJroc902TFlFdgPu2IU2eD7+WebN2Z14xKYrKHeJ4UQcZwzgSuH4Rgzw+jp7sbHl40NefuIEYsg==} engines: {node: '>=0.12.18'} - simple-swizzle@0.2.4: - resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} - sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} @@ -15590,10 +15550,6 @@ packages: resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} engines: {node: '>=12'} - ssf@0.11.2: - resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} - engines: {node: '>=0.8'} - stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} @@ -16367,9 +16323,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - uc.micro@1.0.6: - resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} @@ -16967,18 +16920,10 @@ packages: resolution: {integrity: sha512-KZYyq6Q5JjmsxXEBuz3qp6OBWLBjnkh4rN48xMUn23wL+Of5qWbe8lsLJNOLo+0NYiyxjDgWB00eHrksCCJSHg==} engines: {node: '>= 8'} - wmf@1.0.2: - resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} - engines: {node: '>=0.8'} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - word@0.3.0: - resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} - engines: {node: '>=0.8'} - wordwrap@0.0.3: resolution: {integrity: sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==} engines: {node: '>=0.4.0'} @@ -17044,8 +16989,9 @@ packages: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} - xlsx@0.18.5: - resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==} + xlsx@https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz: + resolution: {integrity: sha512-oLDq3jw7AcLqKWH2AhCpVTZl8mf6X2YReP+Neh0SJUzV/BdZYjth94tG5toiMB1PPrYtxOCfaoUCkvtuH+3AJA==, tarball: https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz} + version: 0.20.3 engines: {node: '>=0.8'} hasBin: true @@ -17220,7 +17166,7 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 - '@acid-info/docusaurus-og@1.0.3-beta.2(patch_hash=beddb9454387dac2126078c1626f4582ba524500d1c488c358685c5365660068)(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(esbuild@0.28.2)(postcss@8.5.28)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3)': + '@acid-info/docusaurus-og@1.0.3-beta.2(patch_hash=beddb9454387dac2126078c1626f4582ba524500d1c488c358685c5365660068)(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@types/node@26.4.1)(esbuild@0.28.2)(postcss@8.5.28)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3)': dependencies: '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(esbuild@0.28.2)(postcss@8.5.28)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3) '@docusaurus/module-type-aliases': 3.8.1(esbuild@0.28.2)(postcss@8.5.28)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -17232,7 +17178,7 @@ snapshots: node-html-parser: 6.1.13 object-hash: 3.0.0 satori: 0.10.14 - sharp: 0.32.6 + sharp: 0.35.4(@types/node@26.4.1) transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' @@ -17242,8 +17188,7 @@ snapshots: - '@swc/core' - '@swc/css' - '@swc/html' - - bare-abort-controller - - bare-buffer + - '@types/node' - bufferutil - clean-css - cssnano @@ -17254,7 +17199,6 @@ snapshots: - postcss - react - react-dom - - react-native-b4a - supports-color - typescript - uglify-js @@ -17464,7 +17408,7 @@ snapshots: '@atlaskit/feature-gate-js-client': 4.26.5(react@18.3.1) '@babel/runtime': 7.29.7 css-color-names: 0.0.4 - linkify-it: 2.2.0 + linkify-it: 5.0.2 memoize-one: 6.0.0 transitivePeerDependencies: - react @@ -17476,7 +17420,7 @@ snapshots: '@atlaskit/tmp-editor-statsig': 103.0.1(react@18.3.1) '@babel/runtime': 7.29.7 css-color-names: 0.0.4 - linkify-it: 3.0.3 + linkify-it: 5.0.2 memoize-one: 6.0.0 transitivePeerDependencies: - react @@ -23114,7 +23058,7 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 - '@hono/node-server@1.19.13(hono@4.13.7)': + '@hono/node-server@1.19.17(hono@4.13.7)': dependencies: hono: 4.13.7 @@ -23567,7 +23511,7 @@ snapshots: '@modelcontextprotocol/sdk@1.30.0(zod@3.25.76)': dependencies: - '@hono/node-server': 1.19.13(hono@4.13.7) + '@hono/node-server': 1.19.17(hono@4.13.7) ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) content-type: 1.0.5 @@ -23589,7 +23533,7 @@ snapshots: '@modelcontextprotocol/sdk@1.30.0(zod@4.5.4)': dependencies: - '@hono/node-server': 1.19.13(hono@4.13.7) + '@hono/node-server': 1.19.17(hono@4.13.7) ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) content-type: 1.0.5 @@ -27400,7 +27344,7 @@ snapshots: '@zenstackhq/cli@3.9.3(express@5.2.1)(kysely@0.29.5)(next@16.3.4(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.63.0)(@types/node@26.4.1)(babel-plugin-macros@3.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(typescript@6.0.3)': dependencies: - '@hono/node-server': 1.19.13(hono@4.13.7) + '@hono/node-server': 1.19.17(hono@4.13.7) '@zenstackhq/common-helpers': 3.9.3 '@zenstackhq/language': 3.9.3 '@zenstackhq/orm': 3.9.3(pg@8.23.0)(zod@4.5.4) @@ -27594,8 +27538,6 @@ snapshots: address@2.0.3: {} - adler-32@1.3.1: {} - adm-zip@0.6.0: {} agent-base@6.0.2: @@ -28316,11 +28258,6 @@ snapshots: ccount@2.0.1: {} - cfb@1.2.2: - dependencies: - adler-32: 1.3.1 - crc-32: 1.2.2 - chai@6.2.2: {} chalk@2.4.2: @@ -28526,8 +28463,6 @@ snapshots: code-block-writer@13.0.3: {} - codepage@1.15.0: {} - collapse-white-space@2.1.0: {} color-convert@1.9.3: @@ -28542,16 +28477,6 @@ snapshots: color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.4 - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - colord@2.10.0: {} colorette@2.0.20: {} @@ -30604,8 +30529,6 @@ snapshots: fp-ts@2.16.11: {} - frac@1.1.2: {} - fraction.js@5.3.4: {} framer-motion@13.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): @@ -31419,8 +31342,6 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.4: {} - is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -32031,14 +31952,6 @@ snapshots: lines-and-columns@1.2.4: {} - linkify-it@2.2.0: - dependencies: - uc.micro: 1.0.6 - - linkify-it@3.0.3: - dependencies: - uc.micro: 1.0.6 - linkify-it@5.0.2: dependencies: uc.micro: 2.1.0 @@ -33138,8 +33051,6 @@ snapshots: node-addon-api@4.3.0: {} - node-addon-api@6.1.0: {} - node-addon-api@7.1.1: {} node-addon-api@8.9.2: {} @@ -35870,21 +35781,6 @@ snapshots: shallowequal@1.1.0: {} - sharp@0.32.6: - dependencies: - color: 4.2.3 - detect-libc: 2.1.2 - node-addon-api: 6.1.0 - prebuild-install: 7.1.3 - semver: 7.8.5 - simple-get: 4.0.1 - tar-fs: 3.1.3 - tunnel-agent: 0.6.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - sharp@0.35.4(@types/node@26.4.1): dependencies: '@img/colour': 1.1.0 @@ -35978,10 +35874,6 @@ snapshots: simple-icons@16.29.0: {} - simple-swizzle@0.2.4: - dependencies: - is-arrayish: 0.3.4 - sirv@2.0.4: dependencies: '@polka/url': 1.0.0-next.29 @@ -36118,10 +36010,6 @@ snapshots: srcset@4.0.0: {} - ssf@0.11.2: - dependencies: - frac: 1.1.2 - stable-hash@0.0.5: {} stackback@0.0.2: {} @@ -36991,8 +36879,6 @@ snapshots: typescript@6.0.3: {} - uc.micro@1.0.6: {} - uc.micro@2.1.0: {} ufo@1.6.4: {} @@ -37780,12 +37666,8 @@ snapshots: dependencies: fswin: 3.21.1008 - wmf@1.0.2: {} - word-wrap@1.2.5: {} - word@0.3.0: {} - wordwrap@0.0.3: {} wordwrap@1.0.0: {} @@ -37838,15 +37720,7 @@ snapshots: xdg-basedir@5.1.0: {} - xlsx@0.18.5: - dependencies: - adler-32: 1.3.1 - cfb: 1.2.2 - codepage: 1.15.0 - crc-32: 1.2.2 - ssf: 0.11.2 - wmf: 1.0.2 - word: 0.3.0 + xlsx@https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz: {} xml-but-prettier@1.0.1: dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 493fb5ef4..f8a766b17 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -70,7 +70,7 @@ overrides: '@remix-run/router': '>=1.23.2' 'hono': '>=4.12.18' 'deepmerge-ts': '^8.0.1' - '@hono/node-server': '1.19.13' + '@hono/node-server': '^1.19.15' 'vite': '^8.1.0' 'basic-ftp': '>=5.3.1' 'fast-uri': '>=3.1.2' @@ -91,6 +91,8 @@ overrides: 'webpack': '>=5.104.1' 'webpackbar': '>=7.0.0' 'markdown-it': '^14.2.0' + 'linkify-it': '^5.0.2' + 'sharp': '^0.35.0' 'launch-editor': '^2.14.1' 'ajv': '>=8.18.0' 'eslint>ajv': '^6.14.0' diff --git a/testplanit/.releaserc.json b/testplanit/.releaserc.json index b181ff341..40830b3fe 100644 --- a/testplanit/.releaserc.json +++ b/testplanit/.releaserc.json @@ -13,6 +13,7 @@ { "scope": "packages", "release": false }, { "scope": "cli", "release": false }, { "scope": "forge-app", "release": false }, + { "scope": "release", "release": false }, { "scope": "dependencies", "release": false }, { "scope": "deps", "release": false } ] diff --git a/testplanit/app/api/repository/import/route.test.ts b/testplanit/app/api/repository/import/route.test.ts index 4c094e935..5942af79d 100644 --- a/testplanit/app/api/repository/import/route.test.ts +++ b/testplanit/app/api/repository/import/route.test.ts @@ -1,3 +1,4 @@ +import { DbNull } from "@zenstackhq/orm"; import { enhanceWithAudit } from "~/lib/audit/enhanceWithAudit"; import { getServerSession } from "next-auth"; import { NextRequest } from "next/server"; @@ -864,7 +865,7 @@ describe("CSV Import API Route", () => { }), ]), }), - expectedResult: null, + expectedResult: DbNull, order: 0, }), }); @@ -1664,4 +1665,51 @@ describe("CSV Import API Route", () => { expect(result.complete?.importedCount).toBe(2); }); }); + + describe("Restoring soft-deleted cases", () => { + it("allocates the next version when the restored case already has snapshots", async () => { + // The soft-deleted lookup finds an earlier life of this case; its + // version 1 snapshot still exists, so the restore must not re-create it. + mockEnhancedDb.repositoryCases.findFirst.mockResolvedValue({ id: 77 }); + mockEnhancedDb.repositoryCases.update.mockImplementation( + ({ where, data }: any) => ({ id: where.id, ...data }) + ); + mockEnhancedDb.repositoryCaseVersions.findFirst.mockResolvedValue({ + version: 1, + }); + + const request = createRequest({ + projectId: 1, + file: "Name,Description\nRestored case,Desc", + delimiter: ",", + hasHeaders: true, + encoding: "UTF-8", + templateId: 1, + importLocation: "single_folder", + folderId: 1, + fieldMappings: [ + { csvColumn: "Name", templateField: "name" }, + { csvColumn: "Description", templateField: "description" }, + ], + }); + + const response = await POST(request); + const result = await parseSSEResponse(response); + + expect(result.complete?.errors).toEqual([]); + expect(result.complete?.importedCount).toBe(1); + expect(mockEnhancedDb.repositoryCases.create).not.toHaveBeenCalled(); + expect(mockEnhancedDb.repositoryCases.update).toHaveBeenCalledWith({ + where: { id: 77 }, + data: expect.objectContaining({ isDeleted: false }), + }); + expect(mockEnhancedDb.repositoryCases.update).toHaveBeenCalledWith({ + where: { id: 77 }, + data: { currentVersion: 2 }, + }); + expect(mockEnhancedDb.repositoryCaseVersions.create).toHaveBeenCalledWith( + { data: expect.objectContaining({ version: 2 }) } + ); + }); + }); }); diff --git a/testplanit/app/api/repository/import/route.ts b/testplanit/app/api/repository/import/route.ts index 97b34a23c..aae80b15e 100644 --- a/testplanit/app/api/repository/import/route.ts +++ b/testplanit/app/api/repository/import/route.ts @@ -1,6 +1,6 @@ import { RepositoryCaseSource, WorkflowScope } from "~/zenstack/models"; import type { CaseFields, CaseFieldTypes } from "~/zenstack/models"; -import type { JsonValue } from "@zenstackhq/orm"; +import { DbNull, type JsonValue } from "@zenstackhq/orm"; import { enhanceWithAudit } from "~/lib/audit/enhanceWithAudit"; import { getServerSession } from "next-auth"; import { NextRequest, NextResponse } from "next/server"; @@ -814,7 +814,8 @@ export const POST = withAuditContext(async (request: NextRequest) => { data: { testCaseId: newCase.id, step: stepData.step, - expectedResult: stepData.expectedResult, + // v3 rejects raw `null` for nullable Json columns on create. + expectedResult: stepData.expectedResult ?? DbNull, order: stepData.order, }, }); @@ -843,6 +844,25 @@ export const POST = withAuditContext(async (request: NextRequest) => { : highestVersion + 1; // Update the case's currentVersion + await enhancedDb.repositoryCases.update({ + where: { id: newCase.id }, + data: { currentVersion: versionNumber }, + }); + } else if (reusedCaseId !== null) { + // A restored soft-deleted case keeps its earlier version + // snapshots, so move past them instead of colliding on + // @@unique([repositoryCaseId, version]). + const latestVersion = + await enhancedDb.repositoryCaseVersions.findFirst({ + where: { repositoryCaseId: newCase.id }, + orderBy: { version: "desc" }, + }); + const highestVersion = latestVersion?.version || 0; + versionNumber = + caseData.version && caseData.version > highestVersion + ? caseData.version + : highestVersion + 1; + await enhancedDb.repositoryCases.update({ where: { id: newCase.id }, data: { currentVersion: versionNumber }, diff --git a/testplanit/package.json b/testplanit/package.json index 9436ee5fd..6f9071a59 100644 --- a/testplanit/package.json +++ b/testplanit/package.json @@ -304,7 +304,7 @@ "use-debounce": "^10.1.1", "uuid": "^14.0.2", "vaul": "^1.1.2", - "xlsx": "^0.18.5", + "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz", "xml-crypto": "^6.1.2", "xml2js": "^0.6.2", "zod": "^4.5.4"