diff --git a/helpers/compile/plugins/resolvePathsPlugin.test.ts b/helpers/compile/plugins/resolvePathsPlugin.test.ts index 78f4155a213e..f73cab9c141f 100644 --- a/helpers/compile/plugins/resolvePathsPlugin.test.ts +++ b/helpers/compile/plugins/resolvePathsPlugin.test.ts @@ -39,19 +39,22 @@ async function bundleImport(importPath: string, external: string[] = []) { describe('resolvePathsPlugin', () => { it.each([ ['prisma', 'packages/cli/src/types.ts'], - ['prisma7', 'packages/prisma7/src/index.ts'], + ['@prisma/prisma7', 'packages/prisma7/src/index.ts'], ['prisma/config', 'packages/cli/src/config.ts'], - ['prisma7/config', 'packages/prisma7/src/config.ts'], + ['@prisma/prisma7/config', 'packages/prisma7/src/config.ts'], ])('resolves %s to %s', async (importPath, resolvedPath) => { const result = await bundleImport(importPath) expect(Object.keys(result.metafile.inputs)).toContain(resolvedPath) }) - it('preserves exact external aliases', async () => { - const result = await bundleImport('prisma/config', ['prisma/config']) + it.each([ + ['prisma/config', 'packages/cli/src/config.ts'], + ['@prisma/prisma7/config', 'packages/prisma7/src/config.ts'], + ])('preserves exact external alias %s', async (importPath, resolvedPath) => { + const result = await bundleImport(importPath, [importPath]) - expect(Object.keys(result.metafile.inputs)).not.toContain('packages/cli/src/config.ts') - expect(result.outputFiles[0]?.text).toContain('import "prisma/config";') + expect(Object.keys(result.metafile.inputs)).not.toContain(resolvedPath) + expect(result.outputFiles[0]?.text).toContain(`import "${importPath}";`) }) }) diff --git a/packages/cli/src/Generate.ts b/packages/cli/src/Generate.ts index 11be7939f64f..6d27e17e4d0e 100644 --- a/packages/cli/src/Generate.ts +++ b/packages/cli/src/Generate.ts @@ -31,7 +31,7 @@ import { version as cliVersion } from '../package.json' import { introspectSql, sqlDirPath } from './generate/introspectSql' import { Watcher } from './generate/Watcher' import { breakingChangesMessage } from './utils/breakingChanges' -import type { CliDistributionIdentity } from './utils/cli-distribution-identity' +import { type CliDistributionIdentity, getCliDistributionPackageName } from './utils/cli-distribution-identity' import { getGlobalLocalVersionMismatchWarning as getDefaultGlobalLocalVersionMismatchWarning, type GlobalLocalVersionMismatchWarningOptions, @@ -250,9 +250,9 @@ ${breakingChangesMessage}` const versionsOutOfSync = clientGeneratorVersion && cliVersion !== clientGeneratorVersion const versionsWarning = versionsOutOfSync && logger.should.warn() - ? `\n\n${yellow(bold('warn'))} Versions of ${bold(`${this.identity}@${cliVersion}`)} and ${bold( - `@prisma/client@${clientGeneratorVersion}`, - )} don't match. + ? `\n\n${yellow(bold('warn'))} Versions of ${bold( + `${getCliDistributionPackageName(this.identity)}@${cliVersion}`, + )} and ${bold(`@prisma/client@${clientGeneratorVersion}`)} don't match. This might lead to unexpected behavior. Please make sure they have the same version.` : '' diff --git a/packages/cli/src/Init.ts b/packages/cli/src/Init.ts index 61c3ec0bd602..acfdec8791b0 100644 --- a/packages/cli/src/Init.ts +++ b/packages/cli/src/Init.ts @@ -32,7 +32,11 @@ import { installSkills } from './init/skill-install' import { login } from './management-api/auth' import { createAuthenticatedManagementAPI } from './management-api/auth-client' import { FileTokenStorage } from './management-api/token-storage' -import type { CliDistributionIdentity } from './utils/cli-distribution-identity' +import { + type CliDistributionIdentity, + getCliDistributionConfigPackageName, + getCliDistributionPackageName, +} from './utils/cli-distribution-identity' import { determineClientOutputPath } from './utils/client-output-path' import { printError } from './utils/prompt/utils/print' @@ -233,7 +237,8 @@ type DefaultConfigInput = { } export const defaultConfig = ({ prismaFolder, runtime, identity }: DefaultConfigInput) => { - const configPackage = `${identity}/config` + const configPackage = getCliDistributionConfigPackageName(identity) + const packageName = getCliDistributionPackageName(identity) const schemaPath = path.relative(process.cwd(), path.join(prismaFolder, 'schema.prisma')) const migrationsPath = path.relative(process.cwd(), path.join(prismaFolder, 'migrations')) @@ -257,7 +262,7 @@ export default defineConfig({ .otherwise(() => { return `\ // This file was generated by Prisma, and assumes you have installed the following: -// npm install --save-dev ${identity} dotenv +// npm install --save-dev ${packageName} dotenv import "dotenv/config"; import { defineConfig } from "${configPackage}"; diff --git a/packages/cli/src/__tests__/Init.vitest.ts b/packages/cli/src/__tests__/Init.vitest.ts index 9fc84ddd0e37..2d5307acbb26 100644 --- a/packages/cli/src/__tests__/Init.vitest.ts +++ b/packages/cli/src/__tests__/Init.vitest.ts @@ -77,6 +77,36 @@ test('is schema and env written on disk replace', async () => { `) }) +test('prisma7 init writes scoped config package and keeps prisma7 commands', async () => { + ctx.fixture('init') + const recordedStdout = stripAnsi( + ( + await Init.new('prisma7').parse(['--datasource-provider', 'sqlite', '--no-skills'], defaultTestConfig()) + ).toString(), + ) + + const config = fs.readFileSync(join(ctx.tmpDir, 'prisma.config.ts'), 'utf-8') + expect(config).toMatchInlineSnapshot(` + "// This file was generated by Prisma, and assumes you have installed the following: + // npm install --save-dev @prisma/prisma7 dotenv + import \"dotenv/config\"; + import { defineConfig } from \"@prisma/prisma7/config\"; + + export default defineConfig({ + schema: \"prisma/schema.prisma\", + migrations: { + path: \"prisma/migrations\", + }, + datasource: { + url: process.env[\"DATABASE_URL\"], + }, + }); + " + `) + expect(recordedStdout).toContain('Run prisma7 db pull to introspect your database.') + expect(recordedStdout).not.toContain('Run prisma db pull to introspect your database.') +}) + test('works with url param', async () => { ctx.fixture('init') const recordedStdout = (await Init.new('prisma').parse(['--url', 'file:dev.db'], defaultTestConfig())).toString() diff --git a/packages/cli/src/__tests__/globalLocalVersionMismatch.test.ts b/packages/cli/src/__tests__/globalLocalVersionMismatch.test.ts index 71ae92af69d2..da308738f926 100644 --- a/packages/cli/src/__tests__/globalLocalVersionMismatch.test.ts +++ b/packages/cli/src/__tests__/globalLocalVersionMismatch.test.ts @@ -79,6 +79,19 @@ describe('getGlobalLocalVersionMismatchWarning', () => { expect(result).toContain('@prisma/client@7.3.0') }) + test('warns with the scoped prisma7 package name and prisma7 command guidance', async () => { + const result = await buildWarning({ + identity: 'prisma7', + getInstalledPackageVersion: (packageName) => + Promise.resolve(packageName === '@prisma/prisma7' ? '7.4.0' : GLOBAL_VERSION), + }) + + expect(result).toContain('@prisma/prisma7@7.5.0') + expect(result).toContain('@prisma/prisma7@7.4.0') + expect(result).not.toContain('The globally installed prisma7@7.5.0') + expect(result).toContain('npx prisma7 generate') + }) + test('returns null for an empty global version', async () => { const getInstalledPackageVersion = jest.fn() const result = await buildWarning({ @@ -102,13 +115,15 @@ describe('getInstalledPackageVersionFromNodeModules', () => { await fs.promises.rm(tempDir, { force: true, recursive: true }) }) - test('reads local prisma and @prisma/client versions from an ancestor node_modules directory', async () => { + test('reads local prisma, @prisma/prisma7, and @prisma/client versions from an ancestor node_modules directory', async () => { const schemaRootDir = path.join(tempDir, 'prisma') await fs.promises.mkdir(schemaRootDir) await writePackageVersion('prisma', '7.4.0') + await writePackageVersion('@prisma/prisma7', '7.4.1') await writePackageVersion('@prisma/client', '7.3.0') await expect(getInstalledPackageVersionFromNodeModules('prisma', schemaRootDir)).resolves.toBe('7.4.0') + await expect(getInstalledPackageVersionFromNodeModules('@prisma/prisma7', schemaRootDir)).resolves.toBe('7.4.1') await expect(getInstalledPackageVersionFromNodeModules('@prisma/client', schemaRootDir)).resolves.toBe('7.3.0') }) @@ -116,7 +131,10 @@ describe('getInstalledPackageVersionFromNodeModules', () => { await expect(getInstalledPackageVersionFromNodeModules('prisma', tempDir)).resolves.toBeNull() }) - async function writePackageVersion(packageName: 'prisma' | '@prisma/client', version: string): Promise { + async function writePackageVersion( + packageName: 'prisma' | '@prisma/prisma7' | '@prisma/client', + version: string, + ): Promise { const packageDir = path.join(tempDir, 'node_modules', ...packageName.split('/')) await fs.promises.mkdir(packageDir, { recursive: true }) await fs.promises.writeFile(path.join(packageDir, 'package.json'), JSON.stringify({ version }), 'utf-8') diff --git a/packages/cli/src/bootstrap/Bootstrap.ts b/packages/cli/src/bootstrap/Bootstrap.ts index ce993514f0f5..9f2bd4bb4461 100644 --- a/packages/cli/src/bootstrap/Bootstrap.ts +++ b/packages/cli/src/bootstrap/Bootstrap.ts @@ -17,7 +17,7 @@ import { Init } from '../Init' import { Link, type LinkResult } from '../postgres/link/Link' import { isAlreadyLinked } from '../postgres/link/local-setup' import { LinkApiError, sanitizeErrorMessage } from '../postgres/link/management-api' -import type { CliDistributionIdentity } from '../utils/cli-distribution-identity' +import { type CliDistributionIdentity, getCliDistributionPackageName } from '../utils/cli-distribution-identity' import { type BootstrapStepStatus, formatBootstrapOutput } from './completion-output' import { detectProjectState, getModelNames, getSeedCommand } from './project-state' import { emitFlowCompleted, emitFlowStarted, emitStepCompleted, emitStepFailed, emitStepSkipped } from './telemetry' @@ -128,7 +128,7 @@ export class Bootstrap implements Command { baseDir: string, ): Promise { const flowStart = performance.now() - const cliPackage = this.identity + const cliPackage = getCliDistributionPackageName(this.identity) const stepsCompleted: string[] = [] const steps: BootstrapStepStatus = { init: 'skipped', @@ -186,12 +186,12 @@ export class Bootstrap implements Command { templateScaffolded = steps.template === 'completed' if (!templateScaffolded) { return new HelpError( - `\n${bold(red('!'))} Template download failed and no project exists to fall back to.\n\nInitialize a project first, then re-run ${bold(`${this.identity} bootstrap`)}:\n ${dim('$')} npm init -y ${dim(' (or pnpm init / yarn init / bun init)')}\n ${dim('$')} npx ${this.identity} bootstrap`, + `\n${bold(red('!'))} Template download failed and no project exists to fall back to.\n\nInitialize a project first, then re-run ${bold(`${this.identity} bootstrap`)}:\n ${dim('$')} npm init -y ${dim(' (or pnpm init / yarn init / bun init)')}\n ${dim('$')} npx ${getCliDistributionPackageName(this.identity)}@latest bootstrap`, ) } } else { return new HelpError( - `\n${bold(red('!'))} Cannot proceed without a project.\n\nInitialize a project first, then re-run ${bold(`${this.identity} bootstrap`)}:\n ${dim('$')} npm init -y ${dim(' (or pnpm init / yarn init / bun init)')}\n ${dim('$')} npx ${this.identity} bootstrap`, + `\n${bold(red('!'))} Cannot proceed without a project.\n\nInitialize a project first, then re-run ${bold(`${this.identity} bootstrap`)}:\n ${dim('$')} npm init -y ${dim(' (or pnpm init / yarn init / bun init)')}\n ${dim('$')} npx ${getCliDistributionPackageName(this.identity)}@latest bootstrap`, ) } } else if (templateName) { @@ -321,7 +321,7 @@ export class Bootstrap implements Command { : `${pm} add -D ${missingDevDeps.join(' ')}` console.log(` ${dim('$')} ${installHint}`) } - console.log(` ${dim('$')} npx ${this.identity}@latest bootstrap`) + console.log(` ${dim('$')} npx ${getCliDistributionPackageName(this.identity)}@latest bootstrap`) return formatBootstrapOutput({ databaseId: telemetryCtx.linkResult?.databaseId ?? databaseId ?? 'unknown', diff --git a/packages/cli/src/bootstrap/__tests__/Bootstrap.vitest.ts b/packages/cli/src/bootstrap/__tests__/Bootstrap.vitest.ts index e8d7287aa6a4..9d37777d1ada 100644 --- a/packages/cli/src/bootstrap/__tests__/Bootstrap.vitest.ts +++ b/packages/cli/src/bootstrap/__tests__/Bootstrap.vitest.ts @@ -162,6 +162,29 @@ describe('Bootstrap command — help and validation', () => { }) describe('Bootstrap command — new project flow', () => { + test.each([ + { args: [], templateFailure: false }, + { args: ['--template', 'nextjs'], templateFailure: true }, + ])('uses the scoped package in empty-project prisma7 recovery', async ({ args, templateFailure }) => { + const { confirm } = await import('@inquirer/prompts') + vi.mocked(confirm).mockResolvedValue(false) + + if (templateFailure) { + const { downloadAndExtractTemplate } = await import('../template-scaffold') + vi.mocked(downloadAndExtractTemplate).mockRejectedValueOnce(new Error('Network error')) + } + + const result = await Bootstrap.new('prisma7').parse( + ['--api-key', 'test_key', '--database', 'db_abc123', ...args], + defaultTestConfig(), + tmpDir, + ) + + expect(result).toBeInstanceOf(HelpError) + expect((result as HelpError).message).toContain('npx @prisma/prisma7@latest bootstrap') + expect((result as HelpError).message).not.toContain('npx prisma7 bootstrap') + }) + test('runs init when user declines template, then links', async () => { fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name":"test"}', 'utf-8') fs.mkdirSync(path.join(tmpDir, 'node_modules', 'dotenv'), { recursive: true }) @@ -280,7 +303,7 @@ describe('Bootstrap command — existing project flow', () => { fs.mkdirSync(path.join(tmpDir, 'node_modules', '.bin'), { recursive: true }) fs.writeFileSync(path.join(tmpDir, 'node_modules', '.bin', 'prisma7.cmd'), '', 'utf-8') fs.mkdirSync(path.join(tmpDir, 'node_modules', 'dotenv'), { recursive: true }) - fs.mkdirSync(path.join(tmpDir, 'node_modules', 'prisma7'), { recursive: true }) + fs.mkdirSync(path.join(tmpDir, 'node_modules', '@prisma', 'prisma7'), { recursive: true }) fs.mkdirSync(path.join(tmpDir, 'node_modules', '@prisma', 'client'), { recursive: true }) const { confirm } = await import('@inquirer/prompts') diff --git a/packages/cli/src/bootstrap/completion-output.ts b/packages/cli/src/bootstrap/completion-output.ts index 94e6f06d594d..8aa7b5acecd8 100644 --- a/packages/cli/src/bootstrap/completion-output.ts +++ b/packages/cli/src/bootstrap/completion-output.ts @@ -1,7 +1,7 @@ import { getCommandWithExecutor } from '@prisma/internals' import { bold, dim, green, red } from 'kleur/colors' -import type { CliDistributionIdentity } from '../utils/cli-distribution-identity' +import { type CliDistributionIdentity, getCliDistributionPackageName } from '../utils/cli-distribution-identity' type StepResult = 'completed' | 'skipped' | 'not-applicable' | 'failed' @@ -64,9 +64,13 @@ export function formatBootstrapOutput(opts: { if (opts.pendingDepsInstall) { lines.push(bold('Next steps:')) lines.push( - ` 1. Install ${bold('@prisma/client')}, ${bold('dotenv')}, and ${bold(cliCommand)} with your package manager`, + ` 1. Install ${bold('@prisma/client')}, ${bold('dotenv')}, and ${bold( + getCliDistributionPackageName(cliCommand), + )} with your package manager`, + ) + lines.push( + ` 2. Re-run ${green(`npx ${getCliDistributionPackageName(cliCommand)}@latest bootstrap`)} to finish setup`, ) - lines.push(` 2. Re-run ${green(`npx ${cliCommand}@latest bootstrap`)} to finish setup`) lines.push('') return lines.join('\n') } diff --git a/packages/cli/src/utils/cli-distribution-identity.ts b/packages/cli/src/utils/cli-distribution-identity.ts index 854009c6d368..71275ec1fd09 100644 --- a/packages/cli/src/utils/cli-distribution-identity.ts +++ b/packages/cli/src/utils/cli-distribution-identity.ts @@ -1,6 +1,7 @@ import path from 'node:path' export type CliDistributionIdentity = 'prisma' | 'prisma7' +export type CliDistributionPackageName = 'prisma' | '@prisma/prisma7' /** Returns the CLI distribution selected by the executable that Node invoked. */ export function getCliDistributionIdentity(executedScript = process.argv[1]): CliDistributionIdentity { @@ -9,3 +10,13 @@ export function getCliDistributionIdentity(executedScript = process.argv[1]): Cl return stem === 'prisma7' ? 'prisma7' : 'prisma' } + +export function getCliDistributionPackageName(identity: CliDistributionIdentity): CliDistributionPackageName { + return identity === 'prisma7' ? '@prisma/prisma7' : 'prisma' +} + +export function getCliDistributionConfigPackageName( + identity: CliDistributionIdentity, +): `${CliDistributionPackageName}/config` { + return `${getCliDistributionPackageName(identity)}/config` +} diff --git a/packages/cli/src/utils/global-local-version-mismatch.ts b/packages/cli/src/utils/global-local-version-mismatch.ts index 8a111a6b60b7..58a68f7597d0 100644 --- a/packages/cli/src/utils/global-local-version-mismatch.ts +++ b/packages/cli/src/utils/global-local-version-mismatch.ts @@ -3,9 +3,13 @@ import fs from 'fs' import { bold, yellow } from 'kleur/colors' import path from 'path' -import type { CliDistributionIdentity } from './cli-distribution-identity' +import { + type CliDistributionIdentity, + type CliDistributionPackageName, + getCliDistributionPackageName, +} from './cli-distribution-identity' -type LocalPackageName = CliDistributionIdentity | '@prisma/client' +type LocalPackageName = CliDistributionPackageName | '@prisma/client' export type GlobalLocalVersionMismatchWarningOptions = { cwd?: string @@ -22,7 +26,7 @@ type LocalPackageVersionMismatch = { } function getLocalPackageNames(identity: CliDistributionIdentity): LocalPackageName[] { - return [identity, '@prisma/client'] + return [getCliDistributionPackageName(identity), '@prisma/client'] } export async function getGlobalLocalVersionMismatchWarning( @@ -109,7 +113,7 @@ function formatGlobalLocalVersionMismatchWarning( const packageLabel = mismatches.length === 1 ? 'package' : 'packages' return `${yellow(bold('warn'))} The globally installed ${bold( - `${identity}@${globalVersion}`, + `${getCliDistributionPackageName(identity)}@${globalVersion}`, )} does not match the local ${packageLabel} ${localVersions} installed in this project. This may generate Prisma Client artifacts that are incompatible with the local runtime. Run ${bold(`npx ${identity} generate`)} to use the local Prisma CLI, or align your global and local Prisma versions.` diff --git a/packages/client/tests/e2e/_utils/run.ts b/packages/client/tests/e2e/_utils/run.ts index e7775d2da31a..d3087042ffbe 100644 --- a/packages/client/tests/e2e/_utils/run.ts +++ b/packages/client/tests/e2e/_utils/run.ts @@ -60,8 +60,20 @@ async function main() { console.log('🎠 Preparing e2e tests') - let allPackageFolderNames = await fs.readdir(path.join(monorepoRoot, 'packages')) - allPackageFolderNames = allPackageFolderNames.filter((p) => !p.includes('DS_Store')) + const packagesDir = path.join(monorepoRoot, 'packages') + const allPackageFolderNames = (await fs.readdir(packagesDir)).filter((folderName) => + existsSync(path.join(packagesDir, folderName, 'package.json')), + ) + const allPackageFolders = allPackageFolderNames.map((folderName) => path.join(packagesDir, folderName)) + const allPkgJsonPaths = allPackageFolders.map((packageFolder) => path.join(packageFolder, 'package.json')) + const allPkgJson = allPkgJsonPaths.map( + (packageJsonPath) => + require(packageJsonPath) as { + name: string + dependencies?: Record + }, + ) + const packedPackageFilename = (packageName: string) => `${packageName.replace(/^@/, '').replace('/', '-')}-0.0.0.tgz` const prismaTmpDir = path.join(os.homedir(), '.local', 'share', 'prisma-tmp') @@ -70,16 +82,13 @@ async function main() { await $`pnpm -r exec cp package.json package.copy.json` // we prepare to replace references to local packages with their tarballs names - const localPackageNames = [...allPackageFolderNames.map((p) => `@prisma/${p}`), 'prisma', 'prisma7'] - const allPackageFolders = allPackageFolderNames.map((p) => path.join(monorepoRoot, 'packages', p)) - const allPkgJsonPaths = allPackageFolders.map((p) => path.join(p, 'package.json')) - const allPkgJson = allPkgJsonPaths.map((p) => require(p)) + const localPackageNames = allPkgJson.map((packageJson) => packageJson.name) // replace references to unbundled local packages with built and packaged tarballs for (let i = 0; i < allPkgJson.length; i++) { for (const key of Object.keys(allPkgJson[i].dependencies ?? {})) { if (localPackageNames.includes(key)) { - allPkgJson[i].dependencies[key] = `/tmp/${key.replace('@prisma/', 'prisma-')}-0.0.0.tgz` + allPkgJson[i].dependencies[key] = `/tmp/${packedPackageFilename(key)}` } } @@ -121,11 +130,10 @@ async function main() { const dockerVolumeOptions = process.platform === 'linux' ? ':z' : '' const dockerVolume = (source: string, target: string) => `${source}:${target}${dockerVolumeOptions}` const dockerVolumes = [ - dockerVolume(`${prismaTmpDir}/prisma-0.0.0.tgz`, '/tmp/prisma-0.0.0.tgz'), // hardcoded because folder doesn't match name - dockerVolume(`${prismaTmpDir}/prisma7-0.0.0.tgz`, '/tmp/prisma7-0.0.0.tgz'), - ...allPackageFolderNames - .filter((p) => p !== 'prisma7') - .map((p) => dockerVolume(`${prismaTmpDir}/prisma-${p}-0.0.0.tgz`, `/tmp/prisma-${p}-0.0.0.tgz`)), + ...allPkgJson.map(({ name }) => { + const filename = packedPackageFilename(name) + return dockerVolume(`${prismaTmpDir}/${filename}`, `/tmp/${filename}`) + }), dockerVolume(path.join(monorepoRoot, 'packages', 'engines'), '/engines'), dockerVolume(path.join(monorepoRoot, 'packages', 'client'), '/client'), dockerVolume(e2eRoot, '/e2e'), diff --git a/packages/client/tests/e2e/prisma7-compatibility/config-consumer.ts b/packages/client/tests/e2e/prisma7-compatibility/config-consumer.ts index ad73f22bc7fd..30325ea118af 100644 --- a/packages/client/tests/e2e/prisma7-compatibility/config-consumer.ts +++ b/packages/client/tests/e2e/prisma7-compatibility/config-consumer.ts @@ -1,4 +1,4 @@ -import { defineConfig, type PrismaConfig } from 'prisma7/config' +import { defineConfig, type PrismaConfig } from '@prisma/prisma7/config' import config from './prisma.config' diff --git a/packages/client/tests/e2e/prisma7-compatibility/package.json b/packages/client/tests/e2e/prisma7-compatibility/package.json index 4f841d72eaef..78d9edc74437 100644 --- a/packages/client/tests/e2e/prisma7-compatibility/package.json +++ b/packages/client/tests/e2e/prisma7-compatibility/package.json @@ -7,7 +7,7 @@ "@prisma/adapter-better-sqlite3": "/tmp/prisma-adapter-better-sqlite3-0.0.0.tgz", "@prisma/client": "/tmp/prisma-client-0.0.0.tgz", "@prisma/client-runtime-utils": "/tmp/prisma-client-runtime-utils-0.0.0.tgz", - "prisma7": "/tmp/prisma7-0.0.0.tgz" + "@prisma/prisma7": "/tmp/prisma-prisma7-0.0.0.tgz" }, "devDependencies": { "@types/better-sqlite3": "^7.6.13", diff --git a/packages/client/tests/e2e/prisma7-compatibility/pnpm-lock.yaml b/packages/client/tests/e2e/prisma7-compatibility/pnpm-lock.yaml index ded032bdad42..1809bb2d7d4d 100644 --- a/packages/client/tests/e2e/prisma7-compatibility/pnpm-lock.yaml +++ b/packages/client/tests/e2e/prisma7-compatibility/pnpm-lock.yaml @@ -17,9 +17,9 @@ importers: '@prisma/client-runtime-utils': specifier: /tmp/prisma-client-runtime-utils-0.0.0.tgz version: file:../../tmp/prisma-client-runtime-utils-0.0.0.tgz - prisma7: - specifier: /tmp/prisma7-0.0.0.tgz - version: file:../../tmp/prisma7-0.0.0.tgz(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.7.3) + '@prisma/prisma7': + specifier: /tmp/prisma-prisma7-0.0.0.tgz + version: file:../../tmp/prisma-prisma7-0.0.0.tgz(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.7.3) devDependencies: '@types/better-sqlite3': specifier: ^7.6.13 @@ -224,7 +224,7 @@ packages: version: 0.0.0 '@prisma/client@file:../../tmp/prisma-client-0.0.0.tgz': - resolution: {integrity: sha512-VbT8sKUi3MJAwE5lSQ3zCZjlOjGexCNrkOLfg5vXUnDbPWBBjXV/kqQFr4FOCN2ZI0zzKRgOL00ljyrUJ8DDDg==, tarball: file:../../tmp/prisma-client-0.0.0.tgz} + resolution: {integrity: sha512-7w0D4yqPSQTjDUH+JQEbKRQhW4AUiFMlU9zeyXazg25spyp/AVMnP8qFLKVl/VBMMps3JeF/V2+yLWFbfODkLg==, tarball: file:../../tmp/prisma-client-0.0.0.tgz} version: 0.0.0 engines: {node: ^20.19 || ^22.12 || >=24.0} peerDependencies: @@ -237,7 +237,7 @@ packages: optional: true '@prisma/config@file:../../tmp/prisma-config-0.0.0.tgz': - resolution: {integrity: sha512-OhJrxnCO5BlGkBzH6/eOkBQlZeDZ2U1D8jlpiHgP06yYUpiu7W7sK37fHkm2OxITlkHFnXJALDscPWiIvXq54Q==, tarball: file:../../tmp/prisma-config-0.0.0.tgz} + resolution: {integrity: sha512-caKMWXW0EP/WRUw7w6BANiM9fmS4WcM5kfljGoiUaTMPyCSGIjgRY/ZnKXwietT1h5kBuLvDh5nzjldC4hPiKA==, tarball: file:../../tmp/prisma-config-0.0.0.tgz} version: 0.0.0 '@prisma/debug@7.2.0': @@ -258,7 +258,7 @@ packages: resolution: {integrity: sha512-8OJ6RuZTZ06eFUOtBwxVmv8XMmOW6HWN5F+uxUbZkGxR0Bfab1dfAdXaHPmR5mb59E+fmUo8IOzXlbLY1SClbw==} '@prisma/engines@file:../../tmp/prisma-engines-0.0.0.tgz': - resolution: {integrity: sha512-nb2E3UEjXR0hR+Jxo5uPYvQqRFLNSnGlB0muzpDsNWdpe23sLhAu3QwwkNZwWcDX92t4srtaiMQDavg5kzl9Sw==, tarball: file:../../tmp/prisma-engines-0.0.0.tgz} + resolution: {integrity: sha512-eaIUpBNLPIruofksXs+25i17JDNBU0RQAi88dqurlF7ObOHgeq5p3pCTz2XqqWRfIKQWalfBVZPxscfWR1FfHA==, tarball: file:../../tmp/prisma-engines-0.0.0.tgz} version: 0.0.0 '@prisma/fetch-engine@file:../../tmp/prisma-fetch-engine-0.0.0.tgz': @@ -272,6 +272,12 @@ packages: resolution: {integrity: sha512-0GQnyJw0dEurECARYcJwaSHvbNAcuKgEj6FVQS0+9ZmgwLL8caFGxt62xSDou4QNo8H070ikKU7W3V3iC5OSPQ==, tarball: file:../../tmp/prisma-get-platform-0.0.0.tgz} version: 0.0.0 + '@prisma/prisma7@file:../../tmp/prisma-prisma7-0.0.0.tgz': + resolution: {integrity: sha512-702+WDh5L2d9qGSz+kxSJkR4rAw1uPLHvdxrLJzNt9JuLzsaZivKqFQN3ieGt8OOU8EIbINav/aQCxGRa8KcWQ==, tarball: file:../../tmp/prisma-prisma7-0.0.0.tgz} + version: 0.0.0 + engines: {node: ^20.19 || ^22.12 || >=24.0} + hasBin: true + '@prisma/query-plan-executor@7.2.0': resolution: {integrity: sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==} @@ -975,14 +981,8 @@ packages: deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. hasBin: true - prisma7@file:../../tmp/prisma7-0.0.0.tgz: - resolution: {integrity: sha512-T6GftfFpinrEIyUpZgexG1JmhLsNId00ULzesbda+v2Fc52uotaLphPcznG2YJBQQrHXttQWqOLiPwp/W8lLqA==, tarball: file:../../tmp/prisma7-0.0.0.tgz} - version: 0.0.0 - engines: {node: ^20.19 || ^22.12 || >=24.0} - hasBin: true - prisma@file:../../tmp/prisma-0.0.0.tgz: - resolution: {integrity: sha512-rLJnqR+odkYbA/2TFUGVuscCN51thVBm/0Ppmtjv5Jh9cQ9rHWfcL0wQorKP22NhLNfBNAy+PEXNcoxgaM+TBQ==, tarball: file:../../tmp/prisma-0.0.0.tgz} + resolution: {integrity: sha512-X0HcqFt4WE3SrZSMTCdoxh3Vy364ZCKVOe9ThHEs9PSaYbCyjntpQUyvaXEsDnmVRNQZaByY6eZWn5COfCB78Q==, tarball: file:../../tmp/prisma-0.0.0.tgz} version: 0.0.0 engines: {node: ^20.19 || ^22.12 || >=24.0} hasBin: true @@ -1419,6 +1419,18 @@ snapshots: dependencies: '@prisma/debug': file:../../tmp/prisma-debug-0.0.0.tgz + '@prisma/prisma7@file:../../tmp/prisma-prisma7-0.0.0.tgz(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.7.3)': + dependencies: + prisma: file:../../tmp/prisma-0.0.0.tgz(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.7.3) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - better-sqlite3 + - magicast + - react + - react-dom + - typescript + '@prisma/query-plan-executor@7.2.0': {} '@prisma/streams-local@0.1.11': @@ -2102,18 +2114,6 @@ snapshots: tar-fs: 2.1.5 tunnel-agent: 0.6.0 - prisma7@file:../../tmp/prisma7-0.0.0.tgz(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.7.3): - dependencies: - prisma: file:../../tmp/prisma-0.0.0.tgz(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.7.3) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - better-sqlite3 - - magicast - - react - - react-dom - - typescript - prisma@file:../../tmp/prisma-0.0.0.tgz(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.7.3): dependencies: '@prisma/config': file:../../tmp/prisma-config-0.0.0.tgz diff --git a/packages/client/tests/e2e/prisma7-compatibility/prisma.config.ts b/packages/client/tests/e2e/prisma7-compatibility/prisma.config.ts index ecd9d74f1b65..faf17b2c18aa 100644 --- a/packages/client/tests/e2e/prisma7-compatibility/prisma.config.ts +++ b/packages/client/tests/e2e/prisma7-compatibility/prisma.config.ts @@ -1,4 +1,4 @@ -import { defineConfig, type PrismaConfig } from 'prisma7/config' +import { defineConfig, type PrismaConfig } from '@prisma/prisma7/config' const config: PrismaConfig = { schema: 'project-models/non-default.prisma', diff --git a/packages/client/tests/e2e/prisma7-compatibility/tests/main.test.ts b/packages/client/tests/e2e/prisma7-compatibility/tests/main.test.ts index e8965a193e19..483321340aae 100644 --- a/packages/client/tests/e2e/prisma7-compatibility/tests/main.test.ts +++ b/packages/client/tests/e2e/prisma7-compatibility/tests/main.test.ts @@ -188,7 +188,7 @@ test('prisma7 snapshots real CLI-owned identity surfaces and keeps the packed sm await writeFile(path.join(initProjectDir, 'package.json'), '{"private":true}\n') await writeProject(migrateProjectDir, { - prismaConfig: `import { defineConfig } from 'prisma7/config' + prismaConfig: `import { defineConfig } from '@prisma/prisma7/config' export default defineConfig({ schema: 'prisma/schema.prisma', @@ -206,7 +206,7 @@ model User { }) await writeProject(dbPushProjectDir, { - prismaConfig: `import { defineConfig } from 'prisma7/config' + prismaConfig: `import { defineConfig } from '@prisma/prisma7/config' export default defineConfig({ schema: 'prisma/schema.prisma', @@ -228,7 +228,7 @@ model User { }) await writeProject(noGeneratorProjectDir, { - prismaConfig: `import { defineConfig } from 'prisma7/config' + prismaConfig: `import { defineConfig } from '@prisma/prisma7/config' export default defineConfig({ schema: 'prisma/schema.prisma', @@ -245,7 +245,7 @@ model User { }) await writeProject(noModelsProjectDir, { - prismaConfig: `import { defineConfig } from 'prisma7/config' + prismaConfig: `import { defineConfig } from '@prisma/prisma7/config' export default defineConfig({ schema: 'prisma/schema.prisma', @@ -263,7 +263,7 @@ datasource db { }) await writeProject(missingClientProjectDir, { - prismaConfig: `import { defineConfig } from 'prisma7/config' + prismaConfig: `import { defineConfig } from '@prisma/prisma7/config' export default defineConfig({ schema: 'prisma/schema.prisma', @@ -493,9 +493,9 @@ model User { `) expect(normalizeText(prismaConfig, replacements)).toMatchInlineSnapshot(` "// This file was generated by Prisma, and assumes you have installed the following: - // npm install --save-dev prisma7 dotenv + // npm install --save-dev @prisma/prisma7 dotenv import \"dotenv/config\"; - import { defineConfig } from \"prisma7/config\"; + import { defineConfig } from \"@prisma/prisma7/config\"; export default defineConfig({ schema: \"prisma/schema.prisma\", diff --git a/packages/prisma7/package.json b/packages/prisma7/package.json index 27e22539196f..a98743a6e8a8 100644 --- a/packages/prisma7/package.json +++ b/packages/prisma7/package.json @@ -1,5 +1,5 @@ { - "name": "prisma7", + "name": "@prisma/prisma7", "version": "0.0.0", "private": false, "description": "Compatibility wrapper for running the Prisma 7 CLI", diff --git a/packages/prisma7/tsconfig.build.json b/packages/prisma7/tsconfig.build.json index a5c05a4805bb..61fa69100ec8 100644 --- a/packages/prisma7/tsconfig.build.json +++ b/packages/prisma7/tsconfig.build.json @@ -2,6 +2,7 @@ "extends": "../../tsconfig.build.bundle.json", "compilerOptions": { "outDir": "dist", + "paths": {}, "rootDir": "src" }, "include": ["src"] diff --git a/scripts/ci/publish.ts b/scripts/ci/publish.ts index 678e62203b2b..0207d94ebe35 100644 --- a/scripts/ci/publish.ts +++ b/scripts/ci/publish.ts @@ -160,9 +160,7 @@ function getPrismaDependencies(dependencies?: { [name: string]: string }): strin } return Object.keys(dependencies).filter( (dependency) => - (dependency.startsWith('@prisma') && !dependency.startsWith('@prisma/studio')) || - dependency === 'prisma' || - dependency === 'prisma7', + (dependency.startsWith('@prisma') && !dependency.startsWith('@prisma/studio')) || dependency === 'prisma', ) } diff --git a/tsconfig.build.bundle.json b/tsconfig.build.bundle.json index cb90970bdfa9..b60ebd3cc43d 100644 --- a/tsconfig.build.bundle.json +++ b/tsconfig.build.bundle.json @@ -22,8 +22,8 @@ "@prisma/debug": ["./packages/debug/src"], "prisma": ["./packages/cli/src/types.ts"], "prisma/*": ["./packages/cli/src/*"], - "prisma7": ["./packages/prisma7/src"], - "prisma7/*": ["./packages/prisma7/src/*"], + "@prisma/prisma7": ["./packages/prisma7/src/index.ts"], + "@prisma/prisma7/*": ["./packages/prisma7/src/*"], "@prisma/get-platform": ["./packages/get-platform/src"], "@prisma/fetch-engine": ["./packages/fetch-engine/src"], "@prisma/engines": ["./packages/engines/src"],