Skip to content

Increment package versions#96

Open
cefn wants to merge 1 commit into
mainfrom
refresh-packages
Open

Increment package versions#96
cefn wants to merge 1 commit into
mainfrom
refresh-packages

Conversation

@cefn
Copy link
Copy Markdown
Owner

@cefn cefn commented May 7, 2026

Summary by CodeRabbit

  • Chores

    • Updated Node.js requirement to v26 and npm to v11
    • Upgraded React to v19 across applicable applications
    • Updated Vite, TypeScript, Vitest, and development tooling to latest versions
  • Configuration

    • Enabled pre-release mode with alpha tag versioning
    • Refactored ESLint configuration structure

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 7, 2026

Review Change Stack

Warning

Rate limit exceeded

@cefn has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 49 minutes and 43 seconds before requesting another review.

To continue reviewing without waiting, purchase usage credits in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 0e78182a-f7ec-4b7d-8d42-eee8c8d02933

📥 Commits

Reviewing files that changed from the base of the PR and between 69cec16 and 723f95a.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (22)
  • .changeset/pre.json
  • .nvmrc
  • apps/counter-dom-commonjs/package.json
  • apps/counter-dom-esm/package.json
  • apps/counter-dom-tiny/package.json
  • apps/counter-dom-ts/package.json
  • apps/counter-preact-ts/package.json
  • apps/counter-react-js/package.json
  • apps/counter-react-ts-edit-context/package.json
  • apps/counter-react-ts-edit/package.json
  • apps/counter-react-ts/package.json
  • apps/fast/package.json
  • apps/tiny/package.json
  • eslint.config-ts.mjs
  • package.json
  • packages/nevermore/package.json
  • packages/queue/package.json
  • packages/store-edit/package.json
  • packages/store-follow/package.json
  • packages/store-react/package.json
  • packages/store/package.json
  • packages/unpromise/package.json
📝 Walkthrough

Walkthrough

This PR coordinates a comprehensive upgrade of the monorepo's toolchain and dependencies. It introduces pre-release alpha configuration, upgrades Node.js and npm engine requirements, modernizes ESLint configuration, upgrades React from version 18 to 19 across multiple apps, and synchronizes build and testing tooling (Vite, TypeScript, Vitest, Wireit) to newer major versions throughout all packages and applications.

Changes

Monorepo Toolchain & React 19 Upgrade

Layer / File(s) Summary
Release & Engine Configuration
.changeset/pre.json, .nvmrc, package.json
Pre-release alpha mode is configured. Node.js engine bumped from ^20 to ^26 and npm from ^10 to ^11.
Root Monorepo Tooling
package.json
Root devDependencies updated: @changesets/cli, Vite plugins (@vitejs/plugin-legacy, @vitejs/plugin-react, @preact/preset-vite), prettier, wireit, vitest, TypeScript, and utilities (terser, tsx, zx) to newer major/minor versions.
ESLint Config Modernization
eslint.config-ts.mjs
Configuration refactored from FlatCompat array-based setup to tseslint.config() composition integrating @eslint/js recommended, typescript-eslint strict, and eslint-plugin-react flat configs. React version detection enabled via settings.react.version = "detect".
React 18 → 19 Upgrade in Apps
apps/counter-react-js/package.json, apps/counter-react-ts-edit-context/package.json, apps/counter-react-ts-edit/package.json, apps/counter-react-ts/package.json
react and react-dom bumped from ^18.2.0 to ^19.2.6. React type packages (@types/react, @types/react-dom) updated from React 18 to 19 types. Immer upgraded to ^11.1.7 where applicable.
React Peer Dependency Update
packages/store-react/package.json
@watchable/store-react peer dependency for react updated from ^18.2.0 to ^19.2.6. Test tooling (Testing Library, Vitest, coverage) bumped to newer versions.
Vite & General Tooling Updates in Apps
apps/counter-dom-commonjs/package.json, apps/counter-dom-esm/package.json, apps/counter-dom-tiny/package.json, apps/counter-dom-ts/package.json, apps/counter-preact-ts/package.json, apps/fast/package.json, apps/tiny/package.json
Vite upgraded from ^5.x to ^8.0.11. Vite plugins (@vitejs/plugin-legacy, @vitejs/plugin-react), TypeScript, Vitest, Wireit, Playwright, and build tooling all bumped to newer versions.
Package Library Tooling Updates
packages/nevermore/package.json, packages/queue/package.json, packages/store-edit/package.json, packages/store-follow/package.json, packages/store/package.json, packages/unpromise/package.json
devDependencies synchronized across all library packages: @vitest/coverage-*^4.x, vitest^4.x, typescript^6.0.3, vite^8.0.11, wireit^0.14.12. Immer in @watchable/store-edit updated to ^11.1.7.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Poem

