Skip to content

fix(cicd): bump stack to Node 22 (TW v4 / @tailwindcss/oxide need >=20)#153

Merged
programad merged 1 commit into
developfrom
fix/cicd-node-20
May 8, 2026
Merged

fix(cicd): bump stack to Node 22 (TW v4 / @tailwindcss/oxide need >=20)#153
programad merged 1 commit into
developfrom
fix/cicd-node-20

Conversation

@programad
Copy link
Copy Markdown
Contributor

Summary

Second attempt to unblock the v0.5.0 release pipeline. Previous fix (#152, switching to npm ci) didn't help because the actual root cause is the Node engine mismatch, not the lockfile resolution.

Root cause

Logs from the most recent failed prepare-release run reveal:

npm warn EBADENGINE package: '@tailwindcss/oxide@4.2.1',
                     required: { node: '>= 20' },
                     current:  { node: 'v18.20.8', npm: '10.8.2' }

@tailwindcss/oxide is TW v4's Rust-based native core, loaded transitively through @tailwindcss/postcss by packages/tailwind's integration test. Its prebuilt .node binary refuses to load on Node <20 — that's the "Cannot find native binding" we saw at runtime.

Next.js 15 also recommends Node 20+, and the rest of the v4 stack (NativeWind 4, Expo SDK we adopted in packages/native-test) is happiest on a recent Node.

Changes

  • All four GitHub workflows: NODE_VERSION 18.x22.x

    • prepare-release.yml
    • release.yml
    • prepare-preview.yml
    • publish-ignition.yml (default node-version input)
  • .nvmrc added at repo root pinning local dev to Node 22 — matches CI

  • engines.node: ">=20" on the three currently-published packages:

    • rocketicons (packages/icons)
    • @rocketicons/tailwind
    • @rocketicons/utils

    Consumers installing the new release on Node 18 will get a clear EBADENGINE warning at install time instead of a confusing runtime crash from oxide. (We chose >=20 not >=22 for the engines floor — that's the actual constraint from TW v4's oxide rather than our dev-environment preference.)

Why Node 22 (not 20)

22 is current LTS (since Oct 2024) and matches the user's local dev machine. CI on 22 mirrors local. No reason to pin lower.

Verified locally on Node 22.19.0

  • npm run test-all — 79 tests pass (utils 22 + tailwind plugin 57)
  • npm run lint-all — no warnings/errors across all 6 workspaces
  • npm run --workspaces --if-present typecheck — all clean
  • npm run build-all — ignition Next.js 15 build completes (SKIP_GENERATOR_BUILD=true since icons are pre-built)

After merge

PR #151 (develop → main) will auto-resync and prepare-release re-runs against develop on Node 22 — @tailwindcss/oxide should load, integration tests should pass, the releaser should produce a clean tag artifact.

The previous prepare-release run still failed at the @rocketicons/tailwind
integration test even with `npm ci` because the runner was on Node 18, and
@tailwindcss/oxide@4.2.1 (TW v4's native Rust core, loaded via
@tailwindcss/postcss) requires Node >=20 — its native binary refuses to
load on 18 with "Cannot find native binding". Same constraint applies to
Next.js 15 and the rest of the v4 stack we just adopted.

Changes:

- All four GitHub workflows: NODE_VERSION 18.x -> 22.x.
- Add `.nvmrc` pinning local dev to Node 22 (matches CI).
- Set engines.node ">=20" on the three published packages
  (rocketicons, @rocketicons/tailwind, @rocketicons/utils) so consumers
  installing the new release on Node 18 get a clear warning instead of
  a runtime crash from oxide.

Verified locally on Node 22.19.0:

- npm run test-all: 79 tests pass (utils 22 + tailwind 57)
- npm run lint-all: no warnings/errors
- npm run --workspaces typecheck: all 6 packages clean
- npm run build-all: ignition Next 15 build completes

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@programad programad merged commit 69b4b04 into develop May 8, 2026
1 check passed
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