From 129ddbf95b67d94a78334c60db52dc561f396b5d Mon Sep 17 00:00:00 2001 From: Brad DerManouelian Date: Fri, 4 Sep 2026 10:19:25 -0500 Subject: [PATCH 1/3] fix(import): import steps that have no expected result MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The CSV import route passed a raw null for Steps.expectedResult, a nullable Json column that ZenStack v3 only accepts as the DbNull sentinel — the convention the copy/move worker and the version service already follow. Every stepped row was reported as a problem and no steps were created, while the case rows were still inserted, so a failed import left half-built cases behind. This also broke the documented export, edit and re-import round trip, since our own export writes null expected results. The route's unit tests mock the database, so they never exercised the real validation. Restoring a soft-deleted case had a related defect: it re-created version 1 and collided with the case's surviving version snapshots. The restore path now allocates the next free version, the way the update path does. (cherry picked from commit a6091db41764ccd0d4807f9fc17ca5a9826e8890) --- .../app/api/repository/import/route.test.ts | 50 ++++++++++++++++++- testplanit/app/api/repository/import/route.ts | 24 ++++++++- 2 files changed, 71 insertions(+), 3 deletions(-) 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 }, From dfb4ef4ed45aa673e68b108f4fc73f92778e4310 Mon Sep 17 00:00:00 2001 From: Brad DerManouelian Date: Tue, 8 Sep 2026 11:46:33 -0500 Subject: [PATCH 2/3] ci(release): keep release-scoped commits from bumping the app version Commits scoped to the release pipeline change workflow files, not the application, so they should not decide the next app version on their own. Without this rule the feat(release) already on main since v1.0.1 would turn the next patch release into 1.1.0. --- testplanit/.releaserc.json | 1 + 1 file changed, 1 insertion(+) 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 } ] From 9789bb877163746fad900b84875a8a78192abfc8 Mon Sep 17 00:00:00 2001 From: Brad DerManouelian Date: Tue, 8 Sep 2026 12:10:09 -0500 Subject: [PATCH 3/3] fix(deps): resolve the open Dependabot alerts that survived the 1.0 cut The 1.0.0 graduation took beta's tree wholesale, which dropped the security floors main had accumulated in pnpm-workspace.yaml. Two of the open alerts are that regression: sharp@0.32.6 came back under the docs OG plugin and linkify-it 2.x/3.x under the Forge app's Atlassian packages. Both floors are restored. @hono/node-server moves off its exact 1.19.13 pin to the patched 1.19 line; it stays on 1.x because @zenstackhq/cli only accepts ^1.13.8. npm's xlsx is frozen at 0.18.5 and will never receive the prototype pollution and ReDoS fixes, so the dependency now points at the SheetJS CDN tarball for 0.20.3, integrity-pinned in the lockfile. It parses uploaded attachments for the preview, so those fixes matter. image-size has no fixed release and is only reachable through the docs build, so it is left as is. --- pnpm-lock.yaml | 170 ++++++---------------------------------- pnpm-workspace.yaml | 4 +- testplanit/package.json | 2 +- 3 files changed, 26 insertions(+), 150 deletions(-) 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/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"