@tanstack/cta-framework-solid 0.47.0 → 0.48.1
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/CHANGELOG.md +18 -0
- package/add-ons/better-auth/README.md +32 -0
- package/add-ons/better-auth/assets/_dot_env.local.append +3 -0
- package/add-ons/better-auth/assets/src/integrations/better-auth/header-user.tsx +51 -0
- package/add-ons/better-auth/assets/src/lib/auth-client.ts +3 -0
- package/add-ons/better-auth/assets/src/lib/auth.ts +9 -0
- package/add-ons/better-auth/assets/src/routes/api/auth/$.ts +11 -0
- package/add-ons/better-auth/assets/src/routes/demo.better-auth.tsx +237 -0
- package/add-ons/better-auth/info.json +27 -0
- package/add-ons/better-auth/logo.svg +7 -0
- package/add-ons/better-auth/package.json +5 -0
- package/add-ons/better-auth/small-logo.svg +9 -0
- package/add-ons/convex/info.json +3 -0
- package/add-ons/form/info.json +2 -0
- package/add-ons/module-federation/info.json +3 -1
- package/add-ons/sentry/info.json +2 -0
- package/add-ons/solid-ui/info.json +2 -0
- package/add-ons/start/info.json +2 -0
- package/add-ons/store/info.json +2 -0
- package/add-ons/strapi/info.json +4 -4
- package/add-ons/t3env/info.json +2 -0
- package/add-ons/tanstack-query/info.json +2 -0
- package/examples/tanchat/info.json +2 -0
- package/hosts/cloudflare/info.json +3 -0
- package/hosts/cloudflare/{package.json → package.json.ejs} +1 -1
- package/hosts/netlify/info.json +3 -0
- package/hosts/nitro/info.json +3 -0
- package/hosts/railway/assets/nixpacks.toml +8 -0
- package/hosts/railway/info.json +20 -0
- package/hosts/railway/package.json +8 -0
- package/package.json +2 -2
- package/toolchains/biome/info.json +3 -0
- package/toolchains/eslint/info.json +3 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @tanstack/cta-framework-solid
|
|
2
2
|
|
|
3
|
+
## 0.48.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [[`cdb6eef`](https://github.com/TanStack/create-tsrouter-app/commit/cdb6eef79274a4041eae5e8cd9d43539c9a9a77a)]:
|
|
8
|
+
- @tanstack/cta-engine@0.49.0
|
|
9
|
+
|
|
10
|
+
## 0.48.0
|
|
11
|
+
|
|
12
|
+
### Minor Changes
|
|
13
|
+
|
|
14
|
+
- no will prompt about overriding a directory that has contents ([#289](https://github.com/TanStack/create-tsrouter-app/pull/289))
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- Updated dependencies [[`3087532`](https://github.com/TanStack/create-tsrouter-app/commit/308753249af11bf5c9e374789e973a934c753520)]:
|
|
19
|
+
- @tanstack/cta-engine@0.48.0
|
|
20
|
+
|
|
3
21
|
## 0.47.0
|
|
4
22
|
|
|
5
23
|
### Minor Changes
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
## Setting up Better Auth
|
|
2
|
+
|
|
3
|
+
1. Generate and set the `BETTER_AUTH_SECRET` environment variable in your `.env.local`:
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npx @better-auth/cli secret
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
2. Visit the [Better Auth documentation](https://www.better-auth.com) to unlock the full potential of authentication in your app.
|
|
10
|
+
|
|
11
|
+
### Adding a Database (Optional)
|
|
12
|
+
|
|
13
|
+
Better Auth can work in stateless mode, but to persist user data, add a database:
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
// src/lib/auth.ts
|
|
17
|
+
import { betterAuth } from "better-auth";
|
|
18
|
+
import { Pool } from "pg";
|
|
19
|
+
|
|
20
|
+
export const auth = betterAuth({
|
|
21
|
+
database: new Pool({
|
|
22
|
+
connectionString: process.env.DATABASE_URL,
|
|
23
|
+
}),
|
|
24
|
+
// ... rest of config
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Then run migrations:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npx @better-auth/cli migrate
|
|
32
|
+
```
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Show } from "solid-js";
|
|
2
|
+
import { Link } from "@tanstack/solid-router";
|
|
3
|
+
import { authClient } from "../../lib/auth-client";
|
|
4
|
+
|
|
5
|
+
export default function BetterAuthHeader() {
|
|
6
|
+
const session = authClient.useSession();
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<Show
|
|
10
|
+
when={!session().isPending}
|
|
11
|
+
fallback={
|
|
12
|
+
<div class="h-8 w-8 bg-neutral-100 dark:bg-neutral-800 animate-pulse" />
|
|
13
|
+
}
|
|
14
|
+
>
|
|
15
|
+
<Show
|
|
16
|
+
when={session().data?.user}
|
|
17
|
+
fallback={
|
|
18
|
+
<Link
|
|
19
|
+
to="/demo/better-auth"
|
|
20
|
+
class="h-9 px-4 text-sm font-medium bg-white dark:bg-neutral-900 text-neutral-900 dark:text-neutral-50 border border-neutral-300 dark:border-neutral-700 hover:bg-neutral-50 dark:hover:bg-neutral-800 transition-colors inline-flex items-center"
|
|
21
|
+
>
|
|
22
|
+
Sign in
|
|
23
|
+
</Link>
|
|
24
|
+
}
|
|
25
|
+
>
|
|
26
|
+
{(user) => (
|
|
27
|
+
<div class="flex items-center gap-2">
|
|
28
|
+
<Show
|
|
29
|
+
when={user().image}
|
|
30
|
+
fallback={
|
|
31
|
+
<div class="h-8 w-8 bg-neutral-100 dark:bg-neutral-800 flex items-center justify-center">
|
|
32
|
+
<span class="text-xs font-medium text-neutral-600 dark:text-neutral-400">
|
|
33
|
+
{user().name?.charAt(0).toUpperCase() || "U"}
|
|
34
|
+
</span>
|
|
35
|
+
</div>
|
|
36
|
+
}
|
|
37
|
+
>
|
|
38
|
+
{(image) => <img src={image()} alt="" class="h-8 w-8" />}
|
|
39
|
+
</Show>
|
|
40
|
+
<button
|
|
41
|
+
onClick={() => authClient.signOut()}
|
|
42
|
+
class="flex-1 h-9 px-4 text-sm font-medium bg-white dark:bg-neutral-900 text-neutral-900 dark:text-neutral-50 border border-neutral-300 dark:border-neutral-700 hover:bg-neutral-50 dark:hover:bg-neutral-800 transition-colors"
|
|
43
|
+
>
|
|
44
|
+
Sign out
|
|
45
|
+
</button>
|
|
46
|
+
</div>
|
|
47
|
+
)}
|
|
48
|
+
</Show>
|
|
49
|
+
</Show>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createFileRoute } from '@tanstack/solid-router'
|
|
2
|
+
import { auth } from '../../../lib/auth'
|
|
3
|
+
|
|
4
|
+
export const Route = createFileRoute('/api/auth/$')({
|
|
5
|
+
server: {
|
|
6
|
+
handlers: {
|
|
7
|
+
GET: ({ request }) => auth.handler(request),
|
|
8
|
+
POST: ({ request }) => auth.handler(request),
|
|
9
|
+
},
|
|
10
|
+
},
|
|
11
|
+
})
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { createFileRoute } from "@tanstack/solid-router";
|
|
2
|
+
import { createSignal, Show } from "solid-js";
|
|
3
|
+
import { authClient } from "../lib/auth-client";
|
|
4
|
+
|
|
5
|
+
export const Route = createFileRoute("/demo/better-auth")({
|
|
6
|
+
component: BetterAuthDemo,
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
function BetterAuthDemo() {
|
|
10
|
+
const session = authClient.useSession();
|
|
11
|
+
const [isSignUp, setIsSignUp] = createSignal(false);
|
|
12
|
+
const [email, setEmail] = createSignal("");
|
|
13
|
+
const [password, setPassword] = createSignal("");
|
|
14
|
+
const [name, setName] = createSignal("");
|
|
15
|
+
const [error, setError] = createSignal("");
|
|
16
|
+
const [loading, setLoading] = createSignal(false);
|
|
17
|
+
|
|
18
|
+
const handleSubmit = async (e: Event) => {
|
|
19
|
+
e.preventDefault();
|
|
20
|
+
setError("");
|
|
21
|
+
setLoading(true);
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
if (isSignUp()) {
|
|
25
|
+
const result = await authClient.signUp.email({
|
|
26
|
+
email: email(),
|
|
27
|
+
password: password(),
|
|
28
|
+
name: name(),
|
|
29
|
+
});
|
|
30
|
+
if (result.error) {
|
|
31
|
+
setError(result.error.message || "Sign up failed");
|
|
32
|
+
}
|
|
33
|
+
} else {
|
|
34
|
+
const result = await authClient.signIn.email({
|
|
35
|
+
email: email(),
|
|
36
|
+
password: password(),
|
|
37
|
+
});
|
|
38
|
+
if (result.error) {
|
|
39
|
+
setError(result.error.message || "Sign in failed");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
} catch (err) {
|
|
43
|
+
setError("An unexpected error occurred");
|
|
44
|
+
} finally {
|
|
45
|
+
setLoading(false);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<Show
|
|
51
|
+
when={!session().isPending}
|
|
52
|
+
fallback={
|
|
53
|
+
<div class="flex items-center justify-center py-10">
|
|
54
|
+
<div class="h-5 w-5 animate-spin rounded-full border-2 border-neutral-200 border-t-neutral-900 dark:border-neutral-800 dark:border-t-neutral-100" />
|
|
55
|
+
</div>
|
|
56
|
+
}
|
|
57
|
+
>
|
|
58
|
+
<Show
|
|
59
|
+
when={session().data?.user}
|
|
60
|
+
fallback={
|
|
61
|
+
<div class="flex justify-center py-10 px-4">
|
|
62
|
+
<div class="w-full max-w-md p-6">
|
|
63
|
+
<h1 class="text-lg font-semibold leading-none tracking-tight">
|
|
64
|
+
{isSignUp() ? "Create an account" : "Sign in"}
|
|
65
|
+
</h1>
|
|
66
|
+
<p class="text-sm text-neutral-500 dark:text-neutral-400 mt-2 mb-6">
|
|
67
|
+
{isSignUp()
|
|
68
|
+
? "Enter your information to create an account"
|
|
69
|
+
: "Enter your email below to login to your account"}
|
|
70
|
+
</p>
|
|
71
|
+
|
|
72
|
+
<form onSubmit={handleSubmit} class="grid gap-4">
|
|
73
|
+
<Show when={isSignUp()}>
|
|
74
|
+
<div class="grid gap-2">
|
|
75
|
+
<label for="name" class="text-sm font-medium leading-none">
|
|
76
|
+
Name
|
|
77
|
+
</label>
|
|
78
|
+
<input
|
|
79
|
+
id="name"
|
|
80
|
+
type="text"
|
|
81
|
+
value={name()}
|
|
82
|
+
onInput={(e) => setName(e.currentTarget.value)}
|
|
83
|
+
class="flex h-9 w-full border border-neutral-300 dark:border-neutral-700 bg-transparent px-3 text-sm focus:outline-none focus:border-neutral-900 dark:focus:border-neutral-100 disabled:cursor-not-allowed disabled:opacity-50"
|
|
84
|
+
required
|
|
85
|
+
/>
|
|
86
|
+
</div>
|
|
87
|
+
</Show>
|
|
88
|
+
|
|
89
|
+
<div class="grid gap-2">
|
|
90
|
+
<label for="email" class="text-sm font-medium leading-none">
|
|
91
|
+
Email
|
|
92
|
+
</label>
|
|
93
|
+
<input
|
|
94
|
+
id="email"
|
|
95
|
+
type="email"
|
|
96
|
+
value={email()}
|
|
97
|
+
onInput={(e) => setEmail(e.currentTarget.value)}
|
|
98
|
+
class="flex h-9 w-full border border-neutral-300 dark:border-neutral-700 bg-transparent px-3 text-sm focus:outline-none focus:border-neutral-900 dark:focus:border-neutral-100 disabled:cursor-not-allowed disabled:opacity-50"
|
|
99
|
+
required
|
|
100
|
+
/>
|
|
101
|
+
</div>
|
|
102
|
+
|
|
103
|
+
<div class="grid gap-2">
|
|
104
|
+
<label
|
|
105
|
+
for="password"
|
|
106
|
+
class="text-sm font-medium leading-none"
|
|
107
|
+
>
|
|
108
|
+
Password
|
|
109
|
+
</label>
|
|
110
|
+
<input
|
|
111
|
+
id="password"
|
|
112
|
+
type="password"
|
|
113
|
+
value={password()}
|
|
114
|
+
onInput={(e) => setPassword(e.currentTarget.value)}
|
|
115
|
+
class="flex h-9 w-full border border-neutral-300 dark:border-neutral-700 bg-transparent px-3 text-sm focus:outline-none focus:border-neutral-900 dark:focus:border-neutral-100 disabled:cursor-not-allowed disabled:opacity-50"
|
|
116
|
+
required
|
|
117
|
+
minLength={8}
|
|
118
|
+
/>
|
|
119
|
+
</div>
|
|
120
|
+
|
|
121
|
+
<Show when={error()}>
|
|
122
|
+
<div class="bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 p-3">
|
|
123
|
+
<p class="text-sm text-red-600 dark:text-red-400">
|
|
124
|
+
{error()}
|
|
125
|
+
</p>
|
|
126
|
+
</div>
|
|
127
|
+
</Show>
|
|
128
|
+
|
|
129
|
+
<button
|
|
130
|
+
type="submit"
|
|
131
|
+
disabled={loading()}
|
|
132
|
+
class="w-full h-9 px-4 text-sm font-medium text-white bg-neutral-900 hover:bg-neutral-800 dark:bg-neutral-50 dark:text-neutral-900 dark:hover:bg-neutral-200 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
133
|
+
>
|
|
134
|
+
<Show
|
|
135
|
+
when={!loading()}
|
|
136
|
+
fallback={
|
|
137
|
+
<span class="flex items-center justify-center gap-2">
|
|
138
|
+
<span class="h-4 w-4 animate-spin rounded-full border-2 border-neutral-400 border-t-white dark:border-neutral-600 dark:border-t-neutral-900" />
|
|
139
|
+
<span>Please wait</span>
|
|
140
|
+
</span>
|
|
141
|
+
}
|
|
142
|
+
>
|
|
143
|
+
{isSignUp() ? "Create account" : "Sign in"}
|
|
144
|
+
</Show>
|
|
145
|
+
</button>
|
|
146
|
+
</form>
|
|
147
|
+
|
|
148
|
+
<div class="mt-4 text-center">
|
|
149
|
+
<button
|
|
150
|
+
type="button"
|
|
151
|
+
onClick={() => {
|
|
152
|
+
setIsSignUp(!isSignUp());
|
|
153
|
+
setError("");
|
|
154
|
+
}}
|
|
155
|
+
class="text-sm text-neutral-500 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-neutral-100 transition-colors"
|
|
156
|
+
>
|
|
157
|
+
{isSignUp()
|
|
158
|
+
? "Already have an account? Sign in"
|
|
159
|
+
: "Don't have an account? Sign up"}
|
|
160
|
+
</button>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
<p class="mt-6 text-xs text-center text-neutral-400 dark:text-neutral-500">
|
|
164
|
+
Built with{" "}
|
|
165
|
+
<a
|
|
166
|
+
href="https://better-auth.com"
|
|
167
|
+
target="_blank"
|
|
168
|
+
rel="noopener noreferrer"
|
|
169
|
+
class="font-medium hover:text-neutral-600 dark:hover:text-neutral-300"
|
|
170
|
+
>
|
|
171
|
+
BETTER-AUTH
|
|
172
|
+
</a>
|
|
173
|
+
.
|
|
174
|
+
</p>
|
|
175
|
+
</div>
|
|
176
|
+
</div>
|
|
177
|
+
}
|
|
178
|
+
>
|
|
179
|
+
{(user) => (
|
|
180
|
+
<div class="flex justify-center py-10 px-4">
|
|
181
|
+
<div class="w-full max-w-md p-6 space-y-6">
|
|
182
|
+
<div class="space-y-1.5">
|
|
183
|
+
<h1 class="text-lg font-semibold leading-none tracking-tight">
|
|
184
|
+
Welcome back
|
|
185
|
+
</h1>
|
|
186
|
+
<p class="text-sm text-neutral-500 dark:text-neutral-400">
|
|
187
|
+
You're signed in as {user().email}
|
|
188
|
+
</p>
|
|
189
|
+
</div>
|
|
190
|
+
|
|
191
|
+
<div class="flex items-center gap-3">
|
|
192
|
+
<Show
|
|
193
|
+
when={user().image}
|
|
194
|
+
fallback={
|
|
195
|
+
<div class="h-10 w-10 bg-neutral-200 dark:bg-neutral-800 flex items-center justify-center">
|
|
196
|
+
<span class="text-sm font-medium text-neutral-600 dark:text-neutral-400">
|
|
197
|
+
{user().name?.charAt(0).toUpperCase() || "U"}
|
|
198
|
+
</span>
|
|
199
|
+
</div>
|
|
200
|
+
}
|
|
201
|
+
>
|
|
202
|
+
{(image) => <img src={image()} alt="" class="h-10 w-10" />}
|
|
203
|
+
</Show>
|
|
204
|
+
<div class="flex-1 min-w-0">
|
|
205
|
+
<p class="text-sm font-medium truncate">{user().name}</p>
|
|
206
|
+
<p class="text-xs text-neutral-500 dark:text-neutral-400 truncate">
|
|
207
|
+
{user().email}
|
|
208
|
+
</p>
|
|
209
|
+
</div>
|
|
210
|
+
</div>
|
|
211
|
+
|
|
212
|
+
<button
|
|
213
|
+
onClick={() => authClient.signOut()}
|
|
214
|
+
class="w-full h-9 px-4 text-sm font-medium border border-neutral-300 dark:border-neutral-700 hover:bg-neutral-100 dark:hover:bg-neutral-800 transition-colors"
|
|
215
|
+
>
|
|
216
|
+
Sign out
|
|
217
|
+
</button>
|
|
218
|
+
|
|
219
|
+
<p class="text-xs text-center text-neutral-400 dark:text-neutral-500">
|
|
220
|
+
Built with{" "}
|
|
221
|
+
<a
|
|
222
|
+
href="https://better-auth.com"
|
|
223
|
+
target="_blank"
|
|
224
|
+
rel="noopener noreferrer"
|
|
225
|
+
class="font-medium hover:text-neutral-600 dark:hover:text-neutral-300"
|
|
226
|
+
>
|
|
227
|
+
BETTER-AUTH
|
|
228
|
+
</a>
|
|
229
|
+
.
|
|
230
|
+
</p>
|
|
231
|
+
</div>
|
|
232
|
+
</div>
|
|
233
|
+
)}
|
|
234
|
+
</Show>
|
|
235
|
+
</Show>
|
|
236
|
+
);
|
|
237
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Better Auth",
|
|
3
|
+
"description": "Add Better Auth authentication to your application.",
|
|
4
|
+
"phase": "add-on",
|
|
5
|
+
"type": "add-on",
|
|
6
|
+
"category": "auth",
|
|
7
|
+
"exclusive": ["auth"],
|
|
8
|
+
"color": "#000000",
|
|
9
|
+
"link": "https://www.better-auth.com/",
|
|
10
|
+
"modes": ["file-router"],
|
|
11
|
+
"dependsOn": ["start"],
|
|
12
|
+
"routes": [
|
|
13
|
+
{
|
|
14
|
+
"url": "/demo/better-auth",
|
|
15
|
+
"name": "Better Auth",
|
|
16
|
+
"path": "src/routes/demo.better-auth.tsx",
|
|
17
|
+
"jsName": "BetterAuthDemo"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"integrations": [
|
|
21
|
+
{
|
|
22
|
+
"type": "header-user",
|
|
23
|
+
"jsName": "BetterAuthHeader",
|
|
24
|
+
"path": "src/integrations/better-auth/header-user.tsx"
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="500" height="500">
|
|
3
|
+
<path d="M0 0 C165 0 330 0 500 0 C500 165 500 330 500 500 C335 500 170 500 0 500 C0 335 0 170 0 0 Z " fill="#000000" transform="translate(0,0)"/>
|
|
4
|
+
<path d="M0 0 C28.71 0 57.42 0 87 0 C87 27.39 87 54.78 87 83 C119.01 83 151.02 83 184 83 C184 55.61 184 28.22 184 0 C242.41 0 300.82 0 361 0 C361 85.47 361 170.94 361 259 C302.59 259 244.18 259 184 259 C184 231.61 184 204.22 184 176 C151.99 176 119.98 176 87 176 C87 203.39 87 230.78 87 259 C58.29 259 29.58 259 0 259 C0 173.53 0 88.06 0 0 Z " fill="#FCFCFC" transform="translate(69,121)"/>
|
|
5
|
+
<path d="M0 0 C58.41 0 116.82 0 177 0 C177 85.47 177 170.94 177 259 C118.59 259 60.18 259 0 259 C0 231.61 0 204.22 0 176 C28.05 176 56.1 176 85 176 C85 145.31 85 114.62 85 83 C56.95 83 28.9 83 0 83 C0 55.61 0 28.22 0 0 Z " fill="#FFFFFF" transform="translate(253,121)"/>
|
|
6
|
+
<path d="M0 0 C27.72 0 55.44 0 84 0 C84 30.03 84 60.06 84 91 C56.28 91 28.56 91 0 91 C0 60.97 0 30.94 0 0 Z " fill="#000000" transform="translate(253,205)"/>
|
|
7
|
+
</svg>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128px" height="128px" viewBox="0 0 128 128" version="1.1">
|
|
3
|
+
<g id="surface1">
|
|
4
|
+
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 0 0 C 42.238281 0 84.480469 0 128 0 C 128 42.238281 128 84.480469 128 128 C 85.761719 128 43.519531 128 0 128 C 0 85.761719 0 43.519531 0 0 Z M 0 0 "/>
|
|
5
|
+
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,98.823529%,98.823529%);fill-opacity:1;" d="M 17.664062 30.976562 C 25.015625 30.976562 32.363281 30.976562 39.9375 30.976562 C 39.9375 37.988281 39.9375 45 39.9375 52.222656 C 48.128906 52.222656 56.324219 52.222656 64.769531 52.222656 C 64.769531 45.210938 64.769531 38.199219 64.769531 30.976562 C 79.722656 30.976562 94.675781 30.976562 110.078125 30.976562 C 110.078125 52.855469 110.078125 74.738281 110.078125 97.28125 C 95.128906 97.28125 80.175781 97.28125 64.769531 97.28125 C 64.769531 90.269531 64.769531 83.257812 64.769531 76.03125 C 56.574219 76.03125 48.378906 76.03125 39.9375 76.03125 C 39.9375 83.042969 39.9375 90.054688 39.9375 97.28125 C 32.585938 97.28125 25.238281 97.28125 17.664062 97.28125 C 17.664062 75.398438 17.664062 53.519531 17.664062 30.976562 Z M 17.664062 30.976562 "/>
|
|
6
|
+
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 64.769531 30.976562 C 79.722656 30.976562 94.675781 30.976562 110.078125 30.976562 C 110.078125 52.855469 110.078125 74.738281 110.078125 97.28125 C 95.128906 97.28125 80.175781 97.28125 64.769531 97.28125 C 64.769531 90.269531 64.769531 83.257812 64.769531 76.03125 C 71.949219 76.03125 79.128906 76.03125 86.527344 76.03125 C 86.527344 68.175781 86.527344 60.320312 86.527344 52.222656 C 79.347656 52.222656 72.167969 52.222656 64.769531 52.222656 C 64.769531 45.210938 64.769531 38.199219 64.769531 30.976562 Z M 64.769531 30.976562 "/>
|
|
7
|
+
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 64.769531 52.480469 C 71.863281 52.480469 78.960938 52.480469 86.273438 52.480469 C 86.273438 60.167969 86.273438 67.855469 86.273438 75.777344 C 79.175781 75.777344 72.078125 75.777344 64.769531 75.777344 C 64.769531 68.089844 64.769531 60.402344 64.769531 52.480469 Z M 64.769531 52.480469 "/>
|
|
8
|
+
</g>
|
|
9
|
+
</svg>
|
package/add-ons/convex/info.json
CHANGED
package/add-ons/form/info.json
CHANGED
package/add-ons/sentry/info.json
CHANGED
package/add-ons/start/info.json
CHANGED
package/add-ons/store/info.json
CHANGED
package/add-ons/strapi/info.json
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
"link": "https://strapi.io/",
|
|
5
5
|
"phase": "add-on",
|
|
6
6
|
"type": "add-on",
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
],
|
|
7
|
+
"category": "cms",
|
|
8
|
+
"color": "#4945FF",
|
|
9
|
+
"modes": ["file-router"],
|
|
10
10
|
"routes": [
|
|
11
11
|
{
|
|
12
12
|
"url": "/demo/strapi",
|
|
@@ -15,4 +15,4 @@
|
|
|
15
15
|
"jsName": "StrapiDemo"
|
|
16
16
|
}
|
|
17
17
|
]
|
|
18
|
-
}
|
|
18
|
+
}
|
package/add-ons/t3env/info.json
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
"description": "A chat example that uses TanStack Start and TanStack Store. Features chat with Anthropic Sonnet, chat history and custom prompts.",
|
|
4
4
|
"phase": "example",
|
|
5
5
|
"type": "example",
|
|
6
|
+
"category": "other",
|
|
7
|
+
"color": "#00D1B2",
|
|
6
8
|
"modes": ["file-router"],
|
|
7
9
|
"link": "",
|
|
8
10
|
"routes": [
|
package/hosts/netlify/info.json
CHANGED
package/hosts/nitro/info.json
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Railway",
|
|
3
|
+
"description": "Railway deployment setup",
|
|
4
|
+
"link": "https://railway.com/",
|
|
5
|
+
"phase": "add-on",
|
|
6
|
+
"modes": ["file-router", "code-router"],
|
|
7
|
+
"type": "deployment",
|
|
8
|
+
"category": "deploy",
|
|
9
|
+
"exclusive": ["deploy"],
|
|
10
|
+
"color": "#9B4DCA",
|
|
11
|
+
"priority": 160,
|
|
12
|
+
"tailwind": false,
|
|
13
|
+
"integrations": [
|
|
14
|
+
{
|
|
15
|
+
"type": "vite-plugin",
|
|
16
|
+
"import": "import { nitro } from 'nitro/vite'",
|
|
17
|
+
"code": "nitro()"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/cta-framework-solid",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.48.1",
|
|
4
4
|
"description": "CTA Framework for Solid",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"author": "Jack Herrington <jherr@pobox.com>",
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@tanstack/cta-engine": "0.
|
|
25
|
+
"@tanstack/cta-engine": "0.49.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^24.6.0",
|