| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- "use strict";
- var __defProp = Object.defineProperty;
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
- var __getOwnPropNames = Object.getOwnPropertyNames;
- var __hasOwnProp = Object.prototype.hasOwnProperty;
- var __export = (target, all) => {
- for (var name in all)
- __defProp(target, name, { get: all[name], enumerable: true });
- };
- var __copyProps = (to, from, except, desc2) => {
- if (from && typeof from === "object" || typeof from === "function") {
- for (let key of __getOwnPropNames(from))
- if (!__hasOwnProp.call(to, key) && key !== except)
- __defProp(to, key, { get: () => from[key], enumerable: !(desc2 = __getOwnPropDesc(from, key)) || desc2.enumerable });
- }
- return to;
- };
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
- var relations_exports = {};
- __export(relations_exports, {
- Many: () => Many,
- One: () => One,
- Relation: () => Relation,
- Relations: () => Relations,
- createMany: () => createMany,
- createOne: () => createOne,
- createTableRelationsHelpers: () => createTableRelationsHelpers,
- extractTablesRelationalConfig: () => extractTablesRelationalConfig,
- getOperators: () => getOperators,
- getOrderByOperators: () => getOrderByOperators,
- mapRelationalRow: () => mapRelationalRow,
- normalizeRelation: () => normalizeRelation,
- relations: () => relations
- });
- module.exports = __toCommonJS(relations_exports);
- var import_table = require("./table.cjs");
- var import_column = require("./column.cjs");
- var import_entity = require("./entity.cjs");
- var import_primary_keys = require("./pg-core/primary-keys.cjs");
- var import_expressions = require("./sql/expressions/index.cjs");
- var import_sql = require("./sql/sql.cjs");
- class Relation {
- constructor(sourceTable, referencedTable, relationName) {
- this.sourceTable = sourceTable;
- this.referencedTable = referencedTable;
- this.relationName = relationName;
- this.referencedTableName = referencedTable[import_table.Table.Symbol.Name];
- }
- static [import_entity.entityKind] = "Relation";
- referencedTableName;
- fieldName;
- }
- class Relations {
- constructor(table, config) {
- this.table = table;
- this.config = config;
- }
- static [import_entity.entityKind] = "Relations";
- }
- class One extends Relation {
- constructor(sourceTable, referencedTable, config, isNullable) {
- super(sourceTable, referencedTable, config?.relationName);
- this.config = config;
- this.isNullable = isNullable;
- }
- static [import_entity.entityKind] = "One";
- withFieldName(fieldName) {
- const relation = new One(
- this.sourceTable,
- this.referencedTable,
- this.config,
- this.isNullable
- );
- relation.fieldName = fieldName;
- return relation;
- }
- }
- class Many extends Relation {
- constructor(sourceTable, referencedTable, config) {
- super(sourceTable, referencedTable, config?.relationName);
- this.config = config;
- }
- static [import_entity.entityKind] = "Many";
- withFieldName(fieldName) {
- const relation = new Many(
- this.sourceTable,
- this.referencedTable,
- this.config
- );
- relation.fieldName = fieldName;
- return relation;
- }
- }
- function getOperators() {
- return {
- and: import_expressions.and,
- between: import_expressions.between,
- eq: import_expressions.eq,
- exists: import_expressions.exists,
- gt: import_expressions.gt,
- gte: import_expressions.gte,
- ilike: import_expressions.ilike,
- inArray: import_expressions.inArray,
- isNull: import_expressions.isNull,
- isNotNull: import_expressions.isNotNull,
- like: import_expressions.like,
- lt: import_expressions.lt,
- lte: import_expressions.lte,
- ne: import_expressions.ne,
- not: import_expressions.not,
- notBetween: import_expressions.notBetween,
- notExists: import_expressions.notExists,
- notLike: import_expressions.notLike,
- notIlike: import_expressions.notIlike,
- notInArray: import_expressions.notInArray,
- or: import_expressions.or,
- sql: import_sql.sql
- };
- }
- function getOrderByOperators() {
- return {
- sql: import_sql.sql,
- asc: import_expressions.asc,
- desc: import_expressions.desc
- };
- }
- function extractTablesRelationalConfig(schema, configHelpers) {
- if (Object.keys(schema).length === 1 && "default" in schema && !(0, import_entity.is)(schema["default"], import_table.Table)) {
- schema = schema["default"];
- }
- const tableNamesMap = {};
- const relationsBuffer = {};
- const tablesConfig = {};
- for (const [key, value] of Object.entries(schema)) {
- if ((0, import_entity.is)(value, import_table.Table)) {
- const dbName = (0, import_table.getTableUniqueName)(value);
- const bufferedRelations = relationsBuffer[dbName];
- tableNamesMap[dbName] = key;
- tablesConfig[key] = {
- tsName: key,
- dbName: value[import_table.Table.Symbol.Name],
- schema: value[import_table.Table.Symbol.Schema],
- columns: value[import_table.Table.Symbol.Columns],
- relations: bufferedRelations?.relations ?? {},
- primaryKey: bufferedRelations?.primaryKey ?? []
- };
- for (const column of Object.values(
- value[import_table.Table.Symbol.Columns]
- )) {
- if (column.primary) {
- tablesConfig[key].primaryKey.push(column);
- }
- }
- const extraConfig = value[import_table.Table.Symbol.ExtraConfigBuilder]?.(value[import_table.Table.Symbol.ExtraConfigColumns]);
- if (extraConfig) {
- for (const configEntry of Object.values(extraConfig)) {
- if ((0, import_entity.is)(configEntry, import_primary_keys.PrimaryKeyBuilder)) {
- tablesConfig[key].primaryKey.push(...configEntry.columns);
- }
- }
- }
- } else if ((0, import_entity.is)(value, Relations)) {
- const dbName = (0, import_table.getTableUniqueName)(value.table);
- const tableName = tableNamesMap[dbName];
- const relations2 = value.config(
- configHelpers(value.table)
- );
- let primaryKey;
- for (const [relationName, relation] of Object.entries(relations2)) {
- if (tableName) {
- const tableConfig = tablesConfig[tableName];
- tableConfig.relations[relationName] = relation;
- if (primaryKey) {
- tableConfig.primaryKey.push(...primaryKey);
- }
- } else {
- if (!(dbName in relationsBuffer)) {
- relationsBuffer[dbName] = {
- relations: {},
- primaryKey
- };
- }
- relationsBuffer[dbName].relations[relationName] = relation;
- }
- }
- }
- }
- return { tables: tablesConfig, tableNamesMap };
- }
- function relations(table, relations2) {
- return new Relations(
- table,
- (helpers) => Object.fromEntries(
- Object.entries(relations2(helpers)).map(([key, value]) => [
- key,
- value.withFieldName(key)
- ])
- )
- );
- }
- function createOne(sourceTable) {
- return function one(table, config) {
- return new One(
- sourceTable,
- table,
- config,
- config?.fields.reduce((res, f) => res && f.notNull, true) ?? false
- );
- };
- }
- function createMany(sourceTable) {
- return function many(referencedTable, config) {
- return new Many(sourceTable, referencedTable, config);
- };
- }
- function normalizeRelation(schema, tableNamesMap, relation) {
- if ((0, import_entity.is)(relation, One) && relation.config) {
- return {
- fields: relation.config.fields,
- references: relation.config.references
- };
- }
- const referencedTableTsName = tableNamesMap[(0, import_table.getTableUniqueName)(relation.referencedTable)];
- if (!referencedTableTsName) {
- throw new Error(
- `Table "${relation.referencedTable[import_table.Table.Symbol.Name]}" not found in schema`
- );
- }
- const referencedTableConfig = schema[referencedTableTsName];
- if (!referencedTableConfig) {
- throw new Error(`Table "${referencedTableTsName}" not found in schema`);
- }
- const sourceTable = relation.sourceTable;
- const sourceTableTsName = tableNamesMap[(0, import_table.getTableUniqueName)(sourceTable)];
- if (!sourceTableTsName) {
- throw new Error(
- `Table "${sourceTable[import_table.Table.Symbol.Name]}" not found in schema`
- );
- }
- const reverseRelations = [];
- for (const referencedTableRelation of Object.values(
- referencedTableConfig.relations
- )) {
- if (relation.relationName && relation !== referencedTableRelation && referencedTableRelation.relationName === relation.relationName || !relation.relationName && referencedTableRelation.referencedTable === relation.sourceTable) {
- reverseRelations.push(referencedTableRelation);
- }
- }
- if (reverseRelations.length > 1) {
- throw relation.relationName ? new Error(
- `There are multiple relations with name "${relation.relationName}" in table "${referencedTableTsName}"`
- ) : new Error(
- `There are multiple relations between "${referencedTableTsName}" and "${relation.sourceTable[import_table.Table.Symbol.Name]}". Please specify relation name`
- );
- }
- if (reverseRelations[0] && (0, import_entity.is)(reverseRelations[0], One) && reverseRelations[0].config) {
- return {
- fields: reverseRelations[0].config.references,
- references: reverseRelations[0].config.fields
- };
- }
- throw new Error(
- `There is not enough information to infer relation "${sourceTableTsName}.${relation.fieldName}"`
- );
- }
- function createTableRelationsHelpers(sourceTable) {
- return {
- one: createOne(sourceTable),
- many: createMany(sourceTable)
- };
- }
- function mapRelationalRow(tablesConfig, tableConfig, row, buildQueryResultSelection, mapColumnValue = (value) => value) {
- const result = {};
- for (const [
- selectionItemIndex,
- selectionItem
- ] of buildQueryResultSelection.entries()) {
- if (selectionItem.isJson) {
- const relation = tableConfig.relations[selectionItem.tsKey];
- const rawSubRows = row[selectionItemIndex];
- const subRows = typeof rawSubRows === "string" ? JSON.parse(rawSubRows) : rawSubRows;
- result[selectionItem.tsKey] = (0, import_entity.is)(relation, One) ? subRows && mapRelationalRow(
- tablesConfig,
- tablesConfig[selectionItem.relationTableTsKey],
- subRows,
- selectionItem.selection,
- mapColumnValue
- ) : subRows.map(
- (subRow) => mapRelationalRow(
- tablesConfig,
- tablesConfig[selectionItem.relationTableTsKey],
- subRow,
- selectionItem.selection,
- mapColumnValue
- )
- );
- } else {
- const value = mapColumnValue(row[selectionItemIndex]);
- const field = selectionItem.field;
- let decoder;
- if ((0, import_entity.is)(field, import_column.Column)) {
- decoder = field;
- } else if ((0, import_entity.is)(field, import_sql.SQL)) {
- decoder = field.decoder;
- } else {
- decoder = field.sql.decoder;
- }
- result[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);
- }
- }
- return result;
- }
- // Annotate the CommonJS export names for ESM import in node:
- 0 && (module.exports = {
- Many,
- One,
- Relation,
- Relations,
- createMany,
- createOne,
- createTableRelationsHelpers,
- extractTablesRelationalConfig,
- getOperators,
- getOrderByOperators,
- mapRelationalRow,
- normalizeRelation,
- relations
- });
- //# sourceMappingURL=relations.cjs.map
|