diff --git a/index.ts b/index.ts index 775b7aa..2703dd2 100644 --- a/index.ts +++ b/index.ts @@ -46,6 +46,9 @@ const project = await p.group( return undefined }, }), + installDeps: async () => { + return await p.confirm({message: "Install dependencies?", }) + } }, { onCancel: () => { @@ -69,15 +72,10 @@ const destDir = path.join("./", project.name); render(destDir, { project }, { reverseMap: true }) const s = p.spinner(); -s.start("Installing dependencies"); -await Bun.$`bun install`.cwd(path.join(destDir)).quiet(); -await Bun.$`bun install`.cwd(path.join(destDir, 'packages', 'rpc')).quiet(); -if (project.frontend !== "none") { - await Bun.$`bun install`.cwd(path.join(destDir, 'apps', 'web')).quiet(); +if (project.installDeps) { + s.start("Installing dependencies"); + await Bun.$`bun install`.cwd(path.join(destDir)).quiet(); + s.stop("Dependencies installed."); } -if (project.mobile !== "none") { - await Bun.$`bun install`.cwd(path.join(destDir, 'apps', 'mobile')).quiet(); -} -s.stop("Dependencies installed."); p.outro("You're all set!"); diff --git "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/.ignore" "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/.ignore" deleted file mode 100644 index 3c3629e..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/.ignore" +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/package.json" "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/package.json" index 33f0f0b..1546f3b 100644 --- "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/package.json" +++ "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/package.json" @@ -1,5 +1,5 @@ { - "name": "example-basic", + "name": "example-bare", "type": "module", "scripts": { "dev": "vite dev", @@ -9,16 +9,9 @@ }, "dependencies": { "@<@var(context.project.name)>/rpc": "workspace:*", - "@solidjs/meta": "^0.29.4", - "@solidjs/router": "^0.15.0", "@solidjs/start": "2.0.0-alpha.2", "@solidjs/vite-plugin-nitro-2": "^0.1.0", - "@tailwindcss/vite": "^4.2.2", - "@tanstack/query-db-collection": "^1.0.35", - "@tanstack/solid-db": "^0.2.18", - "@tanstack/solid-query": "^5.96.2", "solid-js": "^1.9.5", - "tailwindcss": "^4.2.2", "vite": "^7.0.0" }, "engines": { diff --git "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/app.css" "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/app.css" index c9cc343..a4d2e55 100644 --- "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/app.css" +++ "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/app.css" @@ -1,5 +1,61 @@ -@import "tailwindcss"; - body { font-family: Gordita, Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; } + +a { + margin-right: 1rem; +} + +main { + text-align: center; + padding: 1em; + margin: 0 auto; +} + +h1 { + color: #335d92; + text-transform: uppercase; + font-size: 4rem; + font-weight: 100; + line-height: 1.1; + margin: 4rem auto; + max-width: 14rem; +} + +p { + max-width: 14rem; + margin: 2rem auto; + line-height: 1.35; +} + +@media (min-width: 480px) { + h1 { + max-width: none; + } + + p { + max-width: none; + } +} + +.increment { + font-family: inherit; + font-size: inherit; + padding: 1em 2em; + color: #335d92; + background-color: rgba(68, 107, 158, 0.1); + border-radius: 2em; + border: 2px solid rgba(68, 107, 158, 0); + outline: none; + width: 200px; + font-variant-numeric: tabular-nums; + cursor: pointer; +} + +.increment:focus { + border: 2px solid #335d92; +} + +.increment:active { + background-color: rgba(68, 107, 158, 0.2); +} diff --git "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/app.tsx" "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/app.tsx" index 5ff9bcc..ccab463 100644 --- "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/app.tsx" +++ "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/app.tsx" @@ -1,58 +1,58 @@ -import { MetaProvider, Title } from "@solidjs/meta"; -import { Router } from "@solidjs/router"; -import { FileRoutes } from "@solidjs/start/router"; -import { Suspense } from "solid-js"; -import { createCollection } from '@tanstack/solid-db' -import { queryCollectionOptions } from '@tanstack/query-db-collection' -import type { Todo, ExtractPayload } from '@<@var(context.project.name)>/rpc' -import { QueryClient, QueryClientProvider } from "@tanstack/solid-query" -import { getRouter } from "./lib/getRouter" +import { createSignal, For } from "solid-js"; +import { createRouter, Todo } from "@<@var(context.project.name)>/rpc" +import { createEffect } from 'solid-js' import "./app.css"; -import { TodoCollectionProvider } from "./context/todocollection/provider"; -const queryClient = new QueryClient({ -}) -const router = getRouter(); export default function App() { - const todosCollection = createCollection( - queryCollectionOptions({ - queryKey: ["todos"], - queryFn: async () => { - const todos = await router.todos.listTodos({}) - return todos.todos as ExtractPayload[]; - }, - queryClient, - getKey: (item) => item.id ? item.id : crypto.randomUUID(), - onInsert: async ({ transaction }) => { - Promise.all(transaction.mutations.map((m) => { - router.todos.createTodo({ todo: m.modified }) - })) - }, - onDelete: async ({ transaction }) => { - Promise.all(transaction.mutations.map((m) => { - router.todos.deleteTodo({ todo: m.modified }) - })) - }, - onUpdate: async ({ transaction }) => { - Promise.all(transaction.mutations.map((m) => { - router.todos.updateTodo({ todo: m.modified }) - })) - } + const router = createRouter("http://127.0.0.1:8080") + const [todos, setTodos] = createSignal([]); + const [todoToCreateTask, setTodoToCreateTask] = createSignal(""); + const fetchTodos = () => { + router.todos.listTodos({}).then((r) => { + setTodos(r.todos) }) - ) + } + createEffect(() => { + fetchTodos() + }) + + const setTodoDone = (id: string, task: string) => { + return async (event : Event & { currentTarget: HTMLInputElement }) => { + await router.todos.updateTodo({ todo: { id, task, done: event.currentTarget.checked } }) + fetchTodos() + } + } + + const deleteTodo = (id: string) => { + return async () => { + await router.todos.deleteTodo({ todo: { id } }) + fetchTodos() + } + } + + const createTodo = () => { + router.todos.createTodo({ todo: { id: crypto.randomUUID(), task: todoToCreateTask() } }).then((r) => { + console.log(r) + fetchTodos() + }).catch((e) => { + console.log(e) + }) + } + return ( - ( - - - - {props.children} - - - - )} - > - - +
+

Create Todo

+ setTodoToCreateTask(e.currentTarget.value)} type="text"/> + + + {(item:Todo) => +
+ {item.task} + + +
+ } +
+
); } diff --git "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/components/CreateTodo.tsx" "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/components/CreateTodo.tsx" deleted file mode 100644 index 61c450e..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/components/CreateTodo.tsx" +++ /dev/null @@ -1,38 +0,0 @@ -import { ExtractPayload, type Todo } from '@<@var(context.project.name)>/rpc' -import { createSignal } from 'solid-js'; -import { useTodoCollection } from '~/context/todocollection/create'; - -export const CreateTodo = () => { - const [todoState, setTodoState] = createSignal>({ - id: crypto.randomUUID(), - task: "", - done: false, - }) - - let inputRef!: HTMLInputElement - - const setTask = () => { - const todo = {...todoState()} - todo.task = inputRef.value; - setTodoState(todo) - } - - const todoCollection = useTodoCollection() - - const insertTodo = () => { - todoCollection.insert(todoState()) - setTodoState({ - id: crypto.randomUUID(), - task: "", - done: false - }) - inputRef.value = ""; - } - - return ( - <> - - - - ) -} diff --git "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/components/ListTodos.tsx" "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/components/ListTodos.tsx" deleted file mode 100644 index 3df92ba..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/components/ListTodos.tsx" +++ /dev/null @@ -1,29 +0,0 @@ -import { useLiveQuery } from "@tanstack/solid-db"; -import { useTodoCollection } from "~/context/todocollection/create"; -import { Todo } from './Todo' -import { For } from 'solid-js' - -export const ListTodos = () => { - const todoCollection = useTodoCollection() - const data = useLiveQuery((q) => - q.from({todos: todoCollection}) - ) - const todos = () => { - const items = Array.from(data.state.values()); - return items.sort((a: any, b: any) => { - if (a.done != b.done) return a.done ? -1 : 1 - if (!a.done && !b.done) { - const adate = a.createdAt ? new Date(a.createdAt) : new Date() - const bdate = b.createdAt ? new Date(b.createdAt) : new Date() - return bdate.getTime() - adate.getTime() - } - return 0 - }) - } - - return ( - Loading...}> - {(item) => } - - ) -} diff --git "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/components/Todo.tsx" "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/components/Todo.tsx" deleted file mode 100644 index 56edeb2..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/components/Todo.tsx" +++ /dev/null @@ -1,44 +0,0 @@ -import { ExtractPayload, type Todo as RpcTodo } from '@<@var(context.project.name)>/rpc' -import { createSignal, type JSX } from 'solid-js'; -import { useTodoCollection } from '~/context/todocollection/create'; - -export const Todo = ({ todo }: { todo: ExtractPayload }) => { - const [todoState, setTodoState] = createSignal(todo) - const todoCollection = useTodoCollection() - let commitUpdateTimeoutId: NodeJS.Timeout|null = null; - const updateTask: JSX.EventHandlerUnion = (e) => { - if (commitUpdateTimeoutId != null) { - clearTimeout(commitUpdateTimeoutId) - } - const todo = { ...todoState() }; - todo.task = e.currentTarget.value - setTodoState(todo) - commitUpdateTimeoutId = setTimeout(() => { - todoCollection.update(todoState().id, (draft) => { - draft.task = todoState().task - }) - },3000) - - } - const updateDone: JSX.EventHandlerUnion = (e) => { - const todo = { ...todoState() } - todo.done = e.currentTarget.checked - setTodoState(todo) - todoCollection.update(todoState().id, (draft) => { - draft.done = todoState().done - }) - } - const del = () => { - todoCollection.delete(todoState().id || "") - } - return ( -
- - {(new Date(todoState().createdAt || "")).toLocaleString()} - {(new Date(todoState().updatesAt || "")).toLocaleString()} - - -
- ) -} - diff --git "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/context/todocollection/create.ts" "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/context/todocollection/create.ts" deleted file mode 100644 index 58343d7..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/context/todocollection/create.ts" +++ /dev/null @@ -1,12 +0,0 @@ -import { createContext,useContext } from 'solid-js' -import { type CollectionImpl, type CollectionLike } from '@tanstack/solid-db' -import type { ExtractPayload, Todo } from '@<@var(context.project.name)>/rpc'; -export type TodoCollection = CollectionImpl> -export const TodoCollectionContext = createContext() -export const useTodoCollection = () => { - const col = useContext(TodoCollectionContext) - if (col === undefined) { - throw new Error("Todo collection has not been initialized") - } - return col; -} diff --git "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/context/todocollection/provider.tsx" "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/context/todocollection/provider.tsx" deleted file mode 100644 index a671753..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/context/todocollection/provider.tsx" +++ /dev/null @@ -1,8 +0,0 @@ -import { JSXElement } from 'solid-js'; -import { TodoCollection, TodoCollectionContext } from './create' - -export const TodoCollectionProvider = (props : {children:JSXElement, value: TodoCollection}) => { - return ( - {props.children} - ) -} diff --git "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/lib/getRouter.ts" "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/lib/getRouter.ts" deleted file mode 100644 index ae11412..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/lib/getRouter.ts" +++ /dev/null @@ -1,7 +0,0 @@ -import { createRouter } from "@<@var(context.project.name)>/rpc" - -const router = createRouter("http://127.0.0.1:8080") - -export const getRouter = () => { - return router; -} diff --git "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/routes/[...404].tsx" "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/routes/[...404].tsx" deleted file mode 100644 index 4ea71ec..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/routes/[...404].tsx" +++ /dev/null @@ -1,19 +0,0 @@ -import { Title } from "@solidjs/meta"; -import { HttpStatusCode } from "@solidjs/start"; - -export default function NotFound() { - return ( -
- Not Found - -

