From 2cea7e4607602de39828598d8c0e8296391c740b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 23 Jan 2026 06:04:17 +0000 Subject: [PATCH 01/11] docs: archive changelog for v0.3.21 [skip ci] --- .changelog/{v0.3.x.md => v0.3.21.md} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename .changelog/{v0.3.x.md => v0.3.21.md} (98%) diff --git a/.changelog/v0.3.x.md b/.changelog/v0.3.21.md similarity index 98% rename from .changelog/v0.3.x.md rename to .changelog/v0.3.21.md index d0905b39..05806ac1 100644 --- a/.changelog/v0.3.x.md +++ b/.changelog/v0.3.21.md @@ -1,4 +1,4 @@ -# Release v0.3.x - SQLite Storage Layer & Migration Framework +# Release v0.3.21 - SQLite Storage Layer & Migration Framework Released: YYYY-MM-DD @@ -160,4 +160,4 @@ pm2 restart ecosystem.config.cjs ## 🔗 Full Changelog -**Full Diff**: https://github.com/atomantic/SparseTree/compare/v0.2.11...v0.3.x +**Full Diff**: https://github.com/atomantic/SparseTree/compare/v0.2.11...v0.3.21 From d81b0b5a801657ea9f643cc0d66e27bd9ad336e0 Mon Sep 17 00:00:00 2001 From: Adam Eivy Date: Thu, 22 Jan 2026 22:06:19 -0800 Subject: [PATCH 02/11] fix: add build step to scraper tests in CI workflow --- .github/workflows/test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 20b658cd..68bd4e8c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -68,6 +68,9 @@ jobs: - name: Install dependencies run: npm ci + - name: Build server + run: npm run build + - name: Install Playwright browsers run: npx playwright install chromium From 518b75b1dc40ded81cf465911c112a54534e0b08 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 23 Jan 2026 06:07:37 +0000 Subject: [PATCH 03/11] build: bump version to 0.3.22 [skip ci] --- client/package.json | 2 +- package-lock.json | 10 +++++----- package.json | 2 +- server/package.json | 2 +- shared/package.json | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/client/package.json b/client/package.json index 8776c5a8..2d779b7c 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@fsf/client", - "version": "0.3.21", + "version": "0.3.22", "type": "module", "scripts": { "dev": "vite --port 6373", diff --git a/package-lock.json b/package-lock.json index 1e93bbbf..3acb5e7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sparsetree", - "version": "0.3.21", + "version": "0.3.22", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sparsetree", - "version": "0.3.21", + "version": "0.3.22", "license": "ISC", "workspaces": [ "shared", @@ -59,7 +59,7 @@ }, "client": { "name": "@fsf/client", - "version": "0.3.21", + "version": "0.3.22", "dependencies": { "@fsf/shared": "*", "d3": "^7.9.0", @@ -8417,7 +8417,7 @@ }, "server": { "name": "@fsf/server", - "version": "0.3.21", + "version": "0.3.22", "dependencies": { "@fsf/shared": "*", "better-sqlite3": "^12.6.2", @@ -8440,7 +8440,7 @@ }, "shared": { "name": "@fsf/shared", - "version": "0.3.21", + "version": "0.3.22", "devDependencies": { "typescript": "^5.7.2" } diff --git a/package.json b/package.json index c23b3667..516d243a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sparsetree", - "version": "0.3.21", + "version": "0.3.22", "private": true, "description": "", "main": "index.js", diff --git a/server/package.json b/server/package.json index f478a906..ad7d5ead 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "@fsf/server", - "version": "0.3.21", + "version": "0.3.22", "type": "module", "main": "dist/index.js", "scripts": { diff --git a/shared/package.json b/shared/package.json index 8d00fca3..bf8d26f0 100644 --- a/shared/package.json +++ b/shared/package.json @@ -1,6 +1,6 @@ { "name": "@fsf/shared", - "version": "0.3.21", + "version": "0.3.22", "type": "module", "main": "types/index.js", "types": "types/index.d.ts", From 3241ca43aaa5718c094bc2707db099601f588877 Mon Sep 17 00:00:00 2001 From: Adam Eivy Date: Thu, 22 Jan 2026 22:07:37 -0800 Subject: [PATCH 04/11] fix: store commit SHA before cherry-pick in release workflow --- .github/workflows/release.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7fbdd61b..10086932 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -134,9 +134,12 @@ jobs: git commit -m "docs: archive changelog for v${CURRENT_VERSION} [skip ci]" git push origin dev + # Store the changelog commit SHA before switching branches + CHANGELOG_COMMIT=$(git rev-parse HEAD) + # Merge changelog back to main (without triggering CI) git checkout main - git cherry-pick HEAD~1 + git cherry-pick "$CHANGELOG_COMMIT" git push origin main git checkout dev fi From 6509a819b6a4b1ab8c2af5faf129e5aa20645fb3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 23 Jan 2026 06:08:55 +0000 Subject: [PATCH 05/11] build: bump version to 0.3.23 [skip ci] --- client/package.json | 2 +- package-lock.json | 10 +++++----- package.json | 2 +- server/package.json | 2 +- shared/package.json | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/client/package.json b/client/package.json index 2d779b7c..4b5359fa 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@fsf/client", - "version": "0.3.22", + "version": "0.3.23", "type": "module", "scripts": { "dev": "vite --port 6373", diff --git a/package-lock.json b/package-lock.json index 3acb5e7f..18c5d7e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sparsetree", - "version": "0.3.22", + "version": "0.3.23", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sparsetree", - "version": "0.3.22", + "version": "0.3.23", "license": "ISC", "workspaces": [ "shared", @@ -59,7 +59,7 @@ }, "client": { "name": "@fsf/client", - "version": "0.3.22", + "version": "0.3.23", "dependencies": { "@fsf/shared": "*", "d3": "^7.9.0", @@ -8417,7 +8417,7 @@ }, "server": { "name": "@fsf/server", - "version": "0.3.22", + "version": "0.3.23", "dependencies": { "@fsf/shared": "*", "better-sqlite3": "^12.6.2", @@ -8440,7 +8440,7 @@ }, "shared": { "name": "@fsf/shared", - "version": "0.3.22", + "version": "0.3.23", "devDependencies": { "typescript": "^5.7.2" } diff --git a/package.json b/package.json index 516d243a..b529b1cd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sparsetree", - "version": "0.3.22", + "version": "0.3.23", "private": true, "description": "", "main": "index.js", diff --git a/server/package.json b/server/package.json index ad7d5ead..e48d2aef 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "@fsf/server", - "version": "0.3.22", + "version": "0.3.23", "type": "module", "main": "dist/index.js", "scripts": { diff --git a/shared/package.json b/shared/package.json index bf8d26f0..e09bca1e 100644 --- a/shared/package.json +++ b/shared/package.json @@ -1,6 +1,6 @@ { "name": "@fsf/shared", - "version": "0.3.22", + "version": "0.3.23", "type": "module", "main": "types/index.js", "types": "types/index.d.ts", From 92f98a5624b3c41b3db46ad5408a350925243908 Mon Sep 17 00:00:00 2001 From: Adam Eivy Date: Thu, 22 Jan 2026 22:12:25 -0800 Subject: [PATCH 06/11] refactor: consolidate CI and test workflows into single pipeline - Build once, cache artifacts, then run all tests in parallel - Version bump only runs after ALL tests pass (unit, integration, scraper) - Remove separate test.yml workflow to avoid confusing parallel runs --- .github/workflows/ci.yml | 152 ++++++++++++++++++++++++++++--------- .github/workflows/test.yml | 103 ------------------------- 2 files changed, 117 insertions(+), 138 deletions(-) delete mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d794411b..f0a5f0da 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,69 +4,158 @@ on: pull_request: branches: [main, dev] push: - branches: [dev] + branches: [dev, main] permissions: contents: write jobs: - test: + build: + name: Build runs-on: ubuntu-latest - # Skip if commit message contains [skip ci] if: "!contains(github.event.head_commit.message, '[skip ci]')" - strategy: - matrix: - node-version: [20.x] + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Build all packages + run: npm run build + + - name: Cache build artifacts + uses: actions/cache/save@v4 + with: + path: | + server/dist + client/dist + shared/dist + key: build-${{ github.sha }} + + unit-tests: + name: Unit Tests + runs-on: ubuntu-latest + needs: build + if: "!contains(github.event.head_commit.message, '[skip ci]')" steps: - uses: actions/checkout@v4 - - name: Use Node.js ${{ matrix.node-version }} + - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: ${{ matrix.node-version }} + node-version: '20' cache: 'npm' - - name: Install all dependencies - run: npm run install:all + - name: Install dependencies + run: npm ci - - name: Build shared types - run: npm run build -w shared + - name: Restore build artifacts + uses: actions/cache/restore@v4 + with: + path: | + server/dist + client/dist + shared/dist + key: build-${{ github.sha }} + + - name: Run unit tests + run: npm run test:unit + + - name: Upload coverage + uses: codecov/codecov-action@v4 + if: always() + with: + files: ./coverage/lcov.info + fail_ci_if_error: false - - name: Build server - run: npm run build -w server + integration-tests: + name: Integration Tests + runs-on: ubuntu-latest + needs: build + if: "!contains(github.event.head_commit.message, '[skip ci]')" - - name: Build client - run: npm run build -w client + steps: + - uses: actions/checkout@v4 - lint: + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Restore build artifacts + uses: actions/cache/restore@v4 + with: + path: | + server/dist + client/dist + shared/dist + key: build-${{ github.sha }} + + - name: Run integration tests + run: npm run test:integration + + scraper-tests: + name: Scraper Tests runs-on: ubuntu-latest + needs: build if: "!contains(github.event.head_commit.message, '[skip ci]')" steps: - uses: actions/checkout@v4 - - name: Use Node.js 20.x + - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 20.x + node-version: '20' cache: 'npm' - name: Install dependencies - run: npm run install:all + run: npm ci + + - name: Restore build artifacts + uses: actions/cache/restore@v4 + with: + path: | + server/dist + client/dist + shared/dist + key: build-${{ github.sha }} - - name: Build shared types - run: npm run build -w shared + - name: Install Playwright browsers + run: npx playwright install chromium - - name: Check for TypeScript errors - run: npm run build -w server && npm run build -w client + - name: Run scraper tests + run: npm run test:scraper - bump-build: + - name: Upload test results + uses: actions/upload-artifact@v4 + if: always() + with: + name: scraper-test-results + path: test-results/ + retention-days: 7 + + bump-version: + name: Bump Version runs-on: ubuntu-latest - needs: [test, lint] - # Only run on push to dev (not PRs), and skip if already a version bump commit - if: github.event_name == 'push' && github.ref == 'refs/heads/dev' && !contains(github.event.head_commit.message, '[skip ci]') + needs: [unit-tests, integration-tests, scraper-tests] + # Only on push to dev, not PRs, and only if all tests passed + if: | + github.event_name == 'push' && + github.ref == 'refs/heads/dev' && + !contains(github.event.head_commit.message, '[skip ci]') steps: - uses: actions/checkout@v4 @@ -80,25 +169,18 @@ jobs: - name: Bump patch version run: | - # Get current version CURRENT_VERSION=$(node -p "require('./package.json').version") - - # Split into parts MAJOR=$(echo $CURRENT_VERSION | cut -d. -f1) MINOR=$(echo $CURRENT_VERSION | cut -d. -f2) PATCH=$(echo $CURRENT_VERSION | cut -d. -f3) - - # Increment patch NEW_PATCH=$((PATCH + 1)) NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH" - # Update package.json files npm version $NEW_VERSION --no-git-tag-version cd shared && npm version $NEW_VERSION --no-git-tag-version && cd .. cd client && npm version $NEW_VERSION --no-git-tag-version && cd .. cd server && npm version $NEW_VERSION --no-git-tag-version && cd .. - # Commit and push git add package.json package-lock.json shared/package.json client/package.json server/package.json git commit -m "build: bump version to $NEW_VERSION [skip ci]" git push diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 68bd4e8c..00000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,103 +0,0 @@ -name: Tests - -on: - push: - branches: [dev, main] - pull_request: - branches: [dev, main] - -jobs: - unit-tests: - name: Unit Tests - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - - - name: Install dependencies - run: npm ci - - - name: Run unit tests - run: npm run test:unit - - - name: Upload coverage - uses: codecov/codecov-action@v4 - if: always() - with: - files: ./coverage/lcov.info - fail_ci_if_error: false - - integration-tests: - name: Integration Tests - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - - - name: Install dependencies - run: npm ci - - - name: Run integration tests - run: npm run test:integration - - scraper-tests: - name: Scraper Tests - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - - - name: Install dependencies - run: npm ci - - - name: Build server - run: npm run build - - - name: Install Playwright browsers - run: npx playwright install chromium - - - name: Run scraper tests - run: npm run test:scraper - - - name: Upload test results - uses: actions/upload-artifact@v4 - if: always() - with: - name: scraper-test-results - path: test-results/ - retention-days: 7 - - all-tests: - name: All Tests Summary - runs-on: ubuntu-latest - needs: [unit-tests, integration-tests, scraper-tests] - if: always() - - steps: - - name: Check test results - run: | - if [[ "${{ needs.unit-tests.result }}" != "success" ]] || \ - [[ "${{ needs.integration-tests.result }}" != "success" ]] || \ - [[ "${{ needs.scraper-tests.result }}" != "success" ]]; then - echo "One or more test jobs failed" - exit 1 - fi - echo "All tests passed!" From 276472d875e3232fb10b950d3b1631d94989542d Mon Sep 17 00:00:00 2001 From: Adam Eivy Date: Thu, 22 Jan 2026 22:14:44 -0800 Subject: [PATCH 07/11] ci: simplify triggers to avoid duplicate runs - push to dev: runs tests + version bump - pull_request to main: runs tests only (gate for merge) - Added concurrency group to cancel duplicate runs --- .github/workflows/ci.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f0a5f0da..fbc3f5ff 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,10 +1,15 @@ name: CI on: - pull_request: - branches: [main, dev] push: - branches: [dev, main] + branches: [dev] + pull_request: + branches: [main] + +# Cancel duplicate runs for the same branch/PR +concurrency: + group: ci-${{ github.head_ref || github.ref }} + cancel-in-progress: true permissions: contents: write From 09ebadad9a36d7d2b311b0d0159680b0d588f6e4 Mon Sep 17 00:00:00 2001 From: Adam Eivy Date: Thu, 22 Jan 2026 22:16:31 -0800 Subject: [PATCH 08/11] fix: use tsx for server start to fix ES module resolution Node.js ES modules require .js extensions in imports, but TypeScript with moduleResolution 'bundler' doesn't add them. Using tsx handles module resolution at runtime, matching the dev environment. --- package-lock.json | 89 ++++++++++----------------------------------- server/package.json | 4 +- 2 files changed, 21 insertions(+), 72 deletions(-) diff --git a/package-lock.json b/package-lock.json index 18c5d7e4..4af06ca3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -142,6 +142,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -420,13 +421,11 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "aix" ], - "peer": true, "engines": { "node": ">=18" } @@ -438,13 +437,11 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -456,13 +453,11 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -474,13 +469,11 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -492,13 +485,11 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } @@ -510,13 +501,11 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } @@ -528,13 +517,11 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -546,13 +533,11 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -564,13 +549,11 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -582,13 +565,11 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -600,13 +581,11 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -618,13 +597,11 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -636,13 +613,11 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -654,13 +629,11 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -672,13 +645,11 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -690,13 +661,11 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -708,13 +677,11 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -726,13 +693,11 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -744,13 +709,11 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -762,13 +725,11 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -780,13 +741,11 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -798,13 +757,11 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "openharmony" ], - "peer": true, "engines": { "node": ">=18" } @@ -816,13 +773,11 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "sunos" ], - "peer": true, "engines": { "node": ">=18" } @@ -834,13 +789,11 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -852,13 +805,11 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -870,13 +821,11 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -1665,8 +1614,7 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -2151,6 +2099,7 @@ "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -2489,7 +2438,6 @@ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -2817,6 +2765,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -3245,7 +3194,8 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/d3": { "version": "7.9.0", @@ -3564,6 +3514,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -3742,7 +3693,6 @@ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -3796,8 +3746,7 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/dunder-proto": { "version": "1.0.1", @@ -3964,7 +3913,6 @@ "version": "0.27.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -4360,7 +4308,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -4439,7 +4386,6 @@ "version": "4.13.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", - "dev": true, "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -4533,6 +4479,7 @@ "integrity": "sha512-n0QrmT9lD81rbpKsyhnlz3DgnMZlaOkJPpgi746doA+HvaMC79bdWkwjrNnGJRvDrWTI8iOcJiVTJ5CdT/AZRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "webidl-conversions": "^7.0.0", "whatwg-mimetype": "^3.0.0" @@ -4905,6 +4852,7 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -5049,7 +4997,6 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -5730,6 +5677,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -5905,7 +5853,6 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -5921,7 +5868,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -6050,6 +5996,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -6062,6 +6009,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -6092,8 +6040,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/react-refresh": { "version": "0.17.0", @@ -6257,7 +6204,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" @@ -7189,6 +7135,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7308,7 +7255,6 @@ "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "dev": true, "license": "MIT", "dependencies": { "esbuild": "~0.27.0", @@ -7508,6 +7454,7 @@ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -8108,6 +8055,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8121,6 +8069,7 @@ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", @@ -8426,6 +8375,7 @@ "playwright": "^1.57.0", "portos-ai-toolkit": "^0.1.0", "socket.io": "^4.8.3", + "tsx": "^4.19.2", "ulid": "^3.0.2", "zod": "^3.24.1" }, @@ -8434,7 +8384,6 @@ "@types/cors": "^2.8.17", "@types/express": "^5.0.0", "@types/node": "^22.10.2", - "tsx": "^4.19.2", "typescript": "^5.7.2" } }, diff --git a/server/package.json b/server/package.json index e48d2aef..2d0a43ed 100644 --- a/server/package.json +++ b/server/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "tsx watch src/index.ts", "build": "tsc && cp src/db/schema.sql dist/db/", - "start": "node dist/index.js" + "start": "tsx src/index.ts" }, "dependencies": { "@fsf/shared": "*", @@ -16,6 +16,7 @@ "playwright": "^1.57.0", "portos-ai-toolkit": "^0.1.0", "socket.io": "^4.8.3", + "tsx": "^4.19.2", "ulid": "^3.0.2", "zod": "^3.24.1" }, @@ -24,7 +25,6 @@ "@types/cors": "^2.8.17", "@types/express": "^5.0.0", "@types/node": "^22.10.2", - "tsx": "^4.19.2", "typescript": "^5.7.2" } } From 0a9eaa0212aff9383933463074dc70dead69dda3 Mon Sep 17 00:00:00 2001 From: Adam Eivy Date: Thu, 22 Jan 2026 22:21:35 -0800 Subject: [PATCH 09/11] fix: correct cache path for shared package (types/ not dist/) --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fbc3f5ff..b3b5f3f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,7 +41,7 @@ jobs: path: | server/dist client/dist - shared/dist + shared/types key: build-${{ github.sha }} unit-tests: @@ -68,7 +68,7 @@ jobs: path: | server/dist client/dist - shared/dist + shared/types key: build-${{ github.sha }} - name: Run unit tests @@ -105,7 +105,7 @@ jobs: path: | server/dist client/dist - shared/dist + shared/types key: build-${{ github.sha }} - name: Run integration tests @@ -135,7 +135,7 @@ jobs: path: | server/dist client/dist - shared/dist + shared/types key: build-${{ github.sha }} - name: Install Playwright browsers From 9bfa5cff4025db41ac2b4a5bfc600be8064e03e2 Mon Sep 17 00:00:00 2001 From: Adam Eivy Date: Thu, 22 Jan 2026 22:26:48 -0800 Subject: [PATCH 10/11] fix: separate playwright configs for scraper vs e2e tests Scraper tests use mock servers, don't need webServer. E2E tests need the real server via webServer config. --- package.json | 2 +- playwright.config.ts | 14 +++----------- playwright.scraper.config.ts | 31 +++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 playwright.scraper.config.ts diff --git a/package.json b/package.json index b529b1cd..05d27181 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "test": "vitest", "test:unit": "vitest run tests/unit", "test:integration": "vitest run tests/integration", - "test:scraper": "playwright test tests/scraper", + "test:scraper": "playwright test --config playwright.scraper.config.ts", "test:e2e": "playwright test tests/e2e", "test:ci": "vitest run --coverage", "test:watch": "vitest watch", diff --git a/playwright.config.ts b/playwright.config.ts index cff81e43..61cd5947 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,10 +1,11 @@ import { defineConfig, devices } from '@playwright/test'; /** - * Playwright configuration for scraper and E2E tests + * Playwright configuration for E2E tests + * For scraper tests, use playwright.scraper.config.ts */ export default defineConfig({ - testDir: './tests', + testDir: './tests/e2e', fullyParallel: true, forbidOnly: !!process.env.CI, retries: process.env.CI ? 2 : 0, @@ -19,17 +20,8 @@ export default defineConfig({ }, projects: [ - { - name: 'scraper-tests', - testMatch: 'tests/scraper/**/*.spec.ts', - use: { - ...devices['Desktop Chrome'], - headless: true, - }, - }, { name: 'e2e-tests', - testMatch: 'tests/e2e/**/*.spec.ts', use: { ...devices['Desktop Chrome'], headless: true, diff --git a/playwright.scraper.config.ts b/playwright.scraper.config.ts new file mode 100644 index 00000000..4e4bb0d6 --- /dev/null +++ b/playwright.scraper.config.ts @@ -0,0 +1,31 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Playwright configuration for scraper tests only + * These tests use their own mock servers, no webServer needed + */ +export default defineConfig({ + testDir: './tests/scraper', + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: 'html', + timeout: 30000, + + use: { + trace: 'on-first-retry', + screenshot: 'only-on-failure', + }, + + projects: [ + { + name: 'scraper-tests', + use: { + ...devices['Desktop Chrome'], + headless: true, + }, + }, + ], + // No webServer - scraper tests use mock servers +}); From 3483e70384696738c977eff21451ab7938c929d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 23 Jan 2026 06:28:20 +0000 Subject: [PATCH 11/11] build: bump version to 0.3.24 [skip ci] --- client/package.json | 2 +- package-lock.json | 40 +++++++++++++++++----------------------- package.json | 2 +- server/package.json | 2 +- shared/package.json | 2 +- 5 files changed, 21 insertions(+), 27 deletions(-) diff --git a/client/package.json b/client/package.json index 4b5359fa..4e814fd5 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@fsf/client", - "version": "0.3.23", + "version": "0.3.24", "type": "module", "scripts": { "dev": "vite --port 6373", diff --git a/package-lock.json b/package-lock.json index 4af06ca3..18f8ea81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sparsetree", - "version": "0.3.23", + "version": "0.3.24", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sparsetree", - "version": "0.3.23", + "version": "0.3.24", "license": "ISC", "workspaces": [ "shared", @@ -59,7 +59,7 @@ }, "client": { "name": "@fsf/client", - "version": "0.3.23", + "version": "0.3.24", "dependencies": { "@fsf/shared": "*", "d3": "^7.9.0", @@ -142,7 +142,6 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1614,7 +1613,8 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -2099,7 +2099,6 @@ "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -2438,6 +2437,7 @@ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -2765,7 +2765,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -3194,8 +3193,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/d3": { "version": "7.9.0", @@ -3514,7 +3512,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -3693,6 +3690,7 @@ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -3746,7 +3744,8 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/dunder-proto": { "version": "1.0.1", @@ -4479,7 +4478,6 @@ "integrity": "sha512-n0QrmT9lD81rbpKsyhnlz3DgnMZlaOkJPpgi746doA+HvaMC79bdWkwjrNnGJRvDrWTI8iOcJiVTJ5CdT/AZRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "webidl-conversions": "^7.0.0", "whatwg-mimetype": "^3.0.0" @@ -4852,7 +4850,6 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -4997,6 +4994,7 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -5677,7 +5675,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -5853,6 +5850,7 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -5868,6 +5866,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -5996,7 +5995,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -6009,7 +6007,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -6040,7 +6037,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/react-refresh": { "version": "0.17.0", @@ -7135,7 +7133,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -7454,7 +7451,6 @@ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -8055,7 +8051,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -8069,7 +8064,6 @@ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", @@ -8366,7 +8360,7 @@ }, "server": { "name": "@fsf/server", - "version": "0.3.23", + "version": "0.3.24", "dependencies": { "@fsf/shared": "*", "better-sqlite3": "^12.6.2", @@ -8389,7 +8383,7 @@ }, "shared": { "name": "@fsf/shared", - "version": "0.3.23", + "version": "0.3.24", "devDependencies": { "typescript": "^5.7.2" } diff --git a/package.json b/package.json index 05d27181..11fd913c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sparsetree", - "version": "0.3.23", + "version": "0.3.24", "private": true, "description": "", "main": "index.js", diff --git a/server/package.json b/server/package.json index 2d0a43ed..997b8de3 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "@fsf/server", - "version": "0.3.23", + "version": "0.3.24", "type": "module", "main": "dist/index.js", "scripts": { diff --git a/shared/package.json b/shared/package.json index e09bca1e..36645dd5 100644 --- a/shared/package.json +++ b/shared/package.json @@ -1,6 +1,6 @@ { "name": "@fsf/shared", - "version": "0.3.23", + "version": "0.3.24", "type": "module", "main": "types/index.js", "types": "types/index.d.ts",