🐰 Hops of version, leaps so high,
React bounces eighteen to nineteen sky,
Vite dances five to eight with glee,
TypeScript types flow wild and free,
While monorepo tools all synchronize,
To modern Node, npm's reprise!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Title check ⚠️ Warning The title 'Increment package versions' is vague and generic; it does not accurately reflect the primary changes of upgrading dependencies to newer major versions and introducing pre-release configuration. Revise the title to be more specific about the main changes, such as 'Upgrade dependencies to latest versions and enable pre-release mode' or 'Update Node.js requirement and bump build tooling across monorepo'.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refresh-packages

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/store-edit/package.json (1)

38-50: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

peerDependencies.immer is stale and conflicts with dependencies.immer

dependencies.immer was bumped to ^11.1.7 but peerDependencies.immer still declares "^9.0.16 || ^10.0.1". Consumers running npm/pnpm install with immer v11 will receive an unsatisfied peer dependency error; if they have an older immer version installed alongside, two separate immer instances end up in the dependency tree and Immer's internal singleton state will break runtime behavior.

🛠️ Proposed fix
   "peerDependencies": {
     "@watchable/store": "1.0.2",
-    "immer": "^9.0.16 || ^10.0.1"
+    "immer": "^9.0.16 || ^10.0.1 || ^11.0.0"
   },
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/store-edit/package.json` around lines 38 - 50, The peerDependencies
entry for immer is out of sync with the package dependency: update the
"peerDependencies".immer range to include the v11 release used in "dependencies"
(e.g. change "peerDependencies".immer from "^9.0.16 || ^10.0.1" to a range that
includes v11 such as "^9.0.16 || ^10.0.1 || ^11.0.0" or simply "^11.1.7") so
consumers won't get peer dependency conflicts; modify the peerDependencies block
in package.json (the immer entry) to match or accept the installed dependencies.
🧹 Nitpick comments (1)
eslint.config-ts.mjs (1)

1-17: ⚡ Quick win

eslint-plugin-react-hooks is absent from the flat config

rules-of-hooks and exhaustive-deps are no longer enforced after this rewrite. Per the provided React 19 documentation, React 19.2 requires eslint-plugin-react-hooks v6+ for new hook semantics. eslint-plugin-react-hooks v6 ships a flat/recommended preset that integrates cleanly with ESLint flat config, and a recommended-latest preset for bleeding-edge compiler rules.

🛠️ Proposed addition
 import eslint from "@eslint/js";
 import tseslint from "typescript-eslint";
 import pluginReact from "eslint-plugin-react";
+import reactHooks from "eslint-plugin-react-hooks";

 export default tseslint.config(
+  {
+    ignores: ["**/dist/**", "**/coverage/**", "**/playwright-report/**"],
+  },
   eslint.configs.recommended,
   tseslint.configs.strict,
   pluginReact.configs.flat.recommended,
   pluginReact.configs.flat["jsx-runtime"],
+  reactHooks.configs.flat.recommended,
   {
     settings: {
       react: {
         version: "detect",
       },
     },
   }
 );

Also add eslint-plugin-react-hooks to the root devDependencies.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@eslint.config-ts.mjs` around lines 1 - 17, The flat ESLint config call
(tseslint.config(...)) removed rules-of-hooks/exhaustive-deps; import and
include eslint-plugin-react-hooks and its flat preset into the same config
invocation: add an import like import pluginReactHooks from
"eslint-plugin-react-hooks" and include
pluginReactHooks.configs.flat.recommended (or
pluginReactHooks.configs.flat["recommended-latest"] if you want bleeding-edge)
alongside pluginReact.configs.flat.recommended and
pluginReact.configs.flat["jsx-runtime"]; also add eslint-plugin-react-hooks v6+
to the root devDependencies so the plugin is installed.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.nvmrc:
- Line 1: The repo pins Node to "26.1.0" in .nvmrc which is a Current (non-LTS)
release; change the version string "26.1.0" to a stable LTS release (e.g. "24"
or a specific Active LTS like "24.x" / "24.20.0") so CI and hosted runners
reliably support it; update any CI/workflow references that hardcode the 26.x
value to read .nvmrc or the new 24.x value and verify CI runners/tooling support
the chosen LTS before merging.

