diff --git a/.changeset/jsx-tokenizer-solid2-migration.md b/.changeset/jsx-tokenizer-solid2-migration.md
new file mode 100644
index 000000000..ad399a847
--- /dev/null
+++ b/.changeset/jsx-tokenizer-solid2-migration.md
@@ -0,0 +1,26 @@
+---
+"@solid-primitives/jsx-tokenizer": major
+---
+
+Migrate to Solid.js v2.0 (beta.10)
+
+## Breaking Changes
+
+**Peer dependencies**: `solid-js@^2.0.0-beta.10` and `@solidjs/web@^2.0.0-beta.10` are now required.
+
+### API changes
+
+- `isServer` is now imported from `@solidjs/web` (not `solid-js/web`)
+- `JSX` types are now imported from `@solidjs/web`
+- `ResolvedJSXElement` type renamed to `ResolvedElement` (from `solid-js`) in `resolveTokens` overloads
+- `renderToString` in SSR tests moved to `@solidjs/web`
+
+### Usage changes
+
+- `createEffect` now requires the split compute/apply form — update any `createEffect` calls in consuming code
+- Context is now its own provider: `` replaces ``
+- `classList` is replaced by the `class` object/array form
+
+### Vitest config
+
+- Added `moduleName: "@solidjs/web"` to the shared vitest config `solid` option so JSX transforms target `@solidjs/web` instead of the removed `solid-js/web` subpath. This affects all packages with `.tsx` test files.
diff --git a/configs/vitest.config.ts b/configs/vitest.config.ts
index 611f49a6f..f2d2194a2 100644
--- a/configs/vitest.config.ts
+++ b/configs/vitest.config.ts
@@ -23,7 +23,7 @@ export default defineConfig(({ mode }) => {
// https://github.com/solidjs/solid-refresh/issues/29
hot: false,
// For testing SSR we need to do a SSR JSX transform
- solid: { generate: testSSR ? "ssr" : "dom", omitNestedClosingTags: false },
+ solid: { generate: testSSR ? "ssr" : "dom", omitNestedClosingTags: false, moduleName: "@solidjs/web" },
}),
],
test: {
diff --git a/packages/jsx-tokenizer/README.md b/packages/jsx-tokenizer/README.md
index aae49a85e..2c46638aa 100644
--- a/packages/jsx-tokenizer/README.md
+++ b/packages/jsx-tokenizer/README.md
@@ -124,7 +124,7 @@ function Tabs(props: { children: (Tab: Component<{ value: T }>) => JSX.Elemen
return (
- {token =>
{token.data}
}
+ {token =>
{token.data}
}
);
@@ -163,13 +163,14 @@ import { resolveTokens } from "@solid-primitives/jsx-tokenizer";
const tokens = resolveTokens(tokenizer, () => props.children);
-createEffect(() => {
- tokens().forEach(token => {
+createEffect(
+ () => tokens(),
+ tokens => {
// token is a function that returns the JSX Element fallback
// token.data is the data returned by the tokenData function
- console.log(token.data);
- });
-});
+ tokens.forEach(token => console.log(token.data));
+ }
+);
// the return value of resolveTokens can be used in JSX (will render the fallback JSX Elements)
return <>{els()}>;
@@ -188,17 +189,20 @@ const els = resolveTokens(tokenizer, () => props.children, {
includeJSXElements: true,
});
-createEffect(() => {
- els().forEach(el => {
- if (!isToken(tokenizer, el)) {
- // el is a normal JSX Element
- return;
- }
- // token is a function that returns the JSX Element fallback
- // token.data is the data returned by the tokenData function
- console.log(token.data);
- });
-});
+createEffect(
+ () => els(),
+ els => {
+ els.forEach(el => {
+ if (!isToken(tokenizer, el)) {
+ // el is a normal JSX Element
+ return;
+ }
+ // token is a function that returns the JSX Element fallback
+ // token.data is the data returned by the tokenData function
+ console.log(el.data);
+ });
+ }
+);
// the return value of resolveTokens can be used in JSX
return <>{els()}>;
@@ -221,7 +225,7 @@ Since `resolveTokens` is eagerly resolving the JSX structure, if you want to pro
```tsx
function ParentComponent(props) {
return (
-
+
{untrack(() => {
const tokens = resolveTokens(tokenizer, () => props.children);
@@ -229,7 +233,7 @@ function ParentComponent(props) {
return <>{tokens()}>;
})}
-
+
);
}
```
@@ -243,13 +247,13 @@ For example, [`@solidjs/router`](https://github.com/solidjs/solid-router) which
function App() {
return (
-
+
{/*
component prop is not rendered immediately, it is rendered within
as later time, so the context will not be available in Home component
*/}
-
+
);
}
@@ -262,11 +266,11 @@ function Home() {
// do this instead
function App() {
return (
-
+
-
+
);
}
```
@@ -291,10 +295,6 @@ token; // token is typed as UnionOfAcceptedTokens
isToken([tokenizer1, tokenizer2, MyTokenComponent], token);
```
-## Demo
-
-[Live Example](https://primitives.solidjs.community/playground/jsx-tokenizer) | [Source Code](./dev/index.tsx)
-
## Changelog
See [CHANGELOG.md](./CHANGELOG.md)
diff --git a/packages/jsx-tokenizer/dev/index.tsx b/packages/jsx-tokenizer/dev/index.tsx
deleted file mode 100644
index 4e4b8f5bc..000000000
--- a/packages/jsx-tokenizer/dev/index.tsx
+++ /dev/null
@@ -1,95 +0,0 @@
-import { type Component, type JSX, type ParentComponent } from "solid-js";
-
-import { createTokenizer, createToken, isToken, resolveTokens } from "../src/index.js";
-
-type Props = {
- value: number;
- children?: JSX.Element;
-};
-
-const parser = createTokenizer<{
- id: "Value" | "Add";
- props: Props;
-}>({ name: "calculator" });
-
-const Calculator: ParentComponent = props => {
- const tokens = resolveTokens([parser, Subtract], () => props.children, {
- includeJSXElements: true,
- });
-
- const calculation = () => {
- let result = 0;
- tokens().forEach(el => {
- if (!isToken([parser, Subtract], el)) {
- console.info("not a token element:", el);
- return;
- }
- console.info("token element:", el);
- const data = el.data;
- console.info("token data is", data);
- if (data.id === "Value") {
- result = data.props.value;
- } else if (data.id === "Add") {
- result += data.props.value;
- } else if (data.id === "Subtract") {
- result -= data.props.value;
- }
- console.info("result is", result);
- });
- return result;
- };
-
- return (
-