Skip to content

Commit 78af490

Browse files
committed
fix: remove relative file prefixes
1 parent 434eefd commit 78af490

File tree

13 files changed

+107
-86
lines changed

13 files changed

+107
-86
lines changed

.changeset/flat-baths-cough.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@tanstack/cta-engine': patch
3+
---
4+
5+
fix: remove relative file prefixes

packages/cta-engine/src/custom-add-ons/shared.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { createMemoryEnvironment } from '../environment.js'
55
import { finalizeAddOns, populateAddOnOptionsDefaults } from '../add-ons.js'
66
import { getFrameworkById } from '../frameworks.js'
77
import { readConfigFileFromEnvironment } from '../config-file.js'
8-
import { readFileHelper } from '../file-helpers.js'
8+
import { readFileHelper, toCleanPath } from '../file-helpers.js'
99
import { loadStarter } from '../custom-add-ons/starter.js'
1010

1111
import type { Environment, Options, SerializedOptions } from '../types.js'
@@ -117,9 +117,10 @@ export async function runCreateApp(options: Required<Options>) {
117117
})
118118

119119
output.files = Object.fromEntries(
120-
Object.entries(output.files).map(([key, value]) => {
121-
return [key.replace(targetDir, '.'), value]
122-
}),
120+
Object.entries(output.files).map(([key, value]) => [
121+
toCleanPath(key, targetDir),
122+
value,
123+
]),
123124
)
124125

125126
return output

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@ export function getBinaryFile(content: string): string | null {
3636
return null
3737
}
3838

