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

schema.ts — drizzle-orm Source File

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

Entity Profile

Dependency Diagram

graph LR
  a1e9a186_355d_5f4f_7cf0_889804754896["schema.ts"]
  04df2f9f_a1ec_55a9_5392_86b92a0e6555["column.ts"]
  a1e9a186_355d_5f4f_7cf0_889804754896 --> 04df2f9f_a1ec_55a9_5392_86b92a0e6555
  c3d8e5a3_48ae_8877_650c_206534a04c0c["columnToSchema"]
  a1e9a186_355d_5f4f_7cf0_889804754896 --> c3d8e5a3_48ae_8877_650c_206534a04c0c
  b867e693_1ca4_ac0a_0989_d20dce8c0520["mapEnumValues"]
  a1e9a186_355d_5f4f_7cf0_889804754896 --> b867e693_1ca4_ac0a_0989_d20dce8c0520
  8beb3c26_f68c_2b02_ad7a_a436848c5635["schema.types.internal.ts"]
  a1e9a186_355d_5f4f_7cf0_889804754896 --> 8beb3c26_f68c_2b02_ad7a_a436848c5635
  e918a77e_1e35_56b9_adb6_5727c2a5b3ad["schema.types.ts"]
  a1e9a186_355d_5f4f_7cf0_889804754896 --> e918a77e_1e35_56b9_adb6_5727c2a5b3ad
  a0d71e56_fdeb_c568_64e9_fb247617a17c["utils.ts"]
  a1e9a186_355d_5f4f_7cf0_889804754896 --> a0d71e56_fdeb_c568_64e9_fb247617a17c
  690f7dfc_0aea_9ee8_d6e7_26bbb3689031["drizzle-orm"]
  a1e9a186_355d_5f4f_7cf0_889804754896 --> 690f7dfc_0aea_9ee8_d6e7_26bbb3689031
  53497908_16e7_977d_e97d_7414884a88a6["pg-core"]
  a1e9a186_355d_5f4f_7cf0_889804754896 --> 53497908_16e7_977d_e97d_7414884a88a6
  a9e31838_d52b_02c1_2b9d_c4354b2ad2fa["valibot"]
  a1e9a186_355d_5f4f_7cf0_889804754896 --> a9e31838_d52b_02c1_2b9d_c4354b2ad2fa
  style a1e9a186_355d_5f4f_7cf0_889804754896 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import { Column, getTableColumns, getViewSelectedFields, is, isTable, isView, SQL } from 'drizzle-orm';
import type { Table, View } from 'drizzle-orm';
import type { PgEnum } from 'drizzle-orm/pg-core';
import * as v from 'valibot';
import { columnToSchema, mapEnumValues } from './column.ts';
import type { Conditions } from './schema.types.internal.ts';
import type { CreateInsertSchema, CreateSelectSchema, CreateUpdateSchema } from './schema.types.ts';
import { isPgEnum } from './utils.ts';

function getColumns(tableLike: Table | View) {
	return isTable(tableLike) ? getTableColumns(tableLike) : getViewSelectedFields(tableLike);
}

function handleColumns(
	columns: Record<string, any>,
	refinements: Record<string, any>,
	conditions: Conditions,
): v.GenericSchema {
	const columnSchemas: Record<string, v.GenericSchema> = {};

	for (const [key, selected] of Object.entries(columns)) {
		if (!is(selected, Column) && !is(selected, SQL) && !is(selected, SQL.Aliased) && typeof selected === 'object') {
			const columns = isTable(selected) || isView(selected) ? getColumns(selected) : selected;
			columnSchemas[key] = handleColumns(columns, refinements[key] ?? {}, conditions);
			continue;
		}

		const refinement = refinements[key];
		if (refinement !== undefined && typeof refinement !== 'function') {
			columnSchemas[key] = refinement;
			continue;
		}

		const column = is(selected, Column) ? selected : undefined;
		const schema = column ? columnToSchema(column) : v.any();
		const refined = typeof refinement === 'function' ? refinement(schema) : schema;

		if (conditions.never(column)) {
			continue;
		} else {
			columnSchemas[key] = refined;
		}

		if (column) {
			if (conditions.nullable(column)) {
				columnSchemas[key] = v.nullable(columnSchemas[key]!);
			}

			if (conditions.optional(column)) {
				columnSchemas[key] = v.optional(columnSchemas[key]!);
			}
		}
	}

	return v.object(columnSchemas) as any;
}

export const createSelectSchema: CreateSelectSchema = (
	entity: Table | View | PgEnum<[string, ...string[]]>,
	refine?: Record<string, any>,
) => {
	if (isPgEnum(entity)) {
		return v.enum(mapEnumValues(entity.enumValues));
	}
	const columns = getColumns(entity);
	return handleColumns(columns, refine ?? {}, {
		never: () => false,
		optional: () => false,
		nullable: (column) => !column.notNull,
	}) as any;
};

export const createInsertSchema: CreateInsertSchema = (
	entity: Table,
	refine?: Record<string, any>,
) => {
	const columns = getColumns(entity);
	return handleColumns(columns, refine ?? {}, {
		never: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always',
		optional: (column) => !column.notNull || (column.notNull && column.hasDefault),
		nullable: (column) => !column.notNull,
	}) as any;
};

export const createUpdateSchema: CreateUpdateSchema = (
	entity: Table,
	refine?: Record<string, any>,
) => {
	const columns = getColumns(entity);
	return handleColumns(columns, refine ?? {}, {
		never: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always',
		optional: () => true,
		nullable: (column) => !column.notNull,
	}) as any;
};

Subdomains

Frequently Asked Questions

What does schema.ts do?
schema.ts is a source file in the drizzle-orm codebase, written in typescript. It belongs to the ValidationAdapters domain, SchemaRefinement subdomain.
What functions are defined in schema.ts?
schema.ts defines 5 function(s): createInsertSchema, createSelectSchema, createUpdateSchema, getColumns, handleColumns.
What does schema.ts depend on?
schema.ts imports 9 module(s): column.ts, columnToSchema, drizzle-orm, mapEnumValues, pg-core, schema.types.internal.ts, schema.types.ts, utils.ts, and 1 more.
Where is schema.ts in the architecture?
schema.ts is located at drizzle-valibot/src/schema.ts (domain: ValidationAdapters, subdomain: SchemaRefinement, directory: drizzle-valibot/src).

Analyze Your Own Codebase

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

Try Supermodel Free