Page Not Found

-

- Visit{" "} - - start.solidjs.com - {" "} - to learn how to build SolidStart apps. -

-
- ); -} diff --git "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/routes/index.tsx" "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/routes/index.tsx" deleted file mode 100644 index 569b218..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/src/routes/index.tsx" +++ /dev/null @@ -1,13 +0,0 @@ -import { Title } from "@solidjs/meta"; -import { CreateTodo } from "~/components/CreateTodo"; -import { ListTodos } from "~/components/ListTodos" -export default function Home() { - return ( -
- Todos -

Todos

- - -
- ); -} diff --git "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/vite.config.ts" "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/vite.config.ts" index 72dec74..4c93687 100644 --- "a/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/vite.config.ts" +++ "b/template/apps/<@if(eq(context.project.frontend,\"solid-start\"))>web/vite.config.ts" @@ -1,12 +1,10 @@ import { defineConfig } from "vite"; import { nitroV2Plugin as nitro } from "@solidjs/vite-plugin-nitro-2"; -import tailwindcss from '@tailwindcss/vite' + import { solidStart } from "@solidjs/start/config"; export default defineConfig({ - plugins: [ - solidStart(), - nitro(), - tailwindcss() + plugins: [solidStart(), + nitro() ] }); diff --git "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/package.json" "b/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/package.json" index 02359de..322e3f3 100644 --- "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/package.json" +++ "b/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/package.json" @@ -21,14 +21,6 @@ "vite": "^8.0.7" }, "dependencies": { - "@bufbuild/protobuf": "^2.11.0", - "@connectrpc/connect": "^2.1.1", - "@connectrpc/connect-web": "^2.1.1", - "@<@var(context.project.name)>/rpc": "workspace:*", - "@tailwindcss/vite": "^4.3.0", - "@tanstack/query-db-collection": "^1.0.33", - "@tanstack/svelte-db": "^0.1.79", - "@tanstack/svelte-query": "^6.1.13", - "tailwindcss": "^4.3.0" + "@<@var(context.project.name)>/rpc": "workspace:*" } } diff --git "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/app.css" "b/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/app.css" deleted file mode 100644 index 798d8f1..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/app.css" +++ /dev/null @@ -1 +0,0 @@ -import @tailwindcss; diff --git "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/components/CreateTodo.svelte" "b/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/components/CreateTodo.svelte" deleted file mode 100644 index 700b533..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/components/CreateTodo.svelte" +++ /dev/null @@ -1,25 +0,0 @@ - - - - diff --git "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/components/ListTodos.svelte" "b/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/components/ListTodos.svelte" deleted file mode 100644 index 805717c..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/components/ListTodos.svelte" +++ /dev/null @@ -1,29 +0,0 @@ - - -{#if data.isLoading} -
Loading...
-{:else} - {#each todos as todo (todo.id)} - - {/each} -{/if} diff --git "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/components/Todo.svelte" "b/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/components/Todo.svelte" deleted file mode 100644 index 5d395e6..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/components/Todo.svelte" +++ /dev/null @@ -1,48 +0,0 @@ - - -
- - {new Date(todoState.createdAt || '').toLocaleString()} - {new Date(todoState.updatesAt || '').toLocaleString()} - - -
diff --git "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/getconnectrouter.ts" "b/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/getconnectrouter.ts" deleted file mode 100644 index 8ee292c..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/getconnectrouter.ts" +++ /dev/null @@ -1,8 +0,0 @@ -import {createRouter} from '@<@var(context.project.name)>/rpc' - -const router = createRouter("http://127.0.0.1:8080") - -export const getRouter = () => { - return router; -} - diff --git "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/todocollectionscontext.ts" "b/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/todocollectionscontext.ts" deleted file mode 100644 index bf3d71f..0000000 --- "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/lib/todocollectionscontext.ts" +++ /dev/null @@ -1,4 +0,0 @@ -import { createContext } from "svelte"; -import { type CollectionImpl } from '@tanstack/svelte-db' -import type { Todo, ExtractPayload } from "@<@var(context.project.name)>/rpc"; -export const [getTodoCollection,setTodoCollection] = createContext,string>>() diff --git "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/routes/+layout.svelte" "b/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/routes/+layout.svelte" index 2193962..9cebde5 100644 --- "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/routes/+layout.svelte" +++ "b/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/routes/+layout.svelte" @@ -1,53 +1,11 @@ + + + - - {@render children()} - +{@render children()} diff --git "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/routes/+page.svelte" "b/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/routes/+page.svelte" index 3c35aa9..f358f96 100644 --- "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/routes/+page.svelte" +++ "b/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/src/routes/+page.svelte" @@ -1,11 +1,51 @@ - -
- Todos -

Todos

- - -
+
+

Create Todo

+ + + {#each todos as todo (todo.id)} +
+ {todo.task} + + +
+ {/each} +
diff --git "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/vite.config.ts" "b/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/vite.config.ts" index 5734c85..bbf8c7d 100644 --- "a/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/vite.config.ts" +++ "b/template/apps/<@if(eq(context.project.frontend,\"svelte-kit\"))>web/vite.config.ts" @@ -1,9 +1,6 @@ import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vite'; -import tailwindcss from '@tailwindcss/vite' + export default defineConfig({ - plugins: [ - tailwindcss(), - sveltekit(), - ] + plugins: [sveltekit()] }); diff --git "a/template/apps/<@if(eq(context.project.mobile,\"expo\"))>mobile/src/app/_layout.tsx" "b/template/apps/<@if(eq(context.project.mobile,\"expo\"))>mobile/src/app/_layout.tsx" index d2a8b0b..89f0ac7 100644 --- "a/template/apps/<@if(eq(context.project.mobile,\"expo\"))>mobile/src/app/_layout.tsx" +++ "b/template/apps/<@if(eq(context.project.mobile,\"expo\"))>mobile/src/app/_layout.tsx" @@ -1,5 +1,5 @@ import { Stack } from "expo-router"; export default function RootLayout() { - return ; + return ; } diff --git "a/template/apps/<@if(eq(context.project.mobile,\"expo\"))>mobile/src/app/index.tsx" "b/template/apps/<@if(eq(context.project.mobile,\"expo\"))>mobile/src/app/index.tsx" index 7417679..8081223 100644 --- "a/template/apps/<@if(eq(context.project.mobile,\"expo\"))>mobile/src/app/index.tsx" +++ "b/template/apps/<@if(eq(context.project.mobile,\"expo\"))>mobile/src/app/index.tsx" @@ -47,7 +47,7 @@ export default function Index() { return ( - create todo + Create Todo