Skip to content

fix: bundle remark/unified deps to resolve Vitest jsdom compatibility - #45

Open
DavidsonRafaelK wants to merge 1 commit into
andi23rosca:mainfrom
DavidsonRafaelK:fix/bundle-deps-vitest-compat
Open

fix: bundle remark/unified deps to resolve Vitest jsdom compatibility#45
DavidsonRafaelK wants to merge 1 commit into
andi23rosca:mainfrom
DavidsonRafaelK:fix/bundle-deps-vitest-compat

Conversation

@DavidsonRafaelK

Copy link
Copy Markdown

Summary

Fixes #27solid-markdown v2 causes TypeError: util.deprecate is not a function when used in Vitest with a jsdom environment.

The root cause is that remark-parse, unified, and other runtime deps are listed under dependencies, so they are not bundled into the library output. Consumers' bundlers have to resolve them directly, and when Vitest resolves micromark (a transitive dep of remark-parse) with the "development" export condition, it pulls in debug → Node.js util — which is externalized in jsdom and breaks.

What changes

Moved all runtime dependencies (remark-parse, remark-rehype, unified, vfile, unist-util-visit, property-information, comma-separated-tokens, space-separated-tokens, style-to-object) from dependencies to devDependencies.

tsup automatically externalizes packages in dependencies but bundles packages in devDependencies. With this change, the entire unified/remark pipeline is bundled into dist/, so consumers never resolve micromark themselves — the issue goes away entirely.

solid-js stays as the only peerDependency, nothing else changes.

Known issues

  • The bundled output size will increase since the remark/unified pipeline is now inlined. This is a tradeoff — most component libraries bundle their deps anyway, and it avoids leaking transitive dependency issues to consumers.
  • pnpm-lock.yaml is not updated in this PR since it would need a fresh pnpm install. The lockfile will be regenerated on the next install.

Notes for review

  • Only package.json is changed — no source code modifications needed.
  • The fix is minimal and targeted: just moving deps between sections, no new dependencies added.
  • Consumers who depend on deduplicating unified or remark-parse with their own copies may see slightly larger bundle sizes, but this is the standard approach for Solid component libraries using tsup-preset-solid.

