@tanstack/cta-framework-solid 0.10.0-alpha.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ADD-ON-AUTHORING.md +129 -0
- package/LICENSE +21 -0
- package/add-ons/form/assets/src/routes/demo.form.tsx.ejs +352 -0
- package/add-ons/form/info.json +16 -0
- package/add-ons/form/package.json +5 -0
- package/add-ons/module-federation/assets/module-federation.config.js.ejs +27 -0
- package/add-ons/module-federation/assets/src/demo-mf-component.tsx +3 -0
- package/add-ons/module-federation/assets/src/demo-mf-self-contained.tsx +9 -0
- package/add-ons/module-federation/info.json +8 -0
- package/add-ons/module-federation/package.json +5 -0
- package/add-ons/sentry/assets/_dot_cursorrules.append +22 -0
- package/add-ons/sentry/assets/_dot_env.local.append +2 -0
- package/add-ons/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +20 -0
- package/add-ons/sentry/info.json +16 -0
- package/add-ons/sentry/package.json +5 -0
- package/add-ons/solid-ui/README.md +9 -0
- package/add-ons/solid-ui/assets/src/lib/utils.ts +6 -0
- package/add-ons/solid-ui/assets/src/styles.css +138 -0
- package/add-ons/solid-ui/assets/ui.config.json +13 -0
- package/add-ons/solid-ui/info.json +12 -0
- package/add-ons/solid-ui/package.json +9 -0
- package/add-ons/start/assets/app.config.ts.ejs +19 -0
- package/add-ons/start/assets/src/api.ts +6 -0
- package/add-ons/start/assets/src/client.tsx +7 -0
- package/add-ons/start/assets/src/router.tsx.ejs +24 -0
- package/add-ons/start/assets/src/routes/demo.start.server-funcs.tsx +49 -0
- package/add-ons/start/assets/src/ssr.tsx +12 -0
- package/add-ons/start/info.json +17 -0
- package/add-ons/start/package.json +12 -0
- package/add-ons/store/assets/src/lib/demo-store.ts +13 -0
- package/add-ons/store/assets/src/routes/demo.store.tsx.ejs +77 -0
- package/add-ons/store/info.json +16 -0
- package/add-ons/store/package.json +6 -0
- package/add-ons/t3env/README.md +16 -0
- package/add-ons/t3env/assets/src/env.ts +39 -0
- package/add-ons/t3env/info.json +8 -0
- package/add-ons/t3env/package.json +6 -0
- package/add-ons/tanstack-query/assets/src/integrations/tanstack-query/header-user.tsx +5 -0
- package/add-ons/tanstack-query/assets/src/integrations/tanstack-query/provider.tsx +15 -0
- package/add-ons/tanstack-query/assets/src/routes/demo.tanstack-query.tsx +24 -0
- package/add-ons/tanstack-query/info.json +28 -0
- package/add-ons/tanstack-query/package.json +6 -0
- package/dist/index.js +18 -0
- package/dist/types/index.d.ts +1 -0
- package/examples/tanchat/README.md +52 -0
- package/examples/tanchat/assets/ai-streaming-server/README.md +110 -0
- package/examples/tanchat/assets/ai-streaming-server/_dot_env.example +1 -0
- package/examples/tanchat/assets/ai-streaming-server/package.json +26 -0
- package/examples/tanchat/assets/ai-streaming-server/src/index.ts +102 -0
- package/examples/tanchat/assets/ai-streaming-server/tsconfig.json +15 -0
- package/examples/tanchat/assets/src/components/demo.SettingsDialog.tsx +149 -0
- package/examples/tanchat/assets/src/demo.index.css +227 -0
- package/examples/tanchat/assets/src/lib/demo-store.ts +13 -0
- package/examples/tanchat/assets/src/routes/example.chat.tsx +435 -0
- package/examples/tanchat/assets/src/store/demo.hooks.ts +17 -0
- package/examples/tanchat/assets/src/store/demo.store.ts +133 -0
- package/examples/tanchat/info.json +15 -0
- package/examples/tanchat/package.json +7 -0
- package/package.json +33 -0
- package/project/base/README.md.ejs +215 -0
- package/project/base/_dot_cursorrules.append +35 -0
- package/project/base/_dot_gitignore +5 -0
- package/project/base/_dot_vscode/settings.json.ejs +35 -0
- package/project/base/index.html.ejs +20 -0
- package/project/base/package.json +23 -0
- package/project/base/public/favicon.ico +0 -0
- package/project/base/public/logo192.png +0 -0
- package/project/base/public/logo512.png +0 -0
- package/project/base/public/manifest.json +25 -0
- package/project/base/public/robots.txt +3 -0
- package/project/base/src/App.css.ejs +38 -0
- package/project/base/src/App.tsx.ejs +34 -0
- package/project/base/src/components/Header.tsx.ejs +26 -0
- package/project/base/src/logo.svg +120 -0
- package/project/base/src/main.tsx.ejs +126 -0
- package/project/base/src/routes/__root.tsx.ejs +38 -0
- package/project/base/src/routes/index.tsx.ejs +41 -0
- package/project/base/src/styles.css.ejs +15 -0
- package/project/base/tsconfig.json.ejs +31 -0
- package/project/base/vite.config.js.ejs +22 -0
- package/project/packages.json +18 -0
- package/src/index.ts +26 -0
- package/tests/snapshots/solid/solid-cr-js-npm.json +22 -0
- package/tests/snapshots/solid/solid-cr-ts-npm.json +23 -0
- package/tests/snapshots/solid/solid-cr-ts-start-npm.json +27 -0
- package/tests/snapshots/solid/solid-fr-ts-npm.json +24 -0
- package/tests/snapshots/solid/solid-fr-ts-tw-npm.json +23 -0
- package/tests/solid.test.ts +119 -0
- package/tests/test-utilities.ts +44 -0
- package/toolchains/biome/assets/biome.json.ejs +31 -0
- package/toolchains/biome/info.json +8 -0
- package/toolchains/biome/package.json +10 -0
- package/toolchains/eslint/assets/_dot_prettierignore +3 -0
- package/toolchains/eslint/assets/eslint.config.js +5 -0
- package/toolchains/eslint/assets/prettier.config.js +10 -0
- package/toolchains/eslint/info.json +8 -0
- package/toolchains/eslint/package.json +11 -0
- package/tsconfig.json +17 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
@import 'tailwindcss';
|
|
2
|
+
|
|
3
|
+
@plugin "tailwindcss-animate";
|
|
4
|
+
|
|
5
|
+
@custom-variant dark (&:is(.dark *));
|
|
6
|
+
|
|
7
|
+
body {
|
|
8
|
+
@apply m-0;
|
|
9
|
+
font-family:
|
|
10
|
+
-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',
|
|
11
|
+
'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
|
|
12
|
+
-webkit-font-smoothing: antialiased;
|
|
13
|
+
-moz-osx-font-smoothing: grayscale;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
code {
|
|
17
|
+
font-family:
|
|
18
|
+
source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
:root {
|
|
22
|
+
--background: oklch(1 0 0);
|
|
23
|
+
--foreground: oklch(0.141 0.005 285.823);
|
|
24
|
+
--card: oklch(1 0 0);
|
|
25
|
+
--card-foreground: oklch(0.141 0.005 285.823);
|
|
26
|
+
--popover: oklch(1 0 0);
|
|
27
|
+
--popover-foreground: oklch(0.141 0.005 285.823);
|
|
28
|
+
--primary: oklch(0.21 0.006 285.885);
|
|
29
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
30
|
+
--secondary: oklch(0.967 0.001 286.375);
|
|
31
|
+
--secondary-foreground: oklch(0.21 0.006 285.885);
|
|
32
|
+
--muted: oklch(0.967 0.001 286.375);
|
|
33
|
+
--muted-foreground: oklch(0.552 0.016 285.938);
|
|
34
|
+
--accent: oklch(0.967 0.001 286.375);
|
|
35
|
+
--accent-foreground: oklch(0.21 0.006 285.885);
|
|
36
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
37
|
+
--destructive-foreground: oklch(0.577 0.245 27.325);
|
|
38
|
+
--border: oklch(0.92 0.004 286.32);
|
|
39
|
+
--input: oklch(0.92 0.004 286.32);
|
|
40
|
+
--ring: oklch(0.871 0.006 286.286);
|
|
41
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
42
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
43
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
|
44
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
45
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
46
|
+
--radius: 0.625rem;
|
|
47
|
+
--sidebar: oklch(0.985 0 0);
|
|
48
|
+
--sidebar-foreground: oklch(0.141 0.005 285.823);
|
|
49
|
+
--sidebar-primary: oklch(0.21 0.006 285.885);
|
|
50
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
51
|
+
--sidebar-accent: oklch(0.967 0.001 286.375);
|
|
52
|
+
--sidebar-accent-foreground: oklch(0.21 0.006 285.885);
|
|
53
|
+
--sidebar-border: oklch(0.92 0.004 286.32);
|
|
54
|
+
--sidebar-ring: oklch(0.871 0.006 286.286);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.dark {
|
|
58
|
+
--background: oklch(0.141 0.005 285.823);
|
|
59
|
+
--foreground: oklch(0.985 0 0);
|
|
60
|
+
--card: oklch(0.141 0.005 285.823);
|
|
61
|
+
--card-foreground: oklch(0.985 0 0);
|
|
62
|
+
--popover: oklch(0.141 0.005 285.823);
|
|
63
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
64
|
+
--primary: oklch(0.985 0 0);
|
|
65
|
+
--primary-foreground: oklch(0.21 0.006 285.885);
|
|
66
|
+
--secondary: oklch(0.274 0.006 286.033);
|
|
67
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
68
|
+
--muted: oklch(0.274 0.006 286.033);
|
|
69
|
+
--muted-foreground: oklch(0.705 0.015 286.067);
|
|
70
|
+
--accent: oklch(0.274 0.006 286.033);
|
|
71
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
72
|
+
--destructive: oklch(0.396 0.141 25.723);
|
|
73
|
+
--destructive-foreground: oklch(0.637 0.237 25.331);
|
|
74
|
+
--border: oklch(0.274 0.006 286.033);
|
|
75
|
+
--input: oklch(0.274 0.006 286.033);
|
|
76
|
+
--ring: oklch(0.442 0.017 285.786);
|
|
77
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
78
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
79
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
80
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
81
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
82
|
+
--sidebar: oklch(0.21 0.006 285.885);
|
|
83
|
+
--sidebar-foreground: oklch(0.985 0 0);
|
|
84
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
85
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
86
|
+
--sidebar-accent: oklch(0.274 0.006 286.033);
|
|
87
|
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
88
|
+
--sidebar-border: oklch(0.274 0.006 286.033);
|
|
89
|
+
--sidebar-ring: oklch(0.442 0.017 285.786);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@theme inline {
|
|
93
|
+
--color-background: var(--background);
|
|
94
|
+
--color-foreground: var(--foreground);
|
|
95
|
+
--color-card: var(--card);
|
|
96
|
+
--color-card-foreground: var(--card-foreground);
|
|
97
|
+
--color-popover: var(--popover);
|
|
98
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
99
|
+
--color-primary: var(--primary);
|
|
100
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
101
|
+
--color-secondary: var(--secondary);
|
|
102
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
103
|
+
--color-muted: var(--muted);
|
|
104
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
105
|
+
--color-accent: var(--accent);
|
|
106
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
107
|
+
--color-destructive: var(--destructive);
|
|
108
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
109
|
+
--color-border: var(--border);
|
|
110
|
+
--color-input: var(--input);
|
|
111
|
+
--color-ring: var(--ring);
|
|
112
|
+
--color-chart-1: var(--chart-1);
|
|
113
|
+
--color-chart-2: var(--chart-2);
|
|
114
|
+
--color-chart-3: var(--chart-3);
|
|
115
|
+
--color-chart-4: var(--chart-4);
|
|
116
|
+
--color-chart-5: var(--chart-5);
|
|
117
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
118
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
119
|
+
--radius-lg: var(--radius);
|
|
120
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
121
|
+
--color-sidebar: var(--sidebar);
|
|
122
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
123
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
124
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
125
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
126
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
127
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
128
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
@layer base {
|
|
132
|
+
* {
|
|
133
|
+
@apply border-border outline-ring/50;
|
|
134
|
+
}
|
|
135
|
+
body {
|
|
136
|
+
@apply bg-background text-foreground;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Solid-UI",
|
|
3
|
+
"description": "Add Solid-UI to your application.",
|
|
4
|
+
"phase": "add-on",
|
|
5
|
+
"link": "https://ui.shadcn.com/",
|
|
6
|
+
"modes": ["file-router", "code-router"],
|
|
7
|
+
"type": "add-on",
|
|
8
|
+
"command": {
|
|
9
|
+
"command": "npx",
|
|
10
|
+
"args": ["solidui-cli@latest", "add", "button", "input"]
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { defineConfig } from '@tanstack/solid-start/config'
|
|
2
|
+
import viteTsConfigPaths from 'vite-tsconfig-paths'<% if (tailwind) { %>
|
|
3
|
+
import tailwindcss from "@tailwindcss/vite"
|
|
4
|
+
<% } %>
|
|
5
|
+
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
tsr: {
|
|
8
|
+
appDirectory: 'src',
|
|
9
|
+
},
|
|
10
|
+
vite: {
|
|
11
|
+
plugins: [
|
|
12
|
+
// this is the plugin that enables path aliases
|
|
13
|
+
viteTsConfigPaths({
|
|
14
|
+
projects: ['./tsconfig.json'],
|
|
15
|
+
}),
|
|
16
|
+
<% if (tailwind) { %>tailwindcss(),<% } %>
|
|
17
|
+
],
|
|
18
|
+
},
|
|
19
|
+
})
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createRouter as createTanstackRouter } from '@tanstack/solid-router'
|
|
2
|
+
|
|
3
|
+
// Import the generated route tree
|
|
4
|
+
import { routeTree } from './routeTree.gen'
|
|
5
|
+
|
|
6
|
+
import './styles.css'
|
|
7
|
+
|
|
8
|
+
// Create a new router instance
|
|
9
|
+
export const createRouter = () => {
|
|
10
|
+
const router = createTanstackRouter({
|
|
11
|
+
routeTree,
|
|
12
|
+
scrollRestoration: true,
|
|
13
|
+
})
|
|
14
|
+
return router
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const router = createRouter()
|
|
18
|
+
|
|
19
|
+
// Register the router instance for type safety
|
|
20
|
+
declare module '@tanstack/solid-router' {
|
|
21
|
+
interface Register {
|
|
22
|
+
router: typeof router
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as fs from 'fs'
|
|
2
|
+
import { createFileRoute, useRouter } from '@tanstack/solid-router'
|
|
3
|
+
import { createServerFn } from '@tanstack/solid-start'
|
|
4
|
+
|
|
5
|
+
const filePath = 'count.txt'
|
|
6
|
+
|
|
7
|
+
async function readCount() {
|
|
8
|
+
return parseInt(
|
|
9
|
+
await fs.promises.readFile(filePath, 'utf-8').catch(() => '0'),
|
|
10
|
+
)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const getCount = createServerFn({
|
|
14
|
+
method: 'GET',
|
|
15
|
+
}).handler(() => {
|
|
16
|
+
return readCount()
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
const updateCount = createServerFn({ method: 'POST' })
|
|
20
|
+
.validator((d: number) => d)
|
|
21
|
+
.handler(async ({ data }) => {
|
|
22
|
+
const count = await readCount()
|
|
23
|
+
await fs.promises.writeFile(filePath, `${count + data}`)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
export const Route = createFileRoute('/demo/start/server-funcs')({
|
|
27
|
+
component: Home,
|
|
28
|
+
loader: async () => await getCount(),
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
function Home() {
|
|
32
|
+
const router = useRouter()
|
|
33
|
+
const state = Route.useLoaderData()
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<div class="p-4">
|
|
37
|
+
<button
|
|
38
|
+
onClick={() => {
|
|
39
|
+
updateCount({ data: 1 }).then(() => {
|
|
40
|
+
router.invalidate()
|
|
41
|
+
})
|
|
42
|
+
}}
|
|
43
|
+
claclassssName="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"
|
|
44
|
+
>
|
|
45
|
+
Add 1 to {state}?
|
|
46
|
+
</button>
|
|
47
|
+
</div>
|
|
48
|
+
)
|
|
49
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createStartHandler,
|
|
3
|
+
defaultStreamHandler,
|
|
4
|
+
} from '@tanstack/solid-start/server'
|
|
5
|
+
import { getRouterManifest } from '@tanstack/solid-start/router-manifest'
|
|
6
|
+
|
|
7
|
+
import { createRouter } from './router'
|
|
8
|
+
|
|
9
|
+
export default createStartHandler({
|
|
10
|
+
createRouter,
|
|
11
|
+
getRouterManifest,
|
|
12
|
+
})(defaultStreamHandler)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Start",
|
|
3
|
+
"phase": "setup",
|
|
4
|
+
"description": "Add TanStack Start for SSR, API endpoints, and more.",
|
|
5
|
+
"link": "https://tanstack.com/start/latest",
|
|
6
|
+
"modes": ["file-router"],
|
|
7
|
+
"type": "add-on",
|
|
8
|
+
"warning": "TanStack Start is not yet at 1.0 and may change significantly or not be compatible with other add-ons.",
|
|
9
|
+
"routes": [
|
|
10
|
+
{
|
|
11
|
+
"url": "/demo/start/server-funcs",
|
|
12
|
+
"name": "Start - Server Functions",
|
|
13
|
+
"path": "src/routes/demo.start.server-funcs.tsx",
|
|
14
|
+
"jsName": "StartServerFuncsDemo"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Derived, Store } from '@tanstack/store'
|
|
2
|
+
|
|
3
|
+
export const store = new Store({
|
|
4
|
+
firstName: 'Jane',
|
|
5
|
+
lastName: 'Smith',
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
export const fullName = new Derived({
|
|
9
|
+
fn: () => `${store.state.firstName} ${store.state.lastName}`,
|
|
10
|
+
deps: [store],
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
fullName.mount()
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { <% if (fileRouter) { %>createFileRoute<% } else { %>createRoute<% } %> } from '@tanstack/solid-router'
|
|
2
|
+
import { useStore } from '@tanstack/solid-store'
|
|
3
|
+
|
|
4
|
+
import { fullName, store } from '../lib/demo-store'
|
|
5
|
+
|
|
6
|
+
<% if (codeRouter) { %>
|
|
7
|
+
import type { RootRoute } from '@tanstack/solid-router'
|
|
8
|
+
<% } else { %>
|
|
9
|
+
export const Route = createFileRoute('/demo/store')({
|
|
10
|
+
component: DemoStore,
|
|
11
|
+
})
|
|
12
|
+
<% } %>
|
|
13
|
+
|
|
14
|
+
function FirstName() {
|
|
15
|
+
const firstName = useStore(store, (state) => state.firstName)
|
|
16
|
+
return (
|
|
17
|
+
<input
|
|
18
|
+
type="text"
|
|
19
|
+
value={firstName()}
|
|
20
|
+
onInput={(e) =>
|
|
21
|
+
store.setState((state) => ({ ...state, firstName: e.target.value }))
|
|
22
|
+
}
|
|
23
|
+
class="bg-white/10 rounded-lg px-4 py-2 outline-none border border-white/20 hover:border-white/40 focus:border-white/60 transition-colors duration-200 placeholder-white/40"
|
|
24
|
+
/>
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function LastName() {
|
|
29
|
+
const lastName = useStore(store, (state) => state.lastName)
|
|
30
|
+
return (
|
|
31
|
+
<input
|
|
32
|
+
type="text"
|
|
33
|
+
value={lastName()}
|
|
34
|
+
onInput={(e) =>
|
|
35
|
+
store.setState((state) => ({ ...state, lastName: e.target.value }))
|
|
36
|
+
}
|
|
37
|
+
class="bg-white/10 rounded-lg px-4 py-2 outline-none border border-white/20 hover:border-white/40 focus:border-white/60 transition-colors duration-200 placeholder-white/40"
|
|
38
|
+
/>
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function FullName() {
|
|
43
|
+
const fName = useStore(fullName)
|
|
44
|
+
return (
|
|
45
|
+
<div class="bg-white/10 rounded-lg px-4 py-2 outline-none ">
|
|
46
|
+
{fName}
|
|
47
|
+
</div>
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function DemoStore() {
|
|
52
|
+
return (
|
|
53
|
+
<div
|
|
54
|
+
class="min-h-[calc(100vh-32px)] text-white p-8 flex items-center justify-center w-full h-full"
|
|
55
|
+
style={{
|
|
56
|
+
'background-image':
|
|
57
|
+
'radial-gradient(50% 50% at 80% 80%, #f4a460 0%, #8b4513 70%, #1a0f0a 100%)',
|
|
58
|
+
}}
|
|
59
|
+
>
|
|
60
|
+
<div class="bg-white/10 backdrop-blur-lg rounded-xl p-8 shadow-lg flex flex-col gap-4 text-3xl min-w-1/2">
|
|
61
|
+
<h1 class="text-4xl font-bold mb-5">Store Example</h1>
|
|
62
|
+
<FirstName />
|
|
63
|
+
<LastName />
|
|
64
|
+
<FullName />
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
<% if (codeRouter) { %>
|
|
71
|
+
export default (parentRoute: RootRoute) => createRoute({
|
|
72
|
+
path: '/demo/store',
|
|
73
|
+
component: DemoStore,
|
|
74
|
+
getParentRoute: () => parentRoute,
|
|
75
|
+
})
|
|
76
|
+
<% } %>
|
|
77
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Store",
|
|
3
|
+
"description": "Add TanStack Store to your application.",
|
|
4
|
+
"phase": "add-on",
|
|
5
|
+
"modes": ["file-router", "code-router"],
|
|
6
|
+
"type": "add-on",
|
|
7
|
+
"link": "https://tanstack.com/store/latest",
|
|
8
|
+
"routes": [
|
|
9
|
+
{
|
|
10
|
+
"url": "/demo/store",
|
|
11
|
+
"name": "Store",
|
|
12
|
+
"path": "src/routes/demo.store.tsx",
|
|
13
|
+
"jsName": "StoreDemo"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
## T3Env
|
|
2
|
+
|
|
3
|
+
- You can use T3Env to add type safety to your environment variables.
|
|
4
|
+
- Add Environment variables to the `src/env.mjs` file.
|
|
5
|
+
- Use the environment variables in your code.
|
|
6
|
+
|
|
7
|
+
### Usage
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { env } from "@/env";
|
|
11
|
+
|
|
12
|
+
console.log(env.VITE_APP_TITLE);
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createEnv } from "@t3-oss/env-core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
export const env = createEnv({
|
|
5
|
+
server: {
|
|
6
|
+
SERVER_URL: z.string().url().optional(),
|
|
7
|
+
},
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The prefix that client-side variables must have. This is enforced both at
|
|
11
|
+
* a type-level and at runtime.
|
|
12
|
+
*/
|
|
13
|
+
clientPrefix: "VITE_",
|
|
14
|
+
|
|
15
|
+
client: {
|
|
16
|
+
VITE_APP_TITLE: z.string().min(1).optional(),
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* What object holds the environment variables at runtime. This is usually
|
|
21
|
+
* `process.env` or `import.meta.env`.
|
|
22
|
+
*/
|
|
23
|
+
runtimeEnv: import.meta.env,
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* By default, this library will feed the environment variables directly to
|
|
27
|
+
* the Zod validator.
|
|
28
|
+
*
|
|
29
|
+
* This means that if you have an empty string for a value that is supposed
|
|
30
|
+
* to be a number (e.g. `PORT=` in a ".env" file), Zod will incorrectly flag
|
|
31
|
+
* it as a type mismatch violation. Additionally, if you have an empty string
|
|
32
|
+
* for a value that is supposed to be a string with a default value (e.g.
|
|
33
|
+
* `DOMAIN=` in an ".env" file), the default value will never be applied.
|
|
34
|
+
*
|
|
35
|
+
* In order to solve these issues, we recommend that all new projects
|
|
36
|
+
* explicitly specify this option as true.
|
|
37
|
+
*/
|
|
38
|
+
emptyStringAsUndefined: true,
|
|
39
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { QueryClient, QueryClientProvider } from '@tanstack/solid-query'
|
|
2
|
+
|
|
3
|
+
import type { JSX } from 'solid-js'
|
|
4
|
+
|
|
5
|
+
const queryClient = new QueryClient()
|
|
6
|
+
|
|
7
|
+
export default function AppTanstackQueryProvider(props: {
|
|
8
|
+
children: JSX.Element
|
|
9
|
+
}) {
|
|
10
|
+
return (
|
|
11
|
+
<QueryClientProvider client={queryClient}>
|
|
12
|
+
{props.children}
|
|
13
|
+
</QueryClientProvider>
|
|
14
|
+
)
|
|
15
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createFileRoute } from '@tanstack/solid-router'
|
|
2
|
+
import { createQuery } from '@tanstack/solid-query'
|
|
3
|
+
|
|
4
|
+
export const Route = createFileRoute('/demo/tanstack-query')({
|
|
5
|
+
component: App,
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
function App() {
|
|
9
|
+
const peopleQuery = createQuery(() => ({
|
|
10
|
+
queryKey: ['people'],
|
|
11
|
+
queryFn: () =>
|
|
12
|
+
Promise.resolve([{ name: 'John Doe' }, { name: 'Jane Doe' }]),
|
|
13
|
+
initialData: [],
|
|
14
|
+
}))
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<div class="p-4">
|
|
18
|
+
<h1 class="text-2xl mb-4">People list from Swapi</h1>
|
|
19
|
+
<ul>{peopleQuery.data?.map((person) => <li>{person.name}</li>)}</ul>
|
|
20
|
+
</div>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export default App
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "TanStack Query",
|
|
3
|
+
"description": "Integrate TanStack Query into your application.",
|
|
4
|
+
"phase": "add-on",
|
|
5
|
+
"modes": ["file-router"],
|
|
6
|
+
"type": "add-on",
|
|
7
|
+
"link": "https://tanstack.com/query/latest",
|
|
8
|
+
"routes": [
|
|
9
|
+
{
|
|
10
|
+
"url": "/demo/tanstack-query",
|
|
11
|
+
"name": "TanStack Query",
|
|
12
|
+
"path": "src/routes/demo.tanstack-query.tsx",
|
|
13
|
+
"jsName": "TanStackQueryDemo"
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"integrations": [
|
|
17
|
+
{
|
|
18
|
+
"type": "provider",
|
|
19
|
+
"path": "src/integrations/tanstack-query/provider.tsx",
|
|
20
|
+
"jsName": "TanStackQueryProvider"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"type": "header-user",
|
|
24
|
+
"path": "src/integrations/tanstack-query/header-user.tsx",
|
|
25
|
+
"jsName": "TanStackQueryHeaderUser"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { dirname, join } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { registerFramework } from '@tanstack/cta-engine';
|
|
4
|
+
export function register() {
|
|
5
|
+
registerFramework({
|
|
6
|
+
id: 'solid',
|
|
7
|
+
name: 'solid',
|
|
8
|
+
description: 'Solid templates for Tanstack Router Applications',
|
|
9
|
+
version: '0.1.0',
|
|
10
|
+
baseDirectory: join(dirname(dirname(fileURLToPath(import.meta.url))), 'project'),
|
|
11
|
+
addOnsDirectories: [
|
|
12
|
+
join(dirname(dirname(fileURLToPath(import.meta.url))), 'add-ons'),
|
|
13
|
+
join(dirname(dirname(fileURLToPath(import.meta.url))), 'toolchains'),
|
|
14
|
+
join(dirname(dirname(fileURLToPath(import.meta.url))), 'examples'),
|
|
15
|
+
],
|
|
16
|
+
examplesDirectory: join(dirname(dirname(fileURLToPath(import.meta.url))), 'examples'),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function register(): void;
|