Skip to content

Commit 02bb032

Browse files
authored
chore: update core api (#597)
* add draft * unify * combine create and create primitive * update tests * improve api * update addons * improve `object.create` usage * fix stuff * fix drizzle * fix eslint * fix eslint * fix more eslint * increase timeout * Revert "increase timeout" This reverts commit 18ad5bf. * adjust html and css api
1 parent 19e686a commit 02bb032

File tree

71 files changed

+1173
-826
lines changed

Some content is hidden

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

71 files changed

+1173
-826
lines changed

community-addon-template/src/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export default defineAddon({
2727
sv.file('src/DemoComponent.svelte', (content) => {
2828
if (!options.demo) return content;
2929
const { script, generateCode } = parseSvelte(content, { typescript });
30-
imports.addDefault(script.ast, '../addon-template-demo.txt?raw', 'demo');
30+
imports.addDefault(script.ast, { from: '../addon-template-demo.txt?raw', as: 'demo' });
3131
return generateCode({ script: script.generateCode(), template: '{demo}' });
3232
});
3333
}

packages/addons/_tests/eslint/test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ test.concurrent.for(variants)('core - %s', async (variant, { page, ...ctx }) =>
1919

2020
expect(() => execSync('pnpm lint', { cwd, stdio: 'pipe' })).toThrowError();
2121

22-
expect(() => execSync('pnpm eslint --fix .', { cwd, stdio: 'pipe' })).not.toThrowError();
22+
expect(() => execSync('pnpm eslint --fix .', { cwd, stdio: 'inherit' })).not.toThrowError();
2323

2424
expect(() => execSync('pnpm lint', { cwd, stdio: 'pipe' })).not.toThrowError();
2525
});

packages/addons/_tests/mdsvex/test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ function addFixture(cwd: string, variant: string) {
3838

3939
const src = fs.readFileSync(page, 'utf8');
4040
const { script, template, generateCode } = parseSvelte(src);
41-
imports.addDefault(script.ast, './Demo.svx', 'Demo');
41+
imports.addDefault(script.ast, { from: './Demo.svx', as: 'Demo' });
4242

43-
const div = html.div({ class: 'mdsvex' });
43+
const div = html.createDiv({ class: 'mdsvex' });
4444
html.appendElement(template.ast.childNodes, div);
45-
const mdsvexNode = html.element('Demo');
45+
const mdsvexNode = html.createElement('Demo');
4646
html.appendElement(div.childNodes, mdsvexNode);
4747

4848
const content = generateCode({

packages/addons/common.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,22 @@ export function addEslintConfigPrettier(content: string): string {
2222
}
2323

2424
svelteImportName ??= 'svelte';
25-
imports.addDefault(ast, 'eslint-plugin-svelte', svelteImportName);
26-
imports.addDefault(ast, 'eslint-config-prettier', 'prettier');
25+
imports.addDefault(ast, { from: 'eslint-plugin-svelte', as: svelteImportName });
26+
imports.addDefault(ast, { from: 'eslint-config-prettier', as: 'prettier' });
2727

28-
const fallbackConfig = common.expressionFromString('[]');
29-
const defaultExport = exports.defaultExport(ast, fallbackConfig);
28+
const fallbackConfig = common.parseExpression('[]');
29+
const defaultExport = exports.createDefault(ast, { fallback: fallbackConfig });
3030
const eslintConfig = defaultExport.value;
3131
if (eslintConfig.type !== 'ArrayExpression' && eslintConfig.type !== 'CallExpression')
3232
return content;
3333

34-
const prettier = common.expressionFromString('prettier');
35-
const sveltePrettierConfig = common.expressionFromString(`${svelteImportName}.configs.prettier`);
36-
const configSpread = common.createSpreadElement(sveltePrettierConfig);
34+
const prettier = common.parseExpression('prettier');
35+
const sveltePrettierConfig = common.parseExpression(`${svelteImportName}.configs.prettier`);
36+
const configSpread = common.createSpread(sveltePrettierConfig);
3737

3838
const nodesToInsert = [];
39-
if (!common.hasNode(eslintConfig, prettier)) nodesToInsert.push(prettier);
40-
if (!common.hasNode(eslintConfig, configSpread)) nodesToInsert.push(configSpread);
39+
if (!common.contains(eslintConfig, prettier)) nodesToInsert.push(prettier);
40+
if (!common.contains(eslintConfig, configSpread)) nodesToInsert.push(configSpread);
4141

4242
const elements =
4343
eslintConfig.type === 'ArrayExpression' ? eslintConfig.elements : eslintConfig.arguments;

packages/addons/devtools-json/index.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,21 @@ export default defineAddon({
2525
const { ast, generateCode } = parseScript(content);
2626

2727
const vitePluginName = 'devtoolsJson';
28-
imports.addDefault(ast, 'vite-plugin-devtools-json', vitePluginName);
28+
imports.addDefault(ast, { from: 'vite-plugin-devtools-json', as: vitePluginName });
2929

30-
const { value: rootObject } = exports.defaultExport(ast, functions.call('defineConfig', []));
31-
const param1 = functions.argumentByIndex(rootObject, 0, object.createEmpty());
30+
const { value: rootObject } = exports.createDefault(ast, {
31+
fallback: functions.createCall({ name: 'defineConfig', args: [] })
32+
});
3233

33-
const pluginsArray = object.property(param1, 'plugins', array.createEmpty());
34-
const pluginFunctionCall = functions.call(vitePluginName, []);
35-
array.push(pluginsArray, pluginFunctionCall);
34+
const param1 = functions.getArgument(rootObject, {
35+
index: 0,
36+
fallback: object.create({})
37+
});
38+
39+
const pluginsArray = object.property(param1, { name: 'plugins', fallback: array.create() });
40+
const pluginFunctionCall = functions.createCall({ name: vitePluginName, args: [] });
41+
42+
array.append(pluginsArray, pluginFunctionCall);
3643

3744
return generateCode();
3845
});

packages/addons/drizzle/index.ts

Lines changed: 114 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -195,18 +195,16 @@ export default defineAddon({
195195
sv.file(`drizzle.config.${ext}`, (content) => {
196196
const { ast, generateCode } = parseScript(content);
197197

198-
imports.addNamed(ast, 'drizzle-kit', { defineConfig: 'defineConfig' });
198+
imports.addNamed(ast, { from: 'drizzle-kit', imports: { defineConfig: 'defineConfig' } });
199199

200-
common.addStatement(
201-
ast,
202-
common.statementFromString(
200+
ast.body.push(
201+
common.parseStatement(
203202
"if (!process.env.DATABASE_URL) throw new Error('DATABASE_URL is not set');"
204203
)
205204
);
206205

207-
exports.defaultExport(
208-
ast,
209-
common.expressionFromString(`
206+
exports.createDefault(ast, {
207+
fallback: common.parseExpression(`
210208
defineConfig({
211209
schema: "./src/lib/server/db/schema.${typescript ? 'ts' : 'js'}",
212210
dialect: "${options.sqlite === 'turso' ? 'turso' : options.database}",
@@ -217,7 +215,7 @@ export default defineAddon({
217215
verbose: true,
218216
strict: true
219217
})`)
220-
);
218+
});
221219

222220
return generateCode();
223221
});
@@ -227,128 +225,190 @@ export default defineAddon({
227225

228226
let userSchemaExpression;
229227
if (options.database === 'sqlite') {
230-
imports.addNamed(ast, 'drizzle-orm/sqlite-core', {
231-
sqliteTable: 'sqliteTable',
232-
integer: 'integer'
228+
imports.addNamed(ast, {
229+
from: 'drizzle-orm/sqlite-core',
230+
imports: {
231+
sqliteTable: 'sqliteTable',
232+
integer: 'integer'
233+
}
233234
});
234235

235-
userSchemaExpression = common.expressionFromString(`sqliteTable('user', {
236+
userSchemaExpression = common.parseExpression(`sqliteTable('user', {
236237
id: integer('id').primaryKey(),
237238
age: integer('age')
238239
})`);
239240
}
240241
if (options.database === 'mysql') {
241-
imports.addNamed(ast, 'drizzle-orm/mysql-core', {
242-
mysqlTable: 'mysqlTable',
243-
serial: 'serial',
244-
int: 'int'
242+
imports.addNamed(ast, {
243+
from: 'drizzle-orm/mysql-core',
244+
imports: {
245+
mysqlTable: 'mysqlTable',
246+
serial: 'serial',
247+
int: 'int'
248+
}
245249
});
246250

247-
userSchemaExpression = common.expressionFromString(`mysqlTable('user', {
251+
userSchemaExpression = common.parseExpression(`mysqlTable('user', {
248252
id: serial('id').primaryKey(),
249253
age: int('age'),
250254
})`);
251255
}
252256
if (options.database === 'postgresql') {
253-
imports.addNamed(ast, 'drizzle-orm/pg-core', {
254-
pgTable: 'pgTable',
255-
serial: 'serial',
256-
integer: 'integer'
257+
imports.addNamed(ast, {
258+
from: 'drizzle-orm/pg-core',
259+
imports: {
260+
pgTable: 'pgTable',
261+
serial: 'serial',
262+
integer: 'integer'
263+
}
257264
});
258265

259-
userSchemaExpression = common.expressionFromString(`pgTable('user', {
266+
userSchemaExpression = common.parseExpression(`pgTable('user', {
260267
id: serial('id').primaryKey(),
261268
age: integer('age'),
262269
})`);
263270
}
264271

265272
if (!userSchemaExpression) throw new Error('unreachable state...');
266-
const userIdentifier = variables.declaration(ast, 'const', 'user', userSchemaExpression);
267-
exports.namedExport(ast, 'user', userIdentifier);
273+
const userIdentifier = variables.declaration(ast, {
274+
kind: 'const',
275+
name: 'user',
276+
value: userSchemaExpression
277+
});
278+
exports.createNamed(ast, {
279+
name: 'user',
280+
fallback: userIdentifier
281+
});
268282

269283
return generateCode();
270284
});
271285

272286
sv.file(`${kit?.libDirectory}/server/db/index.${ext}`, (content) => {
273287
const { ast, generateCode } = parseScript(content);
274288

275-
imports.addNamed(ast, '$env/dynamic/private', { env: 'env' });
276-
imports.addNamespace(ast, './schema', 'schema');
289+
imports.addNamed(ast, {
290+
from: '$env/dynamic/private',
291+
imports: { env: 'env' }
292+
});
293+
imports.addNamespace(ast, { from: './schema', as: 'schema' });
277294

278295
// env var checks
279-
const dbURLCheck = common.statementFromString(
296+
const dbURLCheck = common.parseStatement(
280297
"if (!env.DATABASE_URL) throw new Error('DATABASE_URL is not set');"
281298
);
282-
common.addStatement(ast, dbURLCheck);
299+
ast.body.push(dbURLCheck);
283300

284301
let clientExpression;
285302
// SQLite
286303
if (options.sqlite === 'better-sqlite3') {
287-
imports.addDefault(ast, 'better-sqlite3', 'Database');
288-
imports.addNamed(ast, 'drizzle-orm/better-sqlite3', { drizzle: 'drizzle' });
304+
imports.addDefault(ast, { from: 'better-sqlite3', as: 'Database' });
305+
imports.addNamed(ast, {
306+
from: 'drizzle-orm/better-sqlite3',
307+
imports: { drizzle: 'drizzle' }
308+
});
289309

290-
clientExpression = common.expressionFromString('new Database(env.DATABASE_URL)');
310+
clientExpression = common.parseExpression('new Database(env.DATABASE_URL)');
291311
}
292312
if (options.sqlite === 'libsql' || options.sqlite === 'turso') {
293-
imports.addNamed(ast, '@libsql/client', { createClient: 'createClient' });
294-
imports.addNamed(ast, 'drizzle-orm/libsql', { drizzle: 'drizzle' });
313+
imports.addNamed(ast, {
314+
from: '@libsql/client',
315+
imports: { createClient: 'createClient' }
316+
});
317+
imports.addNamed(ast, {
318+
from: 'drizzle-orm/libsql',
319+
imports: { drizzle: 'drizzle' }
320+
});
295321

296322
if (options.sqlite === 'turso') {
297-
imports.addNamed(ast, '$app/environment', { dev: 'dev' });
323+
imports.addNamed(ast, {
324+
from: '$app/environment',
325+
imports: { dev: 'dev' }
326+
});
298327
// auth token check in prod
299-
const authTokenCheck = common.statementFromString(
328+
const authTokenCheck = common.parseStatement(
300329
"if (!dev && !env.DATABASE_AUTH_TOKEN) throw new Error('DATABASE_AUTH_TOKEN is not set');"
301330
);
302-
common.addStatement(ast, authTokenCheck);
331+
ast.body.push(authTokenCheck);
303332

304-
clientExpression = common.expressionFromString(
333+
clientExpression = common.parseExpression(
305334
'createClient({ url: env.DATABASE_URL, authToken: env.DATABASE_AUTH_TOKEN })'
306335
);
307336
} else {
308-
clientExpression = common.expressionFromString('createClient({ url: env.DATABASE_URL })');
337+
clientExpression = common.parseExpression('createClient({ url: env.DATABASE_URL })');
309338
}
310339
}
311340
// MySQL
312341
if (options.mysql === 'mysql2' || options.mysql === 'planetscale') {
313-
imports.addDefault(ast, 'mysql2/promise', 'mysql');
314-
imports.addNamed(ast, 'drizzle-orm/mysql2', { drizzle: 'drizzle' });
342+
imports.addDefault(ast, { from: 'mysql2/promise', as: 'mysql' });
343+
imports.addNamed(ast, {
344+
from: 'drizzle-orm/mysql2',
345+
imports: { drizzle: 'drizzle' }
346+
});
315347

316-
clientExpression = common.expressionFromString('mysql.createPool(env.DATABASE_URL)');
348+
clientExpression = common.parseExpression('mysql.createPool(env.DATABASE_URL)');
317349
}
318350
// PostgreSQL
319351
if (options.postgresql === 'neon') {
320-
imports.addNamed(ast, '@neondatabase/serverless', { neon: 'neon' });
321-
imports.addNamed(ast, 'drizzle-orm/neon-http', { drizzle: 'drizzle' });
352+
imports.addNamed(ast, {
353+
from: '@neondatabase/serverless',
354+
imports: { neon: 'neon' }
355+
});
356+
imports.addNamed(ast, {
357+
from: 'drizzle-orm/neon-http',
358+
imports: { drizzle: 'drizzle' }
359+
});
322360

323-
clientExpression = common.expressionFromString('neon(env.DATABASE_URL)');
361+
clientExpression = common.parseExpression('neon(env.DATABASE_URL)');
324362
}
325363
if (options.postgresql === 'postgres.js') {
326-
imports.addDefault(ast, 'postgres', 'postgres');
327-
imports.addNamed(ast, 'drizzle-orm/postgres-js', { drizzle: 'drizzle' });
364+
imports.addDefault(ast, { from: 'postgres', as: 'postgres' });
365+
imports.addNamed(ast, {
366+
from: 'drizzle-orm/postgres-js',
367+
imports: { drizzle: 'drizzle' }
368+
});
328369

329-
clientExpression = common.expressionFromString('postgres(env.DATABASE_URL)');
370+
clientExpression = common.parseExpression('postgres(env.DATABASE_URL)');
330371
}
331372

332373
if (!clientExpression) throw new Error('unreachable state...');
333-
const clientIdentifier = variables.declaration(ast, 'const', 'client', clientExpression);
334-
common.addStatement(ast, clientIdentifier);
374+
ast.body.push(
375+
variables.declaration(ast, {
376+
kind: 'const',
377+
name: 'client',
378+
value: clientExpression
379+
})
380+
);
335381

336382
// create drizzle function call
337-
const drizzleCall = functions.callByIdentifier('drizzle', ['client']);
383+
const drizzleCall = functions.createCall({
384+
name: 'drizzle',
385+
args: ['client'],
386+
useIdentifiers: true
387+
});
338388

339389
// add schema to support `db.query`
340390
const paramObject = object.create({
341-
schema: variables.identifier('schema')
391+
schema: variables.createIdentifier('schema')
342392
});
343393
if (options.database === 'mysql') {
344394
const mode = options.mysql === 'planetscale' ? 'planetscale' : 'default';
345-
object.property(paramObject, 'mode', common.createLiteral(mode));
395+
object.property(paramObject, {
396+
name: 'mode',
397+
fallback: common.createLiteral(mode)
398+
});
346399
}
347400
drizzleCall.arguments.push(paramObject);
348401

349402
// create `db` export
350-
const db = variables.declaration(ast, 'const', 'db', drizzleCall);
351-
exports.namedExport(ast, 'db', db);
403+
const db = variables.declaration(ast, {
404+
kind: 'const',
405+
name: 'db',
406+
value: drizzleCall
407+
});
408+
exports.createNamed(ast, {
409+
name: 'db',
410+
fallback: db
411+
});
352412

353413
return generateCode();
354414
});

0 commit comments

Comments
 (0)