In `@apps/counter-dom-commonjs/package.json`:
- Around line 29-32: Remove the redundant CommonJS plugins and deprecated
config: delete the two dependencies "@rollup/plugin-commonjs" and
"vite-plugin-commonjs" from package.json and remove any imports and usage of
them in vite.config.ts (search for plugin names or references to
rollupPluginCommonjs/vitePluginCommonjs), and remove any build.commonjsOptions
configuration; after that, run a production build and if you encounter CJS
default-import runtime issues enable legacy.inconsistentCjsInterop: true under
the legacy config in vite.config.ts as a temporary workaround.

In `@apps/counter-preact-ts/package.json`:
- Around line 38-39: The devDependency entries "@types/react" and
"@types/react-dom" in package.json conflict with the project's use of
"npm:`@preact/compat`" and must be removed or aliased; either delete the
"@types/react" and "@types/react-dom" devDependencies, or add TypeScript path
aliases in tsconfig.json (under compilerOptions.paths) mapping "react",
"react-dom", and "react-dom/*" to preact/compat to ensure types resolve to
preact/compat instead of the React typings.

In `@eslint.config-ts.mjs`:
- Around line 5-17: Add an "ignores" block to the top-level tseslint.config call
so ESLint doesn't attempt to lint generated output; update the config passed to
tseslint.config (the object after pluginReact.configs.flat["jsx-runtime"]) to
include an ignores array containing at least "dist/**" and "coverage/**" (so the
exported config from tseslint.config and the settings.react.version="detect"
remain unchanged while ESLint skips those generated directories).

In `@packages/store/package.json`:
- Line 64: Update the shared and package TS configs to be TS6-ready: edit
tsconfig.build.json to remove the deprecated target "es5" (set a modern target
like "es2017" or omit it) and uncomment/populate the "types" array (e.g.,
["node"]) so inheriting configs retain type resolution; then update app tsconfig
files to remove deprecated esModuleInterop:false and change any
moduleResolution:"Node" to moduleResolution:"bundler"; finally ensure
package-level tsconfig.json files (e.g., the one extending tsconfig.build.json)
explicitly define a "types" array if they rely on node types so they won't be
dropped by TS6 defaults.

In `@packages/unpromise/package.json`:
- Line 47: The package.json currently pins the dev dependency "@types/node" to
"^25.6.0" which mismatches the project's Node 26 runtime; update the version
string for the "@types/node" entry in package.json to "^26.x" (e.g., "^26.0.0"
or "^26") and then run your package manager (npm/yarn/pnpm) to reinstall/lock
updated types so the TypeScript definitions align with Node 26 runtime APIs.

---

