From f1a7ea2ca306e47be18cb617505e4d8374f3ff7e Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 16 Oct 2025 08:18:55 +0200 Subject: [PATCH 1/9] Docker Compose file is now stored in `compose.yaml` --- .changeset/great-mammals-buy.md | 5 +++++ packages/addons/drizzle/index.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/great-mammals-buy.md diff --git a/.changeset/great-mammals-buy.md b/.changeset/great-mammals-buy.md new file mode 100644 index 000000000..8cb1e93cd --- /dev/null +++ b/.changeset/great-mammals-buy.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +feat(cli): Docker Compose file is now stored in `compose.yaml` instead of `docker-compose.yml` diff --git a/packages/addons/drizzle/index.ts b/packages/addons/drizzle/index.ts index 94cad464a..508de8123 100644 --- a/packages/addons/drizzle/index.ts +++ b/packages/addons/drizzle/index.ts @@ -123,7 +123,7 @@ export default defineAddon({ sv.file('.env.example', (content) => generateEnvFileContent(content, options)); if (options.docker && (options.mysql === 'mysql2' || options.postgresql === 'postgres.js')) { - sv.file('docker-compose.yml', (content) => { + sv.file('compose.yaml', (content) => { // if the file already exists, don't modify it // (in the future, we could add some tooling for modifying yaml) if (content.length > 0) return content; From 5091bfb06e9df95d8a54609120907a10226e2b20 Mon Sep 17 00:00:00 2001 From: jycouet Date: Fri, 17 Oct 2025 20:43:31 +0200 Subject: [PATCH 2/9] first step, improve tests (even on non docker env) --- .../addons/_tests/drizzle/docker-compose.yml | 20 ------ packages/addons/_tests/drizzle/test.ts | 70 ++++++++++++++----- 2 files changed, 51 insertions(+), 39 deletions(-) delete mode 100644 packages/addons/_tests/drizzle/docker-compose.yml diff --git a/packages/addons/_tests/drizzle/docker-compose.yml b/packages/addons/_tests/drizzle/docker-compose.yml deleted file mode 100644 index f6f5e0a7f..000000000 --- a/packages/addons/_tests/drizzle/docker-compose.yml +++ /dev/null @@ -1,20 +0,0 @@ -services: - db-postgres: - image: postgres - restart: always - shm_size: 128mb - ports: - - 5432:5432 - environment: - POSTGRES_USER: root - POSTGRES_PASSWORD: mysecretpassword - POSTGRES_DB: local - db-mysql: - image: mysql - restart: always - shm_size: 128mb - ports: - - 3306:3306 - environment: - MYSQL_ROOT_PASSWORD: mysecretpassword - MYSQL_DATABASE: local diff --git a/packages/addons/_tests/drizzle/test.ts b/packages/addons/_tests/drizzle/test.ts index d4afdd0c0..fcc5725f0 100644 --- a/packages/addons/_tests/drizzle/test.ts +++ b/packages/addons/_tests/drizzle/test.ts @@ -10,7 +10,8 @@ import drizzle from '../../drizzle/index.ts'; import { pageServer, pageComp } from './fixtures.ts'; // only linux is supported for running docker containers in github runners -const noDocker = process.env.CI && process.platform !== 'linux'; +const MUST_HAVE_DOCKER = process.env.CI && process.platform === 'linux'; +let dockerInstalled = false; const { test, testCases, prepareServer } = setupTest( { drizzle }, @@ -38,44 +39,75 @@ const { test, testCases, prepareServer } = setupTest( ); beforeAll(() => { - if (noDocker) return; const cwd = path.dirname(fileURLToPath(import.meta.url)); - execSync('docker compose up --detach', { cwd, stdio: 'pipe' }); + + try { + execSync('docker --version', { cwd, stdio: 'pipe' }); + dockerInstalled = true; + } catch { + dockerInstalled = false; + } + + if (dockerInstalled) { + execSync('docker compose up --detach', { cwd, stdio: 'pipe' }); + } // cleans up the containers on interrupts (ctrl+c) process.addListener('SIGINT', () => { - execSync('docker compose down --volumes', { cwd, stdio: 'pipe' }); + if (dockerInstalled) { + execSync('docker compose down --volumes', { cwd, stdio: 'pipe' }); + } }); return () => { - execSync('docker compose down --volumes', { cwd, stdio: 'pipe' }); + if (dockerInstalled) { + execSync('docker compose down --volumes', { cwd, stdio: 'pipe' }); + } }; }); test.concurrent.for(testCases)( 'drizzle $kind.type $variant', async (testCase, { page, ...ctx }) => { - if (testCase.kind.options.drizzle.docker && noDocker) ctx.skip(); const cwd = ctx.cwd(testCase); - const ts = testCase.variant === 'kit-ts'; + const ts = testCase.variant.endsWith('ts'); const drizzleConfig = path.resolve(cwd, `drizzle.config.${ts ? 'ts' : 'js'}`); - const content = fs.readFileSync(drizzleConfig, 'utf8').replace(/strict: true[,\s]/, ''); - fs.writeFileSync(drizzleConfig, content, 'utf8'); + const content = fs.readFileSync(drizzleConfig, 'utf8'); + + // Check that we have a drizzle config + expect(content.length).toBeGreaterThan(0); + + // If the environment must have docker, Check that we have docker installed + if (MUST_HAVE_DOCKER) expect(dockerInstalled).toBe(true); + + // If the database requires docker, Check that we have the config file + if (testCase.kind.options.drizzle.docker) { + const dockerCompose = path.resolve(cwd, 'docker-compose.yml'); + expect(fs.existsSync(dockerCompose)).toBe(true); + } + + const db_can_be_tested = + !testCase.kind.options.drizzle.docker || + (testCase.kind.options.drizzle.docker && dockerInstalled); + + if (db_can_be_tested) { + fs.writeFileSync(drizzleConfig, content.replace(/strict: true[,\s]/, ''), 'utf8'); - const routes = path.resolve(cwd, 'src', 'routes'); - const pagePath = path.resolve(routes, '+page.svelte'); - fs.writeFileSync(pagePath, pageComp, 'utf8'); + const routes = path.resolve(cwd, 'src', 'routes'); + const pagePath = path.resolve(routes, '+page.svelte'); + fs.writeFileSync(pagePath, pageComp, 'utf8'); - const pageServerPath = path.resolve(routes, `+page.server.${ts ? 'ts' : 'js'}`); - fs.writeFileSync(pageServerPath, pageServer, 'utf8'); + const pageServerPath = path.resolve(routes, `+page.server.${ts ? 'ts' : 'js'}`); + fs.writeFileSync(pageServerPath, pageServer, 'utf8'); - execSync('npm run db:push', { cwd, stdio: 'pipe' }); + execSync('npm run db:push', { cwd, stdio: 'pipe' }); - const { close } = await prepareServer({ cwd, page }); - // kill server process when we're done - ctx.onTestFinished(async () => await close()); + const { close } = await prepareServer({ cwd, page }); + // kill server process when we're done + ctx.onTestFinished(async () => await close()); - expect(page.locator('[data-testid]')).toBeTruthy(); + expect(page.locator('[data-testid]')).toBeTruthy(); + } } ); From 79dcdf613e20020f1466a7ed226cebeaaf7d763c Mon Sep 17 00:00:00 2001 From: jycouet Date: Fri, 17 Oct 2025 21:05:29 +0200 Subject: [PATCH 3/9] fix CI --- packages/addons/_tests/drizzle/test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/addons/_tests/drizzle/test.ts b/packages/addons/_tests/drizzle/test.ts index fcc5725f0..ea88b48c5 100644 --- a/packages/addons/_tests/drizzle/test.ts +++ b/packages/addons/_tests/drizzle/test.ts @@ -48,19 +48,19 @@ beforeAll(() => { dockerInstalled = false; } - if (dockerInstalled) { + if (dockerInstalled && MUST_HAVE_DOCKER) { execSync('docker compose up --detach', { cwd, stdio: 'pipe' }); } // cleans up the containers on interrupts (ctrl+c) process.addListener('SIGINT', () => { - if (dockerInstalled) { + if (dockerInstalled && MUST_HAVE_DOCKER) { execSync('docker compose down --volumes', { cwd, stdio: 'pipe' }); } }); return () => { - if (dockerInstalled) { + if (dockerInstalled && MUST_HAVE_DOCKER) { execSync('docker compose down --volumes', { cwd, stdio: 'pipe' }); } }; From 23cb18a204d3e9b151dfffa8b750a2e97aa8004a Mon Sep 17 00:00:00 2001 From: jycouet Date: Fri, 17 Oct 2025 21:14:29 +0200 Subject: [PATCH 4/9] for CI ? --- .../addons/_tests/drizzle/docker-compose.yml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 packages/addons/_tests/drizzle/docker-compose.yml diff --git a/packages/addons/_tests/drizzle/docker-compose.yml b/packages/addons/_tests/drizzle/docker-compose.yml new file mode 100644 index 000000000..f6f5e0a7f --- /dev/null +++ b/packages/addons/_tests/drizzle/docker-compose.yml @@ -0,0 +1,20 @@ +services: + db-postgres: + image: postgres + restart: always + shm_size: 128mb + ports: + - 5432:5432 + environment: + POSTGRES_USER: root + POSTGRES_PASSWORD: mysecretpassword + POSTGRES_DB: local + db-mysql: + image: mysql + restart: always + shm_size: 128mb + ports: + - 3306:3306 + environment: + MYSQL_ROOT_PASSWORD: mysecretpassword + MYSQL_DATABASE: local From 6a2340ae266194e2bfdf1bf8e0f323b59f605ea5 Mon Sep 17 00:00:00 2001 From: jycouet Date: Fri, 17 Oct 2025 21:28:44 +0200 Subject: [PATCH 5/9] fixing tests --- packages/addons/_tests/drizzle/test.ts | 11 ++++------- packages/addons/drizzle/index.ts | 12 ++++++++++-- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/addons/_tests/drizzle/test.ts b/packages/addons/_tests/drizzle/test.ts index ea88b48c5..cedffabb4 100644 --- a/packages/addons/_tests/drizzle/test.ts +++ b/packages/addons/_tests/drizzle/test.ts @@ -75,16 +75,13 @@ test.concurrent.for(testCases)( const drizzleConfig = path.resolve(cwd, `drizzle.config.${ts ? 'ts' : 'js'}`); const content = fs.readFileSync(drizzleConfig, 'utf8'); - // Check that we have a drizzle config - expect(content.length).toBeGreaterThan(0); + expect(content.length, 'drizzle config should have content').toBeGreaterThan(0); - // If the environment must have docker, Check that we have docker installed - if (MUST_HAVE_DOCKER) expect(dockerInstalled).toBe(true); + if (MUST_HAVE_DOCKER) expect(dockerInstalled, 'docker must be installed').toBe(true); - // If the database requires docker, Check that we have the config file if (testCase.kind.options.drizzle.docker) { - const dockerCompose = path.resolve(cwd, 'docker-compose.yml'); - expect(fs.existsSync(dockerCompose)).toBe(true); + const dockerCompose = path.resolve(cwd, 'compose.yaml'); + expect(fs.existsSync(dockerCompose), 'file should exist').toBe(true); } const db_can_be_tested = diff --git a/packages/addons/drizzle/index.ts b/packages/addons/drizzle/index.ts index 508de8123..3bea47735 100644 --- a/packages/addons/drizzle/index.ts +++ b/packages/addons/drizzle/index.ts @@ -94,7 +94,7 @@ export default defineAddon({ } } }, - run: ({ sv, typescript, options, kit, dependencyVersion }) => { + run: ({ sv, typescript, options, kit, dependencyVersion, cwd }) => { const ext = typescript ? 'ts' : 'js'; sv.devDependency('drizzle-orm', '^0.44.5'); @@ -123,7 +123,15 @@ export default defineAddon({ sv.file('.env.example', (content) => generateEnvFileContent(content, options)); if (options.docker && (options.mysql === 'mysql2' || options.postgresql === 'postgres.js')) { - sv.file('compose.yaml', (content) => { + const composeFileOptions = ['docker-compose.yml', 'docker-compose.yaml', 'compose.yaml']; + let composeFile = ''; + for (const option of composeFileOptions) { + composeFile = option; + if (fs.existsSync(path.resolve(cwd, option))) break; + } + if (composeFile === '') throw new Error('unreachable state...'); + + sv.file(composeFile, (content) => { // if the file already exists, don't modify it // (in the future, we could add some tooling for modifying yaml) if (content.length > 0) return content; From 22cbabd39ebed2accc859a718563a92905f9f42b Mon Sep 17 00:00:00 2001 From: jycouet Date: Sat, 18 Oct 2025 00:31:06 +0200 Subject: [PATCH 6/9] fix --cwd in add for drizzle + cancel option --- .changeset/bright-flies-argue.md | 5 +++++ packages/addons/drizzle/index.ts | 32 ++++++++++++++---------------- packages/cli/commands/add/index.ts | 24 ++++++++++++++++++---- packages/cli/lib/install.ts | 31 +++++++++++++++++++++++------ packages/core/addon/config.ts | 4 +++- 5 files changed, 68 insertions(+), 28 deletions(-) create mode 100644 .changeset/bright-flies-argue.md diff --git a/.changeset/bright-flies-argue.md b/.changeset/bright-flies-argue.md new file mode 100644 index 000000000..c66f83811 --- /dev/null +++ b/.changeset/bright-flies-argue.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +fix(drizzle): `--cwd` option in `add` command is now taken into account diff --git a/packages/addons/drizzle/index.ts b/packages/addons/drizzle/index.ts index 3bea47735..cb9a12be1 100644 --- a/packages/addons/drizzle/index.ts +++ b/packages/addons/drizzle/index.ts @@ -73,30 +73,28 @@ export default defineAddon({ shortDescription: 'database orm', homepage: 'https://orm.drizzle.team', options, - setup: ({ kit, unsupported, runsAfter, cwd, typescript }) => { + setup: ({ kit, unsupported, runsAfter }) => { runsAfter('prettier'); - const ext = typescript ? 'ts' : 'js'; - if (!kit) { - return unsupported('Requires SvelteKit'); - } + if (!kit) return unsupported('Requires SvelteKit'); + }, + run: ({ sv, typescript, options, kit, dependencyVersion, cwd, cancel }) => { + if (!kit) throw new Error('SvelteKit is required'); - const baseDBPath = path.resolve(kit.libDirectory, 'server', 'db'); + const ext = typescript ? 'ts' : 'js'; + const baseDBPath = path.resolve(cwd, kit.libDirectory, 'server', 'db'); const paths = { - 'drizzle config': path.relative(cwd, path.resolve(cwd, `drizzle.config.${ext}`)), - 'database schema': path.relative(cwd, path.resolve(baseDBPath, `schema.${ext}`)), - database: path.relative(cwd, path.resolve(baseDBPath, `index.${ext}`)) + 'drizzle config': path.resolve(cwd, `drizzle.config.${ext}`), + 'database schema': path.resolve(baseDBPath, `schema.${ext}`), + database: path.resolve(baseDBPath, `index.${ext}`) }; for (const [fileType, filePath] of Object.entries(paths)) { if (fs.existsSync(filePath)) { - unsupported(`Preexisting ${fileType} file at '${filePath}'`); + return cancel(`Preexisting ${fileType} file at '${filePath}'`); } } - }, - run: ({ sv, typescript, options, kit, dependencyVersion, cwd }) => { - const ext = typescript ? 'ts' : 'js'; - + console.log(`no preexisting files`); sv.devDependency('drizzle-orm', '^0.44.5'); sv.devDependency('drizzle-kit', '^0.31.4'); sv.devDependency('@types/node', getNodeTypesVersion()); @@ -214,7 +212,7 @@ export default defineAddon({ }); } - sv.file(`drizzle.config.${ext}`, (content) => { + sv.file(paths['drizzle config'], (content) => { const { ast, generateCode } = parseScript(content); imports.addNamed(ast, { from: 'drizzle-kit', imports: { defineConfig: 'defineConfig' } }); @@ -242,7 +240,7 @@ export default defineAddon({ return generateCode(); }); - sv.file(`${kit?.libDirectory}/server/db/schema.${ext}`, (content) => { + sv.file(paths['database schema'], (content) => { const { ast, generateCode } = parseScript(content); let userSchemaExpression; @@ -294,7 +292,7 @@ export default defineAddon({ return generateCode(); }); - sv.file(`${kit?.libDirectory}/server/db/index.${ext}`, (content) => { + sv.file(paths['database'], (content) => { const { ast, generateCode } = parseScript(content); imports.addNamed(ast, { diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index 89d336098..cd9ffc6ee 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -205,7 +205,7 @@ export async function runAddCommand( options: Options, selectedAddonIds: string[] ): Promise<{ nextSteps: string[]; packageManager?: AgentName | null }> { - const selectedAddons: SelectedAddon[] = selectedAddonIds.map((id) => ({ + let selectedAddons: SelectedAddon[] = selectedAddonIds.map((id) => ({ type: 'official', addon: getAddonDetails(id) })); @@ -542,14 +542,30 @@ export async function runAddCommand( const details = officialDetails.concat(commDetails); const addonMap: AddonMap = Object.assign({}, ...details.map((a) => ({ [a.id]: a }))); - const { filesToFormat, pnpmBuildDependencies: addonPnpmBuildDependencies } = await applyAddons({ + const { filesToFormat, pnpmBuildDependencies, status } = await applyAddons({ workspace, addonSetupResults, addons: addonMap, options: official }); - p.log.success('Successfully setup add-ons'); + const addonSuccess: string[] = []; + for (const [addonId, info] of Object.entries(status)) { + if (info === 'success') addonSuccess.push(addonId); + else { + p.log.warn(`Canceled ${addonId}: ${info.join(', ')}`); + selectedAddons = selectedAddons.filter((a) => a.addon.id !== addonId); + } + } + + if (addonSuccess.length === 0) { + p.cancel('All selected add-ons were canceled.'); + process.exit(1); + } else if (addonSuccess.length === Object.entries(status).length) { + p.log.success('Successfully setup add-ons'); + } else { + p.log.success(`Successfully setup: ${addonSuccess.join(', ')}`); + } // prompt for package manager and install dependencies let packageManager: PackageManager | undefined; @@ -562,7 +578,7 @@ export async function runAddCommand( await addPnpmBuildDependencies(workspace.cwd, packageManager, [ 'esbuild', - ...addonPnpmBuildDependencies + ...pnpmBuildDependencies ]); await installDependencies(packageManager, options.cwd); diff --git a/packages/cli/lib/install.ts b/packages/cli/lib/install.ts index 151e24a42..aafd6446a 100644 --- a/packages/cli/lib/install.ts +++ b/packages/cli/lib/install.ts @@ -54,9 +54,11 @@ export async function applyAddons({ }: ApplyAddonOptions): Promise<{ filesToFormat: string[]; pnpmBuildDependencies: string[]; + status: Record; }> { const filesToFormat = new Set(); const allPnpmBuildDependencies: string[] = []; + const status: Record = {}; const mapped = Object.entries(addons).map(([, addon]) => addon); const ordered = orderAddons(mapped, addonSetupResults); @@ -64,7 +66,7 @@ export async function applyAddons({ for (const addon of ordered) { workspace = await createWorkspace({ ...workspace, options: options[addon.id] }); - const { files, pnpmBuildDependencies } = await runAddon({ + const { files, pnpmBuildDependencies, cancels } = await runAddon({ workspace, addon, multiple: ordered.length > 1 @@ -72,11 +74,17 @@ export async function applyAddons({ files.forEach((f) => filesToFormat.add(f)); pnpmBuildDependencies.forEach((s) => allPnpmBuildDependencies.push(s)); + if (cancels.length === 0) { + status[addon.id] = 'success'; + } else { + status[addon.id] = cancels; + } } return { filesToFormat: Array.from(filesToFormat), - pnpmBuildDependencies: allPnpmBuildDependencies + pnpmBuildDependencies: allPnpmBuildDependencies, + status }; } @@ -177,14 +185,25 @@ async function runAddon({ addon, multiple, workspace }: RunAddon) { pnpmBuildDependencies.push(pkg); } }; - await addon.run({ ...workspace, sv }); - const pkgPath = installPackages(dependencies, workspace); - files.add(pkgPath); + const cancels: string[] = []; + await addon.run({ + cancel: (reason) => { + cancels.push(reason); + }, + ...workspace, + sv + }); + + if (cancels.length === 0) { + const pkgPath = installPackages(dependencies, workspace); + files.add(pkgPath); + } return { files: Array.from(files), - pnpmBuildDependencies + pnpmBuildDependencies, + cancels }; } diff --git a/packages/core/addon/config.ts b/packages/core/addon/config.ts index 656b39b4a..9d846d260 100644 --- a/packages/core/addon/config.ts +++ b/packages/core/addon/config.ts @@ -40,7 +40,9 @@ export type Addon = { runsAfter: (addonName: string) => void; } ) => MaybePromise; - run: (workspace: Workspace & { sv: SvApi }) => MaybePromise; + run: ( + workspace: Workspace & { sv: SvApi; cancel: (reason: string) => void } + ) => MaybePromise; nextSteps?: ( data: { highlighter: Highlighter; From 43047d64e4f3de706dedcd88df6e1c8fcb269703 Mon Sep 17 00:00:00 2001 From: jycouet Date: Sat, 18 Oct 2025 01:07:31 +0200 Subject: [PATCH 7/9] if docker is here, let's use it --- packages/addons/_tests/drizzle/test.ts | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/addons/_tests/drizzle/test.ts b/packages/addons/_tests/drizzle/test.ts index cedffabb4..25962389d 100644 --- a/packages/addons/_tests/drizzle/test.ts +++ b/packages/addons/_tests/drizzle/test.ts @@ -48,21 +48,15 @@ beforeAll(() => { dockerInstalled = false; } - if (dockerInstalled && MUST_HAVE_DOCKER) { - execSync('docker compose up --detach', { cwd, stdio: 'pipe' }); - } + if (dockerInstalled) execSync('docker compose up --detach', { cwd, stdio: 'pipe' }); // cleans up the containers on interrupts (ctrl+c) process.addListener('SIGINT', () => { - if (dockerInstalled && MUST_HAVE_DOCKER) { - execSync('docker compose down --volumes', { cwd, stdio: 'pipe' }); - } + if (dockerInstalled) execSync('docker compose down --volumes', { cwd, stdio: 'pipe' }); }); return () => { - if (dockerInstalled && MUST_HAVE_DOCKER) { - execSync('docker compose down --volumes', { cwd, stdio: 'pipe' }); - } + if (dockerInstalled) execSync('docker compose down --volumes', { cwd, stdio: 'pipe' }); }; }); From 3ad0ba6d729005458acea4cc062d991b38e4840a Mon Sep 17 00:00:00 2001 From: jycouet Date: Sat, 18 Oct 2025 01:26:15 +0200 Subject: [PATCH 8/9] only for MUST_HAVE_DOCKER --- packages/addons/_tests/drizzle/test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/addons/_tests/drizzle/test.ts b/packages/addons/_tests/drizzle/test.ts index 25962389d..8659dfac2 100644 --- a/packages/addons/_tests/drizzle/test.ts +++ b/packages/addons/_tests/drizzle/test.ts @@ -39,6 +39,7 @@ const { test, testCases, prepareServer } = setupTest( ); beforeAll(() => { + if (!MUST_HAVE_DOCKER) return; const cwd = path.dirname(fileURLToPath(import.meta.url)); try { From ca5f23e7c7318dca443d5abb751d75e6c6f2c434 Mon Sep 17 00:00:00 2001 From: "jyc.dev" Date: Sat, 18 Oct 2025 13:07:05 +0200 Subject: [PATCH 9/9] Update .changeset/great-mammals-buy.md Co-authored-by: Manuel <30698007+manuel3108@users.noreply.github.com> --- .changeset/great-mammals-buy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/great-mammals-buy.md b/.changeset/great-mammals-buy.md index 8cb1e93cd..02a052f2d 100644 --- a/.changeset/great-mammals-buy.md +++ b/.changeset/great-mammals-buy.md @@ -2,4 +2,4 @@ 'sv': patch --- -feat(cli): Docker Compose file is now stored in `compose.yaml` instead of `docker-compose.yml` +feat(drizzle): Docker Compose file is now stored in `compose.yaml` instead of `docker-compose.yml`