zod-dbs
Version:
Opinionated Zod schema generator for databases
87 lines (86 loc) • 3.74 kB
JavaScript
import pluralize from 'pluralize';
import { convertCaseFormat, pascalCase, singularPascalCase, singularUpperCase, snakeCase, } from '../utils/casing.js';
const MVIEW_PREFIXES = ['mv_', 'mview_'];
const VIEW_PREFIXES = ['v_', 'view_'];
const getOperationSuffix = (type) => {
switch (type) {
case 'insert':
return 'Insert';
case 'update':
return 'Update';
case 'write':
return 'Write';
case 'read':
return '';
default:
return '';
}
};
export const getSchemaPrefix = (table) => {
switch (table.type) {
case 'table':
case 'foreign_table':
return 'Table';
case 'materialized_view':
// If the table name starts with a known materialized view prefix, return an empty string
// to avoid adding 'Mv' prefix unnecessarily.
return MVIEW_PREFIXES.some((prefix) => table.name.startsWith(prefix))
? ''
: 'Mv';
case 'view':
// If the table name starts with a known view prefix, return an empty string
// to avoid adding 'View' prefix unnecessarily.
return VIEW_PREFIXES.some((prefix) => table.name.startsWith(prefix))
? ''
: 'View';
default:
return '';
}
};
export const formatRecordTransformName = ({ table, operation: type, singularize = true, casing = 'camelCase', suffix = 'BaseRecord', }) => {
const tableName = singularize
? singularPascalCase(table.name)
: pascalCase(table.name);
const name = `transform${tableName}${getOperationSuffix(type)}${suffix}`;
return convertCaseFormat(name, casing);
};
export const formatTableSchemaName = ({ table, operation: type, casing = 'PascalCase', suffix = 'Schema', }) => {
const tableName = convertCaseFormat(table.name, casing);
const name = `${tableName}${getSchemaPrefix(table)}${getOperationSuffix(type)}${suffix}`;
return convertCaseFormat(name, casing);
};
export const formatTableRecordName = ({ table, operation, singularize = true, casing = 'PascalCase', suffix = 'Record', }) => {
const tableName = singularize
? singularPascalCase(table.name)
: pascalCase(table.name);
const name = `${tableName}${getOperationSuffix(operation)}${suffix}`;
return convertCaseFormat(name, casing);
};
export const formatObjectSchemaName = ({ tableName, columnName, casing = 'PascalCase', singularize = true, suffix = 'Schema', }) => {
const pascalTableName = singularize
? singularPascalCase(tableName)
: pascalCase(tableName);
const name = `${pascalTableName}${pascalCase(columnName)}${suffix}`;
return convertCaseFormat(name, casing);
};
export const formatEnumConstantName = ({ tableName, colName, singularize = true, }) => {
const upperTableName = singularize
? singularUpperCase(tableName)
: tableName.toUpperCase();
const upperColName = snakeCase(colName).toUpperCase();
return pluralize(`${upperTableName}_${upperColName}`);
};
export const formatEnumTypeName = ({ tableName, colName, casing = 'PascalCase', singularize = true, }) => {
const pascalTableName = singularize
? singularPascalCase(tableName)
: pascalCase(tableName);
const pascalColName = singularize
? singularPascalCase(colName)
: pascalCase(colName);
return convertCaseFormat(`${pascalTableName}${pascalColName}`, casing);
};
export const formatPropertyName = (columnName, casing = 'camelCase') => {
// Remove leading underscores
const normalizedColumnName = columnName.replace(/^_+/, '');
return convertCaseFormat(normalizedColumnName, casing);
};