Comprehensive internal utility library for Prisma's CLI operations, schema management, generator handling, and engine interactions
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
The engine commands domain provides comprehensive schema processing capabilities using WASM-based engines for formatting, validation, DMMF generation, and configuration extraction.
formatSchema(options, formattingOptions?)Formats Prisma schema files using the WASM formatter with customizable formatting options.
function formatSchema(
options: { schemas: MultipleSchemas },
formattingOptions?: Partial<DocumentFormattingParams['options']>
): Promise<MultipleSchemas>Parameters:
options: { schemas: MultipleSchemas } - Schemas to formatformattingOptions?: Partial<DocumentFormattingParams['options']> - Formatting configurationDocumentFormattingParams Options:
interface DocumentFormattingParams {
options?: {
tabSize?: number // Tab size (default: 2)
insertSpaces?: boolean // Use spaces instead of tabs (default: true)
}
}Returns: Promise<MultipleSchemas> - Formatted schemas
Example:
const formatted = await formatSchema(
{ schemas: loadedSchemas },
{ tabSize: 4, insertSpaces: true }
)getConfig(options)Extracts and parses configuration from Prisma schema using the WASM engine.
function getConfig(options: GetConfigOptions): Promise<ConfigMetaFormat>GetConfigOptions:
interface GetConfigOptions {
schemas: SchemaFileInput // Schema input
cwd?: string // Current working directory
ignoreEnvVarErrors?: boolean // Ignore environment variable errors
}Returns: Promise<ConfigMetaFormat> - Parsed configuration with datasources, generators, and warnings
Example:
const config = await getConfig({
schemas: schemaResult.schemas,
cwd: process.cwd(),
ignoreEnvVarErrors: false
})
console.log(`Found ${config.datasources.length} datasources`)
console.log(`Found ${config.generators.length} generators`)
if (config.warnings.length > 0) {
console.warn('Configuration warnings:', config.warnings)
}getDirectUrl(ds)Extracts the direct URL from a datasource configuration.
function getDirectUrl(ds: DataSource): EnvValue | undefinedParameters:
ds: DataSource - Datasource objectReturns: EnvValue | undefined - Direct URL environment value if defined
getEffectiveUrl(ds)Gets the effective URL from a datasource (direct URL takes precedence over regular URL).
function getEffectiveUrl(ds: DataSource): EnvValueParameters:
ds: DataSource - Datasource objectReturns: EnvValue - Effective URL environment value
resolveUrl(envValue?)Resolves URL string from environment value configuration.
function resolveUrl(envValue?: EnvValue): string | undefinedParameters:
envValue?: EnvValue - Environment value configurationReturns: string | undefined - Resolved URL string
Example:
const config = await getConfig({ schemas })
for (const datasource of config.datasources) {
const directUrl = getDirectUrl(datasource)
const effectiveUrl = getEffectiveUrl(datasource)
const resolvedUrl = resolveUrl(effectiveUrl)
console.log(`Datasource: ${datasource.name}`)
console.log(`Direct URL: ${directUrl ? 'defined' : 'not defined'}`)
console.log(`Resolved URL: ${resolvedUrl}`)
}getDMMF(options)Generates Data Model Meta Format (DMMF) from Prisma schema using the WASM engine.
function getDMMF(options: GetDMMFOptions): Promise<DMMF.Document>GetDMMFOptions:
interface GetDMMFOptions {
datamodel: SchemaFileInput // Schema input
previewFeatures?: string[] // Preview features to enable
}Returns: Promise<DMMF.Document> - Generated DMMF document containing models, enums, types, and mappings
Example:
const dmmf = await getDMMF({
datamodel: schemaResult.schemas,
previewFeatures: ['typedSql', 'views']
})
console.log(`Models: ${dmmf.datamodel.models.length}`)
console.log(`Enums: ${dmmf.datamodel.enums.length}`)
console.log(`Types: ${dmmf.datamodel.types.length}`)
// Access model information
for (const model of dmmf.datamodel.models) {
console.log(`Model ${model.name}: ${model.fields.length} fields`)
}validate(options)Validates Prisma schema without generating DMMF, throwing error if validation fails.
function validate(options: ValidateOptions): voidValidateOptions:
interface ValidateOptions {
schemas: SchemaFileInput // Schema input to validate
cwd?: string // Current working directory
}Throws: Error if validation fails
Example:
try {
validate({
schemas: schemaResult.schemas,
cwd: process.cwd()
})
console.log('Schema validation passed')
} catch (error) {
console.error('Schema validation failed:', error.message)
}lintSchema(options)Lints Prisma schema and returns array of diagnostics (warnings and errors).
function lintSchema(options: { schemas: MultipleSchemas }): LintDiagnostic[]Parameters:
options: { schemas: MultipleSchemas } - Schemas to lintReturns: LintDiagnostic[] - Array of lint diagnostics
getLintWarningsAsText(lintDiagnostics)Converts lint diagnostics to formatted text warnings for display.
function getLintWarningsAsText(lintDiagnostics: LintDiagnostic[]): stringParameters:
lintDiagnostics: LintDiagnostic[] - Lint diagnostics to formatReturns: string - Formatted warning text
handleLintPanic<T>(tryCb)Handles panics during schema linting operations by converting them to RustPanic errors.
function handleLintPanic<T>(tryCb: () => T): TParameters:
tryCb: () => T - Callback function that might panicReturns: T - Result or throws RustPanic
Example:
const diagnostics = lintSchema({ schemas: loadedSchemas })
const warnings = diagnostics.filter(d => d.is_warning)
const errors = diagnostics.filter(d => !d.is_warning)
if (warnings.length > 0) {
console.warn('Lint warnings:')
console.warn(getLintWarningsAsText(warnings))
}
if (errors.length > 0) {
console.error('Lint errors:')
console.error(getLintWarningsAsText(errors))
}mergeSchemas(options)Merges multiple schema files into a single schema string.
function mergeSchemas(options: MergeSchemasOptions): stringMergeSchemasOptions:
interface MergeSchemasOptions {
schemas: MultipleSchemas // Multiple schema files to merge
}Returns: string - Merged schema string
Example:
const mergedSchema = mergeSchemas({
schemas: {
'schema.prisma': schemaContent1,
'models.prisma': schemaContent2,
'enums.prisma': schemaContent3
}
})
console.log('Merged schema length:', mergedSchema.length)getEnginesInfo(enginesInfo)Gets formatted engine information and collects any errors encountered.
function getEnginesInfo(enginesInfo: BinaryInfoMatrix): readonly [string, Error[]]Parameters:
enginesInfo: BinaryInfoMatrix - Engine information matrixReturns: readonly [string, Error[]] - Tuple of version message and array of errors
resolveEngine(binaryName)Resolves engine path and version information for a specific binary type.
function resolveEngine(binaryName: BinaryType): Promise<EngineInfo>Parameters:
binaryName: BinaryType - Type of binary to resolveReturns: Promise<EngineInfo> - Engine information including path and version
getEngineVersion(enginePath?, binaryName?)Gets version information from an engine binary.
function getEngineVersion(
enginePath?: string,
binaryName?: BinaryType
): Promise<string>Parameters:
enginePath?: string - Optional engine pathbinaryName?: BinaryType - Binary typeReturns: Promise<string> - Engine version string
Example:
// Get query engine information
const queryEngineInfo = await resolveEngine(BinaryType.QueryEngine)
if (queryEngineInfo.path._tag === 'Right') {
console.log('Query engine path:', queryEngineInfo.path.right)
}
if (queryEngineInfo.version._tag === 'Right') {
console.log('Query engine version:', queryEngineInfo.version.right)
}
// Get version directly
const version = await getEngineVersion()
console.log('Engine version:', version)wasmWebAssembly integration namespace providing access to Prisma Schema WASM modules and Schema Engine WASM functionality.
namespace wasm {
// WASM modules
const prismaSchemaWasm: typeof import('@prisma/prisma-schema-wasm')
type SchemaEngineWasm = import('@prisma/schema-engine-wasm').SchemaEngine
// Version information
const prismaSchemaWasmVersion: string // e.g. "4.3.0-18.a39215673171b87177b86233206a5d65f2558857"
const schemaEngineWasmVersion: string // e.g. "4.3.0-18.a39215673171b87177b86233206a5d65f2558857"
}wasm.prismaSchemaWasmDirect export of the Prisma Schema WASM module for schema processing operations.
const prismaSchemaWasm: typeof import('@prisma/prisma-schema-wasm')Usage:
import { wasm } from '@prisma/internals'
// Use the Prisma Schema WASM module directly
const result = wasm.prismaSchemaWasm.format(schemaContent, formatOptions)wasm.SchemaEngineWasmType export for the WASM-based schema engine.
type SchemaEngineWasm = import('@prisma/schema-engine-wasm').SchemaEnginewasm.prismaSchemaWasmVersionVersion string for the Prisma Schema WASM package dependency.
const prismaSchemaWasmVersion: stringwasm.schemaEngineWasmVersionVersion string for the Schema Engine WASM package dependency.
const schemaEngineWasmVersion: stringExample:
import { wasm } from '@prisma/internals'
console.log('WASM Versions:')
console.log(`Prisma Schema WASM: ${wasm.prismaSchemaWasmVersion}`)
console.log(`Schema Engine WASM: ${wasm.schemaEngineWasmVersion}`)wasmSchemaEngineLoaderSingleton loader for WASM-based schema engine instances with efficient caching and WebAssembly integration.
const wasmSchemaEngineLoader: {
loadSchemaEngine(
input: ConstructorOptions,
debug: (arg: string) => void,
adapter: ErrorCapturingSqlDriverAdapterFactory
): Promise<SchemaEngineInstance>
}wasmSchemaEngineLoader.loadSchemaEngine(input, debug, adapter)Loads and initializes a WASM schema engine instance with caching for efficiency.
function loadSchemaEngine(
input: ConstructorOptions,
debug: (arg: string) => void,
adapter: ErrorCapturingSqlDriverAdapterFactory
): Promise<SchemaEngineInstance>Parameters:
input: ConstructorOptions - Schema engine constructor optionsdebug: (arg: string) => void - Debug logging functionadapter: ErrorCapturingSqlDriverAdapterFactory - SQL driver adapter factoryReturns: Promise<SchemaEngineInstance> - Initialized schema engine instance
Caching Behavior:
Example:
import { wasmSchemaEngineLoader } from '@prisma/internals'
async function initializeSchemaEngine() {
const debugLogger = (message: string) => {
console.log(`[Schema Engine Debug]: ${message}`)
}
const constructorOptions = {
// Schema engine configuration options
datamodel: schemaContent,
logQueries: true,
logLevel: 'info'
}
const sqlAdapter = createSqlDriverAdapterFactory()
try {
const schemaEngine = await wasmSchemaEngineLoader.loadSchemaEngine(
constructorOptions,
debugLogger,
sqlAdapter
)
console.log('WASM Schema Engine loaded successfully')
return schemaEngine
} catch (error) {
console.error('Failed to load WASM Schema Engine:', error.message)
throw error
}
}
// Multiple calls will reuse the same WASM instance internally
const engine1 = await wasmSchemaEngineLoader.loadSchemaEngine(opts1, debug, adapter)
const engine2 = await wasmSchemaEngineLoader.loadSchemaEngine(opts2, debug, adapter)
// Both use the same underlying WASM module instanceInternal Architecture:
// Simplified internal structure
const wasmSchemaEngineLoader = {
async loadSchemaEngine(input, debug, adapter) {
// Singleton pattern - create WASM instance only once
if (loadedWasmInstance === undefined) {
const wasmModule = await getSchemaEngineWasModule() // Load .wasm file
const runtime = await import('@prisma/schema-engine-wasm/schema_engine_bg')
// WebAssembly instantiation with wasm-bindgen integration
const instance = new WebAssembly.Instance(wasmModule, {
'./schema_engine_bg.js': runtime
})
runtime.__wbg_set_wasm(instance.exports)
const wbindgen_start = instance.exports.__wbindgen_start as () => void
wbindgen_start()
loadedWasmInstance = runtime.SchemaEngine
}
return await loadedWasmInstance.new(input, debug, adapter)
}
}relativizePathInPSLError(message)Converts absolute paths in PSL (Prisma Schema Language) error messages to relative paths for better readability.
function relativizePathInPSLError(message: string): stringParameters:
message: string - Error message containing absolute pathsReturns: string - Error message with relativized paths
ConfigMetaFormatComplete configuration extracted from Prisma schema.
interface ConfigMetaFormat {
datasources: DataSource[] // Parsed datasources
generators: GeneratorConfig[] // Parsed generators
warnings: string[] // Configuration warnings
}GetDMMFOptionsOptions for DMMF generation.
interface GetDMMFOptions {
datamodel: SchemaFileInput // Schema input
previewFeatures?: string[] // Preview features to enable
}EngineInfoInformation about an engine binary including path and version.
interface EngineInfo {
fromEnvVar: O.Option<string> // Environment variable name if resolved from env
path: E.Either<Error, string> // Engine path or error
version: E.Either<Error, string> // Engine version or error
}BinaryMatrix<T>Type matrix for different binary types.
type BinaryMatrix<T> = {
'query-engine': T
'schema-engine': T
}BinaryInfoMatrixEngine information for each binary type.
type BinaryInfoMatrix = BinaryMatrix<EngineInfo>LintDiagnosticUnion type representing lint warnings or errors.
type LintDiagnostic = LintWarning | LintErrorLintWarningLint warning diagnostic information.
interface LintWarning {
is_warning: true // Indicates this is a warning
start: number // Start position in schema
end: number // End position in schema
text: string // Warning message text
}LintErrorLint error diagnostic information.
interface LintError {
is_warning: false // Indicates this is an error
start: number // Start position in schema
end: number // End position in schema
text: string // Error message text
}SchemaFileInputInput type for schema content that can be a string or MultipleSchemas.
type SchemaFileInput = string | MultipleSchemasMultipleSchemasObject representing multiple schema files with their content.
type MultipleSchemas = {
[filename: string]: string // Filename to content mapping
}import {
getConfig,
validate,
formatSchema,
getDMMF,
lintSchema,
getLintWarningsAsText
} from '@prisma/internals'
async function processSchema(schemas: MultipleSchemas) {
// 1. Validate schema
try {
validate({ schemas, cwd: process.cwd() })
console.log('✓ Schema validation passed')
} catch (error) {
console.error('✗ Schema validation failed:', error.message)
return
}
// 2. Lint schema
const diagnostics = lintSchema({ schemas })
if (diagnostics.length > 0) {
const warnings = getLintWarningsAsText(diagnostics)
console.warn('Lint diagnostics:\n', warnings)
}
// 3. Format schema
const formatted = await formatSchema(
{ schemas },
{ tabSize: 2, insertSpaces: true }
)
console.log('✓ Schema formatted')
// 4. Extract configuration
const config = await getConfig({
schemas: formatted,
cwd: process.cwd()
})
console.log(`✓ Found ${config.datasources.length} datasources, ${config.generators.length} generators`)
// 5. Generate DMMF
const dmmf = await getDMMF({
datamodel: formatted,
previewFeatures: ['typedSql']
})
console.log(`✓ Generated DMMF with ${dmmf.datamodel.models.length} models`)
return {
formatted,
config,
dmmf,
diagnostics
}
}import {
resolveEngine,
getEngineVersion,
getEnginesInfo,
BinaryType
} from '@prisma/internals'
async function checkEngineVersions() {
const engines = ['query-engine', 'schema-engine'] as const
const engineInfo: any = {}
for (const engineType of engines) {
try {
const info = await resolveEngine(BinaryType[engineType])
engineInfo[engineType] = info
console.log(`${engineType}:`)
if (info.path._tag === 'Right') {
console.log(` Path: ${info.path.right}`)
}
if (info.version._tag === 'Right') {
console.log(` Version: ${info.version.right}`)
}
if (info.fromEnvVar._tag === 'Some') {
console.log(` From env var: ${info.fromEnvVar.value}`)
}
} catch (error) {
console.error(`Failed to resolve ${engineType}:`, error.message)
}
}
// Get formatted summary
const [summary, errors] = getEnginesInfo(engineInfo)
console.log('\nEngine Summary:')
console.log(summary)
if (errors.length > 0) {
console.error('Errors:', errors.map(e => e.message))
}
}import {
getConfig,
getDirectUrl,
getEffectiveUrl,
resolveUrl
} from '@prisma/internals'
async function analyzeDatasourceUrls(schemas: MultipleSchemas) {
const config = await getConfig({ schemas })
for (const datasource of config.datasources) {
console.log(`\nDatasource: ${datasource.name}`)
console.log(`Provider: ${datasource.provider}`)
// Check for direct URL
const directUrl = getDirectUrl(datasource)
if (directUrl) {
console.log('Direct URL configured: Yes')
const resolvedDirectUrl = resolveUrl(directUrl)
if (resolvedDirectUrl) {
console.log(`Direct URL: ${resolvedDirectUrl}`)
}
} else {
console.log('Direct URL configured: No')
}
// Get effective URL (direct takes precedence)
const effectiveUrl = getEffectiveUrl(datasource)
const resolvedUrl = resolveUrl(effectiveUrl)
if (resolvedUrl) {
console.log(`Effective URL: ${resolvedUrl}`)
}
}
}Install with Tessl CLI
npx tessl i tessl/npm-prisma--internals