From 99960ad0c07ce8501cd3f4c80986cdb79cb46316 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Fri, 28 Mar 2025 17:30:40 +0100 Subject: [PATCH] add solid-start add-on --- .../form/assets/src/routes/demo.form.tsx.ejs | 2 +- .../solid/add-on/start/assets/app.config.ts | 16 ++++++ .../add-on/start/assets/postcss.config.ts | 5 ++ .../solid/add-on/start/assets/src/api.ts | 6 +++ .../solid/add-on/start/assets/src/client.tsx | 7 +++ .../add-on/start/assets/src/router.tsx.ejs | 24 +++++++++ .../src/routes/demo.start.server-funcs.tsx | 49 +++++++++++++++++++ .../solid/add-on/start/assets/src/ssr.tsx | 12 +++++ templates/solid/add-on/start/info.json | 14 ++++++ templates/solid/add-on/start/package.json | 14 ++++++ .../assets/src/routes/demo.store.tsx.ejs | 2 +- 11 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 templates/solid/add-on/start/assets/app.config.ts create mode 100644 templates/solid/add-on/start/assets/postcss.config.ts create mode 100644 templates/solid/add-on/start/assets/src/api.ts create mode 100644 templates/solid/add-on/start/assets/src/client.tsx create mode 100644 templates/solid/add-on/start/assets/src/router.tsx.ejs create mode 100644 templates/solid/add-on/start/assets/src/routes/demo.start.server-funcs.tsx create mode 100644 templates/solid/add-on/start/assets/src/ssr.tsx create mode 100644 templates/solid/add-on/start/info.json create mode 100644 templates/solid/add-on/start/package.json diff --git a/templates/solid/add-on/form/assets/src/routes/demo.form.tsx.ejs b/templates/solid/add-on/form/assets/src/routes/demo.form.tsx.ejs index e034828c..f3976838 100644 --- a/templates/solid/add-on/form/assets/src/routes/demo.form.tsx.ejs +++ b/templates/solid/add-on/form/assets/src/routes/demo.form.tsx.ejs @@ -5,7 +5,7 @@ import type { JSX } from 'solid-js/jsx-runtime' import type { ValidationError } from '@tanstack/solid-form' <% if (codeRouter) { %> -import type { RootRoute } from '@tanstack/react-router' +import type { RootRoute } from '@tanstack/solid-router' <% } else { %> export const Route = createFileRoute('/demo/form')({ component: FormExample, diff --git a/templates/solid/add-on/start/assets/app.config.ts b/templates/solid/add-on/start/assets/app.config.ts new file mode 100644 index 00000000..b5039684 --- /dev/null +++ b/templates/solid/add-on/start/assets/app.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from '@tanstack/solid-start/config' +import viteTsConfigPaths from 'vite-tsconfig-paths' + +export default defineConfig({ + tsr: { + appDirectory: 'src', + }, + vite: { + plugins: [ + // this is the plugin that enables path aliases + viteTsConfigPaths({ + projects: ['./tsconfig.json'], + }), + ], + }, +}) diff --git a/templates/solid/add-on/start/assets/postcss.config.ts b/templates/solid/add-on/start/assets/postcss.config.ts new file mode 100644 index 00000000..c2ddf748 --- /dev/null +++ b/templates/solid/add-on/start/assets/postcss.config.ts @@ -0,0 +1,5 @@ +export default { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; diff --git a/templates/solid/add-on/start/assets/src/api.ts b/templates/solid/add-on/start/assets/src/api.ts new file mode 100644 index 00000000..ed511bcd --- /dev/null +++ b/templates/solid/add-on/start/assets/src/api.ts @@ -0,0 +1,6 @@ +import { + createStartAPIHandler, + defaultAPIFileRouteHandler, +} from '@tanstack/solid-start/api' + +export default createStartAPIHandler(defaultAPIFileRouteHandler) diff --git a/templates/solid/add-on/start/assets/src/client.tsx b/templates/solid/add-on/start/assets/src/client.tsx new file mode 100644 index 00000000..fa83c450 --- /dev/null +++ b/templates/solid/add-on/start/assets/src/client.tsx @@ -0,0 +1,7 @@ +import { hydrate } from 'solid-js/web' +import { StartClient } from '@tanstack/solid-start' +import { createRouter } from './router' + +const router = createRouter() + +hydrate(() => , document.body) diff --git a/templates/solid/add-on/start/assets/src/router.tsx.ejs b/templates/solid/add-on/start/assets/src/router.tsx.ejs new file mode 100644 index 00000000..09932b06 --- /dev/null +++ b/templates/solid/add-on/start/assets/src/router.tsx.ejs @@ -0,0 +1,24 @@ +import { createRouter as createTanstackRouter } from '@tanstack/solid-router' + +// Import the generated route tree +import { routeTree } from './routeTree.gen' + +import './styles.css' + +// Create a new router instance +export const createRouter = () => { + const router = createTanstackRouter({ + routeTree, + scrollRestoration: true, + }) + return router +} + +const router = createRouter() + +// Register the router instance for type safety +declare module '@tanstack/solid-router' { + interface Register { + router: typeof router + } +} diff --git a/templates/solid/add-on/start/assets/src/routes/demo.start.server-funcs.tsx b/templates/solid/add-on/start/assets/src/routes/demo.start.server-funcs.tsx new file mode 100644 index 00000000..de0ff4b9 --- /dev/null +++ b/templates/solid/add-on/start/assets/src/routes/demo.start.server-funcs.tsx @@ -0,0 +1,49 @@ +import * as fs from 'fs' +import { createFileRoute, useRouter } from '@tanstack/solid-router' +import { createServerFn } from '@tanstack/solid-start' + +const filePath = 'count.txt' + +async function readCount() { + return parseInt( + await fs.promises.readFile(filePath, 'utf-8').catch(() => '0'), + ) +} + +const getCount = createServerFn({ + method: 'GET', +}).handler(() => { + return readCount() +}) + +const updateCount = createServerFn({ method: 'POST' }) + .validator((d: number) => d) + .handler(async ({ data }) => { + const count = await readCount() + await fs.promises.writeFile(filePath, `${count + data}`) + }) + +export const Route = createFileRoute('/demo/start/server-funcs')({ + component: Home, + loader: async () => await getCount(), +}) + +function Home() { + const router = useRouter() + const state = Route.useLoaderData() + + return ( +
+ +
+ ) +} diff --git a/templates/solid/add-on/start/assets/src/ssr.tsx b/templates/solid/add-on/start/assets/src/ssr.tsx new file mode 100644 index 00000000..6d10bea0 --- /dev/null +++ b/templates/solid/add-on/start/assets/src/ssr.tsx @@ -0,0 +1,12 @@ +import { + createStartHandler, + defaultStreamHandler, +} from '@tanstack/solid-start/server' +import { getRouterManifest } from '@tanstack/solid-start/router-manifest' + +import { createRouter } from './router' + +export default createStartHandler({ + createRouter, + getRouterManifest, +})(defaultStreamHandler) diff --git a/templates/solid/add-on/start/info.json b/templates/solid/add-on/start/info.json new file mode 100644 index 00000000..adfe32f8 --- /dev/null +++ b/templates/solid/add-on/start/info.json @@ -0,0 +1,14 @@ +{ + "name": "Start", + "phase": "setup", + "description": "Add TanStack Start for SSR, API endpoints, and more.", + "link": "https://tanstack.com/start/latest", + "templates": ["file-router"], + "warning": "TanStack Start is not yet at 1.0 and may change significantly or not be compatible with other add-ons.", + "routes": [ + { + "url": "/demo/start/server-funcs", + "name": "Start - Server Functions" + } + ] +} diff --git a/templates/solid/add-on/start/package.json b/templates/solid/add-on/start/package.json new file mode 100644 index 00000000..97febc0e --- /dev/null +++ b/templates/solid/add-on/start/package.json @@ -0,0 +1,14 @@ +{ + "scripts": { + "dev": "vinxi dev", + "build": "vinxi build", + "start": "vinxi start" + }, + "dependencies": { + "@tailwindcss/postcss": "^4.0.7", + "@tanstack/solid-start": "^1.114.3", + "postcss": "^8.5.2", + "vinxi": "^0.5.3", + "vite-tsconfig-paths": "^5.1.4" + } +} diff --git a/templates/solid/add-on/store/assets/src/routes/demo.store.tsx.ejs b/templates/solid/add-on/store/assets/src/routes/demo.store.tsx.ejs index 525c4cc2..76caaf14 100644 --- a/templates/solid/add-on/store/assets/src/routes/demo.store.tsx.ejs +++ b/templates/solid/add-on/store/assets/src/routes/demo.store.tsx.ejs @@ -4,7 +4,7 @@ import { useStore } from '@tanstack/solid-store' import { fullName, store } from '../lib/demo-store' <% if (codeRouter) { %> -import type { RootRoute } from '@tanstack/react-router' +import type { RootRoute } from '@tanstack/solid-router' <% } else { %> export const Route = createFileRoute('/demo/store')({ component: DemoStore,