rigel-mintaka added a commit to RigelBuild/solid-markdown that referenced this pull request Aug 22, 2026
Replaces the Solid-1 upstream renderer with the react-markdown-10 API
(upstream PR andi23rosca#44 + andi23rosca#45), re-ported to Solid 2, and ships the bun test
harness that runs the component suite. Supersedes the earlier draft of
this PR, which was based on the pnpm+vitest toolchain that `main` retired
when it converted to bun + biome.

## Source

- `src/index.tsx` — the react-markdown-10 renderer (`Markdown`,
  `MarkdownAsync`, `MarkdownResource`, `defaultUrlTransform`) built on
  `hast-util-to-jsx-runtime`, re-ported to Solid 2 (`@solidjs/web`,
  `createStore`/`reconcile`, owned-write signals).
- `src/jsx-runtime.ts` — fork-local JSX runtime for
  `hast-util-to-jsx-runtime` over Solid-2 primitives, replacing the
  Solid-1-bound `solid-jsx` dependency.
- `src/types.ts` — public option/component types over `@solidjs/web` `JSX`.
- Retires the Solid-1 renderer: `renderer.tsx`, `rehype-filter.ts`,
  `utils.ts`, `utils.test.ts`.

## Test harness (bun)

`main` runs `bun test`, which has no Vite pipeline and no Solid JSX
transform, so the Solid-2 component suite needs a harness:

- `test/setup.ts` — a `Bun.plugin` preload that runs `babel-preset-solid`
  over `.tsx` sources (`SOLID_GENERATE` picks `dom` vs `ssr` output) and
  registers happy-dom globals for the client leg only.
- `bunfig.toml` — wires the preload into `bun test`.
- Two legs mirror the retired vitest `--mode ssr` split:
  `test:client` (happy-dom, `--conditions=browser --conditions=development`)
  and `test:ssr` (node env, `--conditions=development` for `devlop`
  assertion messages). `bun run test` runs both.
- `test/client.test.tsx` (11) + `test/server.test.tsx` (20) converted from
  vitest to `bun:test`; `@solidjs/testing-library` bumped to `1.0.0-beta.2`
  (the Solid-2 line — imports from `@solidjs/web`, drops the removed
  `onError`, which bun's strict ESM rejects where vitest silently tolerated).

## Packaging

- `package.json` — Solid-2 peers (`solid-js`, `@solidjs/web` `^2.0.0-rc.0`),
  `3.0.0-rc.0`, bun harness devDeps, two-leg test scripts.
- `biome.json` — disables the React-specific `noChildrenProp` rule
  (`children` as a prop is this package's public API).
- `.github/workflows/ci.yml` + `publish.yml` — run `bun run test` (both
  legs); `publish.yml` converted pnpm -> bun, tag-driven, dist-tag aware
  (`next` for prereleases, `latest` otherwise).

Spec-impact: none. Refs RIG-2187, RIG-2358.

Co-authored-by: Matt Wilkinson <matt@rigel.build>
rigel-mintaka added a commit to RigelBuild/solid-markdown that referenced this pull request Aug 22, 2026
… bun

Replaces the Solid-1 upstream renderer with the react-markdown-10 API
(upstream PR andi23rosca#44 + andi23rosca#45), re-ported to Solid 2, and ships the bun test
harness + bun build that the fork's bun + biome toolchain needs.

## Source

- `src/index.tsx` — the react-markdown-10 renderer (`Markdown`,
  `MarkdownAsync`, `MarkdownResource`, `defaultUrlTransform`) built on
  `hast-util-to-jsx-runtime`, re-ported to Solid 2 (`@solidjs/web`,
  `createStore`/`reconcile`, owned-write signals).
- `src/jsx-runtime.ts` — fork-local JSX runtime for
  `hast-util-to-jsx-runtime` over Solid-2 primitives, replacing the
  Solid-1-bound `solid-jsx` dependency.
- `src/types.ts` — public option/component types over `@solidjs/web` `JSX`.
- Retires the Solid-1 renderer: `renderer.tsx`, `rehype-filter.ts`,
  `utils.ts`, `utils.test.ts`.

## Build (bun)

The prior `tsup` + `tsup-preset-solid` + `esbuild-plugin-solid` chain was
hard-pinned to `babel-preset-solid@1` (Solid 1) and emitted the removed
`solid-js/web` import subpath, so the published dist threw
`ERR_PACKAGE_PATH_NOT_EXPORTED` on load under the Solid-2 peer. Replaced
with `build.ts`, a `bun build` script running `babel-preset-solid@2` (the
same transform the test harness uses):

- Emits the six export-condition variants (dom prod/dev, ssr, and the
  JSX-preserving `.jsx` for the `solid` condition) + `index.d.ts` via `tsc`.
- `scripts/smoke-dist.ts` imports every compiled entry and asserts the
  public API resolves — chained into `build` and run in CI + before publish,
  so a dead-on-arrival bundle fails the gate (nothing else imports `dist`).
- Runtime deps moved from `devDependencies` to `dependencies` (they are
  externalized in dist and must install for consumers); dead deps and the
  retired tsup/esbuild toolchain removed.

## Test harness (bun)

`bun test` has no Vite pipeline and no Solid JSX transform, so the Solid-2
suite needs a harness:

- `test/setup.ts` — a `Bun.plugin` preload that runs `babel-preset-solid`
  over `.tsx` sources (`SOLID_GENERATE` picks `dom` vs `ssr`) and registers
  happy-dom globals for the client leg only.
- `bunfig.toml` — wires the preload into `bun test`.
- Two legs mirror the retired vitest `--mode ssr` split:
  `test:client` (happy-dom, `--conditions=browser --conditions=development`)
  and `test:ssr` (node env, `--conditions=development` for `devlop`
  assertion messages). `bun run test` runs both.
- `test/client.test.tsx` (11) + `test/server.test.tsx` (20) converted from
  vitest to `bun:test`; `@solidjs/testing-library` bumped to `1.0.0-beta.2`
  (the Solid-2 line — imports from `@solidjs/web`, drops the removed
  `onError`, which bun's strict ESM rejects where vitest silently tolerated).

## Packaging

- `package.json` — Solid-2 peers (`solid-js`, `@solidjs/web` `^2.0.0-rc.0`),
  `3.0.0-rc.0`, runtime `dependencies` + bun harness/build devDeps, two-leg
  test scripts, `bun run build.ts` build.
- `biome.json` — disables the React-specific `noChildrenProp` rule
  (`children` as a prop is this package's public API).
- `.github/workflows/ci.yml` + `publish.yml` — run `bun run test` (both
  legs) + `bun run build` (which self-verifies via the dist smoke check);
  `publish.yml` converted pnpm -> bun, tag-driven, dist-tag aware.

Spec-impact: none. Refs RIG-2187, RIG-2358.

Co-authored-by: Matt Wilkinson <matt@rigel.build>
rigel-mintaka added a commit to RigelBuild/solid-markdown that referenced this pull request Aug 22, 2026
… bun

Replaces the Solid-1 upstream renderer with the react-markdown-10 API
(upstream PR andi23rosca#44 + andi23rosca#45), re-ported to Solid 2, and ships the bun test
harness + bun build that the fork's bun + biome toolchain needs.

## Source

- `src/index.tsx` — the react-markdown-10 renderer (`Markdown`,
  `MarkdownAsync`, `MarkdownResource`, `defaultUrlTransform`) built on
  `hast-util-to-jsx-runtime`, re-ported to Solid 2 (`@solidjs/web`,
  `createStore`/`reconcile`, owned-write signals).
- `src/jsx-runtime.ts` — fork-local JSX runtime for
  `hast-util-to-jsx-runtime` over Solid-2 primitives, replacing the
  Solid-1-bound `solid-jsx` dependency.
- `src/types.ts` — public option/component types over `@solidjs/web` `JSX`.
- Retires the Solid-1 renderer: `renderer.tsx`, `rehype-filter.ts`,
  `utils.ts`, `utils.test.ts`.

## Build (bun)

`build.ts` builds `dist/` with `babel-preset-solid@2` (the Solid compiler)
as the one transform, in two output modes:

- Compiled (`index.js` dom/prod, `dev.js` dom/dev, `server.js` ssr) — Solid
  compiles the JSX to `@solidjs/web` runtime calls, then `bun build` bundles
  the now JSX-free modules. `bun build` never sees JSX.
- Source (`index.jsx` + a sibling `jsx-runtime.js`) — babel strips types but
  leaves the JSX untransformed, written directly, so the `solid` export
  condition ships raw JSX for a consuming app's own Solid compiler (matching
  its exact `solid-js` version and generate settings). This variant is not
  routed through `bun build`, whose own automatic JSX-runtime transform would
  emit a `@solidjs/web/jsx-dev-runtime` import that subpath does not provide.
- `index.d.ts` via `tsc --project tsconfig.build.json`.
- `scripts/smoke-dist.ts` guards the published artifact: imports each compiled
  entry and asserts the public API resolves, and compiles the `.jsx` source
  entry the way a consumer would, asserting it targets `@solidjs/web` and never
  a removed subpath. Chained into `build` and run in CI + before publish, so a
  dead-on-arrival bundle fails the gate (nothing else imports `dist`).
- Runtime deps are declared under `dependencies` (externalized in dist);
  peer deps under `peerDependencies`; build/harness tooling under
  `devDependencies`.

## Test harness (bun)

`bun test` has no Vite pipeline and no Solid JSX transform, so the Solid-2
suite needs a harness:

- `test/setup.ts` — a `Bun.plugin` preload that runs `babel-preset-solid`
  over `.tsx` sources (`SOLID_GENERATE` picks `dom` vs `ssr`) and registers
  happy-dom globals for the client leg only.
- `bunfig.toml` — wires the preload into `bun test`.
- Two legs mirror the retired vitest `--mode ssr` split:
  `test:client` (happy-dom, `--conditions=browser --conditions=development`)
  and `test:ssr` (node env, `--conditions=development` for `devlop`
  assertion messages). `bun run test` runs both.
- `test/client.test.tsx` (11) + `test/server.test.tsx` (20) converted from
  vitest to `bun:test`; `@solidjs/testing-library` bumped to `1.0.0-beta.2`
  (the Solid-2 line — imports from `@solidjs/web`, drops the removed
  `onError`, which bun's strict ESM rejects where vitest silently tolerated).

## Packaging

- `package.json` — Solid-2 peers (`solid-js`, `@solidjs/web` `^2.0.0-rc.0`),
  `3.0.0-rc.0`, runtime `dependencies` + bun harness/build devDeps, two-leg
  test scripts, `bun run build.ts` build.
- `biome.json` — disables the React-specific `noChildrenProp` rule
  (`children` as a prop is this package's public API).
- `.github/workflows/ci.yml` + `publish.yml` — run `bun run test` (both
  legs) + `bun run build` (which self-verifies via the dist smoke check);
  `publish.yml` converted pnpm -> bun, tag-driven, dist-tag aware.

Spec-impact: none. Refs RIG-2187, RIG-2358.

Co-authored-by: Matt Wilkinson <matt@rigel.build>
mattwilkinsonn added a commit to RigelBuild/solid-markdown that referenced this pull request Aug 22, 2026
… bun (#1)

Replaces the Solid-1 upstream renderer with the react-markdown-10 API
(upstream PR andi23rosca#44 + andi23rosca#45), re-ported to Solid 2, and ships the bun test
harness + bun build that the fork's bun + biome toolchain needs.

## Source

- `src/index.tsx` — the react-markdown-10 renderer (`Markdown`,
  `MarkdownAsync`, `MarkdownResource`, `defaultUrlTransform`) built on
  `hast-util-to-jsx-runtime`, re-ported to Solid 2 (`@solidjs/web`,
  `createStore`/`reconcile`, owned-write signals).
- `src/jsx-runtime.ts` — fork-local JSX runtime for
  `hast-util-to-jsx-runtime` over Solid-2 primitives, replacing the
  Solid-1-bound `solid-jsx` dependency.
- `src/types.ts` — public option/component types over `@solidjs/web` `JSX`.
- Retires the Solid-1 renderer: `renderer.tsx`, `rehype-filter.ts`,
  `utils.ts`, `utils.test.ts`.

## Build (bun)

`build.ts` builds `dist/` with `babel-preset-solid@2` (the Solid compiler)
as the one transform, in two output modes:

- Compiled (`index.js` dom/prod, `dev.js` dom/dev, `server.js` ssr) — Solid
  compiles the JSX to `@solidjs/web` runtime calls, then `bun build` bundles
  the now JSX-free modules. `bun build` never sees JSX.
- Source (`index.jsx` + a sibling `jsx-runtime.js`) — babel strips types but
  leaves the JSX untransformed, written directly, so the `solid` export
  condition ships raw JSX for a consuming app's own Solid compiler (matching
  its exact `solid-js` version and generate settings). This variant is not
  routed through `bun build`, whose own automatic JSX-runtime transform would
  emit a `@solidjs/web/jsx-dev-runtime` import that subpath does not provide.
- `index.d.ts` via `tsc --project tsconfig.build.json`.
- `scripts/smoke-dist.ts` guards the published artifact: imports each compiled
  entry and asserts the public API resolves, and compiles the `.jsx` source
  entry the way a consumer would, asserting it targets `@solidjs/web` and never
  a removed subpath. Chained into `build` and run in CI + before publish, so a
  dead-on-arrival bundle fails the gate (nothing else imports `dist`).
- Runtime deps are declared under `dependencies` (externalized in dist);
  peer deps under `peerDependencies`; build/harness tooling under
  `devDependencies`.

## Test harness (bun)

`bun test` has no Vite pipeline and no Solid JSX transform, so the Solid-2
suite needs a harness:

- `test/setup.ts` — a `Bun.plugin` preload that runs `babel-preset-solid`
  over `.tsx` sources (`SOLID_GENERATE` picks `dom` vs `ssr`) and registers
  happy-dom globals for the client leg only.
- `bunfig.toml` — wires the preload into `bun test`.
- Two legs mirror the retired vitest `--mode ssr` split:
  `test:client` (happy-dom, `--conditions=browser --conditions=development`)
  and `test:ssr` (node env, `--conditions=development` for `devlop`
  assertion messages). `bun run test` runs both.
- `test/client.test.tsx` (11) + `test/server.test.tsx` (20) converted from
  vitest to `bun:test`; `@solidjs/testing-library` bumped to `1.0.0-beta.2`
  (the Solid-2 line — imports from `@solidjs/web`, drops the removed
  `onError`, which bun's strict ESM rejects where vitest silently tolerated).

## Packaging

- `package.json` — Solid-2 peers (`solid-js`, `@solidjs/web` `^2.0.0-rc.0`),
  `3.0.0-rc.0`, runtime `dependencies` + bun harness/build devDeps, two-leg
  test scripts, `bun run build.ts` build.
- `biome.json` — disables the React-specific `noChildrenProp` rule
  (`children` as a prop is this package's public API).
- `.github/workflows/ci.yml` + `publish.yml` — run `bun run test` (both
  legs) + `bun run build` (which self-verifies via the dist smoke check);
  `publish.yml` converted pnpm -> bun, tag-driven, dist-tag aware.

Spec-impact: none. Refs RIG-2187, RIG-2358.

Co-authored-by: Matt Wilkinson <matt@rigel.build>
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.

solid-markdown v2 causes Vitest tests to error

1 participant