Skip to content

Commit 4583b46

Browse files
committed
fix(create): drop src-only tsconfig include
1 parent 6f97f09 commit 4583b46

4 files changed

Lines changed: 89 additions & 2 deletions

File tree

packages/cli/src/create/__tests__/utils.spec.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
getProjectDirFromPackageName,
1313
normalizeEditorOption,
1414
renameFiles,
15+
removeSrcOnlyTsconfigInclude,
1516
shouldConfigureEditorsForCreate,
1617
} from '../utils.js';
1718

@@ -124,6 +125,61 @@ describe('deriveDefaultPackageName', () => {
124125
});
125126
});
126127

128+
describe('removeSrcOnlyTsconfigInclude', () => {
129+
let projectDir: string;
130+
131+
beforeEach(() => {
132+
projectDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vp-tsconfig-include-'));
133+
});
134+
135+
afterEach(() => {
136+
fs.rmSync(projectDir, { recursive: true, force: true });
137+
});
138+
139+
function writeTsconfig(tsconfig: unknown): void {
140+
fs.writeFileSync(path.join(projectDir, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2));
141+
}
142+
143+
function readTsconfig(): Record<string, unknown> {
144+
return JSON.parse(fs.readFileSync(path.join(projectDir, 'tsconfig.json'), 'utf-8'));
145+
}
146+
147+
it('removes the default src-only include', () => {
148+
writeTsconfig({
149+
compilerOptions: {
150+
strict: true,
151+
},
152+
include: ['src'],
153+
});
154+
155+
removeSrcOnlyTsconfigInclude(projectDir);
156+
157+
expect(readTsconfig()).toEqual({
158+
compilerOptions: {
159+
strict: true,
160+
},
161+
});
162+
});
163+
164+
it('keeps custom include patterns', () => {
165+
const tsconfig = {
166+
compilerOptions: {
167+
strict: true,
168+
},
169+
include: ['src', 'tests'],
170+
};
171+
writeTsconfig(tsconfig);
172+
173+
removeSrcOnlyTsconfigInclude(projectDir);
174+
175+
expect(readTsconfig()).toEqual(tsconfig);
176+
});
177+
178+
it('ignores projects without a tsconfig', () => {
179+
expect(() => removeSrcOnlyTsconfigInclude(projectDir)).not.toThrow();
180+
});
181+
});
182+
127183
describe('ensureGitignoreNodeModules', () => {
128184
let projectDir: string;
129185

packages/cli/src/create/templates/builtin.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import colors from 'picocolors';
77
import type { WorkspaceInfo } from '../../types/index.ts';
88
import type { ExecutionWithProjectDir } from '../command.ts';
99
import { discoverTemplate } from '../discovery.ts';
10-
import { setPackageName } from '../utils.ts';
10+
import { removeSrcOnlyTsconfigInclude, setPackageName } from '../utils.ts';
1111
import { executeGeneratorScaffold } from './generator.ts';
1212
import { runRemoteTemplateCommand } from './remote.ts';
1313
import { BuiltinTemplate, type BuiltinTemplateInfo, LibraryTemplateRepo } from './types.ts';
@@ -49,6 +49,7 @@ export async function executeBuiltinTemplate(
4949
}
5050
const fullPath = path.join(workspaceInfo.rootDir, templateInfo.targetDir);
5151
setPackageName(fullPath, templateInfo.packageName);
52+
removeSrcOnlyTsconfigInclude(fullPath);
5253
return { ...result, projectDir: templateInfo.targetDir };
5354
}
5455

@@ -76,6 +77,9 @@ export async function executeBuiltinTemplate(
7677
const fullPath = path.join(workspaceInfo.rootDir, templateInfo.targetDir);
7778
// set package name in the project directory
7879
setPackageName(fullPath, templateInfo.packageName);
80+
if (templateInfo.command === 'create-vite@latest') {
81+
removeSrcOnlyTsconfigInclude(fullPath);
82+
}
7983

8084
return {
8185
...result,

packages/cli/src/create/templates/monorepo.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@ import { editJsonFile } from '../../utils/json.ts';
1010
import { templatesDir } from '../../utils/path.ts';
1111
import type { ExecutionWithProjectDir } from '../command.ts';
1212
import { discoverTemplate } from '../discovery.ts';
13-
import { copyDir, formatDisplayTargetDir, renameFiles, setPackageName } from '../utils.ts';
13+
import {
14+
copyDir,
15+
formatDisplayTargetDir,
16+
removeSrcOnlyTsconfigInclude,
17+
renameFiles,
18+
setPackageName,
19+
} from '../utils.ts';
1420
import { runRemoteTemplateCommand } from './remote.ts';
1521
import { type BuiltinTemplateInfo, LibraryTemplateRepo } from './types.ts';
1622

@@ -116,6 +122,7 @@ export async function executeMonorepoTemplate(
116122
: 'website';
117123
const appProjectPath = path.join(fullPath, InitialMonorepoAppDir);
118124
setPackageName(appProjectPath, appPackageName);
125+
removeSrcOnlyTsconfigInclude(appProjectPath);
119126
// Perform auto-migration on the created app
120127
rewriteMonorepoProject(
121128
appProjectPath,
@@ -150,6 +157,7 @@ export async function executeMonorepoTemplate(
150157
: 'utils';
151158
const libraryProjectPath = path.join(fullPath, libraryDir);
152159
setPackageName(libraryProjectPath, libraryPackageName);
160+
removeSrcOnlyTsconfigInclude(libraryProjectPath);
153161
// Perform auto-migration on the created library
154162
rewriteMonorepoProject(
155163
libraryProjectPath,

packages/cli/src/create/utils.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,25 @@ export function setPackageName(projectDir: string, packageName: string) {
145145
});
146146
}
147147

148+
export function removeSrcOnlyTsconfigInclude(projectDir: string): void {
149+
const tsconfigPath = path.join(projectDir, 'tsconfig.json');
150+
if (!fs.existsSync(tsconfigPath)) {
151+
return;
152+
}
153+
154+
editJsonFile<{ include?: unknown }>(tsconfigPath, (tsconfig) => {
155+
if (
156+
Array.isArray(tsconfig.include) &&
157+
tsconfig.include.length === 1 &&
158+
tsconfig.include[0] === 'src'
159+
) {
160+
delete tsconfig.include;
161+
return tsconfig;
162+
}
163+
return undefined;
164+
});
165+
}
166+
148167
const RENAME_FILES = {
149168
_gitignore: '.gitignore',
150169
_npmrc: '.npmrc',

0 commit comments

Comments
 (0)