= {
+ get primaryPoint() {
+ return props.target().primaryPoint
+ },
+ get points() {
+ return props.target().points
+ },
+ get content() {
+ return props.target().content
+ },
+ defaultBody,
+ get pinned() {
+ return props.target().pinned
+ },
+ // A stable handler, so `onClick={context.dismiss}` needs no tracking.
+ dismiss: () => untrack(props.target).dismiss(),
+ }
+ const body = props.render(context)
+
+ return {body}
+}
+
+function DefaultTooltipBody(props: {
+ content: ChartTooltipContent | string
+}): Element {
+ return (
+ <>
+ {() => {
+ const content = props.content
+ return typeof content === 'string' ? (
+ content
+ ) : (
+
+ )
+ }}
+ >
+ )
+}
+
+function StructuredTooltipBody(props: {
+ content: ChartTooltipContent
+}): Element {
+ return (
+ <>
+ {props.content.title ? (
+
+ {props.content.color ? (
+
+ ) : null}
+ {props.content.title}
+
+ ) : null}
+ {props.content.rows.length ? (
+
+ ) : null}
+ >
+ )
+}
+
+function TooltipSwatch(props: { color: string }): Element {
+ return (
+
+ )
+}
diff --git a/packages/solid-charts/src/solid2/index.ts b/packages/solid-charts/src/solid2/index.ts
new file mode 100644
index 00000000..b16692b1
--- /dev/null
+++ b/packages/solid-charts/src/solid2/index.ts
@@ -0,0 +1,11 @@
+export { Chart } from './Chart'
+export type {
+ ChartCommonProps,
+ ChartPresentationProps,
+ ChartProps,
+ ChartTooltipBodyRenderContext,
+} from './types'
+export type {
+ DomChartDefinition as ChartDefinition,
+ ChartPoint,
+} from '@tanstack/charts'
diff --git a/packages/solid-charts/src/solid2/types.ts b/packages/solid-charts/src/solid2/types.ts
new file mode 100644
index 00000000..ae3044a4
--- /dev/null
+++ b/packages/solid-charts/src/solid2/types.ts
@@ -0,0 +1,47 @@
+import type { Element } from 'solid-js'
+import type { JSX } from '@solidjs/web'
+import type {
+ ChartHostCommonOptions,
+ ChartHostOptions,
+ ChartTooltipBodyContext,
+ ChartValue,
+} from '@tanstack/charts'
+
+export interface ChartPresentationProps {
+ class?: string
+ style?: JSX.CSSProperties
+}
+
+export interface ChartTooltipBodyRenderContext<
+ TDatum = unknown,
+ TXValue extends ChartValue = ChartValue,
+ TYValue extends ChartValue = ChartValue,
+> extends ChartTooltipBodyContext {
+ defaultBody: Element
+}
+
+export interface ChartTooltipBodyRenderProps<
+ TDatum = unknown,
+ TXValue extends ChartValue = ChartValue,
+ TYValue extends ChartValue = ChartValue,
+> {
+ renderTooltipBody?: (
+ context: ChartTooltipBodyRenderContext,
+ ) => Element
+}
+
+export type ChartCommonProps<
+ TDatum = unknown,
+ TXValue extends ChartValue = ChartValue,
+ TYValue extends ChartValue = ChartValue,
+> = ChartHostCommonOptions &
+ ChartPresentationProps &
+ ChartTooltipBodyRenderProps
+
+export type ChartProps<
+ TDatum = unknown,
+ TXValue extends ChartValue = ChartValue,
+ TYValue extends ChartValue = ChartValue,
+> = ChartHostOptions &
+ ChartPresentationProps &
+ ChartTooltipBodyRenderProps
diff --git a/packages/solid-charts/tsconfig.solid2.json b/packages/solid-charts/tsconfig.solid2.json
new file mode 100644
index 00000000..2b8cfc06
--- /dev/null
+++ b/packages/solid-charts/tsconfig.solid2.json
@@ -0,0 +1,22 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "allowJs": true,
+ "jsx": "preserve",
+ "jsxImportSource": "@solidjs/web",
+ "paths": {
+ "solid-js": ["../solid-2-compat/node_modules/solid-js"],
+ "solid-js/*": ["../solid-2-compat/node_modules/solid-js/*"],
+ "@solidjs/web": ["../solid-2-compat/node_modules/@solidjs/web"],
+ "@solidjs/web/jsx-runtime": [
+ "../solid-2-compat/node_modules/@solidjs/web/types/jsx.d.ts"
+ ]
+ }
+ },
+ "include": [
+ "src/solid2/**/*.ts",
+ "src/solid2/**/*.tsx",
+ "../charts-core/src/solid-solid2.ts"
+ ],
+ "exclude": []
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 65a6b109..9f510368 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -803,6 +803,19 @@ importers:
specifier: 15.15.5
version: 15.15.5(react-native@0.86.2(@babel/core@7.29.7(supports-color@10.2.2))(@react-native-community/cli@20.1.0(supports-color@10.2.2)(typescript@6.0.3))(@react-native/metro-config@0.86.2(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2))(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)
+ packages/solid-2-compat:
+ dependencies:
+ '@solidjs/web':
+ specifier: 2.0.0-rc.19
+ version: 2.0.0-rc.19(solid-js@2.0.0-rc.19)
+ solid-js:
+ specifier: 2.0.0-rc.19
+ version: 2.0.0-rc.19
+ devDependencies:
+ '@solidjs/vite-plugin':
+ specifier: 3.0.0-next.52
+ version: 3.0.0-next.52(@solidjs/web@2.0.0-rc.19(solid-js@2.0.0-rc.19))(solid-js@2.0.0-rc.19)(supports-color@10.2.2)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0))
+
packages/solid-charts:
dependencies:
'@tanstack/charts':
@@ -1751,6 +1764,12 @@ packages:
integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==,
}
+ '@emnapi/core@1.11.3':
+ resolution:
+ {
+ integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==,
+ }
+
'@emnapi/core@1.4.5':
resolution:
{
@@ -1763,6 +1782,12 @@ packages:
integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==,
}
+ '@emnapi/runtime@1.11.3':
+ resolution:
+ {
+ integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==,
+ }
+
'@emnapi/runtime@1.4.5':
resolution:
{
@@ -1781,6 +1806,12 @@ packages:
integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==,
}
+ '@emnapi/wasi-threads@1.2.3':
+ resolution:
+ {
+ integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==,
+ }
+
'@esbuild/aix-ppc64@0.27.7':
resolution:
{
@@ -3894,6 +3925,107 @@ packages:
integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==,
}
+ '@solidjs/babel-plugin@2.0.0-rc.19':
+ resolution:
+ {
+ integrity: sha512-DZTDg989Znh553C/emDjAJXNEe73G+8jYbLyq9kZSB5HV3bTb9yq2PY/qwfM+NiJIA8qRCVMkrW+XsAE+yO6kQ==,
+ }
+ peerDependencies:
+ '@babel/core': ^7.20.12 || ^8.0.0
+ '@tsrx/core': 0.1.63
+ peerDependenciesMeta:
+ '@tsrx/core':
+ optional: true
+
+ '@solidjs/compiler-darwin-arm64@2.0.0-rc.19':
+ resolution:
+ {
+ integrity: sha512-4IM2eXXVffIVGo6ps1dnv3iyR+EBZHP/85FfmyEeOr3LkaAr1uTHr1gtQwdz/Ru670TRzUPNiWDGb7hJWHFEBw==,
+ }
+ cpu: [arm64]
+ os: [darwin]
+
+ '@solidjs/compiler-darwin-x64@2.0.0-rc.19':
+ resolution:
+ {
+ integrity: sha512-YXMya46yTZqgeprZurE7kdbjcm0ky6OyVBWB276SRiWXlp275mnO8rpeT32uyQP8f8qlisjroyVNmPTmLGpEmg==,
+ }
+ cpu: [x64]
+ os: [darwin]
+
+ '@solidjs/compiler-linux-arm64-gnu@2.0.0-rc.19':
+ resolution:
+ {
+ integrity: sha512-aXZ8SEsUJGLji3ilC9m9wpgDTbXxdbngDwQnRdhhdPUaER6nz5YfLd7zzkZpYHNVq+/TcUP7IY3TV3Iq4sfnZw==,
+ }
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@solidjs/compiler-linux-x64-gnu@2.0.0-rc.19':
+ resolution:
+ {
+ integrity: sha512-U6muc1Qz4PCckrquesnhc0/O2+zypV8F+ad0jkYXM+gwdoDFnzFLk1xevJI8uTPOSt4Qdn3LGldBViG9MFoZeQ==,
+ }
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@solidjs/compiler-wasm32-wasi@2.0.0-rc.19':
+ resolution:
+ {
+ integrity: sha512-Y7BM58QTk0aAz5OxrVzTaMvCvw74KEvLWUJXSMJz6txfedpIFzmaATnmVE9Pkyodv801Z3Gnp1fadVNudcA6tw==,
+ }
+ engines: { node: '>=14.0.0' }
+
+ '@solidjs/compiler-win32-x64-msvc@2.0.0-rc.19':
+ resolution:
+ {
+ integrity: sha512-UBjA+xCXCWgH/6gHdlzViKk21XaPAPJZIsnHav5BcpHdyRl2K6kAIzAoPm2IZGH7ZK73TxSxCifMaRWY6Yt3ag==,
+ }
+ cpu: [x64]
+ os: [win32]
+
+ '@solidjs/compiler@2.0.0-rc.19':
+ resolution:
+ {
+ integrity: sha512-1ySojyE1/RXePyoWqm4nXxYWSdrJ4SoxAY8VF2Ac787zGkrme1PKq5fyE1tq/dJxdAAw6Tc2jgAJn0hyq3h9DA==,
+ }
+
+ '@solidjs/signals@2.0.0-rc.19':
+ resolution:
+ {
+ integrity: sha512-Epg4lyelYZnwG152q1U7lXAXp/2/jaQdaRbzh60rcOelSwmCMf/WN6FQuUEUwbn1p/QNyoJzdGSKPajkVe3zOg==,
+ }
+ engines: { node: '>=22.12.0' }
+
+ '@solidjs/vite-plugin@3.0.0-next.52':
+ resolution:
+ {
+ integrity: sha512-Dn4xLGdZxYOFOQpY/wISboBR6sYrfuN2Nxq+h56a6bspCqMq7hhpWYhQwwwo8RvsiVD2/T9o1U76pz/KJ1Wkgw==,
+ }
+ engines: { node: '>=22.12.0' }
+ peerDependencies:
+ '@solidjs/start-devtools': ^1.0.0-next.2
+ '@solidjs/web': ^2.0.0-rc.19
+ '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.0.0 || ^7.0.0
+ solid-js: ^2.0.0-rc.19
+ vite: ^8.0.0 || ^9.0.0
+ peerDependenciesMeta:
+ '@solidjs/start-devtools':
+ optional: true
+ '@testing-library/jest-dom':
+ optional: true
+
+ '@solidjs/web@2.0.0-rc.19':
+ resolution:
+ {
+ integrity: sha512-FTHxQ8aE+vSHWc1exWw2Y+Brb727I4hCiWi+Y0DURbaqCou8xjCTzn8uiPi7mwC1tqpKSWfkn1Iq1ya/Bl9vYQ==,
+ }
+ engines: { node: '>=22.12.0' }
+ peerDependencies:
+ solid-js: ^2.0.0-rc.19
+
'@standard-schema/spec@1.1.0':
resolution:
{
@@ -8841,6 +8973,15 @@ packages:
peerDependencies:
seroval: ^1.0
+ seroval-plugins@1.7.0:
+ resolution:
+ {
+ integrity: sha512-WM4rArfPtLZriTuxC5DBvNulEwAaRcjNe/dkMOEesOcuvXf5nEwKf5Bw3AT92WHohqcc45+57GdtsCuBTI0mjw==,
+ }
+ engines: { node: '>=20' }
+ peerDependencies:
+ seroval: ^1.0
+
seroval@1.5.6:
resolution:
{
@@ -8848,6 +8989,13 @@ packages:
}
engines: { node: '>=10' }
+ seroval@1.7.0:
+ resolution:
+ {
+ integrity: sha512-FU+LUkmDzWNsJ6oubZFN3dGPKny53DRhPJG6nftEaXDL8MIn19+kEE1Gvc+63Go+qPOwVUlKIdKhsu2HN6tksw==,
+ }
+ engines: { node: '>=20' }
+
serve-static@1.16.3:
resolution:
{
@@ -8981,6 +9129,13 @@ packages:
integrity: sha512-sAEXC0Kk0S1EDg+8ysEWJDbYhA3RRoEjwuySUGlKIemeo0I5YZfOyumNjNs9Sv3y2nmhD+0rW66ag2HsMuQiGQ==,
}
+ solid-js@2.0.0-rc.19:
+ resolution:
+ {
+ integrity: sha512-tlA+rZT1n3XkuxW0sMIoRf/QpOa0H9N9ZDrZLQFueUkZp+hElG+EXWBojBYYi4lVBKV8l03RTNgv+lfVCYkp9w==,
+ }
+ engines: { node: '>=22.12.0' }
+
solid-refresh@0.6.3:
resolution:
{
@@ -10745,6 +10900,12 @@ snapshots:
'@emnapi/wasi-threads': 1.2.2
tslib: 2.8.1
+ '@emnapi/core@1.11.3':
+ dependencies:
+ '@emnapi/wasi-threads': 1.2.3
+ tslib: 2.8.1
+ optional: true
+
'@emnapi/core@1.4.5':
dependencies:
'@emnapi/wasi-threads': 1.0.4
@@ -10754,6 +10915,11 @@ snapshots:
dependencies:
tslib: 2.8.1
+ '@emnapi/runtime@1.11.3':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
'@emnapi/runtime@1.4.5':
dependencies:
tslib: 2.8.1
@@ -10766,6 +10932,11 @@ snapshots:
dependencies:
tslib: 2.8.1
+ '@emnapi/wasi-threads@1.2.3':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
'@esbuild/aix-ppc64@0.27.7':
optional: true
@@ -11460,6 +11631,13 @@ snapshots:
'@tybys/wasm-util': 0.10.3
optional: true
+ '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)':
+ dependencies:
+ '@emnapi/core': 1.11.3
+ '@emnapi/runtime': 1.11.3
+ '@tybys/wasm-util': 0.10.3
+ optional: true
+
'@noble/hashes@2.2.0': {}
'@nodelib/fs.scandir@2.1.5':
@@ -12114,6 +12292,70 @@ snapshots:
'@sinclair/typebox@0.27.12': {}
+ '@solidjs/babel-plugin@2.0.0-rc.19(@babel/core@7.29.7(supports-color@10.2.2))':
+ dependencies:
+ '@babel/core': 7.29.7(supports-color@10.2.2)
+ '@babel/helper-module-imports': 7.18.6
+ '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))
+ '@babel/types': 7.29.7
+ html-entities: 2.3.3
+ parse5: 7.3.0
+
+ '@solidjs/compiler-darwin-arm64@2.0.0-rc.19':
+ optional: true
+
+ '@solidjs/compiler-darwin-x64@2.0.0-rc.19':
+ optional: true
+
+ '@solidjs/compiler-linux-arm64-gnu@2.0.0-rc.19':
+ optional: true
+
+ '@solidjs/compiler-linux-x64-gnu@2.0.0-rc.19':
+ optional: true
+
+ '@solidjs/compiler-wasm32-wasi@2.0.0-rc.19':
+ dependencies:
+ '@emnapi/core': 1.11.3
+ '@emnapi/runtime': 1.11.3
+ '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)
+ optional: true
+
+ '@solidjs/compiler-win32-x64-msvc@2.0.0-rc.19':
+ optional: true
+
+ '@solidjs/compiler@2.0.0-rc.19':
+ optionalDependencies:
+ '@solidjs/compiler-darwin-arm64': 2.0.0-rc.19
+ '@solidjs/compiler-darwin-x64': 2.0.0-rc.19
+ '@solidjs/compiler-linux-arm64-gnu': 2.0.0-rc.19
+ '@solidjs/compiler-linux-x64-gnu': 2.0.0-rc.19
+ '@solidjs/compiler-wasm32-wasi': 2.0.0-rc.19
+ '@solidjs/compiler-win32-x64-msvc': 2.0.0-rc.19
+
+ '@solidjs/signals@2.0.0-rc.19': {}
+
+ '@solidjs/vite-plugin@3.0.0-next.52(@solidjs/web@2.0.0-rc.19(solid-js@2.0.0-rc.19))(solid-js@2.0.0-rc.19)(supports-color@10.2.2)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0))':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/core': 7.29.7(supports-color@10.2.2)
+ '@solidjs/babel-plugin': 2.0.0-rc.19(@babel/core@7.29.7(supports-color@10.2.2))
+ '@solidjs/compiler': 2.0.0-rc.19
+ '@solidjs/web': 2.0.0-rc.19(solid-js@2.0.0-rc.19)
+ '@types/babel__core': 7.20.5
+ merge-anything: 5.1.7
+ solid-js: 2.0.0-rc.19
+ vite: 8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)
+ vitefu: 1.1.3(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0))
+ transitivePeerDependencies:
+ - '@tsrx/core'
+ - supports-color
+
+ '@solidjs/web@2.0.0-rc.19(solid-js@2.0.0-rc.19)':
+ dependencies:
+ seroval: 1.7.0
+ seroval-plugins: 1.7.0(seroval@1.7.0)
+ solid-js: 2.0.0-rc.19
+
'@standard-schema/spec@1.1.0': {}
'@standard-schema/utils@0.3.0': {}
@@ -15491,8 +15733,14 @@ snapshots:
dependencies:
seroval: 1.5.6
+ seroval-plugins@1.7.0(seroval@1.7.0):
+ dependencies:
+ seroval: 1.7.0
+
seroval@1.5.6: {}
+ seroval@1.7.0: {}
+
serve-static@1.16.3(supports-color@10.2.2):
dependencies:
encodeurl: 2.0.0
@@ -15574,6 +15822,13 @@ snapshots:
seroval: 1.5.6
seroval-plugins: 1.5.6(seroval@1.5.6)
+ solid-js@2.0.0-rc.19:
+ dependencies:
+ '@solidjs/signals': 2.0.0-rc.19
+ csstype: 3.2.3
+ seroval: 1.7.0
+ seroval-plugins: 1.7.0(seroval@1.7.0)
+
solid-refresh@0.6.3(solid-js@1.9.14)(supports-color@10.2.2):
dependencies:
'@babel/generator': 7.29.7
diff --git a/project.json b/project.json
index 518ce41a..fb9621fe 100644
--- a/project.json
+++ b/project.json
@@ -24,7 +24,7 @@
"typecheck": {
"executor": "nx:run-commands",
"options": {
- "command": "tsc --noEmit --incremental --tsBuildInfoFile .nx/typescript/tsconfig.tsbuildinfo -p tsconfig.json"
+ "command": "tsc --noEmit --incremental --tsBuildInfoFile .nx/typescript/tsconfig.tsbuildinfo -p tsconfig.json && tsc --noEmit -p packages/solid-charts/tsconfig.solid2.json"
},
"outputs": ["{workspaceRoot}/.nx/typescript/tsconfig.tsbuildinfo"]
},
@@ -46,6 +46,18 @@
"command": "vitest run --config vitest.solid-ssr.config.ts"
}
},
+ "test-solid2": {
+ "executor": "nx:run-commands",
+ "options": {
+ "command": "vitest run --config vitest.solid2.config.ts"
+ }
+ },
+ "test-solid2-ssr": {
+ "executor": "nx:run-commands",
+ "options": {
+ "command": "vitest run --config vitest.solid2-ssr.config.ts"
+ }
+ },
"test-svelte": {
"executor": "nx:run-commands",
"options": {
@@ -76,6 +88,8 @@
"test-dom",
"test-solid",
"test-solid-ssr",
+ "test-solid2",
+ "test-solid2-ssr",
"test-svelte",
"test-svelte-ssr",
"test-octane",
@@ -168,6 +182,8 @@
"test-dom",
"test-solid",
"test-solid-ssr",
+ "test-solid2",
+ "test-solid2-ssr",
"test-svelte",
"test-svelte-ssr",
"test-octane",
@@ -195,6 +211,8 @@
"test-dom",
"test-solid",
"test-solid-ssr",
+ "test-solid2",
+ "test-solid2-ssr",
"test-svelte",
"test-svelte-ssr",
"test-octane",
diff --git a/scripts/check-framework-adapters.mjs b/scripts/check-framework-adapters.mjs
index 6eda2947..ee7926e0 100644
--- a/scripts/check-framework-adapters.mjs
+++ b/scripts/check-framework-adapters.mjs
@@ -18,6 +18,11 @@ import { build as viteBuild } from 'vite'
import solid from 'vite-plugin-solid'
import { validatePackedMarkdownLinks } from './packed-markdown-links.mjs'
import { runWithConcurrency } from './run-with-concurrency.mjs'
+import {
+ loadSolid2VitePlugin,
+ solid2CompatRoot,
+ solid2SourceRoot,
+} from './solid-2-compat.mjs'
const execFileAsync = promisify(execFile)
const root = resolve(import.meta.dirname, '..')
@@ -122,9 +127,63 @@ async function buildSolidPackage() {
},
})
await buildDeclarations(packageRoot)
+ await buildSolid2Entry(packageRoot)
await rewriteGeneratedSpecifiers(outputRoot)
}
+async function buildSolid2Entry(packageRoot) {
+ const outputRoot = resolve(packageRoot, 'dist', 'solid2')
+ const solid2 = await loadSolid2VitePlugin()
+ await viteBuild({
+ configFile: false,
+ logLevel: 'silent',
+ root: solid2CompatRoot,
+ plugins: [solid2()],
+ build: {
+ emptyOutDir: false,
+ lib: {
+ entry: resolve(solid2SourceRoot, 'index.ts'),
+ formats: ['es'],
+ },
+ outDir: outputRoot,
+ rollupOptions: {
+ external: (id) =>
+ id.startsWith('@tanstack/charts') ||
+ /^(?:solid-js|@solidjs\/web)(?:\/|$)/u.test(id),
+ output: {
+ entryFileNames: 'index.js',
+ },
+ },
+ },
+ })
+ const typesConfig = ts.getParsedCommandLineOfConfigFile(
+ resolve(packageRoot, 'tsconfig.solid2.json'),
+ {},
+ { ...ts.sys, onUnRecoverableConfigFileDiagnostic: () => {} },
+ )
+ const program = ts.createProgram([resolve(solid2SourceRoot, 'index.ts')], {
+ ...typesConfig.options,
+ declaration: true,
+ emitDeclarationOnly: true,
+ noEmit: false,
+ noEmitOnError: true,
+ incremental: false,
+ allowImportingTsExtensions: false,
+ outDir: outputRoot,
+ rootDir: solid2SourceRoot,
+ skipLibCheck: true,
+ })
+ const diagnostics = ts.getPreEmitDiagnostics(program)
+ if (diagnostics.length) {
+ throw new Error(
+ `Declaration build failed for ${solid2SourceRoot}:\n${formatDiagnostics(
+ diagnostics,
+ )}`,
+ )
+ }
+ assert.equal(program.emit().emitSkipped, false)
+}
+
async function buildSveltePackage() {
await runPnpm(
[
diff --git a/scripts/public-callback-contract.mjs b/scripts/public-callback-contract.mjs
index 048a75fa..a813d71e 100644
--- a/scripts/public-callback-contract.mjs
+++ b/scripts/public-callback-contract.mjs
@@ -474,6 +474,10 @@ const callbackInventory = {
'@tanstack/react-native-charts:src/Tooltip.tsx:NativeChartTooltipProps',
'render resolvePaint',
],
+ [
+ '@tanstack/solid-charts:src/solid2/types.ts:ChartTooltipBodyRenderProps',
+ 'renderTooltipBody',
+ ],
[
'@tanstack/solid-charts:src/types.ts:ChartTooltipBodyRenderProps',
'renderTooltipBody',
diff --git a/scripts/solid-2-compat.mjs b/scripts/solid-2-compat.mjs
new file mode 100644
index 00000000..2976bccf
--- /dev/null
+++ b/scripts/solid-2-compat.mjs
@@ -0,0 +1,46 @@
+import { createRequire } from 'node:module'
+import { resolve } from 'node:path'
+import { pathToFileURL } from 'node:url'
+
+// The Solid 2 entry (`@tanstack/solid-charts/solid2`) lives next to the
+// Solid 1 adapter, while the workspace toolchain stays on Solid 1. The
+// private `@charts-internal/solid-2-compat` package holds the Solid 2 runtime
+// and compiler; these helpers point the Solid 2 sources at it.
+export const solid2CompatRoot = resolve(
+ import.meta.dirname,
+ '..',
+ 'packages',
+ 'solid-2-compat',
+)
+export const solid2SourceRoot = resolve(
+ import.meta.dirname,
+ '..',
+ 'packages',
+ 'solid-charts',
+ 'src',
+ 'solid2',
+)
+const solid2Runtime = /^(?:solid-js|@solidjs\/web)(?:\/|$)/u
+const compatImporter = resolve(solid2CompatRoot, 'package.json')
+
+export async function loadSolid2VitePlugin() {
+ const entry = createRequire(compatImporter).resolve('@solidjs/vite-plugin')
+ const module = await import(
+ pathToFileURL(entry.replace(/cjs\/index\.cjs$/u, 'esm/index.mjs')).href
+ )
+ return module.default
+}
+
+export function solid2RuntimeResolver() {
+ return {
+ name: 'charts:solid-2-runtime',
+ enforce: 'pre',
+ resolveId(source, _importer, options) {
+ if (!solid2Runtime.test(source)) return null
+ return this.resolve(source, compatImporter, {
+ ...options,
+ skipSelf: true,
+ })
+ },
+ }
+}
diff --git a/scripts/workspace-packages.test.mjs b/scripts/workspace-packages.test.mjs
index 84193d84..1c7857c4 100644
--- a/scripts/workspace-packages.test.mjs
+++ b/scripts/workspace-packages.test.mjs
@@ -17,6 +17,7 @@ const internalPackages = [
['examples/sandbox', 'sandbox'],
['packages/charts-fixtures', 'fixtures'],
['packages/react-18-compat', 'react-18-compat'],
+ ['packages/solid-2-compat', 'solid-2-compat'],
]
describe('workspace package boundaries', () => {
diff --git a/tsconfig.json b/tsconfig.json
index 0d9a8a18..90aa929a 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -27,5 +27,10 @@
"scripts/**/*.mjs",
"vitest.config.ts"
],
- "exclude": ["node_modules", "packages/*/dist"]
+ "exclude": [
+ "node_modules",
+ "packages/*/dist",
+ "packages/solid-charts/src/solid2",
+ "packages/charts-core/src/solid-solid2.ts"
+ ]
}
diff --git a/vitest.solid-ssr.config.ts b/vitest.solid-ssr.config.ts
index 7dd2c570..484a7897 100644
--- a/vitest.solid-ssr.config.ts
+++ b/vitest.solid-ssr.config.ts
@@ -1,10 +1,11 @@
import solid from 'vite-plugin-solid'
-import { defineConfig } from 'vitest/config'
+import { configDefaults, defineConfig } from 'vitest/config'
export default defineConfig({
plugins: [solid({ ssr: true })],
test: {
environment: 'node',
include: ['packages/solid-charts/**/*.ssr.test.tsx'],
+ exclude: [...configDefaults.exclude, 'packages/solid-charts/src/solid2/**'],
},
})
diff --git a/vitest.solid2-ssr.config.ts b/vitest.solid2-ssr.config.ts
new file mode 100644
index 00000000..c2a0584b
--- /dev/null
+++ b/vitest.solid2-ssr.config.ts
@@ -0,0 +1,19 @@
+import { defineConfig } from 'vitest/config'
+import {
+ loadSolid2VitePlugin,
+ solid2CompatRoot,
+ solid2RuntimeResolver,
+ solid2SourceRoot,
+} from './scripts/solid-2-compat.mjs'
+
+const solid = await loadSolid2VitePlugin()
+
+export default defineConfig({
+ root: solid2CompatRoot,
+ plugins: [solid2RuntimeResolver(), solid({ ssr: true })],
+ test: {
+ dir: solid2SourceRoot,
+ environment: 'node',
+ include: ['**/*.ssr.test.tsx'],
+ },
+})
diff --git a/vitest.solid2.config.ts b/vitest.solid2.config.ts
new file mode 100644
index 00000000..8357f229
--- /dev/null
+++ b/vitest.solid2.config.ts
@@ -0,0 +1,20 @@
+import { defineConfig } from 'vitest/config'
+import {
+ loadSolid2VitePlugin,
+ solid2CompatRoot,
+ solid2RuntimeResolver,
+ solid2SourceRoot,
+} from './scripts/solid-2-compat.mjs'
+
+const solid = await loadSolid2VitePlugin()
+
+export default defineConfig({
+ root: solid2CompatRoot,
+ plugins: [solid2RuntimeResolver(), solid({ solid: { hydratable: true } })],
+ test: {
+ dir: solid2SourceRoot,
+ environment: 'jsdom',
+ include: ['**/*.test.tsx'],
+ exclude: ['**/*.ssr.test.tsx'],
+ },
+})