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. 8 imports, 0 dependents.

Entity Profile

Dependency Diagram

graph LR
  b3de3d3d_2c66_6c17_9e29_4ae6af2ae68f["schema.ts"]
  03d2f7f9_4592_2641_ed27_5e125e89d737["column.ts"]
  b3de3d3d_2c66_6c17_9e29_4ae6af2ae68f --> 03d2f7f9_4592_2641_ed27_5e125e89d737
  b1c074f5_2da3_d41e_58f2_747e87ddff7d["columnToSchema"]
  b3de3d3d_2c66_6c17_9e29_4ae6af2ae68f --> b1c074f5_2da3_d41e_58f2_747e87ddff7d
  d530d59d_be0a_6412_1cd0_197b9709fc36["schema.types.internal.ts"]
  b3de3d3d_2c66_6c17_9e29_4ae6af2ae68f --> d530d59d_be0a_6412_1cd0_197b9709fc36
  28b925d4_7f31_9845_f7d2_ae4d3d15f3ee["schema.types.ts"]
  b3de3d3d_2c66_6c17_9e29_4ae6af2ae68f --> 28b925d4_7f31_9845_f7d2_ae4d3d15f3ee
  6926d326_babb_b38d_98de_f0d261e6df93["utils.ts"]
  b3de3d3d_2c66_6c17_9e29_4ae6af2ae68f --> 6926d326_babb_b38d_98de_f0d261e6df93
  4859a2e0_4bd3_506a_e7e6_bf4316983bb5["arktype"]
  b3de3d3d_2c66_6c17_9e29_4ae6af2ae68f --> 4859a2e0_4bd3_506a_e7e6_bf4316983bb5
  690f7dfc_0aea_9ee8_d6e7_26bbb3689031["drizzle-orm"]
  b3de3d3d_2c66_6c17_9e29_4ae6af2ae68f --> 690f7dfc_0aea_9ee8_d6e7_26bbb3689031
  53497908_16e7_977d_e97d_7414884a88a6["pg-core"]
  b3de3d3d_2c66_6c17_9e29_4ae6af2ae68f --> 53497908_16e7_977d_e97d_7414884a88a6
  style b3de3d3d_2c66_6c17_9e29_4ae6af2ae68f fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import { Type, type } from 'arktype';
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 { columnToSchema } 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,
): Type {
	const columnSchemas: Record<string, Type> = {};

	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' || (typeof refinement === 'function' && refinement.expression !== undefined))
		) {
			columnSchemas[key] = refinement;
			continue;
		}

		const column = is(selected, Column) ? selected : undefined;
		const schema = column ? columnToSchema(column) : type.unknown;
		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] = columnSchemas[key]!.or(type.null);
			}

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

	return type(columnSchemas);
}

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

export const 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;
}) as CreateInsertSchema;

export const 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;
}) as CreateUpdateSchema;

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 8 module(s): arktype, column.ts, columnToSchema, drizzle-orm, pg-core, schema.types.internal.ts, schema.types.ts, utils.ts.
Where is schema.ts in the architecture?
schema.ts is located at drizzle-arktype/src/schema.ts (domain: ValidationAdapters, subdomain: SchemaRefinement, directory: drizzle-arktype/src).

Analyze Your Own Codebase

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

Try Supermodel Free