Skip to content

Commit 445ced9

Browse files
jycouetmanuel3108
andauthored
feat(cli): expend known files (#794)
* feat(cli): expend known files * refactor where it make sense --------- Co-authored-by: Manuel <[email protected]>
1 parent 82db3c5 commit 445ced9

File tree

10 files changed

+73
-42
lines changed

10 files changed

+73
-42
lines changed

packages/addons/drizzle/index.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ export default defineAddon({
7878

7979
if (!kit) return unsupported('Requires SvelteKit');
8080
},
81-
run: ({ sv, typescript, options, kit, dependencyVersion, cwd, cancel }) => {
81+
run: ({ sv, typescript, options, kit, dependencyVersion, cwd, cancel, files }) => {
8282
if (!kit) throw new Error('SvelteKit is required');
8383

8484
const ext = typescript ? 'ts' : 'js';
@@ -177,7 +177,7 @@ export default defineAddon({
177177
});
178178
}
179179

180-
sv.file('package.json', (content) => {
180+
sv.file(files.package, (content) => {
181181
const { data, generateCode } = parseJson(content);
182182
data.scripts ??= {};
183183
const scripts: Record<string, string> = data.scripts;
@@ -191,7 +191,7 @@ export default defineAddon({
191191

192192
const hasPrettier = Boolean(dependencyVersion('prettier'));
193193
if (hasPrettier) {
194-
sv.file('.prettierignore', (content) => {
194+
sv.file(files.prettierignore, (content) => {
195195
if (!content.includes(`/drizzle/`)) {
196196
return content.trimEnd() + '\n/drizzle/';
197197
}
@@ -200,7 +200,7 @@ export default defineAddon({
200200
}
201201

202202
if (options.database === 'sqlite') {
203-
sv.file('.gitignore', (content) => {
203+
sv.file(files.gitignore, (content) => {
204204
// Adds the db file to the gitignore if an ignore is present
205205
if (content.length === 0) return content;
206206

packages/addons/eslint/index.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export default defineAddon({
1717
shortDescription: 'linter',
1818
homepage: 'https://eslint.org',
1919
options: {},
20-
run: ({ sv, typescript, dependencyVersion }) => {
20+
run: ({ sv, typescript, dependencyVersion, files }) => {
2121
const prettierInstalled = Boolean(dependencyVersion('prettier'));
2222

2323
sv.devDependency('eslint', '^9.39.1');
@@ -31,7 +31,7 @@ export default defineAddon({
3131

3232
if (prettierInstalled) sv.devDependency('eslint-config-prettier', '^10.1.8');
3333

34-
sv.file('package.json', (content) => {
34+
sv.file(files.package, (content) => {
3535
const { data, generateCode } = parseJson(content);
3636
data.scripts ??= {};
3737
const scripts: Record<string, string> = data.scripts;
@@ -41,7 +41,7 @@ export default defineAddon({
4141
return generateCode();
4242
});
4343

44-
sv.file('.vscode/settings.json', (content) => {
44+
sv.file(files.vscodeSettings, (content) => {
4545
if (!content) return content;
4646

4747
const { data, generateCode } = parseJson(content);
@@ -52,7 +52,7 @@ export default defineAddon({
5252
return generateCode();
5353
});
5454

55-
sv.file('eslint.config.js', (content) => {
55+
sv.file(files.eslintConfig, (content) => {
5656
const { ast, generateCode } = parseScript(content);
5757

5858
const eslintConfigs: Array<AstTypes.Expression | AstTypes.SpreadElement> = [];
@@ -170,7 +170,7 @@ export default defineAddon({
170170
});
171171

172172
if (prettierInstalled) {
173-
sv.file('eslint.config.js', addEslintConfigPrettier);
173+
sv.file(files.eslintConfig, addEslintConfigPrettier);
174174
}
175175
}
176176
});

packages/addons/paraglide/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ export default defineAddon({
167167
return generateCode();
168168
});
169169

170-
sv.file('.gitignore', (content) => {
170+
sv.file(files.gitignore, (content) => {
171171
if (!content) return content;
172172

173173
if (!content.includes(`\n${paraglideOutDir}`)) {

packages/addons/playwright/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ export default defineAddon({
77
shortDescription: 'browser testing',
88
homepage: 'https://playwright.dev',
99
options: {},
10-
run: ({ sv, typescript }) => {
10+
run: ({ sv, typescript, files }) => {
1111
const ext = typescript ? 'ts' : 'js';
1212

1313
sv.devDependency('@playwright/test', '^1.56.1');
1414

15-
sv.file('package.json', (content) => {
15+
sv.file(files.package, (content) => {
1616
const { data, generateCode } = parseJson(content);
1717
data.scripts ??= {};
1818
const scripts: Record<string, string> = data.scripts;
@@ -24,7 +24,7 @@ export default defineAddon({
2424
return generateCode();
2525
});
2626

27-
sv.file('.gitignore', (content) => {
27+
sv.file(files.gitignore, (content) => {
2828
if (!content) return content;
2929
if (content.includes('test-results')) return content;
3030
return 'test-results\n' + content.trim();

packages/addons/prettier/index.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ export default defineAddon({
77
shortDescription: 'formatter',
88
homepage: 'https://prettier.io',
99
options: {},
10-
run: ({ sv, dependencyVersion, kit }) => {
10+
run: ({ sv, dependencyVersion, kit, files }) => {
1111
const tailwindcssInstalled = Boolean(dependencyVersion('tailwindcss'));
1212
if (tailwindcssInstalled) sv.devDependency('prettier-plugin-tailwindcss', '^0.7.1');
1313

1414
sv.devDependency('prettier', '^3.6.2');
1515
sv.devDependency('prettier-plugin-svelte', '^3.4.0');
1616

17-
sv.file('.prettierignore', (content) => {
17+
sv.file(files.prettierignore, (content) => {
1818
if (content) return content;
1919
return dedent`
2020
# Package Managers
@@ -29,7 +29,7 @@ export default defineAddon({
2929
`;
3030
});
3131

32-
sv.file('.prettierrc', (content) => {
32+
sv.file(files.prettierrc, (content) => {
3333
let data, generateCode;
3434
try {
3535
({ data, generateCode } = parseJson(content));
@@ -72,7 +72,7 @@ export default defineAddon({
7272
const eslintVersion = dependencyVersion('eslint');
7373
const eslintInstalled = hasEslint(eslintVersion);
7474

75-
sv.file('package.json', (content) => {
75+
sv.file(files.package, (content) => {
7676
const { data, generateCode } = parseJson(content);
7777

7878
data.scripts ??= {};
@@ -99,7 +99,7 @@ export default defineAddon({
9999

100100
if (eslintInstalled) {
101101
sv.devDependency('eslint-config-prettier', '^10.1.8');
102-
sv.file('eslint.config.js', addEslintConfigPrettier);
102+
sv.file(files.eslintConfig, addEslintConfigPrettier);
103103
}
104104
}
105105
});

packages/addons/sveltekit-adapter/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export default defineAddon({
3333
const adapter = adapters.find((a) => a.id === options.adapter)!;
3434

3535
// removes previously installed adapters
36-
sv.file('package.json', (content) => {
36+
sv.file(files.package, (content) => {
3737
const { data, generateCode } = parseJson(content);
3838
const devDeps = data['devDependencies'];
3939

packages/addons/tailwindcss/index.ts

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,6 @@ export default defineAddon({
3535
run: ({ sv, options, files, typescript, kit, dependencyVersion }) => {
3636
const prettierInstalled = Boolean(dependencyVersion('prettier'));
3737

38-
const stylesheet = kit
39-
? ({
40-
rootPath: `${kit.routesDirectory}/layout.css`,
41-
relativePath: './layout.css'
42-
} as const)
43-
: ({
44-
rootPath: 'src/app.css',
45-
relativePath: './app.css'
46-
} as const);
47-
4838
sv.devDependency('tailwindcss', '^4.1.17');
4939
sv.devDependency('@tailwindcss/vite', '^4.1.17');
5040
sv.pnpmBuildDependency('@tailwindcss/oxide');
@@ -68,7 +58,7 @@ export default defineAddon({
6858
return generateCode();
6959
});
7060

71-
sv.file(stylesheet.rootPath, (content) => {
61+
sv.file(files.stylesheet, (content) => {
7262
let atRules = parseCss(content).ast.nodes.filter((node) => node.type === 'atrule');
7363

7464
const findAtRule = (name: string, params: string) =>
@@ -104,15 +94,19 @@ export default defineAddon({
10494
});
10595

10696
if (!kit) {
107-
sv.file('src/App.svelte', (content) => {
97+
const appSvelte = 'src/App.svelte';
98+
const stylesheetRelative = files.getRelative({ from: appSvelte, to: files.stylesheet });
99+
sv.file(appSvelte, (content) => {
108100
const { script, generateCode } = parseSvelte(content, { typescript });
109-
imports.addEmpty(script.ast, { from: stylesheet.relativePath });
101+
imports.addEmpty(script.ast, { from: stylesheetRelative });
110102
return generateCode({ script: script.generateCode() });
111103
});
112104
} else {
113-
sv.file(`${kit?.routesDirectory}/+layout.svelte`, (content) => {
105+
const layoutSvelte = `${kit?.routesDirectory}/+layout.svelte`;
106+
const stylesheetRelative = files.getRelative({ from: layoutSvelte, to: files.stylesheet });
107+
sv.file(layoutSvelte, (content) => {
114108
const { script, template, generateCode } = parseSvelte(content, { typescript });
115-
imports.addEmpty(script.ast, { from: stylesheet.relativePath });
109+
imports.addEmpty(script.ast, { from: stylesheetRelative });
116110

117111
if (content.length === 0) {
118112
const svelteVersion = dependencyVersion('svelte');
@@ -130,7 +124,7 @@ export default defineAddon({
130124
});
131125
}
132126

133-
sv.file('.vscode/settings.json', (content) => {
127+
sv.file(files.vscodeSettings, (content) => {
134128
const { data, generateCode } = parseJson(content);
135129

136130
data['files.associations'] ??= {};
@@ -140,7 +134,7 @@ export default defineAddon({
140134
});
141135

142136
if (prettierInstalled) {
143-
sv.file('.prettierrc', (content) => {
137+
sv.file(files.prettierrc, (content) => {
144138
const { data, generateCode } = parseJson(content);
145139
const PLUGIN_NAME = 'prettier-plugin-tailwindcss';
146140

@@ -149,7 +143,7 @@ export default defineAddon({
149143

150144
if (!plugins.includes(PLUGIN_NAME)) plugins.push(PLUGIN_NAME);
151145

152-
data.tailwindStylesheet ??= stylesheet.rootPath;
146+
data.tailwindStylesheet ??= files.getRelative({ to: files.stylesheet });
153147

154148
return generateCode();
155149
});

packages/addons/vitest-addon/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export default defineAddon({
3333
sv.devDependency('playwright', '^1.56.1');
3434
}
3535

36-
sv.file('package.json', (content) => {
36+
sv.file(files.package, (content) => {
3737
const { data, generateCode } = parseJson(content);
3838
data.scripts ??= {};
3939
const scripts: Record<string, string> = data.scripts;

packages/cli/commands/add/workspace.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,37 @@ export async function createWorkspace({
6161
dependencies[key] = value.replaceAll(/[^\d|.]/g, '');
6262
}
6363

64+
const kit = dependencies['@sveltejs/kit'] ? parseKitOptions(resolvedCwd) : undefined;
65+
const stylesheet: `${string}/layout.css` | 'src/app.css' = kit
66+
? `${kit.routesDirectory}/layout.css`
67+
: 'src/app.css';
68+
6469
return {
6570
cwd: resolvedCwd,
6671
options,
6772
packageManager: packageManager ?? (await detect({ cwd }))?.name ?? getUserAgent() ?? 'npm',
6873
typescript: usesTypescript,
69-
files: { viteConfig, svelteConfig },
70-
kit: dependencies['@sveltejs/kit'] ? parseKitOptions(resolvedCwd) : undefined,
74+
files: {
75+
viteConfig,
76+
svelteConfig,
77+
stylesheet,
78+
package: 'package.json',
79+
gitignore: '.gitignore',
80+
prettierignore: '.prettierignore',
81+
prettierrc: '.prettierrc',
82+
eslintConfig: 'eslint.config.js',
83+
vscodeSettings: '.vscode/settings.json',
84+
getRelative({ from, to }) {
85+
from = from ?? '';
86+
let relativePath = path.posix.relative(path.posix.dirname(from), to);
87+
// Ensure relative paths start with ./ for proper relative path syntax
88+
if (!relativePath.startsWith('.') && !relativePath.startsWith('/')) {
89+
relativePath = `./${relativePath}`;
90+
}
91+
return relativePath;
92+
}
93+
},
94+
kit,
7195
dependencyVersion: (pkg) => dependencies[pkg]
7296
};
7397
}

packages/core/addon/workspace.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,21 @@ export type Workspace<Args extends OptionDefinition> = {
1414
dependencyVersion: (pkg: string) => string | undefined;
1515
typescript: boolean;
1616
files: {
17-
viteConfig: string;
18-
svelteConfig: string;
17+
viteConfig: 'vite.config.js' | 'vite.config.ts';
18+
svelteConfig: 'svelte.config.js' | 'svelte.config.ts';
19+
/** `${kit.routesDirectory}/layout.css` or `src/app.css` */
20+
stylesheet: `${string}/layout.css` | 'src/app.css';
21+
package: 'package.json';
22+
gitignore: '.gitignore';
23+
24+
prettierignore: '.prettierignore';
25+
prettierrc: '.prettierrc';
26+
eslintConfig: 'eslint.config.js';
27+
28+
vscodeSettings: '.vscode/settings.json';
29+
30+
/** Get the relative path between two files */
31+
getRelative: ({ from, to }: { from?: string; to: string }) => string;
1932
};
2033
kit: { libDirectory: string; routesDirectory: string } | undefined;
2134
packageManager: PackageManager;

0 commit comments

Comments
 (0)