From 24160b09c511981608bf1e3e198a6d8696148d0e Mon Sep 17 00:00:00 2001 From: jycouet Date: Sun, 20 Jul 2025 12:51:15 +0200 Subject: [PATCH 1/2] chore: allow passing an array of import names to imports.addNamed --- .changeset/rare-snakes-tickle.md | 5 +++++ .../core/tests/js/imports/named-import-array/output.ts | 2 ++ packages/core/tests/js/imports/named-import-array/run.ts | 9 +++++++++ packages/core/tests/js/imports/named-import/output.ts | 1 + packages/core/tests/js/imports/named-import/run.ts | 2 ++ packages/core/tooling/js/imports.ts | 8 ++++++-- 6 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 .changeset/rare-snakes-tickle.md create mode 100644 packages/core/tests/js/imports/named-import-array/output.ts create mode 100644 packages/core/tests/js/imports/named-import-array/run.ts diff --git a/.changeset/rare-snakes-tickle.md b/.changeset/rare-snakes-tickle.md new file mode 100644 index 00000000..ad0772d2 --- /dev/null +++ b/.changeset/rare-snakes-tickle.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +chore: allow passing an array of import names to imports.addNamed diff --git a/packages/core/tests/js/imports/named-import-array/output.ts b/packages/core/tests/js/imports/named-import-array/output.ts new file mode 100644 index 00000000..640312d9 --- /dev/null +++ b/packages/core/tests/js/imports/named-import-array/output.ts @@ -0,0 +1,2 @@ +import { Handle } from '@sveltejs/kit'; +import { namedOne } from 'package'; diff --git a/packages/core/tests/js/imports/named-import-array/run.ts b/packages/core/tests/js/imports/named-import-array/run.ts new file mode 100644 index 00000000..5cac0fa4 --- /dev/null +++ b/packages/core/tests/js/imports/named-import-array/run.ts @@ -0,0 +1,9 @@ +import { imports, type AstTypes } from '@sveltejs/cli-core/js'; + +export function run(ast: AstTypes.Program): void { + imports.addNamed(ast, { from: 'package', imports: ['namedOne'], isType: false }); + + imports.addNamed(ast, { from: '@sveltejs/kit', imports: ['Handle'], isType: false }); + // adding the same import twice should not produce two imports + imports.addNamed(ast, { from: '@sveltejs/kit', imports: ['Handle'], isType: false }); +} diff --git a/packages/core/tests/js/imports/named-import/output.ts b/packages/core/tests/js/imports/named-import/output.ts index 640312d9..71bd0962 100644 --- a/packages/core/tests/js/imports/named-import/output.ts +++ b/packages/core/tests/js/imports/named-import/output.ts @@ -1,2 +1,3 @@ +import { foo as bar, baz } from 'xyz'; import { Handle } from '@sveltejs/kit'; import { namedOne } from 'package'; diff --git a/packages/core/tests/js/imports/named-import/run.ts b/packages/core/tests/js/imports/named-import/run.ts index 04f349c8..730a5c99 100644 --- a/packages/core/tests/js/imports/named-import/run.ts +++ b/packages/core/tests/js/imports/named-import/run.ts @@ -6,4 +6,6 @@ export function run(ast: AstTypes.Program): void { imports.addNamed(ast, { from: '@sveltejs/kit', imports: { Handle: 'Handle' }, isType: false }); // adding the same import twice should not produce two imports imports.addNamed(ast, { from: '@sveltejs/kit', imports: { Handle: 'Handle' }, isType: false }); + + imports.addNamed(ast, { from: 'xyz', imports: { foo: 'bar', baz: 'baz' } }); } diff --git a/packages/core/tooling/js/imports.ts b/packages/core/tooling/js/imports.ts index 4c998979..0e066ddd 100644 --- a/packages/core/tooling/js/imports.ts +++ b/packages/core/tooling/js/imports.ts @@ -60,11 +60,15 @@ export function addNamed( node: AstTypes.Program, options: { from: string; - imports: Record; + imports: Record | string[]; isType?: boolean; } ): void { - const specifiers = Object.entries(options.imports).map(([key, value]) => { + const o_imports = Array.isArray(options.imports) + ? Object.fromEntries(options.imports.map((n) => [n, n])) + : options.imports; + + const specifiers = Object.entries(o_imports).map(([key, value]) => { const specifier: AstTypes.ImportSpecifier = { type: 'ImportSpecifier', imported: { From 0326995577571eea7989dc9f961e44d349ac5fb3 Mon Sep 17 00:00:00 2001 From: jycouet Date: Sun, 20 Jul 2025 12:55:55 +0200 Subject: [PATCH 2/2] update usage --- packages/addons/drizzle/index.ts | 35 ++++++++++------------------- packages/addons/eslint/index.ts | 4 ++-- packages/addons/lucia/index.ts | 31 +++++++------------------ packages/addons/mdsvex/index.ts | 2 +- packages/addons/paraglide/index.ts | 17 ++++++-------- packages/addons/playwright/index.ts | 2 +- 6 files changed, 31 insertions(+), 60 deletions(-) diff --git a/packages/addons/drizzle/index.ts b/packages/addons/drizzle/index.ts index 2e65b8ce..c5e2f8ec 100644 --- a/packages/addons/drizzle/index.ts +++ b/packages/addons/drizzle/index.ts @@ -239,10 +239,7 @@ export default defineAddon({ if (options.database === 'sqlite') { imports.addNamed(ast, { from: 'drizzle-orm/sqlite-core', - imports: { - sqliteTable: 'sqliteTable', - integer: 'integer' - } + imports: ['sqliteTable', 'integer'] }); userSchemaExpression = common.parseExpression(`sqliteTable('user', { @@ -253,11 +250,7 @@ export default defineAddon({ if (options.database === 'mysql') { imports.addNamed(ast, { from: 'drizzle-orm/mysql-core', - imports: { - mysqlTable: 'mysqlTable', - serial: 'serial', - int: 'int' - } + imports: ['mysqlTable', 'serial', 'int'] }); userSchemaExpression = common.parseExpression(`mysqlTable('user', { @@ -268,11 +261,7 @@ export default defineAddon({ if (options.database === 'postgresql') { imports.addNamed(ast, { from: 'drizzle-orm/pg-core', - imports: { - pgTable: 'pgTable', - serial: 'serial', - integer: 'integer' - } + imports: ['pgTable', 'serial', 'integer'] }); userSchemaExpression = common.parseExpression(`pgTable('user', { @@ -300,7 +289,7 @@ export default defineAddon({ imports.addNamed(ast, { from: '$env/dynamic/private', - imports: { env: 'env' } + imports: ['env'] }); imports.addNamespace(ast, { from: './schema', as: 'schema' }); @@ -316,7 +305,7 @@ export default defineAddon({ imports.addDefault(ast, { from: 'better-sqlite3', as: 'Database' }); imports.addNamed(ast, { from: 'drizzle-orm/better-sqlite3', - imports: { drizzle: 'drizzle' } + imports: ['drizzle'] }); clientExpression = common.parseExpression('new Database(env.DATABASE_URL)'); @@ -324,17 +313,17 @@ export default defineAddon({ if (options.sqlite === 'libsql' || options.sqlite === 'turso') { imports.addNamed(ast, { from: '@libsql/client', - imports: { createClient: 'createClient' } + imports: ['createClient'] }); imports.addNamed(ast, { from: 'drizzle-orm/libsql', - imports: { drizzle: 'drizzle' } + imports: ['drizzle'] }); if (options.sqlite === 'turso') { imports.addNamed(ast, { from: '$app/environment', - imports: { dev: 'dev' } + imports: ['dev'] }); // auth token check in prod const authTokenCheck = common.parseStatement( @@ -354,7 +343,7 @@ export default defineAddon({ imports.addDefault(ast, { from: 'mysql2/promise', as: 'mysql' }); imports.addNamed(ast, { from: 'drizzle-orm/mysql2', - imports: { drizzle: 'drizzle' } + imports: ['drizzle'] }); clientExpression = common.parseExpression('mysql.createPool(env.DATABASE_URL)'); @@ -363,11 +352,11 @@ export default defineAddon({ if (options.postgresql === 'neon') { imports.addNamed(ast, { from: '@neondatabase/serverless', - imports: { neon: 'neon' } + imports: ['neon'] }); imports.addNamed(ast, { from: 'drizzle-orm/neon-http', - imports: { drizzle: 'drizzle' } + imports: ['drizzle'] }); clientExpression = common.parseExpression('neon(env.DATABASE_URL)'); @@ -376,7 +365,7 @@ export default defineAddon({ imports.addDefault(ast, { from: 'postgres', as: 'postgres' }); imports.addNamed(ast, { from: 'drizzle-orm/postgres-js', - imports: { drizzle: 'drizzle' } + imports: ['drizzle'] }); clientExpression = common.parseExpression('postgres(env.DATABASE_URL)'); diff --git a/packages/addons/eslint/index.ts b/packages/addons/eslint/index.ts index 265ce1d3..e0130e5b 100644 --- a/packages/addons/eslint/index.ts +++ b/packages/addons/eslint/index.ts @@ -155,13 +155,13 @@ export default defineAddon({ common.addJsDocTypeComment(astNode, { type: "import('eslint').Linter.Config[]" }); if (typescript) imports.addDefault(ast, { from: 'typescript-eslint', as: 'ts' }); - imports.addNamed(ast, { from: 'node:url', imports: { fileURLToPath: 'fileURLToPath' } }); + imports.addNamed(ast, { from: 'node:url', imports: ['fileURLToPath'] }); imports.addDefault(ast, { from: 'globals', as: 'globals' }); imports.addDefault(ast, { from: 'eslint-plugin-svelte', as: 'svelte' }); imports.addDefault(ast, { from: '@eslint/js', as: 'js' }); imports.addNamed(ast, { from: '@eslint/compat', - imports: { includeIgnoreFile: 'includeIgnoreFile' } + imports: ['includeIgnoreFile'] }); return generateCode(); diff --git a/packages/addons/lucia/index.ts b/packages/addons/lucia/index.ts index 153091f7..739564ec 100644 --- a/packages/addons/lucia/index.ts +++ b/packages/addons/lucia/index.ts @@ -142,11 +142,7 @@ export default defineAddon({ if (drizzleDialect === 'sqlite' || drizzleDialect === 'turso') { js.imports.addNamed(ast, { from: 'drizzle-orm/sqlite-core', - imports: { - sqliteTable: 'sqliteTable', - text: 'text', - integer: 'integer' - } + imports: ['sqliteTable', 'text', 'integer'] }); js.object.overrideProperties(userAttributes, { properties: { @@ -176,11 +172,7 @@ export default defineAddon({ if (drizzleDialect === 'mysql') { js.imports.addNamed(ast, { from: 'drizzle-orm/mysql-core', - imports: { - mysqlTable: 'mysqlTable', - varchar: 'varchar', - datetime: 'datetime' - } + imports: ['mysqlTable', 'varchar', 'datetime'] }); js.object.overrideProperties(userAttributes, { properties: { @@ -212,11 +204,7 @@ export default defineAddon({ if (drizzleDialect === 'postgresql') { js.imports.addNamed(ast, { from: 'drizzle-orm/pg-core', - imports: { - pgTable: 'pgTable', - text: 'text', - timestamp: 'timestamp' - } + imports: ['pgTable', 'text', 'timestamp'] }); js.object.overrideProperties(userAttributes, { properties: { @@ -260,20 +248,17 @@ export default defineAddon({ const { ast, generateCode } = parseScript(content); js.imports.addNamespace(ast, { from: '$lib/server/db/schema', as: 'table' }); - js.imports.addNamed(ast, { from: '$lib/server/db', imports: { db: 'db' } }); + js.imports.addNamed(ast, { from: '$lib/server/db', imports: ['db'] }); js.imports.addNamed(ast, { from: '@oslojs/encoding', - imports: { - encodeBase64url: 'encodeBase64url', - encodeHexLowerCase: 'encodeHexLowerCase' - } + imports: ['encodeBase64url', 'encodeHexLowerCase'] }); - js.imports.addNamed(ast, { from: '@oslojs/crypto/sha2', imports: { sha256: 'sha256' } }); - js.imports.addNamed(ast, { from: 'drizzle-orm', imports: { eq: 'eq' } }); + js.imports.addNamed(ast, { from: '@oslojs/crypto/sha2', imports: ['sha256'] }); + js.imports.addNamed(ast, { from: 'drizzle-orm', imports: ['eq'] }); if (typescript) { js.imports.addNamed(ast, { from: '@sveltejs/kit', - imports: { RequestEvent: 'RequestEvent' }, + imports: ['RequestEvent'], isType: true }); } diff --git a/packages/addons/mdsvex/index.ts b/packages/addons/mdsvex/index.ts index 0ac95bfd..653d5804 100644 --- a/packages/addons/mdsvex/index.ts +++ b/packages/addons/mdsvex/index.ts @@ -13,7 +13,7 @@ export default defineAddon({ sv.file('svelte.config.js', (content) => { const { ast, generateCode } = parseScript(content); - imports.addNamed(ast, { from: 'mdsvex', imports: { mdsvex: 'mdsvex' } }); + imports.addNamed(ast, { from: 'mdsvex', imports: ['mdsvex'] }); const { value: exportDefault } = exports.createDefault(ast, { fallback: object.create({}) diff --git a/packages/addons/paraglide/index.ts b/packages/addons/paraglide/index.ts index 92d3894f..9f524c41 100644 --- a/packages/addons/paraglide/index.ts +++ b/packages/addons/paraglide/index.ts @@ -96,7 +96,7 @@ export default defineAddon({ const vitePluginName = 'paraglideVitePlugin'; imports.addNamed(ast, { from: '@inlang/paraglide-js', - imports: { paraglideVitePlugin: vitePluginName } + imports: [vitePluginName] }); const { value: rootObject } = exports.createDefault(ast, { fallback: functions.createCall({ name: 'defineConfig', args: [] }) @@ -123,7 +123,7 @@ export default defineAddon({ const { ast, generateCode } = parseScript(content); imports.addNamed(ast, { from: '$lib/paraglide/runtime', - imports: { deLocalizeUrl: 'deLocalizeUrl' } + imports: ['deLocalizeUrl'] }); const expression = common.parseExpression('(request) => deLocalizeUrl(request.url).pathname'); @@ -149,7 +149,7 @@ export default defineAddon({ const { ast, generateCode } = parseScript(content); imports.addNamed(ast, { from: '$lib/paraglide/server', - imports: { paraglideMiddleware: 'paraglideMiddleware' } + imports: ['paraglideMiddleware'] }); const hookHandleContent = `({ event, resolve }) => paraglideMiddleware(event.request, ({ request, locale }) => { @@ -206,13 +206,10 @@ export default defineAddon({ // add usage example sv.file(`${kit.routesDirectory}/demo/paraglide/+page.svelte`, (content) => { const { script, template, generateCode } = parseSvelte(content, { typescript }); - imports.addNamed(script.ast, { from: '$lib/paraglide/messages.js', imports: { m: 'm' } }); - imports.addNamed(script.ast, { from: '$app/navigation', imports: { goto: 'goto' } }); - imports.addNamed(script.ast, { from: '$app/state', imports: { page: 'page' } }); - imports.addNamed(script.ast, { - from: '$lib/paraglide/runtime', - imports: { setLocale: 'setLocale' } - }); + imports.addNamed(script.ast, { from: '$lib/paraglide/messages.js', imports: ['m'] }); + imports.addNamed(script.ast, { from: '$app/navigation', imports: ['goto'] }); + imports.addNamed(script.ast, { from: '$app/state', imports: ['page'] }); + imports.addNamed(script.ast, { from: '$lib/paraglide/runtime', imports: ['setLocale'] }); const scriptCode = new MagicString(script.generateCode()); diff --git a/packages/addons/playwright/index.ts b/packages/addons/playwright/index.ts index a738f558..b422c53e 100644 --- a/packages/addons/playwright/index.ts +++ b/packages/addons/playwright/index.ts @@ -63,7 +63,7 @@ export default defineAddon({ // uses the `defineConfig` helper imports.addNamed(ast, { from: '@playwright/test', - imports: { defineConfig: 'defineConfig' } + imports: ['defineConfig'] }); object.addProperties(defaultExport.arguments[0], { properties: config }); } else if (defaultExport.type === 'ObjectExpression') {