diff --git a/packages/create/src/frameworks/solid/project/base/src/components/Header.tsx.ejs b/packages/create/src/frameworks/solid/project/base/src/components/Header.tsx.ejs
index 85ec43d9..e91489d8 100644
--- a/packages/create/src/frameworks/solid/project/base/src/components/Header.tsx.ejs
+++ b/packages/create/src/frameworks/solid/project/base/src/components/Header.tsx.ejs
@@ -1,3 +1,4 @@
+<% if (!includeExamples) { ignoreFile(); return; } %>
import { Link } from '@tanstack/solid-router'
<% for(const integration of integrations.filter(i => i.type === 'header-user')) { %>
import <%= integration.jsName %> from '<%= relativePath(integration.path) %>'
diff --git a/packages/create/src/frameworks/solid/project/base/src/routes/__root.tsx.ejs b/packages/create/src/frameworks/solid/project/base/src/routes/__root.tsx.ejs
index e8f730c2..949f34df 100644
--- a/packages/create/src/frameworks/solid/project/base/src/routes/__root.tsx.ejs
+++ b/packages/create/src/frameworks/solid/project/base/src/routes/__root.tsx.ejs
@@ -16,6 +16,51 @@ function RootComponent() {
>
)
}
+<% } else if (!includeExamples) { %>
+import { HeadContent, Outlet, Scripts, createRootRouteWithContext } from '@tanstack/solid-router'
+import { TanStackRouterDevtools } from '@tanstack/solid-router-devtools'
+
+<% if (addOnEnabled['solid-ui']) { %>
+import "@fontsource/inter/400.css"
+<% } %>
+
+import { HydrationScript } from 'solid-js/web'
+import { Suspense } from 'solid-js'
+
+<% for(const addOn of addOns) {
+ for(const init of addOn.main?.initialize || []) { %>
+ <%- init %>
+<% } } %>
+
+import styleCss from "../styles.css?url";
+
+export const Route = createRootRouteWithContext()({
+ head: () => ({
+ links: [{ rel: "stylesheet", href: styleCss }],
+ }),
+ shellComponent: RootComponent,
+})
+
+function RootComponent() {
+ return (
+
+
+
+
+
+
+
+
+
+ <% for(const integration of integrations.filter(i => i.type === 'layout')) { %>
+ <<%= integration.jsName %> />
+ <% } %>
+
+
+
+
+ );
+}
<% } else { %>
import { HeadContent, Outlet, Scripts, createRootRouteWithContext } from '@tanstack/solid-router'
import { TanStackRouterDevtools } from '@tanstack/solid-router-devtools'
@@ -47,9 +92,9 @@ function RootComponent() {
+
-
diff --git a/packages/create/src/frameworks/solid/project/base/src/routes/about.tsx.ejs b/packages/create/src/frameworks/solid/project/base/src/routes/about.tsx.ejs
index 48d300de..60072ee9 100644
--- a/packages/create/src/frameworks/solid/project/base/src/routes/about.tsx.ejs
+++ b/packages/create/src/frameworks/solid/project/base/src/routes/about.tsx.ejs
@@ -1,3 +1,4 @@
+<% if (!includeExamples) { ignoreFile(); return; } %>
import { createFileRoute } from '@tanstack/solid-router'
export const Route = createFileRoute('/about')({
diff --git a/packages/create/src/frameworks/solid/project/base/src/routes/index.tsx.ejs b/packages/create/src/frameworks/solid/project/base/src/routes/index.tsx.ejs
index 5d1367b3..dc0e5446 100644
--- a/packages/create/src/frameworks/solid/project/base/src/routes/index.tsx.ejs
+++ b/packages/create/src/frameworks/solid/project/base/src/routes/index.tsx.ejs
@@ -1,3 +1,19 @@
+<% if (!includeExamples) { %>
+import { createFileRoute } from '@tanstack/solid-router'
+
+export const Route = createFileRoute('/')({ component: Home })
+
+function Home() {
+ return (
+
+
Welcome to TanStack Start
+
+ Edit src/routes/index.tsx to get started.
+
+
+ )
+}
+<% } else { %>
import { createFileRoute } from '@tanstack/solid-router'
export const Route = createFileRoute('/')({ component: App })
@@ -66,3 +82,4 @@ function App() {
)
}
+<% } %>
diff --git a/packages/create/src/frameworks/solid/project/base/src/styles.css.ejs b/packages/create/src/frameworks/solid/project/base/src/styles.css.ejs
index a1952e4a..34fd84bb 100644
--- a/packages/create/src/frameworks/solid/project/base/src/styles.css.ejs
+++ b/packages/create/src/frameworks/solid/project/base/src/styles.css.ejs
@@ -1,3 +1,20 @@
+<% if (!includeExamples) { %>
+@import 'tailwindcss';
+
+* {
+ box-sizing: border-box;
+}
+
+html,
+body,
+#app {
+ min-height: 100%;
+}
+
+body {
+ margin: 0;
+}
+<% } else { %>
@import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,500;9..144,700&family=Manrope:wght@400;500;600;700;800&display=swap');
@import 'tailwindcss';
@@ -193,3 +210,4 @@ code {
transform: translateY(0);
}
}
+<% } %>
diff --git a/packages/create/src/template-file.ts b/packages/create/src/template-file.ts
index dfd62236..520a4d23 100644
--- a/packages/create/src/template-file.ts
+++ b/packages/create/src/template-file.ts
@@ -137,6 +137,7 @@ export function createTemplateFile(environment: Environment, options: Options) {
fileRouter: options.mode === 'file-router',
codeRouter: options.mode === 'code-router',
routerOnly: options.routerOnly === true,
+ includeExamples: options.includeExamples !== false,
addOnEnabled,
addOnOption: options.addOnOptions,
addOns: options.chosenAddOns,
diff --git a/packages/create/tests/create-app.test.ts b/packages/create/tests/create-app.test.ts
index 2aef8107..6d77f1c5 100644
--- a/packages/create/tests/create-app.test.ts
+++ b/packages/create/tests/create-app.test.ts
@@ -117,4 +117,81 @@ describe('createApp', () => {
expect(output.files['/src/test2.txt']).toEqual('base64::aGVsbG8=')
expect(output.commands.some(({ command }) => command === 'echo')).toBe(true)
})
+
+ it('should strip demo files from add-ons when includeExamples is false', async () => {
+ const { environment, output } = createMemoryEnvironment()
+
+ const demoFiles = [
+ 'src/routes/demo/form.simple.tsx',
+ 'src/routes/demo.form.tsx',
+ 'src/routes/example.chat.tsx',
+ 'src/components/demo-AIAssistant.tsx',
+ 'src/components/demo.FormComponents.tsx',
+ 'src/hooks/demo-useAudioRecorder.ts',
+ 'src/hooks/demo.form.ts',
+ 'src/lib/demo-store.ts',
+ 'src/lib/demo.ai-hook.ts',
+ 'src/data/demo-guitars.ts',
+ 'src/store/demo.hooks.ts',
+ 'src/store/demo.store.ts',
+ 'src/demo.index.css',
+ 'public/demo-neon.svg',
+ 'public/example-guitar-flowers.jpg',
+ ]
+ const keepFiles = [
+ 'src/routes/index.tsx',
+ 'src/components/Header.tsx',
+ 'src/lib/utils.ts',
+ ]
+ const allFiles = [...demoFiles, ...keepFiles]
+
+ await createApp(environment, {
+ ...simpleOptions,
+ includeExamples: false,
+ chosenAddOns: [
+ {
+ id: 'test-addon',
+ type: 'add-on',
+ phase: 'add-on',
+ packageAdditions: { dependencies: {}, devDependencies: {} },
+ routes: [],
+ integrations: [],
+ getFiles: () => allFiles,
+ getFileContents: () => 'content',
+ getDeletedFiles: () => [],
+ } as unknown as AddOn,
+ ],
+ } as Options)
+
+ for (const file of demoFiles) {
+ expect(output.files[`/${file}`]).toBeUndefined()
+ }
+ for (const file of keepFiles) {
+ expect(output.files[`/${file}`]).toBeDefined()
+ }
+ })
+
+ it('should keep demo files from add-ons when includeExamples is true', async () => {
+ const { environment, output } = createMemoryEnvironment()
+
+ await createApp(environment, {
+ ...simpleOptions,
+ includeExamples: true,
+ chosenAddOns: [
+ {
+ id: 'test-addon',
+ type: 'add-on',
+ phase: 'add-on',
+ packageAdditions: { dependencies: {}, devDependencies: {} },
+ routes: [],
+ integrations: [],
+ getFiles: () => ['src/components/demo-AIAssistant.tsx'],
+ getFileContents: () => 'content',
+ getDeletedFiles: () => [],
+ } as unknown as AddOn,
+ ],
+ } as Options)
+
+ expect(output.files['/src/components/demo-AIAssistant.tsx']).toBeDefined()
+ })
})
diff --git a/packages/create/tests/template-context.test.ts b/packages/create/tests/template-context.test.ts
index 6d08c8d8..4c31cff6 100644
--- a/packages/create/tests/template-context.test.ts
+++ b/packages/create/tests/template-context.test.ts
@@ -311,4 +311,67 @@ export const db = testAddon(/* connection */)`
expect(output.files['/test/src/db/__sqlite__index.ts']).toBeUndefined()
expect(output.files['/test/src/db/__postgres__index.ts']).toBeUndefined()
})
+})
+
+describe('Template Context - includeExamples', () => {
+ it('should default includeExamples to true when undefined', async () => {
+ const { environment, output } = createMemoryEnvironment()
+ const templateFile = createTemplateFile(environment, simpleOptions)
+ environment.startRun()
+ await templateFile(
+ 'test.txt.ejs',
+ '<%= includeExamples ? "with-examples" : "no-examples" %>',
+ )
+ environment.finishRun()
+
+ expect(output.files['/test/test.txt']).toEqual('with-examples')
+ })
+
+ it('should set includeExamples to false when options.includeExamples is false', async () => {
+ const { environment, output } = createMemoryEnvironment()
+ const templateFile = createTemplateFile(environment, {
+ ...simpleOptions,
+ includeExamples: false,
+ })
+ environment.startRun()
+ await templateFile(
+ 'test.txt.ejs',
+ '<%= includeExamples ? "with-examples" : "no-examples" %>',
+ )
+ environment.finishRun()
+
+ expect(output.files['/test/test.txt']).toEqual('no-examples')
+ })
+
+ it('should ignore files when includeExamples is false', async () => {
+ const { environment, output } = createMemoryEnvironment()
+ const templateFile = createTemplateFile(environment, {
+ ...simpleOptions,
+ includeExamples: false,
+ })
+ environment.startRun()
+ await templateFile(
+ 'about.ts.ejs',
+ '<% if (!includeExamples) { ignoreFile(); return; } %>\nexport const about = true',
+ )
+ environment.finishRun()
+
+ expect(output.files['/test/about.ts']).toBeUndefined()
+ })
+
+ it('should include files when includeExamples is true', async () => {
+ const { environment, output } = createMemoryEnvironment()
+ const templateFile = createTemplateFile(environment, {
+ ...simpleOptions,
+ includeExamples: true,
+ })
+ environment.startRun()
+ await templateFile(
+ 'about.ts.ejs',
+ '<% if (!includeExamples) { ignoreFile(); return; } %>\nexport const about = true',
+ )
+ environment.finishRun()
+
+ expect(output.files['/test/about.ts']).toBeDefined()
+ })
})
\ No newline at end of file