8000 chore: rework `content` updates (#75) · sveltejs/cli@ad94bf6 · GitHub
[go: up one dir, main page]

Skip to content

Commit ad94bf6

Browse files
authored
chore: rework content updates (#75)
1 parent 0cc77b2 commit ad94bf6

File tree

48 files changed

+542
-509
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+542
-509
lines changed

cli

Lines changed: 0 additions & 1 deletion
This file was deleted.

community-adder-template/src/config/adder.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { options } from './options.js';
22
import { defineAdder } from '@svelte-cli/core';
33
import { imports } from '@svelte-cli/core/js';
4+
import { parseScript } from '@svelte-cli/core/parsers';
45

56
export const adder = defineAdder({
67
metadata: {
@@ -23,9 +24,10 @@ export const adder = defineAdder({
2324
},
2425
{
2526
name: () => 'src/DemoComponent.svelte',
26-
contentType: 'svelte',
27-
content: ({ jsAst }) => {
28-
imports.addDefault(jsAst, '../adder-template-demo.txt?raw', 'Demo');
27+
content: ({ content }) => {
28+
const { ast, generateCode } = parseScript(content);
29+
imports.addDefault(ast, '../adder-template-demo.txt?raw', 'Demo');
30+
return generateCode();
2931
}
3032
}
3133
]

packages/adders/common.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
1-
import { imports, exports, common, variables, functions } from '@svelte-cli/core/js';
2-
import { Walker, type AstKinds, type AstTypes, type ScriptFileEditor } from '@svelte-cli/core';
3-
import type { Question } from '@svelte-cli/core/internal';
1+
import {
2+
imports,
3+
exports,
4+
common,
5+
variables,
6+
functions,
7+
type AstKinds,
8+
type AstTypes
9+
} from '@svelte-cli/core/js';
10+
import { Walker, type Question, type FileEditor } from '@svelte-cli/core';
11+
import { parseScript } from '@svelte-cli/core/parsers';
412

513
export function createPrinter(...conditions: boolean[]) {
614
const printers = conditions.map((condition) => {
@@ -9,7 +17,9 @@ export function createPrinter(...conditions: boolean[]) {
917
return printers;
1018
}
1119

12-
export function addEslintConfigPrettier({ ast }: ScriptFileEditor<Record<string, Question>>) {
20+
export function addEslintConfigPrettier({ content }: FileEditor<Record<string, Question>>) {
21+
const { ast, generateCode } = parseScript(content);
22+
1323
// if a default import for `eslint-plugin-svelte` already exists, then we'll use their specifier's name instead
1424
const importNodes = ast.body.filter((n) => n.type === 'ImportDeclaration');
1525
const sveltePluginImport = importNodes.find(
@@ -33,7 +43,8 @@ export function addEslintConfigPrettier({ ast }: ScriptFileEditor<Record<string,
3343
const fallbackConfig = common.expressionFromString('[]');
3444
const defaultExport = exports.defaultExport(ast, fallbackConfig);
3545
const eslintConfig = defaultExport.value;
36-
if (eslintConfig.type !== 'ArrayExpression' && eslintConfig.type !== 'CallExpression') return;
46+
if (eslintConfig.type !== 'ArrayExpression' && eslintConfig.type !== 'CallExpression')
47+
return content;
3748

3849
const prettier = common.expressionFromString('prettier');
3950
const sveltePrettierConfig = common.expressionFromString(
@@ -65,6 +76,8 @@ export function addEslintConfigPrettier({ ast }: ScriptFileEditor<Record<string,
6576
// append to the end as a fallback
6677
elements.push(...nodesToInsert);
6778
}
79+
80+
return generateCode();
6881
}
6982

7083
export function addGlobalAppInterface(

packages/adders/drizzle/config/adder.ts

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { options as availableOptions } from './options.ts';
22
import { common, exports, functions, imports, object, variables } from '@svelte-cli/core/js';
3-
import { defineAdder, dedent, type TextFileEditor } from '@svelte-cli/core';
3+
import { defineAdder, dedent, type FileEditor } from '@svelte-cli/core';
4+
import { parseJson, parseScript } from '@svelte-cli/core/parsers';
45

56
const PORTS = {
67
mysql: '3306',
@@ -125,14 +126,15 @@ export const adder = defineAdder({
125126
},
126127
{
127128
name: () => 'package.json',
128-
contentType: 'json',
129-
content: ({ data, options }) => {
129+
content: ({ content, options }) => {
130+
const { data, generateCode } = parseJson(content);
130131
data.scripts ??= {};
131132
const scripts: Record<string, string> = data.scripts;
132133
if (options.docker) scripts['db:start'] ??= 'docker compose up';
133134
scripts['db:push'] ??= 'drizzle-kit push';
134135
scripts['db:migrate'] ??= 'drizzle-kit migrate';
135136
scripts['db:studio'] ??= 'drizzle-kit studio';
137+
return generateCode();
136138
}
137139
},
138140
{
@@ -150,8 +152,9 @@ export const adder = defineAdder({
150152
},
151153
{
152154
name: ({ typescript }) => `drizzle.config.${typescript ? 'ts' : 'js'}`,
153-
contentType: 'script',
154-
content: ({ options, ast, typescript }) => {
155+
content: ({ options, content, typescript }) => {
156+
const { ast, generateCode } = parseScript(content);
157+
155158
imports.addNamed(ast, 'drizzle-kit', { defineConfig: 'defineConfig' });
156159

157160
const envCheckStatement = common.statementFromString(
@@ -161,10 +164,10 @@ export const adder = defineAdder({
161164

162165
const fallback = common.expressionFromString('defineConfig({})');
163166
const { value: exportDefault } = exports.defaultExport(ast, fallback);
164-
if (exportDefault.type !== 'CallExpression') return;
167+
if (exportDefault.type !== 'CallExpression') return content;
165168

166169
const objExpression = exportDefault.arguments?.[0];
167-
if (!objExpression || objExpression.type !== 'ObjectExpression') return;
170+
if (!objExpression || objExpression.type !== 'ObjectExpression') return content;
168171

169172
const driver = options.sqlite === 'turso' ? common.createLiteral('turso') : undefined;
170173
const authToken =
@@ -190,13 +193,16 @@ export const adder = defineAdder({
190193
// The `driver` property is only required for _some_ sqlite DBs.
191194
// We'll need to remove it if it's anything but sqlite
192195
if (options.database !== 'sqlite') object.removeProperty(objExpression, 'driver');
196+
197+
return generateCode();
193198
}
194199
},
195200
{
196201
name: ({ kit, typescript }) =>
197202
`${kit?.libDirectory}/server/db/schema.${typescript ? 'ts' : 'js'}`,
198-
contentType: 'script',
199-
content: ({ ast, options }) => {
203+
content: ({ content, options }) => {
204+
const { ast, generateCode } = parseScript(content);
205+
200206
let userSchemaExpression;
201207
if (options.database === 'sqlite') {
202208
imports.addNamed(ast, 'drizzle-orm/sqlite-core', {
@@ -240,13 +246,16 @@ export const adder = defineAdder({
240246
if (!userSchemaExpression) throw new Error('unreachable state...');
241247
const userIdentifier = variables.declaration(ast, 'const', 'user', userSchemaExpression);
242248
exports.namedExport(ast, 'user', userIdentifier);
249+
250+
return generateCode();
243251
}
244252
},
245253
{
246254
name: ({ kit, typescript }) =>
247255
`${kit?.libDirectory}/server/db/index.${typescript ? 'ts' : 'js'}`,
248-
contentType: 'script',
249-
content: ({ ast, options }) => {
256+
content: ({ content, options }) => {
257+
const { ast, generateCode } = parseScript(content);
258+
250259
imports.addNamed(ast, '$env/dynamic/private', { env: 'env' });
251260

252261
// env var checks
@@ -320,6 +329,8 @@ export const adder = defineAdder({
320329
const drizzleCall = functions.callByIdentifier('drizzle', ['client']);
321330
const db = variables.declaration(ast, 'const', 'db', drizzleCall);
322331
exports.namedExport(ast, 'db', db);
332+
333+
return generateCode();
323334
}
324335
}
325336
],
@@ -336,7 +347,7 @@ export const adder = defineAdder({
336347
}
337348
});
338349

339-
function generateEnvFileContent({ content, options }: TextFileEditor<typeof availableOptions>) {
350+
function generateEnvFileContent({ content, options }: FileEditor<typeof availableOptions>) {
340351
const DB_URL_KEY = 'DATABASE_URL';
341352
if (options.docker) {
342353
// we'll prefill with the default docker db credentials

packages/adders/drizzle/tests/tests.ts

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { options } from '../config/options.ts';
22
import { defineAdderTests } from '@svelte-cli/core';
3-
import { common } from '@svelte-cli/core/js';
4-
import { addFromRawHtml } from '@svelte-cli/core/html';
3+
import { parseSvelte, parseJson } from '@svelte-cli/core/parsers';
54

65
const defaultOptionValues = {
76
sqlite: options.sqlite.default,
@@ -21,29 +20,26 @@ export const tests = defineAdderTests({
2120
files: [
2221
{
2322
name: ({ kit }) => `${kit?.routesDirectory}/+page.svelte`,
24-
contentType: 'svelte',
2523
condition: ({ kit }) => Boolean(kit),
26-
content: ({ htmlAst, jsAst }) => {
27-
common.addFromString(jsAst, 'export let data;');
28-
addFromRawHtml(
29-
htmlAst.childNodes,
30-
`
31-
{#each data.users as user}
24+
content: ({ content }) => {
25+
const { script, template, generateCode } = parseSvelte(content);
26+
const dataProp = '\nexport let data;';
27+
const eachBlock = `
28+
{#each data.users as user}
3229
<span data-test-id="user-id-{user.id}">{user.id} {user.name}</span>
33-
{/each}
34-
`
35-
);
30+
{/each}`;
31+
return generateCode({
32+
script: script.source + dataProp,
33+
template: template.source + eachBlock
34+
});
3635
}
3736
},
3837
{
3938
name: ({ kit, typescript }) =>
4039
`${kit?.routesDirectory}/+page.server.${typescript ? 'ts' : 'js'}`,
41-
contentType: 'script',
4240
condition: ({ kit }) => Boolean(kit),
43-
content: ({ ast, typescript }) => {
44-
common.addFromString(
45-
ast,
46-
`
41+
content: ({ typescript }) => {
42+
return `
4743
import { db } from '$lib/server/db';
4844
import { user } from '$lib/server/db/schema.js';
4945
@@ -58,8 +54,7 @@ export const tests = defineAdderTests({
5854
function insertUser(${typescript ? 'value: typeof user.$inferInsert' : 'value'}) {
5955
return db.insert(user).values(value);
6056
}
61-
`
62-
);
57+
`;
6358
}
6459
},
6560
{
@@ -72,10 +67,11 @@ export const tests = defineAdderTests({
7267
},
7368
{
7469
name: () => 'package.json',
75-
contentType: 'json',
76-
content: ({ data }) => {
70+
content: ({ content }) => {
71+
const { data, generateCode } = parseJson(content);
7772
// executes after pnpm install
7873
data.scripts['postinstall'] ??= 'pnpm run db:push';
74+
return generateCode();
7975
}
8076
}
8177
],

packages/adders/eslint/config/adder.ts

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,18 @@ import fs from 'node:fs';
22
import path from 'node:path';
33
import { options } from './options.ts';
44
import { addEslintConfigPrettier } from '../../common.ts';
5-
import { defineAdder, log, type AstKinds, type AstTypes } from '@svelte-cli/core';
6-
import { array, common, exports, functions, imports, object } from '@svelte-cli/core/js';
5+
import { defineAdder, log } from '@svelte-cli/core';
6+
import {
7+
array,
8+
common,
9+
exports,
10+
functions,
11+
imports,
12+
object,
13+
type AstKinds,
14+
type AstTypes
15+
} from '@svelte-cli/core/js';
16+
import { parseJson, parseScript } from '@svelte-cli/core/parsers';
717

818
export const adder = defineAdder({
919
metadata: {
@@ -39,31 +49,34 @@ export const adder = defineAdder({
3949
files: [
4050
{
4151
name: () => 'package.json',
42-
contentType: 'json',
43-
content: ({ data }) => {
52+
content: ({ content }) => {
53+
const { data, generateCode } = parseJson(content);
4454
data.scripts ??= {};
4555
const scripts: Record<string, string> = data.scripts;
4656
const LINT_CMD = 'eslint .';
4757
scripts['lint'] ??= LINT_CMD;
4858
if (!scripts['lint'].includes(LINT_CMD)) scripts['lint'] += ` && ${LINT_CMD}`;
59+
return generateCode();
4960
}
5061
},
5162
{
5263
name: () => '.vscode/settings.json',
53-
contentType: 'json',
5464
// we'll only want to run this step if the file exists
5565
condition: ({ cwd }) => fs.existsSync(path.join(cwd, '.vscode', 'settings.json')),
56-
content: ({ data }) => {
66+
content: ({ content }) => {
67+
const { data, generateCode } = parseJson(content);
5768
const validate: string[] | undefined = data['eslint.validate'];
5869
if (validate && !validate.includes('svelte')) {
5970
validate.push('svelte');
6071
}
72+
return generateCode();
6173
}
6274
},
6375
{
6476
name: () => 'eslint.config.js',
65-
contentType: 'script',
66-
content: ({ ast, typescript }) => {
77+
content: ({ content, typescript }) => {
78+
const { ast, generateCode } = parseScript(content);
79+
6780
const eslintConfigs: Array<
6881
AstKinds.ExpressionKind | AstTypes.SpreadElement | AstTypes.ObjectExpression
6982
> = [];
@@ -124,7 +137,7 @@ export const adder = defineAdder({
124137
// if it's not the config we created, then we'll leave it alone and exit out
125138
if (defaultExport.value !== exportExpression) {
126139
log.warn('An eslint config is already defined. Skipping initialization.');
127-
return;
140+
return content;
128141
}
129142

130143
// type annotate config
@@ -136,11 +149,12 @@ export const adder = defineAdder({
136149
imports.addDefault(ast, 'globals', 'globals');
137150
imports.addDefault(ast, 'eslint-plugin-svelte', 'svelte');
138151
imports.addDefault(ast, '@eslint/js', 'js');
152+
153+
return generateCode();
139154
}
140155
},
141156
{
142157
name: () => 'eslint.config.js',
143-
contentType: 'script',
144158
condition: ({ prettier }) => prettier,
145159
content: addEslintConfigPrettier
146160
}

0 commit comments

Comments
 (0)
0