diff --git a/.changeset/slow-signs-send.md b/.changeset/slow-signs-send.md new file mode 100644 index 000000000..f22b4a4b9 --- /dev/null +++ b/.changeset/slow-signs-send.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +chore(cli): bump defaults versions diff --git a/package.json b/package.json index 82cbc963e..6a5df7f3d 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "lint": "pnpm --parallel lint && eslint --cache --cache-location node_modules/.eslintcache", "test": "vitest run --silent", "test:ui": "vitest --ui", - "update-addon-deps": "node ./scripts/update-addon-dependencies.js" + "update-deps": "node ./scripts/update-dependencies.js && pnpm format" }, "devDependencies": { "@changesets/cli": "^2.29.4", diff --git a/packages/addons/drizzle/index.ts b/packages/addons/drizzle/index.ts index cdd44c3de..0fa7cdde7 100644 --- a/packages/addons/drizzle/index.ts +++ b/packages/addons/drizzle/index.ts @@ -97,27 +97,27 @@ export default defineAddon({ run: ({ sv, typescript, options, kit, dependencyVersion }) => { const ext = typescript ? 'ts' : 'js'; - sv.devDependency('drizzle-orm', '^0.40.0'); - sv.devDependency('drizzle-kit', '^0.30.2'); + sv.devDependency('drizzle-orm', '^0.44.5'); + sv.devDependency('drizzle-kit', '^0.31.4'); sv.devDependency('@types/node', getNodeTypesVersion()); // MySQL - if (options.mysql === 'mysql2') sv.dependency('mysql2', '^3.12.0'); + if (options.mysql === 'mysql2') sv.dependency('mysql2', '^3.15.0'); if (options.mysql === 'planetscale') sv.dependency('@planetscale/database', '^1.19.0'); // PostgreSQL - if (options.postgresql === 'neon') sv.dependency('@neondatabase/serverless', '^0.10.4'); - if (options.postgresql === 'postgres.js') sv.dependency('postgres', '^3.4.5'); + if (options.postgresql === 'neon') sv.dependency('@neondatabase/serverless', '^1.0.1'); + if (options.postgresql === 'postgres.js') sv.dependency('postgres', '^3.4.7'); // SQLite if (options.sqlite === 'better-sqlite3') { - sv.dependency('better-sqlite3', '^11.8.0'); - sv.devDependency('@types/better-sqlite3', '^7.6.12'); + sv.dependency('better-sqlite3', '^12.4.1'); + sv.devDependency('@types/better-sqlite3', '^7.6.13'); sv.pnpmBuildDependency('better-sqlite3'); } if (options.sqlite === 'libsql' || options.sqlite === 'turso') - sv.devDependency('@libsql/client', '^0.14.0'); + sv.devDependency('@libsql/client', '^0.15.15'); sv.file('.env', (content) => generateEnvFileContent(content, options)); sv.file('.env.example', (content) => generateEnvFileContent(content, options)); diff --git a/packages/addons/eslint/index.ts b/packages/addons/eslint/index.ts index 7d8ab02b5..2b544901a 100644 --- a/packages/addons/eslint/index.ts +++ b/packages/addons/eslint/index.ts @@ -20,16 +20,16 @@ export default defineAddon({ run: ({ sv, typescript, dependencyVersion }) => { const prettierInstalled = Boolean(dependencyVersion('prettier')); - sv.devDependency('eslint', '^9.22.0'); - sv.devDependency('@eslint/compat', '^1.2.5'); - sv.devDependency('eslint-plugin-svelte', '^3.0.0'); - sv.devDependency('globals', '^16.0.0'); - sv.devDependency('@eslint/js', '^9.22.0'); + sv.devDependency('eslint', '^9.36.0'); + sv.devDependency('@eslint/compat', '^1.4.0'); + sv.devDependency('eslint-plugin-svelte', '^3.12.4'); + sv.devDependency('globals', '^16.4.0'); + sv.devDependency('@eslint/js', '^9.36.0'); sv.devDependency('@types/node', getNodeTypesVersion()); - if (typescript) sv.devDependency('typescript-eslint', '^8.20.0'); + if (typescript) sv.devDependency('typescript-eslint', '^8.44.1'); - if (prettierInstalled) sv.devDependency('eslint-config-prettier', '^10.0.1'); + if (prettierInstalled) sv.devDependency('eslint-config-prettier', '^10.1.8'); sv.file('package.json', (content) => { const { data, generateCode } = parseJson(content); diff --git a/packages/addons/mdsvex/index.ts b/packages/addons/mdsvex/index.ts index 4831c426c..b82ad81ff 100644 --- a/packages/addons/mdsvex/index.ts +++ b/packages/addons/mdsvex/index.ts @@ -8,7 +8,7 @@ export default defineAddon({ homepage: 'https://mdsvex.pngwn.io', options: {}, run: ({ sv }) => { - sv.devDependency('mdsvex', '^0.12.3'); + sv.devDependency('mdsvex', '^0.12.6'); sv.file('svelte.config.js', (content) => { const { ast, generateCode } = parseScript(content); diff --git a/packages/addons/paraglide/index.ts b/packages/addons/paraglide/index.ts index 65782c223..41fdbbd4f 100644 --- a/packages/addons/paraglide/index.ts +++ b/packages/addons/paraglide/index.ts @@ -61,7 +61,7 @@ export default defineAddon({ const paraglideOutDir = 'src/lib/paraglide'; - sv.devDependency('@inlang/paraglide-js', '^2.0.0'); + sv.devDependency('@inlang/paraglide-js', '^2.3.2'); sv.file('project.inlang/settings.json', (content) => { if (content) return content; diff --git a/packages/addons/playwright/index.ts b/packages/addons/playwright/index.ts index 7930b2fdf..69b2cc736 100644 --- a/packages/addons/playwright/index.ts +++ b/packages/addons/playwright/index.ts @@ -10,7 +10,7 @@ export default defineAddon({ run: ({ sv, typescript }) => { const ext = typescript ? 'ts' : 'js'; - sv.devDependency('@playwright/test', '^1.49.1'); + sv.devDependency('@playwright/test', '^1.55.1'); sv.file('package.json', (content) => { const { data, generateCode } = parseJson(content); diff --git a/packages/addons/prettier/index.ts b/packages/addons/prettier/index.ts index 21e6cb205..19fb47869 100644 --- a/packages/addons/prettier/index.ts +++ b/packages/addons/prettier/index.ts @@ -8,8 +8,8 @@ export default defineAddon({ homepage: 'https://prettier.io', options: {}, run: ({ sv, dependencyVersion }) => { - sv.devDependency('prettier', '^3.4.2'); - sv.devDependency('prettier-plugin-svelte', '^3.3.3'); + sv.devDependency('prettier', '^3.6.2'); + sv.devDependency('prettier-plugin-svelte', '^3.4.0'); sv.file('.prettierignore', (content) => { if (content) return content; @@ -90,7 +90,7 @@ export default defineAddon({ } if (eslintInstalled) { - sv.devDependency('eslint-config-prettier', '^10.0.1'); + sv.devDependency('eslint-config-prettier', '^10.1.8'); sv.file('eslint.config.js', addEslintConfigPrettier); } } diff --git a/packages/addons/sveltekit-adapter/index.ts b/packages/addons/sveltekit-adapter/index.ts index c4d9e8b6b..2452bbf48 100644 --- a/packages/addons/sveltekit-adapter/index.ts +++ b/packages/addons/sveltekit-adapter/index.ts @@ -3,12 +3,12 @@ import { exports, functions, imports, object } from '@sveltejs/cli-core/js'; import { parseJson, parseScript } from '@sveltejs/cli-core/parsers'; const adapters = [ - { id: 'auto', package: '@sveltejs/adapter-auto', version: '^6.0.0' }, - { id: 'node', package: '@sveltejs/adapter-node', version: '^5.2.12' }, - { id: 'static', package: '@sveltejs/adapter-static', version: '^3.0.8' }, - { id: 'vercel', package: '@sveltejs/adapter-vercel', version: '^5.6.3' }, - { id: 'cloudflare', package: '@sveltejs/adapter-cloudflare', version: '^7.0.0' }, - { id: 'netlify', package: '@sveltejs/adapter-netlify', version: '^5.0.0' } + { id: 'auto', package: '@sveltejs/adapter-auto', version: '^6.1.0' }, + { id: 'node', package: '@sveltejs/adapter-node', version: '^5.3.2' }, + { id: 'static', package: '@sveltejs/adapter-static', version: '^3.0.9' }, + { id: 'vercel', package: '@sveltejs/adapter-vercel', version: '^5.10.2' }, + { id: 'cloudflare', package: '@sveltejs/adapter-cloudflare', version: '^7.2.3' }, + { id: 'netlify', package: '@sveltejs/adapter-netlify', version: '^5.2.3' } ] as const; const options = defineAddonOptions() diff --git a/packages/addons/tailwindcss/index.ts b/packages/addons/tailwindcss/index.ts index 022d8d815..1b3c621f7 100644 --- a/packages/addons/tailwindcss/index.ts +++ b/packages/addons/tailwindcss/index.ts @@ -7,12 +7,12 @@ const plugins = [ { id: 'typography', package: '@tailwindcss/typography', - version: '^0.5.15' + version: '^0.5.18' }, { id: 'forms', package: '@tailwindcss/forms', - version: '^0.5.9' + version: '^0.5.10' } ] as const; @@ -35,10 +35,10 @@ export default defineAddon({ run: ({ sv, options, viteConfigFile, typescript, kit, dependencyVersion }) => { const prettierInstalled = Boolean(dependencyVersion('prettier')); - sv.devDependency('tailwindcss', '^4.0.0'); - sv.devDependency('@tailwindcss/vite', '^4.0.0'); + sv.devDependency('tailwindcss', '^4.1.13'); + sv.devDependency('@tailwindcss/vite', '^4.1.13'); - if (prettierInstalled) sv.devDependency('prettier-plugin-tailwindcss', '^0.6.11'); + if (prettierInstalled) sv.devDependency('prettier-plugin-tailwindcss', '^0.6.14'); for (const plugin of plugins) { if (!options.plugins.includes(plugin.id)) continue; diff --git a/packages/addons/vitest-addon/index.ts b/packages/addons/vitest-addon/index.ts index dcb7ed2b3..10b8a2307 100644 --- a/packages/addons/vitest-addon/index.ts +++ b/packages/addons/vitest-addon/index.ts @@ -25,12 +25,12 @@ export default defineAddon({ const unitTesting = options.usages.includes('unit'); const componentTesting = options.usages.includes('component'); - sv.devDependency('vitest', '^3.2.3'); + sv.devDependency('vitest', '^3.2.4'); if (componentTesting) { - sv.devDependency('@vitest/browser', '^3.2.3'); - sv.devDependency('vitest-browser-svelte', '^0.1.0'); - sv.devDependency('playwright', '^1.53.0'); + sv.devDependency('@vitest/browser', '^3.2.4'); + sv.devDependency('vitest-browser-svelte', '^1.1.0'); + sv.devDependency('playwright', '^1.55.1'); } sv.file('package.json', (content) => { diff --git a/packages/create/shared/+checkjs/package.json b/packages/create/shared/+checkjs/package.json index 2a6584860..1a8ec9f0c 100644 --- a/packages/create/shared/+checkjs/package.json +++ b/packages/create/shared/+checkjs/package.json @@ -4,7 +4,7 @@ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch" }, "devDependencies": { - "svelte-check": "^4.0.0", - "typescript": "^5.0.0" + "svelte-check": "^4.3.2", + "typescript": "^5.9.2" } } diff --git a/packages/create/shared/+typescript/package.json b/packages/create/shared/+typescript/package.json index 5a4b341a6..141557ee0 100644 --- a/packages/create/shared/+typescript/package.json +++ b/packages/create/shared/+typescript/package.json @@ -4,7 +4,7 @@ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" }, "devDependencies": { - "svelte-check": "^4.0.0", - "typescript": "^5.0.0" + "svelte-check": "^4.3.2", + "typescript": "^5.9.2" } } diff --git a/packages/create/templates/demo/package.template.json b/packages/create/templates/demo/package.template.json index f15a53337..ed3e08394 100644 --- a/packages/create/templates/demo/package.template.json +++ b/packages/create/templates/demo/package.template.json @@ -10,12 +10,12 @@ "prepare": "svelte-kit sync || echo ''" }, "devDependencies": { - "@fontsource/fira-mono": "^5.0.0", - "@neoconfetti/svelte": "^2.0.0", - "@sveltejs/adapter-auto": "^6.0.0", - "@sveltejs/kit": "^2.22.0", - "@sveltejs/vite-plugin-svelte": "^6.0.0", - "svelte": "^5.25.0", - "vite": "^7.0.4" + "@fontsource/fira-mono": "^5.2.7", + "@neoconfetti/svelte": "^2.2.2", + "@sveltejs/adapter-auto": "^6.1.0", + "@sveltejs/kit": "^2.43.2", + "@sveltejs/vite-plugin-svelte": "^6.2.0", + "svelte": "^5.39.5", + "vite": "^7.1.7" } } diff --git a/packages/create/templates/library/package.template.json b/packages/create/templates/library/package.template.json index 8784dadc9..218bdd97d 100644 --- a/packages/create/templates/library/package.template.json +++ b/packages/create/templates/library/package.template.json @@ -23,14 +23,14 @@ "svelte": "^5.0.0" }, "devDependencies": { - "@sveltejs/adapter-auto": "^6.0.0", - "@sveltejs/kit": "^2.22.0", - "@sveltejs/package": "^2.0.0", - "@sveltejs/vite-plugin-svelte": "^6.0.0", - "publint": "^0.3.2", - "svelte": "^5.0.0", - "typescript": "^5.3.2", - "vite": "^7.0.4" + "@sveltejs/adapter-auto": "^6.1.0", + "@sveltejs/kit": "^2.43.2", + "@sveltejs/package": "^2.5.4", + "@sveltejs/vite-plugin-svelte": "^6.2.0", + "publint": "^0.3.13", + "svelte": "^5.39.5", + "typescript": "^5.9.2", + "vite": "^7.1.7" }, "keywords": ["svelte"] } diff --git a/packages/create/templates/minimal/package.template.json b/packages/create/templates/minimal/package.template.json index 19ade13a0..dd2b92a59 100644 --- a/packages/create/templates/minimal/package.template.json +++ b/packages/create/templates/minimal/package.template.json @@ -10,10 +10,10 @@ "prepare": "svelte-kit sync || echo ''" }, "devDependencies": { - "@sveltejs/adapter-auto": "^6.0.0", - "@sveltejs/kit": "^2.22.0", - "@sveltejs/vite-plugin-svelte": "^6.0.0", - "svelte": "^5.0.0", - "vite": "^7.0.4" + "@sveltejs/adapter-auto": "^6.1.0", + "@sveltejs/kit": "^2.43.2", + "@sveltejs/vite-plugin-svelte": "^6.2.0", + "svelte": "^5.39.5", + "vite": "^7.1.7" } } diff --git a/scripts/update-addon-dependencies.js b/scripts/update-addon-dependencies.js deleted file mode 100644 index 3396bf9a1..000000000 --- a/scripts/update-addon-dependencies.js +++ /dev/null @@ -1,68 +0,0 @@ -import fs from 'node:fs'; -import path from 'node:path'; -import { styleText } from 'node:util'; - -async function updateAddonDependencies() { - const addonsBasePath = path.resolve('packages', 'addons'); - const addonFolders = fs - .readdirSync(addonsBasePath, { withFileTypes: true }) - .filter((item) => item.isDirectory()) - .map((item) => item.name) - .filter((x) => x !== 'node_modules' && !x.startsWith('_')); - - for (const addonFolder of addonFolders) { - const filePath = `${addonsBasePath}/${addonFolder}/index.ts`; - if (!fs.existsSync(filePath)) continue; - - console.log(`Checking deps for ${styleText(['cyanBright', 'bold'], addonFolder)} add-on`); - - let content = fs.readFileSync(filePath, { encoding: 'utf8' }); - - // regex to extract package name and version from `sv.dependency` and `sv.devDependency` - const svDepRegex = /sv\.(?:dependency|devDependency)\('([^']+)',\s*'([^']+)'\)/g; - // regex to extract from object literal properties `{ package: '...', version: '...' }` (ex: tailwind add-on) - const objectLiteralRegex = /package:\s*'([^']+)',\s*version:\s*'([^']+)'/g; - - const svDepMatches = Array.from(content.matchAll(svDepRegex)); - const objectLiteralMatches = Array.from(content.matchAll(objectLiteralRegex)); - - content = await replaceDeps(content, svDepMatches); - content = await replaceDeps(content, objectLiteralMatches); - - fs.writeFileSync(filePath, content); - } -} - -/** - * Replaces the matched versions with their latest. - * @param {string} content - * @param {RegExpExecArray[]} matches - * @returns {Promise} - */ -async function replaceDeps(content, matches) { - for (const match of matches) { - const [fullMatch, name, version] = match; - const newVersion = `^${await getLatestVersion(name)}`; - const updatedMatch = fullMatch.replace(version, newVersion); - if (fullMatch !== updatedMatch) { - content = content.replace(fullMatch, updatedMatch); - console.log( - ` - ${styleText('blue', name + ':').padEnd(40)} ${styleText('red', version.padEnd(7))} -> ${styleText('green', newVersion)}` - ); - } - } - return content; -} - -/** - * Gets the latest version of given package from the npm registry - * @param {string} name - * @returns {Promise} - */ -async function getLatestVersion(name) { - const response = await fetch(`https://registry.npmjs.org/${name}/latest`); - const json = await response.json(); - return json.version; -} - -await updateAddonDependencies(); diff --git a/scripts/update-dependencies.js b/scripts/update-dependencies.js new file mode 100644 index 000000000..e558a5677 --- /dev/null +++ b/scripts/update-dependencies.js @@ -0,0 +1,148 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { styleText } from 'node:util'; + +async function updateAddonDependencies() { + const addonsBasePath = path.resolve('packages', 'addons'); + const addonFolders = fs + .readdirSync(addonsBasePath, { withFileTypes: true }) + .filter((item) => item.isDirectory()) + .map((item) => item.name) + .filter((x) => x !== 'node_modules' && !x.startsWith('_')); + + for (const addonFolder of addonFolders) { + const filePath = `${addonsBasePath}/${addonFolder}/index.ts`; + if (!fs.existsSync(filePath)) continue; + + console.log(`Checking deps for ${styleText(['cyanBright', 'bold'], addonFolder)} add-on`); + + let content = fs.readFileSync(filePath, { encoding: 'utf8' }); + + // regex to extract package name and version from `sv.dependency` and `sv.devDependency` + const svDepRegex = /sv\.(?:dependency|devDependency)\('([^']+)',\s*'([^']+)'\)/g; + // regex to extract from object literal properties `{ package: '...', version: '...' }` (ex: tailwind add-on) + const objectLiteralRegex = /package:\s*'([^']+)',\s*version:\s*'([^']+)'/g; + + const svDepMatches = Array.from(content.matchAll(svDepRegex)); + const objectLiteralMatches = Array.from(content.matchAll(objectLiteralRegex)); + + content = await replaceDeps(content, svDepMatches); + content = await replaceDeps(content, objectLiteralMatches); + + fs.writeFileSync(filePath, content); + } +} + +/** + * Replaces the matched versions with their latest. + * @param {string} content + * @param {RegExpExecArray[]} matches + * @returns {Promise} + */ +async function replaceDeps(content, matches) { + for (const match of matches) { + const [fullMatch, name, version] = match; + const newVersion = `^${await getLatestVersion(name)}`; + const updatedMatch = fullMatch.replace(version, newVersion); + if (fullMatch !== updatedMatch) { + content = content.replace(fullMatch, updatedMatch); + console.log( + ` - ${styleText('blue', name + ':').padEnd(40)} ${styleText('red', version.padEnd(7))} -> ${styleText('green', newVersion)}` + ); + } + } + return content; +} + +/** + * @param {string} basePath + * @param {string} fileName + * @param {string} type + */ +async function updatePackageFiles(basePath, fileName, type) { + const fullBasePath = path.resolve(basePath); + const folders = fs + .readdirSync(fullBasePath, { withFileTypes: true }) + .filter((item) => item.isDirectory()) + .map((item) => item.name); + + for (const folder of folders) { + const filePath = path.join(fullBasePath, folder, fileName); + if (!fs.existsSync(filePath)) continue; + + console.log(`Checking deps for ${styleText(['cyanBright', 'bold'], folder)} ${type}`); + + const content = fs.readFileSync(filePath, { encoding: 'utf8' }); + const packageJson = JSON.parse(content); + + let hasUpdates = false; + + // Check dependencies + if (packageJson.dependencies) { + for (const [packageName, currentVersion] of Object.entries(packageJson.dependencies)) { + // Skip if version doesn't start with ^ (not a caret range) + if (!currentVersion.startsWith('^')) continue; + + const latestVersion = await getLatestVersion(packageName); + const newVersion = `^${latestVersion}`; + + if (currentVersion !== newVersion) { + packageJson.dependencies[packageName] = newVersion; + hasUpdates = true; + console.log( + ` - ${styleText('blue', packageName + ':').padEnd(40)} ${styleText('red', currentVersion.padEnd(7))} -> ${styleText('green', newVersion)} (dependency)` + ); + } + } + } + + // Check devDependencies + if (packageJson.devDependencies) { + for (const [packageName, currentVersion] of Object.entries(packageJson.devDependencies)) { + // Skip if version doesn't start with ^ (not a caret range) + if (!currentVersion.startsWith('^')) continue; + + const latestVersion = await getLatestVersion(packageName); + const newVersion = `^${latestVersion}`; + + if (currentVersion !== newVersion) { + packageJson.devDependencies[packageName] = newVersion; + hasUpdates = true; + console.log( + ` - ${styleText('blue', packageName + ':').padEnd(40)} ${styleText('red', currentVersion.padEnd(7))} -> ${styleText('green', newVersion)} (devDependency)` + ); + } + } + } + + if (!packageJson.dependencies && !packageJson.devDependencies) { + console.log(` - No dependencies or devDependencies found in ${folder}`); + continue; + } + + if (hasUpdates) { + // Write back the updated package.json with proper formatting + const updatedContent = JSON.stringify(packageJson, null, '\t') + '\n'; + fs.writeFileSync(filePath, updatedContent); + } + } +} + +/** + * Gets the latest version of given package from the npm registry + * @param {string} name + * @returns {Promise} + */ +async function getLatestVersion(name) { + const response = await fetch(`https://registry.npmjs.org/${name}/latest`); + const json = await response.json(); + return json.version; +} + +await updateAddonDependencies(); + +// Update template package.template.json files +await updatePackageFiles('packages/create/templates', 'package.template.json', 'template'); + +// Update shared package.json files +await updatePackageFiles('packages/create/shared', 'package.json', 'shared');