Skip to content

Commit 3341e84

Browse files
committed
fix: supporting forced mode and add-ons in the UI
1 parent 0fac7d7 commit 3341e84

File tree

6 files changed

+66
-7
lines changed

6 files changed

+66
-7
lines changed

packages/cta-cli/src/cli.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ export function cli({
109109
launchUI({
110110
mode: 'add',
111111
addOns: parsedAddOns,
112+
forcedMode,
113+
forcedAddOns,
112114
})
113115
} else {
114116
await addToApp(environment, parsedAddOns, process.cwd(), {
@@ -290,6 +292,8 @@ export function cli({
290292
launchUI({
291293
mode: 'setup',
292294
options: createSerializedOptions(finalOptions || defaultOptions),
295+
forcedMode,
296+
forcedAddOns,
293297
})
294298
return
295299
}

packages/cta-ui/lib/index.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,35 @@
11
import { dirname, resolve } from 'node:path'
22
import { fileURLToPath } from 'node:url'
33

4-
import type { SerializedOptions } from '@tanstack/cta-engine'
4+
import type { Mode, SerializedOptions } from '@tanstack/cta-engine'
55

66
export function launchUI({
77
mode,
88
addOns,
99
options,
10+
forcedMode,
11+
forcedAddOns,
1012
}: {
1113
mode: 'add' | 'setup'
1214
addOns?: Array<string>
1315
options?: SerializedOptions
16+
forcedMode?: Mode
17+
forcedAddOns?: Array<string>
1418
}) {
1519
const projectPath = process.cwd()
1620

21+
delete process.env.NODE_ENV
22+
1723
process.env.CTA_PROJECT_PATH = projectPath
1824
process.env.CTA_ADD_ONS = addOns?.join(',') || ''
1925
process.env.CTA_OPTIONS = options ? JSON.stringify(options) : ''
2026
process.env.CTA_MODE = mode
27+
if (forcedMode) {
28+
process.env.CTA_FORCED_ROUTER_MODE = forcedMode
29+
}
30+
if (forcedAddOns) {
31+
process.env.CTA_FORCED_ADD_ONS = forcedAddOns.join(',')
32+
}
2133

2234
const developerPath = resolve(dirname(fileURLToPath(import.meta.url)), '..')
2335
const configPath = resolve(developerPath, './app.config.js')

packages/cta-ui/src/engine-handling/generate-initial-payload.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import { createAppWrapper } from './create-app-wrapper.js'
1313
import { registerFrameworks } from './framework-registration.js'
1414
import {
1515
getApplicationMode,
16+
getForcedAddOns,
17+
getForcedRouterMode,
1618
getProjectOptions,
1719
getProjectPath,
1820
} from './server-environment.js'
@@ -30,14 +32,16 @@ export async function generateInitialPayload() {
3032
? await cleanUpFiles(await recursivelyGatherFiles(projectPath, false))
3133
: {}
3234

35+
const forcedRouterMode = getForcedRouterMode()
36+
3337
function getSerializedOptions() {
3438
if (applicationMode === 'setup') {
3539
const projectOptions = getProjectOptions()
3640
return {
3741
...projectOptions,
3842
framework: projectOptions.framework || 'react-cra',
3943
projectName: projectOptions.projectName || basename(projectPath),
40-
mode: projectOptions.mode || 'file-router',
44+
mode: forcedRouterMode || projectOptions.mode,
4145
typescript: projectOptions.typescript || true,
4246
tailwind: projectOptions.tailwind || true,
4347
git: projectOptions.git || true,
@@ -89,5 +93,7 @@ export async function generateInitialPayload() {
8993
},
9094
options: serializedOptions,
9195
output,
96+
forcedRouterMode,
97+
forcedAddOns: getForcedAddOns(),
9298
}
9399
}

packages/cta-ui/src/engine-handling/server-environment.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { SerializedOptions } from '@tanstack/cta-engine'
1+
import type { Mode, SerializedOptions } from '@tanstack/cta-engine'
22

33
export function getProjectPath(): string {
44
return process.env.CTA_PROJECT_PATH!
@@ -11,3 +11,14 @@ export function getApplicationMode(): 'add' | 'setup' {
1111
export function getProjectOptions(): SerializedOptions {
1212
return JSON.parse(process.env.CTA_OPTIONS!)
1313
}
14+
15+
export function getForcedRouterMode(): Mode | undefined {
16+
if (!process.env.CTA_FORCED_ROUTER_MODE) {
17+
return undefined
18+
}
19+
return process.env.CTA_FORCED_ROUTER_MODE as Mode
20+
}
21+
22+
export function getForcedAddOns(): Array<string> | undefined {
23+
return process.env.CTA_FORCED_ADD_ONS?.split(',') || []
24+
}

packages/cta-ui/src/store/project.ts

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,14 @@ const useInitialData = () =>
3636
'file-router': [],
3737
},
3838
applicationMode: 'none',
39+
forcedRouterMode: undefined,
40+
forcedAddOns: [],
3941
},
4042
})
4143

44+
const useForcedRouterMode = () => useInitialData().data.forcedRouterMode
45+
const useForcedAddOns = () => useInitialData().data.forcedAddOns
46+
4247
export const useProjectLocalFiles = () => useInitialData().data.localFiles
4348
export const useOriginalOutput = () => useInitialData().data.output
4449
export const useOriginalSelectedAddOns = () =>
@@ -98,6 +103,7 @@ export function useAddOns() {
98103
const originalSelectedAddOns = useOriginalSelectedAddOns()
99104
const codeRouterAddOns = useCodeRouterAddOns()
100105
const fileRouterAddOns = useFileRouterAddOns()
106+
const forcedAddOns = useForcedAddOns()
101107
const { userSelectedAddOns, customAddOns } = useMutableAddOns()
102108
const projectStarter = useProjectStarter().projectStarter
103109

@@ -118,6 +124,9 @@ export function useAddOns() {
118124
for (const addOn of originalSelectedAddOns) {
119125
originalAddOns.add(addOn)
120126
}
127+
for (const addOn of forcedAddOns) {
128+
originalAddOns.add(addOn)
129+
}
121130
return getAddOnStatus(
122131
availableAddOns,
123132
userSelectedAddOns,
@@ -128,11 +137,18 @@ export function useAddOns() {
128137
userSelectedAddOns,
129138
originalSelectedAddOns,
130139
projectStarter?.dependsOn,
140+
forcedAddOns,
131141
])
132142

133143
const chosenAddOns = useMemo(() => {
134-
return Object.keys(addOnState).filter((addOn) => addOnState[addOn].selected)
135-
}, [addOnState])
144+
const addOns = new Set(
145+
Object.keys(addOnState).filter((addOn) => addOnState[addOn].selected),
146+
)
147+
for (const addOn of forcedAddOns) {
148+
addOns.add(addOn)
149+
}
150+
return Array.from(addOns)
151+
}, [addOnState, forcedAddOns])
136152

137153
const toggleAddOn = useCallback(
138154
(addOnId: string) => {
@@ -166,7 +182,11 @@ export function useAddOns() {
166182
const useHasProjectStarter = () =>
167183
useProjectStarter((state) => state.projectStarter === undefined)
168184

169-
export const useModeEditable = () => useHasProjectStarter()
185+
export const useModeEditable = () => {
186+
const forcedRouterMode = useForcedRouterMode()
187+
const hasProjectStarter = useHasProjectStarter()
188+
return !forcedRouterMode && hasProjectStarter
189+
}
170190

171191
export const useTypeScriptEditable = () => {
172192
const hasProjectStarter = useHasProjectStarter()
@@ -183,7 +203,11 @@ export const useTailwindEditable = () => {
183203
export const useProjectName = () =>
184204
useProjectOptions((state) => state.projectName)
185205

186-
export const useRouterMode = () => useProjectOptions((state) => state.mode)
206+
export const useRouterMode = () => {
207+
const forcedRouterMode = useForcedRouterMode()
208+
const userMode = useProjectOptions((state) => state.mode)
209+
return forcedRouterMode || userMode
210+
}
187211

188212
export function useFilters() {
189213
const includedFiles = useApplicationSettings((state) => state.includeFiles)

packages/cta-ui/src/types.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ export type InitialData = {
6464
'file-router': Array<AddOnInfo>
6565
}
6666
applicationMode: ApplicationMode
67+
forcedRouterMode?: Mode
68+
forcedAddOns?: Array<string>
6769
}
6870

6971
export type EventItem = {

0 commit comments

Comments
 (0)