Skip to content

Commit e8fb48f

Browse files
committed
chore: removing conditionals in create-app
1 parent a64fd70 commit e8fb48f

37 files changed

+228
-184
lines changed

packages/cta-engine/src/create-app.ts

Lines changed: 16 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export async function createApp(
3131
) {
3232
environment.startRun()
3333

34+
const projectBaseDir = resolve(options.framework.baseDirectory)
3435
const templateDirBase = resolve(options.framework.baseDirectory, 'base')
3536
const templateDirRouter = resolve(
3637
options.framework.baseDirectory,
@@ -107,20 +108,7 @@ export async function createApp(
107108
}
108109

109110
// Setup the .vscode directory
110-
switch (options.toolchain) {
111-
case 'biome':
112-
await environment.copyFile(
113-
resolve(templateDirBase, '_dot_vscode/settings.biome.json'),
114-
resolve(targetDir, '.vscode/settings.json'),
115-
)
116-
break
117-
case 'none':
118-
default:
119-
await environment.copyFile(
120-
resolve(templateDirBase, '_dot_vscode/settings.json'),
121-
resolve(targetDir, '.vscode/settings.json'),
122-
)
123-
}
111+
await templateFile(templateDirBase, '_dot_vscode/settings.json.ejs')
124112

125113
// Fill the public directory
126114
copyFiles(templateDirBase, [
@@ -132,9 +120,9 @@ export async function createApp(
132120
])
133121

134122
// Check for a .cursorrules file
135-
if (environment.exists(resolve(templateDirBase, '.cursorrules'))) {
123+
if (environment.exists(resolve(templateDirBase, '_dot_cursorrules'))) {
136124
await environment.copyFile(
137-
resolve(templateDirBase, '.cursorrules'),
125+
resolve(templateDirBase, '_dot_cursorrules'),
138126
resolve(targetDir, '.cursorrules'),
139127
)
140128
}
@@ -144,47 +132,24 @@ export async function createApp(
144132
await copyFiles(templateDirBase, ['./src/App.css'])
145133
}
146134

147-
// Don't create a vite.config.js file if we are building a Start app
148-
if (!isAddOnEnabled('start')) {
149-
await templateFile(templateDirBase, './vite.config.js.ejs')
150-
}
151-
135+
await templateFile(templateDirBase, './vite.config.js.ejs')
152136
await templateFile(templateDirBase, './src/styles.css.ejs')
153137

154138
copyFiles(templateDirBase, ['./src/logo.svg'])
155139

156-
if (options.toolchain === 'biome') {
157-
copyFiles(templateDirBase, ['./toolchain/biome.json'], true)
158-
}
159-
160-
if (options.toolchain === 'eslint+prettier') {
161-
copyFiles(
162-
templateDirBase,
163-
[
164-
'./toolchain/eslint.config.js',
165-
'./toolchain/prettier.config.js',
166-
'./toolchain/.prettierignore',
167-
],
168-
true,
169-
)
170-
}
140+
await templateFile(templateDirBase, 'biome.json.ejs')
141+
await templateFile(templateDirBase, '_dot_prettierignore.ejs')
142+
await templateFile(templateDirBase, 'eslint.config.js.ejs')
143+
await templateFile(templateDirBase, 'prettier.config.js.ejs')
171144

172145
// Setup reportWebVitals
173146
// TODO: This is a bit of a hack to check if the framework is react
174-
if (!isAddOnEnabled('start') && options.framework.id === 'react-cra') {
175-
if (options.typescript) {
176-
await templateFile(templateDirBase, './src/reportWebVitals.ts.ejs')
177-
} else {
178-
await templateFile(
179-
templateDirBase,
180-
'./src/reportWebVitals.ts.ejs',
181-
'./src/reportWebVitals.js',
182-
)
183-
}
184-
}
185-
if (!isAddOnEnabled('start')) {
186-
await templateFile(templateDirBase, './index.html.ejs')
147+
if (
148+
environment.exists(resolve(templateDirBase, './src/reportWebVitals.ts.ejs'))
149+
) {
150+
await templateFile(templateDirBase, './src/reportWebVitals.ts.ejs')
187151
}
152+
await templateFile(templateDirBase, './index.html.ejs')
188153

189154
// Add .gitignore
190155
await environment.copyFile(
@@ -193,20 +158,14 @@ export async function createApp(
193158
)
194159

195160
// Setup tsconfig
196-
if (options.typescript) {
197-
await templateFile(
198-
templateDirBase,
199-
'./tsconfig.json.ejs',
200-
'./tsconfig.json',
201-
)
202-
}
161+
await templateFile(templateDirBase, './tsconfig.json.ejs')
203162

204163
// Setup the package.json file, optionally with typescript, tailwind and formatter/linter
205164
await createPackageJSON(
206165
environment,
207166
options.projectName,
208167
options,
209-
templateDirBase,
168+
projectBaseDir,
210169
templateDirRouter,
211170
targetDir,
212171
options.chosenAddOns.map((addOn) => addOn.packageAdditions),

packages/cta-engine/src/package-json.ts

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,25 +51,27 @@ export async function createPackageJSON(
5151
}>,
5252
) {
5353
let packageJSON = JSON.parse(
54-
await environment.readFile(resolve(templateDir, 'package.json'), 'utf8'),
54+
await environment.readFile(
55+
resolve(templateDir, 'base', 'package.json'),
56+
'utf8',
57+
),
5558
)
5659
packageJSON.name = projectName
5760

58-
const additions = [
59-
options.typescript ? 'package.ts.json' : undefined,
60-
options.tailwind ? 'package.tw.json' : undefined,
61-
options.toolchain === 'biome' ? 'package.biome.json' : undefined,
61+
const packages = JSON.parse(
62+
await environment.readFile(resolve(templateDir, 'packages.json'), 'utf8'),
63+
)
64+
65+
const additions: Array<Record<string, any> | undefined> = [
66+
options.typescript ? packages.typescript : undefined,
67+
options.tailwind ? packages.tailwindcss : undefined,
68+
options.toolchain === 'biome' ? packages.biome : undefined,
6269
options.toolchain === 'eslint+prettier'
63-
? 'package.eslintprettier.json'
70+
? packages.eslintprettier
6471
: undefined,
6572
]
6673
for (const addition of additions.filter(Boolean)) {
67-
packageJSON = await appendPackageJSON(
68-
environment,
69-
packageJSON,
70-
templateDir,
71-
addition!,
72-
)
74+
packageJSON = mergePackageJSON(packageJSON, addition!)
7375
}
7476

7577
if (options.mode === FILE_ROUTER) {

packages/cta-engine/src/template-file.ts

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ import { CODE_ROUTER, FILE_ROUTER } from '@tanstack/cta-core'
66

77
import type { Environment, Options } from '@tanstack/cta-core'
88

9+
function convertDotFilesAndPaths(path: string) {
10+
return path
11+
.split('/')
12+
.map((segment) => segment.replace(/^_dot_/, '.'))
13+
.join('/')
14+
}
15+
916
export function createTemplateFile(
1017
environment: Environment,
1118
projectName: string,
@@ -56,6 +63,13 @@ export function createTemplateFile(
5663
return command
5764
}
5865

66+
class IgnoreFileError extends Error {
67+
constructor() {
68+
super('ignoreFile')
69+
this.name = 'IgnoreFileError'
70+
}
71+
}
72+
5973
const templateValues = {
6074
packageManager: options.packageManager,
6175
projectName: projectName,
@@ -79,15 +93,32 @@ export function createTemplateFile(
7993

8094
getPackageManagerAddScript,
8195
getPackageManagerRunScript,
96+
97+
ignoreFile: () => {
98+
throw new IgnoreFileError()
99+
},
82100
}
83101

102+
let ignoreFile = false
103+
84104
try {
85105
content = render(content, templateValues)
86106
} catch (error) {
87-
environment.error(`EJS error in file ${file}`, error?.toString())
88-
process.exit(1)
107+
if (error instanceof IgnoreFileError) {
108+
ignoreFile = true
109+
} else {
110+
environment.error(`EJS error in file ${file}`, error?.toString())
111+
process.exit(1)
112+
}
113+
}
114+
115+
if (ignoreFile) {
116+
return
89117
}
90-
const target = targetFileName ?? file.replace('.ejs', '')
118+
119+
let target = convertDotFilesAndPaths(
120+
targetFileName ?? file.replace('.ejs', ''),
121+
)
91122

92123
if (target.endsWith('.ts') || target.endsWith('.tsx')) {
93124
content = await format(content, {
@@ -98,6 +129,10 @@ export function createTemplateFile(
98129
})
99130
}
100131

132+
if (!options.typescript) {
133+
target = target.replace(/\.tsx?$/, '.jsx').replace(/\.ts$/, '.js')
134+
}
135+
101136
await environment.writeFile(resolve(targetDir, target), content)
102137
}
103138
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<% if (toolchain !== 'eslint+prettier') { ignoreFile() } %>package-lock.json
2+
pnpm-lock.yaml
3+
yarn.lock

templates/react-cra/project/base/_dot_vscode/settings.json

Lines changed: 0 additions & 11 deletions
This file was deleted.

templates/react-cra/project/base/_dot_vscode/settings.biome.json renamed to templates/react-cra/project/base/_dot_vscode/settings.json.ejs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
},
88
"files.readonlyInclude": {
99
"**/routeTree.gen.ts": true
10-
},
10+
}<% if (toolchain === 'biome') { %>,
1111
"[javascript]": {
1212
"editor.defaultFormatter": "biomejs.biome"
1313
},
@@ -34,5 +34,5 @@
3434
},
3535
"editor.codeActionsOnSave": {
3636
"source.organizeImports.biome": "explicit"
37-
}
37+
}<% } %>
3838
}

templates/react-cra/project/base/toolchain/biome.json renamed to templates/react-cra/project/base/biome.json.ejs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{
1+
<% if (toolchain !== 'biome') { ignoreFile() } %>{
22
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
33
"vcs": {
44
"enabled": false,

templates/react-cra/project/base/toolchain/eslint.config.js renamed to templates/react-cra/project/base/eslint.config.js.ejs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// @ts-check
1+
<% if (toolchain !== 'eslint+prettier') { ignoreFile() } %>// @ts-check
22

33
import { tanstackConfig } from "@tanstack/eslint-config";
44

templates/react-cra/project/base/index.html.ejs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!DOCTYPE html>
1+
<% if (addOnEnabled['start']) { ignoreFile() } %><!DOCTYPE html>
22
<html lang="en">
33
<head>
44
<meta charset="UTF-8" />

templates/react-cra/project/base/package.biome.json

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)