diff --git a/.changeset/odd-bikes-like.md b/.changeset/odd-bikes-like.md new file mode 100644 index 00000000..72aed1bb --- /dev/null +++ b/.changeset/odd-bikes-like.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +fix: add `@types/node` as a dev dependency to the `drizzle` and `storybook` add-ons diff --git a/packages/addons/common.ts b/packages/addons/common.ts index 5795e133..90fb9eba 100644 --- a/packages/addons/common.ts +++ b/packages/addons/common.ts @@ -1,5 +1,6 @@ import { imports, exports, common } from '@sveltejs/cli-core/js'; import { parseScript, parseSvelte } from '@sveltejs/cli-core/parsers'; +import process from 'node:process'; export function addEslintConfigPrettier(content: string): string { const { ast, generateCode } = parseScript(content); @@ -75,3 +76,22 @@ export function addToDemoPage(content: string, path: string): string { const src = template.source + `${newLine}${path}`; return generateCode({ template: src }); } + +/** + * Returns the corresponding `@types/node` version for the version of Node.js running in the current process. + * + * If the installed version of Node.js is from a `Current` release, then the major is decremented to + * the nearest `LTS` release version. + */ +export function getNodeTypesVersion(): string { + const nodeVersion = process.versions.node; + const [major] = nodeVersion.split('.'); + + const isLTS = Number(major) % 2 === 0; + if (isLTS) { + return `^${major}`; + } + + const previousLTSMajor = Number(major) - 1; + return `^${previousLTSMajor}`; +} diff --git a/packages/addons/drizzle/index.ts b/packages/addons/drizzle/index.ts index ed1810b2..859e418a 100644 --- a/packages/addons/drizzle/index.ts +++ b/packages/addons/drizzle/index.ts @@ -1,6 +1,7 @@ import { common, exports, functions, imports, object, variables } from '@sveltejs/cli-core/js'; import { defineAddon, defineAddonOptions, dedent, type OptionValues } from '@sveltejs/cli-core'; import { parseJson, parseScript } from '@sveltejs/cli-core/parsers'; +import { getNodeTypesVersion } from '../common.ts'; const PORTS = { mysql: '3306', @@ -76,6 +77,7 @@ export default defineAddon({ sv.dependency('drizzle-orm', '^0.40.0'); sv.devDependency('drizzle-kit', '^0.30.2'); + sv.devDependency('@types/node', getNodeTypesVersion()); // MySQL if (options.mysql === 'mysql2') sv.dependency('mysql2', '^3.12.0'); diff --git a/packages/addons/storybook/index.ts b/packages/addons/storybook/index.ts index 82edb41f..d75ffcf0 100644 --- a/packages/addons/storybook/index.ts +++ b/packages/addons/storybook/index.ts @@ -1,4 +1,5 @@ import { defineAddon } from '@sveltejs/cli-core'; +import { getNodeTypesVersion } from '../common.ts'; export default defineAddon({ id: 'storybook', @@ -7,5 +8,6 @@ export default defineAddon({ options: {}, run: async ({ sv }) => { await sv.execute(['storybook@latest', 'init', '--skip-install', '--no-dev'], 'inherit'); + sv.devDependency(`@types/node`, getNodeTypesVersion()); } });