39+
/**
40+
* Convert an absolute path to a clean relative path by removing a base directory.
41+
* Returns a path without leading ./ or / prefix.
42+
*/
43+
export function toCleanPath(absolutePath: string, baseDir: string): string {
44+
let cleanPath = absolutePath.replace(baseDir, '')
45+
if (cleanPath.startsWith('/')) cleanPath = cleanPath.slice(1)
46+
return cleanPath
47+
}
48+
3949
export function relativePath(
4050
from: string,
4151
to: string,
@@ -122,7 +132,7 @@ async function recursivelyGatherFilesHelper(
122132
)
123133
} else {
124134
const filePath = resolve(path, file.name)
125-
files[filePath.replace(basePath, '.')] = await readFileHelper(filePath)
135+
files[toCleanPath(filePath, basePath)] = await readFileHelper(filePath)
126136
}
127137
}
128138
}
@@ -159,7 +169,7 @@ async function recursivelyGatherFilesFromEnvironmentHelper(
159169
)
160170
} else {
161171
const filePath = resolve(path, file)
162-
files[filePath.replace(basePath, '.')] =
172+
files[toCleanPath(filePath, basePath)] =
163173
await environment.readFile(filePath)
164174
}
165175
}
@@ -232,7 +242,7 @@ export function cleanUpFiles(
232242
) {
233243
return Object.keys(files).reduce<Record<string, string>>((acc, file) => {
234244
if (basename(file) !== '.cta.json') {
235-
acc[targetDir ? file.replace(targetDir, '.') : file] = files[file]
245+
acc[targetDir ? toCleanPath(file, targetDir) : file] = files[file]
236246
}
237247
return acc
238248
}, {})
@@ -241,7 +251,7 @@ export function cleanUpFiles(
241251
export function cleanUpFileArray(files: Array<string>, targetDir?: string) {
242252
return files.reduce<Array<string>>((acc, file) => {
243253
if (basename(file) !== '.cta.json') {
244-
acc.push(targetDir ? file.replace(targetDir, '.') : file)
254+
acc.push(targetDir ? toCleanPath(file, targetDir) : file)
245255
}
246256
return acc
247257
}, [])

packages/cta-engine/src/frameworks.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
findFilesRecursively,
66
isDirectory,
77
readFileHelper,
8+
toCleanPath,
89
} from './file-helpers.js'
910

1011
import type { AddOn, Framework, FrameworkDefinition } from './types.js'
@@ -20,7 +21,7 @@ export function scanProjectDirectory(
2021

2122
const files = Object.keys(absolutePaths).reduce(
2223
(acc, path) => {
23-
acc[path.replace(baseDirectory, '.')] = absolutePaths[path]
24+
acc[toCleanPath(path, baseDirectory)] = absolutePaths[path]
2425
return acc
2526
},
2627
{} as Record<string, string>,
@@ -59,13 +60,16 @@ export function scanAddOnDirectories(addOnsDirectories: Array<string>) {
5960

6061
let packageAdditions: Record<string, any> = {}
6162
let packageTemplate: string | undefined = undefined
62-
63+
6364
if (existsSync(resolve(addOnsBase, dir, 'package.json'))) {
6465
packageAdditions = JSON.parse(
6566
readFileSync(resolve(addOnsBase, dir, 'package.json'), 'utf-8'),
6667
)
6768
} else if (existsSync(resolve(addOnsBase, dir, 'package.json.ejs'))) {
68-
packageTemplate = readFileSync(resolve(addOnsBase, dir, 'package.json.ejs'), 'utf-8')
69+
packageTemplate = readFileSync(
70+
resolve(addOnsBase, dir, 'package.json.ejs'),
71+
'utf-8',
72+
)
6973
}
7074

7175
let readme: string | undefined
@@ -88,7 +92,7 @@ export function scanAddOnDirectories(addOnsDirectories: Array<string>) {
8892
}
8993
const files: Record<string, string> = {}
9094
for (const file of Object.keys(absoluteFiles)) {
91-
files[file.replace(assetsDir, '.')] = readFileHelper(file)
95+
files[toCleanPath(file, assetsDir)] = readFileHelper(file)
9296
}
9397

9498
const getFiles = () => {

packages/cta-engine/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export {
4646
getBinaryFile,
4747
recursivelyGatherFiles,
4848
relativePath,
49+
toCleanPath,
4950
} from './file-helpers.js'
5051

5152
export { formatCommand, handleSpecialURL } from './utils.js'

packages/cta-engine/tests/add-to-app.test.ts

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ const fakeCTAJSON: PersistedOptions = {
3434

3535
beforeEach(() => {
3636
const fakeFiles = {
37-
'./package.json': JSON.stringify({
37+
'package.json': JSON.stringify({
3838
name: 'test',
3939
version: '1.0.0',
4040
dependencies: {},
@@ -71,7 +71,7 @@ beforeEach(() => {
7171
},
7272
},
7373
dependsOn: [],
74-
getFiles: () => Promise.resolve(['./jack.txt']),
74+
getFiles: () => Promise.resolve(['jack.txt']),
7575
getFileContents: () => Promise.resolve('foo'),
7676
getDeletedFiles: () => Promise.resolve([]),
7777
},
@@ -152,8 +152,8 @@ describe('writeFiles', () => {
152152
'/foo',
153153
{
154154
files: {
155-
'./bar.txt': 'baz',
156-
'./blarg.txt': 'blarg',
155+
'bar.txt': 'baz',
156+
'blarg.txt': 'blarg',
157157
},
158158
deletedFiles: [],
159159
},
@@ -177,18 +177,18 @@ describe('writeFiles', () => {
177177
'/foo',
178178
{
179179
files: {
180-
'./bar.txt': 'baz',
181-
'./blarg.txt': 'blarg',
180+
'bar.txt': 'baz',
181+
'blarg.txt': 'blarg',
182182
},
183183
deletedFiles: [],
184184
},
185185
true,
186186
)
187187
environment.finishRun()
188188
expect(output.files).toEqual({
189-
'./blooop.txt': 'blooop',
190-
'./bar.txt': 'baz',
191-
'./blarg.txt': 'blarg',
189+
'blooop.txt': 'blooop',
190+
'bar.txt': 'baz',
191+
'blarg.txt': 'blarg',
192192
})
193193
})
194194

@@ -203,9 +203,9 @@ describe('writeFiles', () => {
203203
'/foo',
204204
{
205205
files: {
206-
'./unchanged.jpg': 'base64::foobaz',
207-
'./changing.jpg': 'base64::aGVsbG8=',
208-
'./new.jpg': 'base64::aGVsbG8=',
206+
'unchanged.jpg': 'base64::foobaz',
207+
'changing.jpg': 'base64::aGVsbG8=',
208+
'new.jpg': 'base64::aGVsbG8=',
209209
},
210210
deletedFiles: [],
211211
},
@@ -214,9 +214,9 @@ describe('writeFiles', () => {
214214
environment.finishRun()
215215
// It's ok for unchanged.jpg not to be written, because it matches the existing file
216216
expect(output.files).toEqual({
217-
'./unchanged.jpg': 'base64::foobaz',
218-
'./changing.jpg': 'base64::aGVsbG8=',
219-
'./new.jpg': 'base64::aGVsbG8=',
217+
'unchanged.jpg': 'base64::foobaz',
218+
'changing.jpg': 'base64::aGVsbG8=',
219+
'new.jpg': 'base64::aGVsbG8=',
220220
})
221221
})
222222

@@ -245,7 +245,7 @@ describe('writeFiles', () => {
245245
'/foo',
246246
{
247247
files: {
248-
'./package.json': JSON.stringify(
248+
'package.json': JSON.stringify(
249249
{
250250
scripts: {
251251
test: 'echo "test"',
@@ -264,7 +264,7 @@ describe('writeFiles', () => {
264264
)
265265
environment.finishRun()
266266
expect(output.files).toEqual({
267-
'./package.json': JSON.stringify(
267+
'package.json': JSON.stringify(
268268
{
269269
name: 'test',
270270
version: '1.0.0',
@@ -291,11 +291,11 @@ describe('writeFiles', () => {
291291
await writeFiles(
292292
environment,
293293
'/foo',
294-
{ files: {}, deletedFiles: ['./bloop.txt'] },
294+
{ files: {}, deletedFiles: ['bloop.txt'] },
295295
true,
296296
)
297297
environment.finishRun()
298-
expect(output.deletedFiles).toEqual(['./bloop.txt'])
298+
expect(output.deletedFiles).toEqual(['bloop.txt'])
299299
})
300300
})
301301

@@ -338,8 +338,8 @@ describe('addToApp', () => {
338338
})
339339
environment.finishRun()
340340
expect(output.files).toEqual({
341-
'./jack.txt': 'foo',
342-
'./package.json': JSON.stringify(
341+
'jack.txt': 'foo',
342+
'package.json': JSON.stringify(
343343
{
344344
name: 'test',
345345
version: '1.0.0',

packages/cta-engine/tests/create-app.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const simpleOptions = {
3535
},
3636
},
3737
},
38-
getFiles: () => ['./src/test.txt'],
38+
getFiles: () => ['src/test.txt'],
3939
getFileContents: () => 'Hello',
4040
getDeletedFiles: () => [],
4141
},
@@ -78,7 +78,7 @@ describe('createApp', () => {
7878
command: 'echo',
7979
args: ['Hello'],
8080
},
81-
getFiles: () => ['./src/test2.txt'],
81+
getFiles: () => ['src/test2.txt'],
8282
getFileContents: () => 'Hello-2',
8383
getDeletedFiles: () => [],
8484
} as unknown as AddOn,
@@ -106,7 +106,7 @@ describe('createApp', () => {
106106
dependencies: {},
107107
devDependencies: {},
108108
},
109-
getFiles: () => ['./src/test2.txt', './public/foo.jpg'],
109+
getFiles: () => ['src/test2.txt', 'public/foo.jpg'],
110110
getFileContents: () => 'base64::aGVsbG8=',
111111
getDeletedFiles: () => [],
112112
} as unknown as AddOn,

packages/cta-engine/tests/custom-add-ons/shared.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ beforeEach(() => {
2323
vol.reset()
2424

2525
const fakeFiles = {
26-
'./package.json': JSON.stringify({
26+
'package.json': JSON.stringify({
2727
name: 'test',
2828
version: '1.0.0',
2929
dependencies: {},
@@ -69,7 +69,7 @@ beforeEach(() => {
6969
},
7070
},
7171
dependsOn: [],
72-
getFiles: () => Promise.resolve(['./jack.txt']),
72+
getFiles: () => Promise.resolve(['jack.txt']),
7373
getFileContents: () => Promise.resolve('foo'),
7474
getDeletedFiles: () => Promise.resolve([]),
7575
},

packages/cta-engine/tests/file-helper.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ describe('relativePath', () => {
4545
it('relative path with a different directory', () => {
4646
expect(
4747
relativePath(
48-
'./src/routes/__root.tsx.ejs',
48+
'src/routes/__root.tsx.ejs',
4949
'src/integrations/tanstack-query/layout.tsx',
5050
),
5151
).toBe('../integrations/tanstack-query/layout.tsx')

0 commit comments

Comments
 (0)