Skip to content

Commit 308b5d8

Browse files
fix(add): Fixes astro add modifying baseUrl by accident (#10774)
* fix(add): Fixes `astro add` modifying `baseUrl` by accident * chore: changeset * test: add test * fix: tsconfig not being a json maybe is a mistake, I don't know! * test: fix * Update packages/astro/test/fixtures/tsconfig-handling/baseUrl/tsconfig.json Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com> --------- Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
1 parent 3ff6b40 commit 308b5d8

5 files changed

Lines changed: 39 additions & 6 deletions

File tree

.changeset/mean-candles-hammer.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"astro": patch
3+
---
4+
5+
Fixes `astro add` sometimes modifying `baseUrl` unintentionally

packages/astro/src/cli/add/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -968,16 +968,16 @@ async function updateTSConfig(
968968
inputConfig = {
969969
tsconfig: defaultTSConfig,
970970
tsconfigFile: path.join(cwd, 'tsconfig.json'),
971-
rawConfig: { tsconfig: defaultTSConfig, tsconfigFile: path.join(cwd, 'tsconfig.json') },
971+
rawConfig: defaultTSConfig,
972972
};
973973
} else {
974-
inputConfigText = JSON.stringify(inputConfig.rawConfig.tsconfig, null, 2);
974+
inputConfigText = JSON.stringify(inputConfig.rawConfig, null, 2);
975975
}
976976

977977
const configFileName = path.basename(inputConfig.tsconfigFile);
978978

979979
const outputConfig = updateTSConfigForFramework(
980-
inputConfig.rawConfig.tsconfig,
980+
inputConfig.rawConfig,
981981
firstIntegrationWithTSSettings
982982
);
983983

packages/astro/src/core/config/tsconfig.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import { join } from 'node:path';
2+
import { readFile } from "node:fs/promises"
23
import {
34
TSConfckParseError,
45
type TSConfckParseOptions,
56
type TSConfckParseResult,
67
find,
78
parse,
9+
toJson
810
} from 'tsconfck';
911
import type { CompilerOptions, TypeAcquisition } from 'typescript';
1012

@@ -64,7 +66,7 @@ type TSConfigResult<T = {}> = Promise<
6466
export async function loadTSConfig(
6567
root: string | undefined,
6668
findUp = false
67-
): Promise<TSConfigResult<{ rawConfig: TSConfckParseResult }>> {
69+
): Promise<TSConfigResult<{ rawConfig: TSConfig }>> {
6870
const safeCwd = root ?? process.cwd();
6971

7072
const [jsconfig, tsconfig] = await Promise.all(
@@ -85,7 +87,13 @@ export async function loadTSConfig(
8587
return parsedConfig;
8688
}
8789

88-
return { ...parsedConfig, rawConfig: parsedConfig.extended?.[0] ?? parsedConfig.tsconfig };
90+
// tsconfck does not return the original config, so we need to parse it ourselves
91+
// https://github.com/dominikg/tsconfck/issues/138
92+
const rawConfig = await readFile(tsconfig, 'utf-8')
93+
.then(toJson)
94+
.then((content) => JSON.parse(content) as TSConfig);
95+
96+
return { ...parsedConfig, rawConfig };
8997
}
9098

9199
if (jsconfig) {
@@ -95,7 +103,11 @@ export async function loadTSConfig(
95103
return parsedConfig;
96104
}
97105

98-
return { ...parsedConfig, rawConfig: parsedConfig.extended?.[0] ?? parsedConfig.tsconfig };
106+
const rawConfig = await readFile(jsconfig, 'utf-8')
107+
.then(toJson)
108+
.then((content) => JSON.parse(content) as TSConfig);
109+
110+
return { ...parsedConfig, rawConfig: rawConfig };
99111
}
100112

101113
return 'missing-config';
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"files": ["i-have-base-url"],
3+
"compilerOptions": {
4+
"baseUrl": ".",
5+
}
6+
}

packages/astro/test/units/config/config-tsconfig.test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import * as path from 'node:path';
33
import { describe, it } from 'node:test';
44
import { fileURLToPath } from 'node:url';
55
import { loadTSConfig, updateTSConfigForFramework } from '../../../dist/core/config/index.js';
6+
import { readFile } from 'node:fs/promises';
7+
import { toJson } from 'tsconfck';
68

79
const cwd = fileURLToPath(new URL('../../fixtures/tsconfig-handling/', import.meta.url));
810

@@ -37,6 +39,14 @@ describe('TSConfig handling', () => {
3739
assert.equal(invalidConfig, 'invalid-config');
3840
assert.equal(missingConfig, 'missing-config');
3941
});
42+
43+
it('does not change baseUrl in raw config', async () => {
44+
const loadedConfig = await loadTSConfig(path.join(cwd, 'baseUrl'));
45+
const rawConfig = await readFile(path.join(cwd, 'baseUrl', 'tsconfig.json'), 'utf-8').then(toJson)
46+
.then((content) => JSON.parse(content));
47+
48+
assert.deepEqual(loadedConfig.rawConfig, rawConfig);
49+
});
4050
});
4151

4252
describe('tsconfig / jsconfig updates', () => {

0 commit comments

Comments
 (0)