Home / File/ migrator.ts — drizzle-orm Source File

migrator.ts — drizzle-orm Source File

Architecture documentation for migrator.ts, a typescript file in the drizzle-orm codebase. 3 imports, 0 dependents.

File typescript DrizzleORM SQLDialects 3 imports 3 functions

Entity Profile

Dependency Diagram

graph LR
  7d4ff80f_0ea3_5189_875c_e681d73995cd["migrator.ts"]
  83aa60fb_f2bc_7cbb_05d6_48650cc6facf["driver.ts"]
  7d4ff80f_0ea3_5189_875c_e681d73995cd --> 83aa60fb_f2bc_7cbb_05d6_48650cc6facf
  d4d235b8_5320_ab49_32b1_655b9b8a9a32["react"]
  7d4ff80f_0ea3_5189_875c_e681d73995cd --> d4d235b8_5320_ab49_32b1_655b9b8a9a32
  e5e6906d_5758_78e9_01f9_fe38ab11030b["migrator.ts"]
  7d4ff80f_0ea3_5189_875c_e681d73995cd --> e5e6906d_5758_78e9_01f9_fe38ab11030b
  style 7d4ff80f_0ea3_5189_875c_e681d73995cd fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import { useEffect, useReducer } from 'react';
import type { MigrationMeta } from '~/migrator.ts';
import type { OPSQLiteDatabase } from './driver.ts';

interface MigrationConfig {
	journal: {
		entries: { idx: number; when: number; tag: string; breakpoints: boolean }[];
	};
	migrations: Record<string, string>;
}

async function readMigrationFiles({ journal, migrations }: MigrationConfig): Promise<MigrationMeta[]> {
	const migrationQueries: MigrationMeta[] = [];

	for await (const journalEntry of journal.entries) {
		const query = migrations[`m${journalEntry.idx.toString().padStart(4, '0')}`];

		if (!query) {
			throw new Error(`Missing migration: ${journalEntry.tag}`);
		}

		try {
			const result = query.split('--> statement-breakpoint').map((it) => {
				return it;
			});

			migrationQueries.push({
				sql: result,
				bps: journalEntry.breakpoints,
				folderMillis: journalEntry.when,
				hash: '',
			});
		} catch {
			throw new Error(`Failed to parse migration: ${journalEntry.tag}`);
		}
	}

	return migrationQueries;
}

export async function migrate<TSchema extends Record<string, unknown>>(
	db: OPSQLiteDatabase<TSchema>,
	config: MigrationConfig,
) {
	const migrations = await readMigrationFiles(config);
	return db.dialect.migrate(migrations, db.session);
}

interface State {
	success: boolean;
	error?: Error;
}

type Action =
	| { type: 'migrating' }
	| { type: 'migrated'; payload: true }
	| { type: 'error'; payload: Error };

export const useMigrations = (db: OPSQLiteDatabase<any>, migrations: {
	journal: {
		entries: { idx: number; when: number; tag: string; breakpoints: boolean }[];
	};
	migrations: Record<string, string>;
}): State => {
	const initialState: State = {
		success: false,
		error: undefined,
	};

	const fetchReducer = (state: State, action: Action): State => {
		switch (action.type) {
			case 'migrating': {
				return { ...initialState };
			}
			case 'migrated': {
				return { ...initialState, success: action.payload };
			}
			case 'error': {
				return { ...initialState, error: action.payload };
			}
			default: {
				return state;
			}
		}
	};

	const [state, dispatch] = useReducer(fetchReducer, initialState);

	useEffect(() => {
		dispatch({ type: 'migrating' });
		migrate(db, migrations).then(() => {
			dispatch({ type: 'migrated', payload: true });
		}).catch((error) => {
			dispatch({ type: 'error', payload: error as Error });
		});
	}, []);

	return state;
};

Domain

Subdomains

Dependencies

Frequently Asked Questions

What does migrator.ts do?
migrator.ts is a source file in the drizzle-orm codebase, written in typescript. It belongs to the DrizzleORM domain, SQLDialects subdomain.
What functions are defined in migrator.ts?
migrator.ts defines 3 function(s): migrate, readMigrationFiles, useMigrations.
What does migrator.ts depend on?
migrator.ts imports 3 module(s): driver.ts, migrator.ts, react.
Where is migrator.ts in the architecture?
migrator.ts is located at drizzle-orm/src/op-sqlite/migrator.ts (domain: DrizzleORM, subdomain: SQLDialects, directory: drizzle-orm/src/op-sqlite).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free