Outside diff comments:
In `@packages/store-edit/package.json`:
- Around line 38-50: The peerDependencies entry for immer is out of sync with
the package dependency: update the "peerDependencies".immer range to include the
v11 release used in "dependencies" (e.g. change "peerDependencies".immer from
"^9.0.16 || ^10.0.1" to a range that includes v11 such as "^9.0.16 || ^10.0.1 ||
^11.0.0" or simply "^11.1.7") so consumers won't get peer dependency conflicts;
modify the peerDependencies block in package.json (the immer entry) to match or
accept the installed dependencies.

---

Nitpick comments:
In `@eslint.config-ts.mjs`:
- Around line 1-17: The flat ESLint config call (tseslint.config(...)) removed
rules-of-hooks/exhaustive-deps; import and include eslint-plugin-react-hooks and
its flat preset into the same config invocation: add an import like import
pluginReactHooks from "eslint-plugin-react-hooks" and include
pluginReactHooks.configs.flat.recommended (or
pluginReactHooks.configs.flat["recommended-latest"] if you want bleeding-edge)
alongside pluginReact.configs.flat.recommended and
pluginReact.configs.flat["jsx-runtime"]; also add eslint-plugin-react-hooks v6+
to the root devDependencies so the plugin is installed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 0701247d-ab88-4acb-a1c2-b216fa592cd4

📥 Commits

Reviewing files that changed from the base of the PR and between bb7131e and 69cec16.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (22)
  • .changeset/pre.json
  • .nvmrc
  • apps/counter-dom-commonjs/package.json
  • apps/counter-dom-esm/package.json
  • apps/counter-dom-tiny/package.json
  • apps/counter-dom-ts/package.json
  • apps/counter-preact-ts/package.json
  • apps/counter-react-js/package.json
  • apps/counter-react-ts-edit-context/package.json
  • apps/counter-react-ts-edit/package.json
  • apps/counter-react-ts/package.json
  • apps/fast/package.json
  • apps/tiny/package.json
  • eslint.config-ts.mjs
  • package.json
  • packages/nevermore/package.json
  • packages/queue/package.json
  • packages/store-edit/package.json
  • packages/store-follow/package.json
  • packages/store-react/package.json
  • packages/store/package.json
  • packages/unpromise/package.json

Comment thread .nvmrc Outdated
Comment on lines +29 to +32
"@rollup/plugin-commonjs": "^29.0.2",
"@vitejs/plugin-legacy": "^8.0.1",
"vite": "^8.0.11",
"vite-plugin-commonjs": "^0.10.4",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check the Vite 8 / Rolldown migration guide for CJS plugin compatibility notes
echo "=== vite.config for counter-dom-commonjs ==="
fd 'vite.config' --search-path apps/counter-dom-commonjs --exec cat {}

Repository: cefn/watchable

Length of output: 587


🌐 Web query:

Vite 8 Rolldown commonjs plugin compatibility @rollup/plugin-commonjs``

💡 Result:

In Vite 8, which uses Rolldown as the bundler instead of Rollup, CommonJS support is natively handled by Rolldown itself, replacing the previous reliance on @rollup/plugin-commonjs[1][2]. You do not need to install or configure @rollup/plugin-commonjs separately, as Rolldown provides built-in compatibility with the Rollup plugin API and handles CJS interop directly[3][1][4]. The Vite configuration option build.commonjsOptions, which passed options to @rollup/plugin-commonjs in earlier versions, is now deprecated and a no-op[5][6]. Rolldown enforces stricter and more consistent CommonJS semantics, particularly for default export resolution from CJS modules[7][6]. If you encounter runtime issues with CJS default imports (e.g., "X is not a function"), use the temporary legacy.inconsistentCjsInterop: true option in your vite.config to restore Vite 7 behavior while fixing upstream packages[7][6][8]. Rolldown maintains high compatibility with existing Vite/Rollup plugins, so most work out of the box, but test production builds thoroughly due to potential differences in chunk order or strict CJS handling[3][7]. For official details, see Vite's Rolldown integration guide and migration docs[3][1][6].

Citations:


🏁 Script executed:

#!/bin/bash
# Check the package.json to understand dependencies and build setup
echo "=== Package.json for counter-dom-commonjs ==="
cat apps/counter-dom-commonjs/package.json

echo -e "\n=== Check for any build output or test configuration ==="
fd -e json -e js -e ts . apps/counter-dom-commonjs --search-path | head -20

Repository: cefn/watchable

Length of output: 1859


🏁 Script executed:

#!/bin/bash
# Check for build output, test results, or CI logs
echo "=== Looking for dist or build output ==="
find apps/counter-dom-commonjs -name dist -o -name build 2>/dev/null | head -10

echo -e "\n=== Check if there are any test files or CI workflows ==="
find . -path "*counter-dom-commonjs*" -type f \( -name "*.test.*" -o -name "*.spec.*" \) 2>/dev/null

echo -e "\n=== Check vite.config file type to ensure it's typescript ==="
file apps/counter-dom-commonjs/vite.config.ts 2>/dev/null || ls -la apps/counter-dom-commonjs/vite.config* 2>/dev/null

Repository: cefn/watchable

Length of output: 310


🏁 Script executed:

#!/bin/bash
# Check if there are any known issues or comments about CJS plugin conflicts
echo "=== Search for any comments or issues about CJS plugins in the project ==="
rg -i "commonjs|cjs|rolldown" apps/counter-dom-commonjs/ -A 2 -B 2 --type=ts --type=js

Repository: cefn/watchable

Length of output: 1208


Remove redundant CommonJS plugins for Vite 8/Rolldown compatibility

Vite 8 uses Rolldown as its native bundler, which includes built-in CommonJS support. Both @rollup/plugin-commonjs and vite-plugin-commonjs are unnecessary and risk double-transformation or conflicts with Rolldown's native CJS handling. The build.commonjsOptions configuration option is also deprecated in Vite 8.

Remove both @rollup/plugin-commonjs and vite-plugin-commonjs from vite.config.ts and the corresponding package.json entries. Test the production build to ensure correct output, particularly for default imports from CommonJS modules. If runtime issues occur with CJS default exports, use legacy.inconsistentCjsInterop: true as a temporary workaround.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/counter-dom-commonjs/package.json` around lines 29 - 32, Remove the
redundant CommonJS plugins and deprecated config: delete the two dependencies
"@rollup/plugin-commonjs" and "vite-plugin-commonjs" from package.json and
remove any imports and usage of them in vite.config.ts (search for plugin names
or references to rollupPluginCommonjs/vitePluginCommonjs), and remove any
build.commonjsOptions configuration; after that, run a production build and if
you encounter CJS default-import runtime issues enable
legacy.inconsistentCjsInterop: true under the legacy config in vite.config.ts as
a temporary workaround.

Comment on lines +38 to +39
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

For the currently used @preact/compatversion in this repo, is React 19 and@types/react@19 officially supported? Please include any caveats for TypeScript projects using vite + preact/compat.

💡 Result:

The currently used @preact/compat version aligns with React 18.3.2 (latest release Feb 26, 2026 [1]), not React 19. React 19 is not officially fully supported by preact/compat in stable Preact 10.x releases. Partial compatibility exists via a dedicated preact/compat/react-19 entry point for some APIs like react/server and react/client [2][3], but features like use(promise) [4], useActionState [3], and <Activity /> [5] lack full support or are open issues. Preact v11 (in development, no stable release by 2026-05-07 [3]) aims for better React 19 alignment. For TypeScript projects using Vite + preact/compat: - Do not use @types/react or @types/react-dom alongside preact/compat; types are intentionally incompatible due to runtime differences like VNode structure [6]. - Configure tsconfig.json paths to alias React imports to preact/compat for TypeScript resolution (Vite handles runtime aliases via @preact/preset-vite [7][8]): { "compilerOptions": { "jsx": "react-jsx", "jsxImportSource": "preact", "paths": { "react": ["./node_modules/preact/compat"], "react-dom": ["./node_modules/preact/compat"], "react-dom/*": ["./node_modules/preact/compat/*"] } } } - skipLibCheck: true may be needed if third-party React libs pull in @types/react [9]. - Use npm install react@npm:@preact/compat react-dom@npm:@preact/compat`` for peer deps [1].

Citations:


🏁 Script executed:

# Check the `@preact/compat` version and full context
cd apps/counter-preact-ts && cat -n package.json | head -50

Repository: cefn/watchable

Length of output: 2012


🏁 Script executed:

# Check if tsconfig.json exists and its type resolution setup
find apps/counter-preact-ts -name "tsconfig.json" -exec cat -n {} +

Repository: cefn/watchable

Length of output: 740


🏁 Script executed:

# Check if there are any other type configuration files
fd -e "tsconfig" -e "vite.config" apps/counter-preact-ts

Repository: cefn/watchable

Length of output: 452


🏁 Script executed:

# Verify `@preact/compat` version in lock file or check dependencies
cat apps/counter-preact-ts/package-lock.json | grep -A 5 '"@preact/compat"' | head -20

Repository: cefn/watchable

Length of output: 131


🏁 Script executed:

# Check if there are any actual type errors or if jsxImportSource is needed
grep -r "jsxImportSource\|jsx.*import" apps/counter-preact-ts/src 2>/dev/null | head -5

Repository: cefn/watchable

Length of output: 40


🏁 Script executed:

# Check what lock file exists (pnpm, yarn, etc)
ls -la | grep -E "pnpm-lock|yarn.lock|package-lock"

Repository: cefn/watchable

Length of output: 40


🏁 Script executed:

# Check if `@preact/compat` is explicitly listed or inherited from workspaces
grep -r "@preact/compat\|preact" apps/counter-preact-ts/package.json

Repository: cefn/watchable

Length of output: 437


🏁 Script executed:

# Check vite config to see how it handles preact
cat apps/counter-preact-ts/vite.config.ts 2>/dev/null || cat apps/counter-preact-ts/vite.config.js 2>/dev/null || echo "No vite config found"

Repository: cefn/watchable

Length of output: 629


Remove @types/react and @types/react-dom or configure TypeScript path aliases for preact/compat types.

Using @types/react@^19 and @types/react-dom@^19 alongside npm:@preact/compat`` creates a type/runtime mismatch. These type packages are incompatible with preact/compat due to structural differences (e.g., VNode representation). Additionally, React 19 is not officially supported by preact/compat in stable releases.

Fix: Either:

  1. Remove @types/react and @types/react-dom from devDependencies, or
  2. Add tsconfig.json path aliases:
{
  "compilerOptions": {
    "jsxImportSource": "preact",
    "paths": {
      "react": ["./node_modules/preact/compat"],
      "react-dom": ["./node_modules/preact/compat"],
      "react-dom/*": ["./node_modules/preact/compat/*"]
    }
  }
}

Option 1 is simpler for this preact-compat setup.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/counter-preact-ts/package.json` around lines 38 - 39, The devDependency
entries "@types/react" and "@types/react-dom" in package.json conflict with the
project's use of "npm:`@preact/compat`" and must be removed or aliased; either
delete the "@types/react" and "@types/react-dom" devDependencies, or add
TypeScript path aliases in tsconfig.json (under compilerOptions.paths) mapping
"react", "react-dom", and "react-dom/*" to preact/compat to ensure types resolve
to preact/compat instead of the React typings.

Comment thread eslint.config-ts.mjs
Comment on lines +5 to +17
export default tseslint.config(
eslint.configs.recommended,
tseslint.configs.strict,
pluginReact.configs.flat.recommended,
pluginReact.configs.flat["jsx-runtime"],
{
files: ["src/**/*.ts", "src/**/*.tsx"],
settings: {
react: {
version: "detect",
},
},
rules: {
"@typescript-eslint/semi": [2, "always"],
"@typescript-eslint/non-nullable-type-assertion-style": "off",
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/explicit-module-boundary-types": "off",
"@typescript-eslint/no-empty-interface": [
"error",
{
allowSingleExtends: true,
},
],
"@typescript-eslint/no-unused-vars": [
"error",
{
varsIgnorePattern: "^_",
argsIgnorePattern: "^_",
},
],
"@typescript-eslint/no-invalid-void-type": [
"error",
{
allowAsThisParameter: true,
},
],
},
},
{
ignores: [
"eslint.config.mjs",
"vite.config.ts",
"vite.config.ts*",
"test/examples/*.js",
"**/*.test.ts",
"dist",
"coverage",
".wireit",
],
},
];
}
); No newline at end of file
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Missing ignores block: ESLint will attempt to lint dist/ and coverage/ directories

The previous FlatCompat-based config had an explicit ignores array for generated output directories. ESLint 9 flat config only ignores **/node_modules/** and .git/** by default — dist/ and coverage/ are not excluded. Running eslint . from any package will now try to parse compiled output files, causing parse errors (e.g., CJS wrappers, minified bundles) and likely breaking wireit lint tasks.

🛠️ Proposed fix
 import eslint from "@eslint/js";
 import tseslint from "typescript-eslint";
 import pluginReact from "eslint-plugin-react";

 export default tseslint.config(
+  {
+    ignores: ["**/dist/**", "**/coverage/**", "**/playwright-report/**"],
+  },
   eslint.configs.recommended,
   tseslint.configs.strict,
   pluginReact.configs.flat.recommended,
   pluginReact.configs.flat["jsx-runtime"],
   {
     settings: {
       react: {
         version: "detect",
       },
     },
   }
 );
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export default tseslint.config(
eslint.configs.recommended,
tseslint.configs.strict,
pluginReact.configs.flat.recommended,
pluginReact.configs.flat["jsx-runtime"],
{
files: ["src/**/*.ts", "src/**/*.tsx"],
settings: {
react: {
version: "detect",
},
},
rules: {
"@typescript-eslint/semi": [2, "always"],
"@typescript-eslint/non-nullable-type-assertion-style": "off",
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/explicit-module-boundary-types": "off",
"@typescript-eslint/no-empty-interface": [
"error",
{
allowSingleExtends: true,
},
],
"@typescript-eslint/no-unused-vars": [
"error",
{
varsIgnorePattern: "^_",
argsIgnorePattern: "^_",
},
],
"@typescript-eslint/no-invalid-void-type": [
"error",
{
allowAsThisParameter: true,
},
],
},
},
{
ignores: [
"eslint.config.mjs",
"vite.config.ts",
"vite.config.ts*",
"test/examples/*.js",
"**/*.test.ts",
"dist",
"coverage",
".wireit",
],
},
];
}
);
export default tseslint.config(
{
ignores: ["**/dist/**", "**/coverage/**", "**/playwright-report/**"],
},
eslint.configs.recommended,
tseslint.configs.strict,
pluginReact.configs.flat.recommended,
pluginReact.configs.flat["jsx-runtime"],
{
settings: {
react: {
version: "detect",
},
},
}
);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@eslint.config-ts.mjs` around lines 5 - 17, Add an "ignores" block to the
top-level tseslint.config call so ESLint doesn't attempt to lint generated
output; update the config passed to tseslint.config (the object after
pluginReact.configs.flat["jsx-runtime"]) to include an ignores array containing
at least "dist/**" and "coverage/**" (so the exported config from
tseslint.config and the settings.react.version="detect" remain unchanged while
ESLint skips those generated directories).

"wireit": "^0.14.4"
"@vitest/coverage-istanbul": "^4.1.5",
"@vitest/coverage-v8": "^4.1.5",
"typescript": "^6.0.3",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find all tsconfig files and check for deprecated options and missing "types" arrays
echo "=== tsconfig files without explicit 'types' array ==="
fd 'tsconfig.*\.json' --exclude 'node_modules' --exec grep -L '"types"' {}

echo ""
echo "=== tsconfig files using deprecated 'target: es5' ==="
rg -n --type=json '"target"\s*:\s*"es5"' --glob 'tsconfig*.json' --glob '!*node_modules*'

echo ""
echo "=== tsconfig files using deprecated moduleResolution: node ==="
rg -n --type=json '"moduleResolution"\s*:\s*"node"' --glob 'tsconfig*.json' --glob '!*node_modules*'

echo ""
echo "=== tsconfig files using deprecated baseUrl ==="
rg -n --type=json '"baseUrl"' --glob 'tsconfig*.json' --glob '!*node_modules*'

Repository: cefn/watchable

Length of output: 1371


🏁 Script executed:

#!/bin/bash

echo "=== tsconfig files using deprecated 'esModuleInterop: false' ==="
rg -n --type=json '"esModuleInterop"\s*:\s*false' --glob 'tsconfig*.json' --glob '!*node_modules*'

echo ""
echo "=== Sample tsconfig files with 'types' array defined ==="
rg -n --type=json '"types"' --glob 'tsconfig*.json' --glob '!*node_modules*' -A 2

echo ""
echo "=== Check the main tsconfig.build.json for deprecated options ==="
head -50 tsconfig.build.json

Repository: cefn/watchable

Length of output: 9286


🏁 Script executed:

#!/bin/bash

echo "=== Check extends field in package tsconfig files ==="
cat packages/store/tsconfig.json
echo ""
cat packages/store/tsconfig.test.json
echo ""

echo "=== Check extends in app tsconfig files without explicit types ==="
cat apps/counter-dom-ts/tsconfig.json
echo ""

echo "=== Check if main tsconfig.json extends base ==="
head -20 tsconfig.json

Repository: cefn/watchable

Length of output: 1557


TypeScript 6.0 upgrade requires fixing deprecated options and type resolution in inherited configs

The monorepo is partially prepared for TypeScript 6.0, but several critical issues remain:

  1. Base config (tsconfig.build.json): Uses deprecated target: "es5", which will become a hard error in TypeScript 7.0. This affects all package configs that extend it.

  2. App configs: Six app tsconfig files use esModuleInterop: false (deprecated). One or more use deprecated moduleResolution: "Node" instead of "bundler".

  3. Package production configs: Package tsconfig.json files (e.g., packages/store/tsconfig.json) don't define explicit "types" arrays. They extend tsconfig.build.json, which has "types" commented out. With TypeScript 6.0's empty array default, these will lose implicit type resolution unless the inheritance chain is fixed.

Test configs are properly configured with explicit "types": ["node"], so no changes needed there.

Fix tsconfig.build.json first (remove es5, uncomment and populate types), then update app configs to remove deprecated options before upgrading to TypeScript 6.0.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/store/package.json` at line 64, Update the shared and package TS
configs to be TS6-ready: edit tsconfig.build.json to remove the deprecated
target "es5" (set a modern target like "es2017" or omit it) and
uncomment/populate the "types" array (e.g., ["node"]) so inheriting configs
retain type resolution; then update app tsconfig files to remove deprecated
esModuleInterop:false and change any moduleResolution:"Node" to
moduleResolution:"bundler"; finally ensure package-level tsconfig.json files
(e.g., the one extending tsconfig.build.json) explicitly define a "types" array
if they rely on node types so they won't be dropped by TS6 defaults.

},
"devDependencies": {
"@types/node": "^20.11.5",
"@types/node": "^25.6.0",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

@types/node version ^25 doesn't match the Node 26 runtime pinned in .nvmrc

@types/node tracks Node.js major versions — ^25.6.0 types Node 25.x APIs. Node.js 26 ships a combination of JavaScript engine improvements, new platform APIs, and long-overdue cleanup of legacy internals. New APIs introduced in Node 26 (e.g. Temporal, updated stream behavior) won't be present in @types/node@^25. Update to ^26` to stay in sync with the runtime.

🛠️ Proposed fix
-    "@types/node": "^25.6.0",
+    "@types/node": "^26.0.0",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"@types/node": "^25.6.0",
"@types/node": "^26.0.0",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/unpromise/package.json` at line 47, The package.json currently pins
the dev dependency "@types/node" to "^25.6.0" which mismatches the project's
Node 26 runtime; update the version string for the "@types/node" entry in
package.json to "^26.x" (e.g., "^26.0.0" or "^26") and then run your package
manager (npm/yarn/pnpm) to reinstall/lock updated types so the TypeScript
definitions align with Node 26 runtime APIs.

@cefn cefn force-pushed the refresh-packages branch from bf63f6f to 723f95a Compare May 7, 2026 13:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant