typeorm 0.3.25-dev.42913b9 → 0.3.25-dev.42e7cbe
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/metadata-builder/ClosureJunctionEntityMetadataBuilder.js +14 -0
- package/browser/metadata-builder/ClosureJunctionEntityMetadataBuilder.js.map +1 -1
- package/browser/metadata-builder/RelationJoinColumnBuilder.js +7 -0
- package/browser/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
- package/browser/persistence/SubjectChangedColumnsComputer.js +4 -4
- package/browser/persistence/SubjectChangedColumnsComputer.js.map +1 -1
- package/browser/util/OrmUtils.d.ts +4 -0
- package/browser/util/OrmUtils.js +9 -0
- package/browser/util/OrmUtils.js.map +1 -1
- package/metadata-builder/ClosureJunctionEntityMetadataBuilder.js +14 -0
- package/metadata-builder/ClosureJunctionEntityMetadataBuilder.js.map +1 -1
- package/metadata-builder/RelationJoinColumnBuilder.js +7 -0
- package/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
- package/package.json +1 -1
- package/persistence/SubjectChangedColumnsComputer.js +4 -4
- package/persistence/SubjectChangedColumnsComputer.js.map +1 -1
- package/util/OrmUtils.d.ts +4 -0
- package/util/OrmUtils.js +9 -0
- package/util/OrmUtils.js.map +1 -1
|
@@ -54,6 +54,13 @@ export class ClosureJunctionEntityMetadataBuilder {
|
|
|
54
54
|
primary: true,
|
|
55
55
|
length: primaryColumn.length,
|
|
56
56
|
type: primaryColumn.type,
|
|
57
|
+
unsigned: primaryColumn.unsigned,
|
|
58
|
+
width: primaryColumn.width,
|
|
59
|
+
precision: primaryColumn.precision,
|
|
60
|
+
scale: primaryColumn.scale,
|
|
61
|
+
zerofill: primaryColumn.zerofill,
|
|
62
|
+
charset: primaryColumn.charset,
|
|
63
|
+
collation: primaryColumn.collation,
|
|
57
64
|
},
|
|
58
65
|
},
|
|
59
66
|
}));
|
|
@@ -74,6 +81,13 @@ export class ClosureJunctionEntityMetadataBuilder {
|
|
|
74
81
|
primary: true,
|
|
75
82
|
length: primaryColumn.length,
|
|
76
83
|
type: primaryColumn.type,
|
|
84
|
+
unsigned: primaryColumn.unsigned,
|
|
85
|
+
width: primaryColumn.width,
|
|
86
|
+
precision: primaryColumn.precision,
|
|
87
|
+
scale: primaryColumn.scale,
|
|
88
|
+
zerofill: primaryColumn.zerofill,
|
|
89
|
+
charset: primaryColumn.charset,
|
|
90
|
+
collation: primaryColumn.collation,
|
|
77
91
|
},
|
|
78
92
|
},
|
|
79
93
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../browser/src/metadata-builder/ClosureJunctionEntityMetadataBuilder.ts"],"names":[],"mappings":"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","file":"ClosureJunctionEntityMetadataBuilder.js","sourcesContent":["import { EntityMetadata } from \"../metadata/EntityMetadata\"\nimport { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { ForeignKeyMetadata } from \"../metadata/ForeignKeyMetadata\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { IndexMetadata } from \"../metadata/IndexMetadata\"\n\n/**\n * Creates EntityMetadata for junction tables of the closure entities.\n * Closure junction tables are tables generated by closure entities.\n */\nexport class ClosureJunctionEntityMetadataBuilder {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private connection: DataSource) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Builds EntityMetadata for the closure junction of the given closure entity.\n */\n build(parentClosureEntityMetadata: EntityMetadata) {\n // create entity metadata itself\n const entityMetadata = new EntityMetadata({\n parentClosureEntityMetadata: parentClosureEntityMetadata,\n connection: this.connection,\n args: {\n target: \"\",\n name:\n parentClosureEntityMetadata.treeOptions &&\n parentClosureEntityMetadata.treeOptions.closureTableName\n ? parentClosureEntityMetadata.treeOptions\n .closureTableName\n : parentClosureEntityMetadata.tableNameWithoutPrefix,\n type: \"closure-junction\",\n },\n })\n entityMetadata.build()\n\n // create ancestor and descendant columns for new closure junction table\n parentClosureEntityMetadata.primaryColumns.forEach((primaryColumn) => {\n entityMetadata.ownColumns.push(\n new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n closureType: \"ancestor\",\n referencedColumn: primaryColumn,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName:\n parentClosureEntityMetadata.treeOptions &&\n parentClosureEntityMetadata.treeOptions\n .ancestorColumnName\n ? parentClosureEntityMetadata.treeOptions.ancestorColumnName(\n primaryColumn,\n )\n : primaryColumn.propertyName + \"_ancestor\",\n options: {\n primary: true,\n length: primaryColumn.length,\n type: primaryColumn.type,\n },\n },\n }),\n )\n entityMetadata.ownColumns.push(\n new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n closureType: \"descendant\",\n referencedColumn: primaryColumn,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName:\n parentClosureEntityMetadata.treeOptions &&\n parentClosureEntityMetadata.treeOptions\n .descendantColumnName\n ? parentClosureEntityMetadata.treeOptions.descendantColumnName(\n primaryColumn,\n )\n : primaryColumn.propertyName + \"_descendant\",\n options: {\n primary: true,\n length: primaryColumn.length,\n type: primaryColumn.type,\n },\n },\n }),\n )\n })\n\n entityMetadata.ownIndices = [\n new IndexMetadata({\n entityMetadata: entityMetadata,\n columns: [entityMetadata.ownColumns[0]],\n args: {\n target: entityMetadata.target,\n synchronize: true,\n },\n }),\n new IndexMetadata({\n entityMetadata: entityMetadata,\n columns: [entityMetadata.ownColumns[1]],\n args: {\n target: entityMetadata.target,\n synchronize: true,\n },\n }),\n ]\n\n // if tree level column was defined by a closure entity then add it to the junction columns as well\n if (parentClosureEntityMetadata.treeLevelColumn) {\n entityMetadata.ownColumns.push(\n new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName: \"level\",\n options: {\n type: this.connection.driver.mappedDataTypes\n .treeLevel,\n },\n },\n }),\n )\n }\n\n // create junction table foreign keys\n // Note: CASCADE is not applied to mssql because it does not support multi cascade paths\n entityMetadata.foreignKeys = [\n new ForeignKeyMetadata({\n entityMetadata: entityMetadata,\n referencedEntityMetadata: parentClosureEntityMetadata,\n columns: [entityMetadata.ownColumns[0]],\n referencedColumns: parentClosureEntityMetadata.primaryColumns,\n onDelete:\n this.connection.driver.options.type === \"mssql\"\n ? \"NO ACTION\"\n : \"CASCADE\",\n }),\n new ForeignKeyMetadata({\n entityMetadata: entityMetadata,\n referencedEntityMetadata: parentClosureEntityMetadata,\n columns: [entityMetadata.ownColumns[1]],\n referencedColumns: parentClosureEntityMetadata.primaryColumns,\n onDelete:\n this.connection.driver.options.type === \"mssql\"\n ? \"NO ACTION\"\n : \"CASCADE\",\n }),\n ]\n\n return entityMetadata\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../browser/src/metadata-builder/ClosureJunctionEntityMetadataBuilder.ts"],"names":[],"mappings":"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","file":"ClosureJunctionEntityMetadataBuilder.js","sourcesContent":["import { EntityMetadata } from \"../metadata/EntityMetadata\"\nimport { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { ForeignKeyMetadata } from \"../metadata/ForeignKeyMetadata\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { IndexMetadata } from \"../metadata/IndexMetadata\"\n\n/**\n * Creates EntityMetadata for junction tables of the closure entities.\n * Closure junction tables are tables generated by closure entities.\n */\nexport class ClosureJunctionEntityMetadataBuilder {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private connection: DataSource) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Builds EntityMetadata for the closure junction of the given closure entity.\n */\n build(parentClosureEntityMetadata: EntityMetadata) {\n // create entity metadata itself\n const entityMetadata = new EntityMetadata({\n parentClosureEntityMetadata: parentClosureEntityMetadata,\n connection: this.connection,\n args: {\n target: \"\",\n name:\n parentClosureEntityMetadata.treeOptions &&\n parentClosureEntityMetadata.treeOptions.closureTableName\n ? parentClosureEntityMetadata.treeOptions\n .closureTableName\n : parentClosureEntityMetadata.tableNameWithoutPrefix,\n type: \"closure-junction\",\n },\n })\n entityMetadata.build()\n\n // create ancestor and descendant columns for new closure junction table\n parentClosureEntityMetadata.primaryColumns.forEach((primaryColumn) => {\n entityMetadata.ownColumns.push(\n new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n closureType: \"ancestor\",\n referencedColumn: primaryColumn,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName:\n parentClosureEntityMetadata.treeOptions &&\n parentClosureEntityMetadata.treeOptions\n .ancestorColumnName\n ? parentClosureEntityMetadata.treeOptions.ancestorColumnName(\n primaryColumn,\n )\n : primaryColumn.propertyName + \"_ancestor\",\n options: {\n primary: true,\n length: primaryColumn.length,\n type: primaryColumn.type,\n unsigned: primaryColumn.unsigned,\n width: primaryColumn.width,\n precision: primaryColumn.precision,\n scale: primaryColumn.scale,\n zerofill: primaryColumn.zerofill,\n charset: primaryColumn.charset,\n collation: primaryColumn.collation,\n },\n },\n }),\n )\n entityMetadata.ownColumns.push(\n new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n closureType: \"descendant\",\n referencedColumn: primaryColumn,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName:\n parentClosureEntityMetadata.treeOptions &&\n parentClosureEntityMetadata.treeOptions\n .descendantColumnName\n ? parentClosureEntityMetadata.treeOptions.descendantColumnName(\n primaryColumn,\n )\n : primaryColumn.propertyName + \"_descendant\",\n options: {\n primary: true,\n length: primaryColumn.length,\n type: primaryColumn.type,\n unsigned: primaryColumn.unsigned,\n width: primaryColumn.width,\n precision: primaryColumn.precision,\n scale: primaryColumn.scale,\n zerofill: primaryColumn.zerofill,\n charset: primaryColumn.charset,\n collation: primaryColumn.collation,\n },\n },\n }),\n )\n })\n\n entityMetadata.ownIndices = [\n new IndexMetadata({\n entityMetadata: entityMetadata,\n columns: [entityMetadata.ownColumns[0]],\n args: {\n target: entityMetadata.target,\n synchronize: true,\n },\n }),\n new IndexMetadata({\n entityMetadata: entityMetadata,\n columns: [entityMetadata.ownColumns[1]],\n args: {\n target: entityMetadata.target,\n synchronize: true,\n },\n }),\n ]\n\n // if tree level column was defined by a closure entity then add it to the junction columns as well\n if (parentClosureEntityMetadata.treeLevelColumn) {\n entityMetadata.ownColumns.push(\n new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName: \"level\",\n options: {\n type: this.connection.driver.mappedDataTypes\n .treeLevel,\n },\n },\n }),\n )\n }\n\n // create junction table foreign keys\n // Note: CASCADE is not applied to mssql because it does not support multi cascade paths\n entityMetadata.foreignKeys = [\n new ForeignKeyMetadata({\n entityMetadata: entityMetadata,\n referencedEntityMetadata: parentClosureEntityMetadata,\n columns: [entityMetadata.ownColumns[0]],\n referencedColumns: parentClosureEntityMetadata.primaryColumns,\n onDelete:\n this.connection.driver.options.type === \"mssql\"\n ? \"NO ACTION\"\n : \"CASCADE\",\n }),\n new ForeignKeyMetadata({\n entityMetadata: entityMetadata,\n referencedEntityMetadata: parentClosureEntityMetadata,\n columns: [entityMetadata.ownColumns[1]],\n referencedColumns: parentClosureEntityMetadata.primaryColumns,\n onDelete:\n this.connection.driver.options.type === \"mssql\"\n ? \"NO ACTION\"\n : \"CASCADE\",\n }),\n ]\n\n return entityMetadata\n }\n}\n"],"sourceRoot":".."}
|
|
@@ -3,6 +3,7 @@ import { UniqueMetadata } from "../metadata/UniqueMetadata";
|
|
|
3
3
|
import { ForeignKeyMetadata } from "../metadata/ForeignKeyMetadata";
|
|
4
4
|
import { TypeORMError } from "../error";
|
|
5
5
|
import { DriverUtils } from "../driver/DriverUtils";
|
|
6
|
+
import { OrmUtils } from "../util/OrmUtils";
|
|
6
7
|
/**
|
|
7
8
|
* Builds join column for the many-to-one and one-to-one owner relations.
|
|
8
9
|
*
|
|
@@ -169,6 +170,12 @@ export class RelationJoinColumnBuilder {
|
|
|
169
170
|
});
|
|
170
171
|
relation.entityMetadata.registerColumn(relationalColumn);
|
|
171
172
|
}
|
|
173
|
+
else if (relationalColumn.referencedColumn) {
|
|
174
|
+
// Clone the relational column to prevent modifying the original when multiple
|
|
175
|
+
// relations reference the same column. This ensures each relation gets its own
|
|
176
|
+
// copy with independent referencedColumn and type properties.
|
|
177
|
+
relationalColumn = OrmUtils.cloneObject(relationalColumn);
|
|
178
|
+
}
|
|
172
179
|
relationalColumn.referencedColumn = referencedColumn; // its important to set it here because we need to set referenced column for user defined join column
|
|
173
180
|
relationalColumn.type = referencedColumn.type; // also since types of relational column and join column must be equal we override user defined column type
|
|
174
181
|
relationalColumn.relationMetadata = relation;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../browser/src/metadata-builder/RelationJoinColumnBuilder.ts"],"names":[],"mappings":"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","file":"RelationJoinColumnBuilder.js","sourcesContent":["import { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { UniqueMetadata } from \"../metadata/UniqueMetadata\"\nimport { ForeignKeyMetadata } from \"../metadata/ForeignKeyMetadata\"\nimport { RelationMetadata } from \"../metadata/RelationMetadata\"\nimport { JoinColumnMetadataArgs } from \"../metadata-args/JoinColumnMetadataArgs\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { TypeORMError } from \"../error\"\nimport { DriverUtils } from \"../driver/DriverUtils\"\n\n/**\n * Builds join column for the many-to-one and one-to-one owner relations.\n *\n * Cases it should cover:\n * 1. when join column is set with custom name and without referenced column name\n * we need automatically set referenced column name - primary ids by default\n * @JoinColumn({ name: \"custom_name\" })\n *\n * 2. when join column is set with only referenced column name\n * we need automatically set join column name - relation name + referenced column name\n * @JoinColumn({ referencedColumnName: \"title\" })\n *\n * 3. when join column is set without both referenced column name and join column name\n * we need to automatically set both of them\n * @JoinColumn()\n *\n * 4. when join column is not set at all (as in case of @ManyToOne relation)\n * we need to create join column for it with proper referenced column name and join column name\n *\n * 5. when multiple join columns set none of referencedColumnName and name can be optional\n * both options are required\n * @JoinColumn([\n * { name: \"category_title\", referencedColumnName: \"type\" },\n * { name: \"category_title\", referencedColumnName: \"name\" },\n * ])\n *\n * Since for many-to-one relations having JoinColumn decorator is not required,\n * we need to go through each many-to-one relation without join column decorator set\n * and create join column metadata args for them.\n */\nexport class RelationJoinColumnBuilder {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private connection: DataSource) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Builds a foreign key of the many-to-one or one-to-one owner relations.\n */\n build(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n ): {\n foreignKey: ForeignKeyMetadata | undefined\n columns: ColumnMetadata[]\n uniqueConstraint: UniqueMetadata | undefined\n } {\n const referencedColumns = this.collectReferencedColumns(\n joinColumns,\n relation,\n )\n const columns = this.collectColumns(\n joinColumns,\n relation,\n referencedColumns,\n )\n if (!referencedColumns.length || !relation.createForeignKeyConstraints)\n return {\n foreignKey: undefined,\n columns,\n uniqueConstraint: undefined,\n } // this case is possible for one-to-one non owning side and relations with createForeignKeyConstraints = false\n\n const foreignKey = new ForeignKeyMetadata({\n name: joinColumns[0]?.foreignKeyConstraintName,\n entityMetadata: relation.entityMetadata,\n referencedEntityMetadata: relation.inverseEntityMetadata,\n namingStrategy: this.connection.namingStrategy,\n columns,\n referencedColumns,\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n deferrable: relation.deferrable,\n })\n\n // SQL requires UNIQUE/PK constraints on columns referenced by a FK\n // Skip creating the unique constraint for the referenced columns if\n // they are already contained in the PK of the referenced entity\n if (\n columns.every((column) => column.isPrimary) ||\n !relation.isOneToOne\n ) {\n return { foreignKey, columns, uniqueConstraint: undefined }\n }\n\n const uniqueConstraint = new UniqueMetadata({\n entityMetadata: relation.entityMetadata,\n columns: foreignKey.columns,\n args: {\n name: this.connection.namingStrategy.relationConstraintName(\n relation.entityMetadata.tableName,\n foreignKey.columns.map((column) => column.databaseName),\n ),\n target: relation.entityMetadata.target,\n },\n })\n uniqueConstraint.build(this.connection.namingStrategy)\n\n return { foreignKey, columns, uniqueConstraint }\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Collects referenced columns from the given join column args.\n */\n protected collectReferencedColumns(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n ): ColumnMetadata[] {\n const hasAnyReferencedColumnName = joinColumns.find(\n (joinColumnArgs) => !!joinColumnArgs.referencedColumnName,\n )\n const manyToOneWithoutJoinColumn =\n joinColumns.length === 0 && relation.isManyToOne\n const hasJoinColumnWithoutAnyReferencedColumnName =\n joinColumns.length > 0 && !hasAnyReferencedColumnName\n\n if (\n manyToOneWithoutJoinColumn ||\n hasJoinColumnWithoutAnyReferencedColumnName\n ) {\n // covers case3 and case1\n return relation.inverseEntityMetadata.primaryColumns\n } else {\n // cases with referenced columns defined\n return joinColumns.map((joinColumn) => {\n const referencedColumn =\n relation.inverseEntityMetadata.ownColumns.find(\n (column) =>\n column.propertyName ===\n joinColumn.referencedColumnName,\n ) // todo: can we also search in relations?\n if (!referencedColumn)\n throw new TypeORMError(\n `Referenced column ${joinColumn.referencedColumnName} was not found in entity ${relation.inverseEntityMetadata.name}`,\n )\n\n return referencedColumn\n })\n }\n }\n\n /**\n * Collects columns from the given join column args.\n */\n private collectColumns(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n referencedColumns: ColumnMetadata[],\n ): ColumnMetadata[] {\n return referencedColumns.map((referencedColumn) => {\n // in the case if relation has join column with only name set we need this check\n const joinColumnMetadataArg = joinColumns.find((joinColumn) => {\n return (\n (!joinColumn.referencedColumnName ||\n joinColumn.referencedColumnName ===\n referencedColumn.propertyName) &&\n !!joinColumn.name\n )\n })\n const joinColumnName = joinColumnMetadataArg\n ? joinColumnMetadataArg.name\n : this.connection.namingStrategy.joinColumnName(\n relation.propertyName,\n referencedColumn.propertyName,\n )\n\n const relationalColumns = relation.embeddedMetadata\n ? relation.embeddedMetadata.columns\n : relation.entityMetadata.ownColumns\n let relationalColumn = relationalColumns.find(\n (column) =>\n column.databaseNameWithoutPrefixes === joinColumnName,\n )\n if (!relationalColumn) {\n relationalColumn = new ColumnMetadata({\n connection: this.connection,\n entityMetadata: relation.entityMetadata,\n embeddedMetadata: relation.embeddedMetadata,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName: relation.propertyName,\n options: {\n name: joinColumnName,\n type: referencedColumn.type,\n length:\n !referencedColumn.length &&\n (DriverUtils.isMySQLFamily(\n this.connection.driver,\n ) ||\n this.connection.driver.options.type ===\n \"aurora-mysql\") &&\n // some versions of mariadb support the column type and should not try to provide the length property\n this.connection.driver.normalizeType(\n referencedColumn,\n ) !== \"uuid\" &&\n (referencedColumn.generationStrategy ===\n \"uuid\" ||\n referencedColumn.type === \"uuid\")\n ? \"36\"\n : referencedColumn.length, // fix https://github.com/typeorm/typeorm/issues/3604\n width: referencedColumn.width,\n charset: referencedColumn.charset,\n collation: referencedColumn.collation,\n precision: referencedColumn.precision,\n scale: referencedColumn.scale,\n zerofill: referencedColumn.zerofill,\n unsigned: referencedColumn.unsigned,\n comment: referencedColumn.comment,\n enum: referencedColumn.enum,\n enumName: referencedColumn.enumName,\n primary: relation.isPrimary,\n nullable: relation.isNullable,\n },\n },\n })\n relation.entityMetadata.registerColumn(relationalColumn)\n }\n relationalColumn.referencedColumn = referencedColumn // its important to set it here because we need to set referenced column for user defined join column\n relationalColumn.type = referencedColumn.type // also since types of relational column and join column must be equal we override user defined column type\n relationalColumn.relationMetadata = relation\n relationalColumn.build(this.connection)\n return relationalColumn\n })\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../browser/src/metadata-builder/RelationJoinColumnBuilder.ts"],"names":[],"mappings":"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","file":"RelationJoinColumnBuilder.js","sourcesContent":["import { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { UniqueMetadata } from \"../metadata/UniqueMetadata\"\nimport { ForeignKeyMetadata } from \"../metadata/ForeignKeyMetadata\"\nimport { RelationMetadata } from \"../metadata/RelationMetadata\"\nimport { JoinColumnMetadataArgs } from \"../metadata-args/JoinColumnMetadataArgs\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { TypeORMError } from \"../error\"\nimport { DriverUtils } from \"../driver/DriverUtils\"\nimport { OrmUtils } from \"../util/OrmUtils\"\n\n/**\n * Builds join column for the many-to-one and one-to-one owner relations.\n *\n * Cases it should cover:\n * 1. when join column is set with custom name and without referenced column name\n * we need automatically set referenced column name - primary ids by default\n * @JoinColumn({ name: \"custom_name\" })\n *\n * 2. when join column is set with only referenced column name\n * we need automatically set join column name - relation name + referenced column name\n * @JoinColumn({ referencedColumnName: \"title\" })\n *\n * 3. when join column is set without both referenced column name and join column name\n * we need to automatically set both of them\n * @JoinColumn()\n *\n * 4. when join column is not set at all (as in case of @ManyToOne relation)\n * we need to create join column for it with proper referenced column name and join column name\n *\n * 5. when multiple join columns set none of referencedColumnName and name can be optional\n * both options are required\n * @JoinColumn([\n * { name: \"category_title\", referencedColumnName: \"type\" },\n * { name: \"category_title\", referencedColumnName: \"name\" },\n * ])\n *\n * Since for many-to-one relations having JoinColumn decorator is not required,\n * we need to go through each many-to-one relation without join column decorator set\n * and create join column metadata args for them.\n */\nexport class RelationJoinColumnBuilder {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private connection: DataSource) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Builds a foreign key of the many-to-one or one-to-one owner relations.\n */\n build(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n ): {\n foreignKey: ForeignKeyMetadata | undefined\n columns: ColumnMetadata[]\n uniqueConstraint: UniqueMetadata | undefined\n } {\n const referencedColumns = this.collectReferencedColumns(\n joinColumns,\n relation,\n )\n const columns = this.collectColumns(\n joinColumns,\n relation,\n referencedColumns,\n )\n if (!referencedColumns.length || !relation.createForeignKeyConstraints)\n return {\n foreignKey: undefined,\n columns,\n uniqueConstraint: undefined,\n } // this case is possible for one-to-one non owning side and relations with createForeignKeyConstraints = false\n\n const foreignKey = new ForeignKeyMetadata({\n name: joinColumns[0]?.foreignKeyConstraintName,\n entityMetadata: relation.entityMetadata,\n referencedEntityMetadata: relation.inverseEntityMetadata,\n namingStrategy: this.connection.namingStrategy,\n columns,\n referencedColumns,\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n deferrable: relation.deferrable,\n })\n\n // SQL requires UNIQUE/PK constraints on columns referenced by a FK\n // Skip creating the unique constraint for the referenced columns if\n // they are already contained in the PK of the referenced entity\n if (\n columns.every((column) => column.isPrimary) ||\n !relation.isOneToOne\n ) {\n return { foreignKey, columns, uniqueConstraint: undefined }\n }\n\n const uniqueConstraint = new UniqueMetadata({\n entityMetadata: relation.entityMetadata,\n columns: foreignKey.columns,\n args: {\n name: this.connection.namingStrategy.relationConstraintName(\n relation.entityMetadata.tableName,\n foreignKey.columns.map((column) => column.databaseName),\n ),\n target: relation.entityMetadata.target,\n },\n })\n uniqueConstraint.build(this.connection.namingStrategy)\n\n return { foreignKey, columns, uniqueConstraint }\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Collects referenced columns from the given join column args.\n */\n protected collectReferencedColumns(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n ): ColumnMetadata[] {\n const hasAnyReferencedColumnName = joinColumns.find(\n (joinColumnArgs) => !!joinColumnArgs.referencedColumnName,\n )\n const manyToOneWithoutJoinColumn =\n joinColumns.length === 0 && relation.isManyToOne\n const hasJoinColumnWithoutAnyReferencedColumnName =\n joinColumns.length > 0 && !hasAnyReferencedColumnName\n\n if (\n manyToOneWithoutJoinColumn ||\n hasJoinColumnWithoutAnyReferencedColumnName\n ) {\n // covers case3 and case1\n return relation.inverseEntityMetadata.primaryColumns\n } else {\n // cases with referenced columns defined\n return joinColumns.map((joinColumn) => {\n const referencedColumn =\n relation.inverseEntityMetadata.ownColumns.find(\n (column) =>\n column.propertyName ===\n joinColumn.referencedColumnName,\n ) // todo: can we also search in relations?\n if (!referencedColumn)\n throw new TypeORMError(\n `Referenced column ${joinColumn.referencedColumnName} was not found in entity ${relation.inverseEntityMetadata.name}`,\n )\n\n return referencedColumn\n })\n }\n }\n\n /**\n * Collects columns from the given join column args.\n */\n private collectColumns(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n referencedColumns: ColumnMetadata[],\n ): ColumnMetadata[] {\n return referencedColumns.map((referencedColumn) => {\n // in the case if relation has join column with only name set we need this check\n const joinColumnMetadataArg = joinColumns.find((joinColumn) => {\n return (\n (!joinColumn.referencedColumnName ||\n joinColumn.referencedColumnName ===\n referencedColumn.propertyName) &&\n !!joinColumn.name\n )\n })\n const joinColumnName = joinColumnMetadataArg\n ? joinColumnMetadataArg.name\n : this.connection.namingStrategy.joinColumnName(\n relation.propertyName,\n referencedColumn.propertyName,\n )\n\n const relationalColumns = relation.embeddedMetadata\n ? relation.embeddedMetadata.columns\n : relation.entityMetadata.ownColumns\n let relationalColumn = relationalColumns.find(\n (column) =>\n column.databaseNameWithoutPrefixes === joinColumnName,\n )\n if (!relationalColumn) {\n relationalColumn = new ColumnMetadata({\n connection: this.connection,\n entityMetadata: relation.entityMetadata,\n embeddedMetadata: relation.embeddedMetadata,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName: relation.propertyName,\n options: {\n name: joinColumnName,\n type: referencedColumn.type,\n length:\n !referencedColumn.length &&\n (DriverUtils.isMySQLFamily(\n this.connection.driver,\n ) ||\n this.connection.driver.options.type ===\n \"aurora-mysql\") &&\n // some versions of mariadb support the column type and should not try to provide the length property\n this.connection.driver.normalizeType(\n referencedColumn,\n ) !== \"uuid\" &&\n (referencedColumn.generationStrategy ===\n \"uuid\" ||\n referencedColumn.type === \"uuid\")\n ? \"36\"\n : referencedColumn.length, // fix https://github.com/typeorm/typeorm/issues/3604\n width: referencedColumn.width,\n charset: referencedColumn.charset,\n collation: referencedColumn.collation,\n precision: referencedColumn.precision,\n scale: referencedColumn.scale,\n zerofill: referencedColumn.zerofill,\n unsigned: referencedColumn.unsigned,\n comment: referencedColumn.comment,\n enum: referencedColumn.enum,\n enumName: referencedColumn.enumName,\n primary: relation.isPrimary,\n nullable: relation.isNullable,\n },\n },\n })\n relation.entityMetadata.registerColumn(relationalColumn)\n } else if (relationalColumn.referencedColumn) {\n // Clone the relational column to prevent modifying the original when multiple\n // relations reference the same column. This ensures each relation gets its own\n // copy with independent referencedColumn and type properties.\n relationalColumn = OrmUtils.cloneObject(relationalColumn)\n }\n relationalColumn.referencedColumn = referencedColumn // its important to set it here because we need to set referenced column for user defined join column\n relationalColumn.type = referencedColumn.type // also since types of relational column and join column must be equal we override user defined column type\n relationalColumn.relationMetadata = relation\n relationalColumn.build(this.connection)\n return relationalColumn\n })\n }\n}\n"],"sourceRoot":".."}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { DateUtils } from "../util/DateUtils";
|
|
2
|
-
import { OrmUtils } from "../util/OrmUtils";
|
|
3
1
|
import { ApplyValueTransformers } from "../util/ApplyValueTransformers";
|
|
2
|
+
import { DateUtils } from "../util/DateUtils";
|
|
4
3
|
import { ObjectUtils } from "../util/ObjectUtils";
|
|
4
|
+
import { OrmUtils } from "../util/OrmUtils";
|
|
5
5
|
/**
|
|
6
6
|
* Finds what columns are changed in the subject entities.
|
|
7
7
|
*/
|
|
@@ -59,8 +59,8 @@ export class SubjectChangedColumnsComputer {
|
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
61
61
|
let normalizedValue = entityValue;
|
|
62
|
-
// normalize special values to make proper comparision
|
|
63
|
-
if (entityValue !== null) {
|
|
62
|
+
// if both values are not null, normalize special values to make proper comparision
|
|
63
|
+
if (entityValue !== null && databaseValue !== null) {
|
|
64
64
|
switch (column.type) {
|
|
65
65
|
case "date":
|
|
66
66
|
normalizedValue = column.isArray
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../browser/src/persistence/SubjectChangedColumnsComputer.ts"],"names":[],"mappings":"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","file":"SubjectChangedColumnsComputer.js","sourcesContent":["import { Subject } from \"./Subject\"\nimport { DateUtils } from \"../util/DateUtils\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { OrmUtils } from \"../util/OrmUtils\"\nimport { ApplyValueTransformers } from \"../util/ApplyValueTransformers\"\nimport { ObjectUtils } from \"../util/ObjectUtils\"\n\n/**\n * Finds what columns are changed in the subject entities.\n */\nexport class SubjectChangedColumnsComputer {\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Finds what columns are changed in the subject entities.\n */\n compute(subjects: Subject[]) {\n subjects.forEach((subject) => {\n this.computeDiffColumns(subject)\n this.computeDiffRelationalColumns(subjects, subject)\n })\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Differentiate columns from the updated entity and entity stored in the database.\n */\n protected computeDiffColumns(subject: Subject): void {\n // if there is no persisted entity then nothing to compute changed in it\n if (!subject.entity) return\n\n subject.metadata.columns.forEach((column) => {\n // ignore special columns\n if (\n column.isVirtual ||\n column.isDiscriminator // ||\n // column.isUpdateDate ||\n // column.isVersion ||\n // column.isCreateDate\n )\n return\n\n const changeMap = subject.changeMaps.find(\n (changeMap) => changeMap.column === column,\n )\n if (changeMap) {\n subject.changeMaps.splice(\n subject.changeMaps.indexOf(changeMap),\n 1,\n )\n }\n\n // get user provided value - column value from the user provided persisted entity\n const entityValue = column.getEntityValue(subject.entity!)\n\n // we don't perform operation over undefined properties (but we DO need null properties!)\n if (entityValue === undefined) return\n\n // if there is no database entity then all columns are treated as new, e.g. changed\n if (subject.databaseEntity) {\n // skip transform database value for json / jsonb for comparison later on\n const shouldTransformDatabaseEntity =\n column.type !== \"json\" && column.type !== \"jsonb\"\n\n // get database value of the column\n let databaseValue = column.getEntityValue(\n subject.databaseEntity,\n shouldTransformDatabaseEntity,\n )\n\n // filter out \"relational columns\" only in the case if there is a relation object in entity\n if (column.relationMetadata) {\n const value = column.relationMetadata.getEntityValue(\n subject.entity!,\n )\n if (value !== null && value !== undefined) return\n }\n let normalizedValue = entityValue\n // normalize special values to make proper comparision\n if (entityValue !== null) {\n switch (column.type) {\n case \"date\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToDateString(date),\n )\n : DateUtils.mixedDateToDateString(entityValue)\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToDateString(date),\n )\n : DateUtils.mixedDateToDateString(databaseValue)\n break\n\n case \"time\":\n case \"time with time zone\":\n case \"time without time zone\":\n case \"timetz\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToTimeString(date),\n )\n : DateUtils.mixedDateToTimeString(entityValue)\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToTimeString(date),\n )\n : DateUtils.mixedDateToTimeString(databaseValue)\n break\n\n case \"datetime\":\n case \"datetime2\":\n case Date:\n case \"timestamp\":\n case \"timestamp without time zone\":\n case \"timestamp with time zone\":\n case \"timestamp with local time zone\":\n case \"timestamptz\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToUtcDatetimeString(\n date,\n ),\n )\n : DateUtils.mixedDateToUtcDatetimeString(\n entityValue,\n )\n\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToUtcDatetimeString(\n date,\n ),\n )\n : DateUtils.mixedDateToUtcDatetimeString(\n databaseValue,\n )\n\n break\n\n case \"json\":\n case \"jsonb\":\n // JSON.stringify doesn't work because postgresql sorts jsonb before save.\n // If you try to save json '[{\"messages\": \"\", \"attribute Key\": \"\", \"level\":\"\"}] ' as jsonb,\n // then postgresql will save it as '[{\"level\": \"\", \"message\":\"\", \"attributeKey\": \"\"}]'\n if (\n OrmUtils.deepCompare(entityValue, databaseValue)\n )\n return\n break\n\n case \"simple-array\":\n normalizedValue =\n DateUtils.simpleArrayToString(entityValue)\n databaseValue =\n DateUtils.simpleArrayToString(databaseValue)\n break\n case \"simple-enum\":\n normalizedValue =\n DateUtils.simpleEnumToString(entityValue)\n databaseValue =\n DateUtils.simpleEnumToString(databaseValue)\n break\n case \"simple-json\":\n normalizedValue =\n DateUtils.simpleJsonToString(entityValue)\n databaseValue =\n DateUtils.simpleJsonToString(databaseValue)\n break\n }\n\n if (column.transformer) {\n normalizedValue = ApplyValueTransformers.transformTo(\n column.transformer,\n entityValue,\n )\n }\n }\n\n // if value is not changed - then do nothing\n if (column.isArray) {\n if (OrmUtils.deepCompare(normalizedValue, databaseValue))\n return\n } else if (\n Buffer.isBuffer(normalizedValue) &&\n Buffer.isBuffer(databaseValue)\n ) {\n if (normalizedValue.equals(databaseValue)) {\n return\n }\n } else {\n if (normalizedValue === databaseValue) return\n }\n }\n\n if (!subject.diffColumns.includes(column))\n subject.diffColumns.push(column)\n\n subject.changeMaps.push({\n column: column,\n value: entityValue,\n })\n })\n }\n\n /**\n * Difference columns of the owning one-to-one and many-to-one columns.\n */\n protected computeDiffRelationalColumns(\n allSubjects: Subject[],\n subject: Subject,\n ): void {\n // if there is no persisted entity then nothing to compute changed in it\n if (!subject.entity) return\n\n subject.metadata.relationsWithJoinColumns.forEach((relation) => {\n // get the related entity from the persisted entity\n let relatedEntity = relation.getEntityValue(subject.entity!)\n\n // we don't perform operation over undefined properties (but we DO need null properties!)\n if (relatedEntity === undefined) return\n\n // if there is no database entity then all relational columns are treated as new, e.g. changed\n if (subject.databaseEntity) {\n // here we cover two scenarios:\n // 1. related entity can be another entity which is natural way\n // 2. related entity can be just an entity id\n // if relation entity is just a relation id set (for example post.tag = 1)\n // then we create an id map from it to make a proper comparision\n let relatedEntityRelationIdMap: ObjectLiteral = relatedEntity\n if (\n relatedEntityRelationIdMap !== null &&\n ObjectUtils.isObject(relatedEntityRelationIdMap)\n )\n relatedEntityRelationIdMap = relation.getRelationIdMap(\n relatedEntityRelationIdMap,\n )!\n\n // get database related entity. Since loadRelationIds are used on databaseEntity\n // related entity will contain only its relation ids\n const databaseRelatedEntityRelationIdMap =\n relation.getEntityValue(subject.databaseEntity)\n\n // if relation ids are equal then we don't need to update anything\n const areRelatedIdsEqual = OrmUtils.compareIds(\n relatedEntityRelationIdMap,\n databaseRelatedEntityRelationIdMap,\n )\n if (areRelatedIdsEqual) {\n return\n } else {\n subject.diffRelations.push(relation)\n }\n }\n\n // if there is an inserted subject for the related entity of the persisted entity then use it as related entity\n // this code is used for related entities without ids to be properly inserted (and then updated if needed)\n const valueSubject = allSubjects.find(\n (subject) =>\n subject.mustBeInserted && subject.entity === relatedEntity,\n )\n if (valueSubject) relatedEntity = valueSubject\n\n // find if there is already a relation to be changed\n const changeMap = subject.changeMaps.find(\n (changeMap) => changeMap.relation === relation,\n )\n if (changeMap) {\n // and update its value if it was found\n changeMap.value = relatedEntity\n } else {\n // if it wasn't found add a new relation for change\n subject.changeMaps.push({\n relation: relation,\n value: relatedEntity,\n })\n }\n })\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../browser/src/persistence/SubjectChangedColumnsComputer.ts"],"names":[],"mappings":"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","file":"SubjectChangedColumnsComputer.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { ApplyValueTransformers } from \"../util/ApplyValueTransformers\"\nimport { DateUtils } from \"../util/DateUtils\"\nimport { ObjectUtils } from \"../util/ObjectUtils\"\nimport { OrmUtils } from \"../util/OrmUtils\"\nimport { Subject } from \"./Subject\"\n\n/**\n * Finds what columns are changed in the subject entities.\n */\nexport class SubjectChangedColumnsComputer {\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Finds what columns are changed in the subject entities.\n */\n compute(subjects: Subject[]) {\n subjects.forEach((subject) => {\n this.computeDiffColumns(subject)\n this.computeDiffRelationalColumns(subjects, subject)\n })\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Differentiate columns from the updated entity and entity stored in the database.\n */\n protected computeDiffColumns(subject: Subject): void {\n // if there is no persisted entity then nothing to compute changed in it\n if (!subject.entity) return\n\n subject.metadata.columns.forEach((column) => {\n // ignore special columns\n if (\n column.isVirtual ||\n column.isDiscriminator // ||\n // column.isUpdateDate ||\n // column.isVersion ||\n // column.isCreateDate\n )\n return\n\n const changeMap = subject.changeMaps.find(\n (changeMap) => changeMap.column === column,\n )\n if (changeMap) {\n subject.changeMaps.splice(\n subject.changeMaps.indexOf(changeMap),\n 1,\n )\n }\n\n // get user provided value - column value from the user provided persisted entity\n const entityValue = column.getEntityValue(subject.entity!)\n\n // we don't perform operation over undefined properties (but we DO need null properties!)\n if (entityValue === undefined) return\n\n // if there is no database entity then all columns are treated as new, e.g. changed\n if (subject.databaseEntity) {\n // skip transform database value for json / jsonb for comparison later on\n const shouldTransformDatabaseEntity =\n column.type !== \"json\" && column.type !== \"jsonb\"\n\n // get database value of the column\n let databaseValue = column.getEntityValue(\n subject.databaseEntity,\n shouldTransformDatabaseEntity,\n )\n\n // filter out \"relational columns\" only in the case if there is a relation object in entity\n if (column.relationMetadata) {\n const value = column.relationMetadata.getEntityValue(\n subject.entity!,\n )\n if (value !== null && value !== undefined) return\n }\n let normalizedValue = entityValue\n // if both values are not null, normalize special values to make proper comparision\n if (entityValue !== null && databaseValue !== null) {\n switch (column.type) {\n case \"date\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToDateString(date),\n )\n : DateUtils.mixedDateToDateString(entityValue)\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToDateString(date),\n )\n : DateUtils.mixedDateToDateString(databaseValue)\n break\n\n case \"time\":\n case \"time with time zone\":\n case \"time without time zone\":\n case \"timetz\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToTimeString(date),\n )\n : DateUtils.mixedDateToTimeString(entityValue)\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToTimeString(date),\n )\n : DateUtils.mixedDateToTimeString(databaseValue)\n break\n\n case \"datetime\":\n case \"datetime2\":\n case Date:\n case \"timestamp\":\n case \"timestamp without time zone\":\n case \"timestamp with time zone\":\n case \"timestamp with local time zone\":\n case \"timestamptz\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToUtcDatetimeString(\n date,\n ),\n )\n : DateUtils.mixedDateToUtcDatetimeString(\n entityValue,\n )\n\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToUtcDatetimeString(\n date,\n ),\n )\n : DateUtils.mixedDateToUtcDatetimeString(\n databaseValue,\n )\n\n break\n\n case \"json\":\n case \"jsonb\":\n // JSON.stringify doesn't work because postgresql sorts jsonb before save.\n // If you try to save json '[{\"messages\": \"\", \"attribute Key\": \"\", \"level\":\"\"}] ' as jsonb,\n // then postgresql will save it as '[{\"level\": \"\", \"message\":\"\", \"attributeKey\": \"\"}]'\n if (\n OrmUtils.deepCompare(entityValue, databaseValue)\n )\n return\n break\n\n case \"simple-array\":\n normalizedValue =\n DateUtils.simpleArrayToString(entityValue)\n databaseValue =\n DateUtils.simpleArrayToString(databaseValue)\n break\n case \"simple-enum\":\n normalizedValue =\n DateUtils.simpleEnumToString(entityValue)\n databaseValue =\n DateUtils.simpleEnumToString(databaseValue)\n break\n case \"simple-json\":\n normalizedValue =\n DateUtils.simpleJsonToString(entityValue)\n databaseValue =\n DateUtils.simpleJsonToString(databaseValue)\n break\n }\n\n if (column.transformer) {\n normalizedValue = ApplyValueTransformers.transformTo(\n column.transformer,\n entityValue,\n )\n }\n }\n\n // if value is not changed - then do nothing\n if (column.isArray) {\n if (OrmUtils.deepCompare(normalizedValue, databaseValue))\n return\n } else if (\n Buffer.isBuffer(normalizedValue) &&\n Buffer.isBuffer(databaseValue)\n ) {\n if (normalizedValue.equals(databaseValue)) {\n return\n }\n } else {\n if (normalizedValue === databaseValue) return\n }\n }\n\n if (!subject.diffColumns.includes(column))\n subject.diffColumns.push(column)\n\n subject.changeMaps.push({\n column: column,\n value: entityValue,\n })\n })\n }\n\n /**\n * Difference columns of the owning one-to-one and many-to-one columns.\n */\n protected computeDiffRelationalColumns(\n allSubjects: Subject[],\n subject: Subject,\n ): void {\n // if there is no persisted entity then nothing to compute changed in it\n if (!subject.entity) return\n\n subject.metadata.relationsWithJoinColumns.forEach((relation) => {\n // get the related entity from the persisted entity\n let relatedEntity = relation.getEntityValue(subject.entity!)\n\n // we don't perform operation over undefined properties (but we DO need null properties!)\n if (relatedEntity === undefined) return\n\n // if there is no database entity then all relational columns are treated as new, e.g. changed\n if (subject.databaseEntity) {\n // here we cover two scenarios:\n // 1. related entity can be another entity which is natural way\n // 2. related entity can be just an entity id\n // if relation entity is just a relation id set (for example post.tag = 1)\n // then we create an id map from it to make a proper comparision\n let relatedEntityRelationIdMap: ObjectLiteral = relatedEntity\n if (\n relatedEntityRelationIdMap !== null &&\n ObjectUtils.isObject(relatedEntityRelationIdMap)\n )\n relatedEntityRelationIdMap = relation.getRelationIdMap(\n relatedEntityRelationIdMap,\n )!\n\n // get database related entity. Since loadRelationIds are used on databaseEntity\n // related entity will contain only its relation ids\n const databaseRelatedEntityRelationIdMap =\n relation.getEntityValue(subject.databaseEntity)\n\n // if relation ids are equal then we don't need to update anything\n const areRelatedIdsEqual = OrmUtils.compareIds(\n relatedEntityRelationIdMap,\n databaseRelatedEntityRelationIdMap,\n )\n if (areRelatedIdsEqual) {\n return\n } else {\n subject.diffRelations.push(relation)\n }\n }\n\n // if there is an inserted subject for the related entity of the persisted entity then use it as related entity\n // this code is used for related entities without ids to be properly inserted (and then updated if needed)\n const valueSubject = allSubjects.find(\n (subject) =>\n subject.mustBeInserted && subject.entity === relatedEntity,\n )\n if (valueSubject) relatedEntity = valueSubject\n\n // find if there is already a relation to be changed\n const changeMap = subject.changeMaps.find(\n (changeMap) => changeMap.relation === relation,\n )\n if (changeMap) {\n // and update its value if it was found\n changeMap.value = relatedEntity\n } else {\n // if it wasn't found add a new relation for change\n subject.changeMaps.push({\n relation: relation,\n value: relatedEntity,\n })\n }\n })\n }\n}\n"],"sourceRoot":".."}
|
|
@@ -16,6 +16,10 @@ export declare class OrmUtils {
|
|
|
16
16
|
* Deep Object.assign.
|
|
17
17
|
*/
|
|
18
18
|
static mergeDeep(target: any, ...sources: any[]): any;
|
|
19
|
+
/**
|
|
20
|
+
* Creates a shallow copy of the object, without invoking the constructor
|
|
21
|
+
*/
|
|
22
|
+
static cloneObject<T extends object>(object: T): T;
|
|
19
23
|
/**
|
|
20
24
|
* Deep compare objects.
|
|
21
25
|
*
|
package/browser/util/OrmUtils.js
CHANGED
|
@@ -59,6 +59,15 @@ export class OrmUtils {
|
|
|
59
59
|
}
|
|
60
60
|
return target;
|
|
61
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Creates a shallow copy of the object, without invoking the constructor
|
|
64
|
+
*/
|
|
65
|
+
static cloneObject(object) {
|
|
66
|
+
if (object === null || object === undefined) {
|
|
67
|
+
return object;
|
|
68
|
+
}
|
|
69
|
+
return Object.assign(Object.create(Object.getPrototypeOf(object)), object);
|
|
70
|
+
}
|
|
62
71
|
/**
|
|
63
72
|
* Deep compare objects.
|
|
64
73
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../browser/src/util/OrmUtils.ts"],"names":[],"mappings":"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","file":"OrmUtils.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport {\n PrimitiveCriteria,\n SinglePrimitiveCriteria,\n} from \"../common/PrimitiveCriteria\"\n\nexport class OrmUtils {\n // -------------------------------------------------------------------------\n // Public methods\n // -------------------------------------------------------------------------\n\n /**\n * Chunks array into pieces.\n */\n public static chunk<T>(array: T[], size: number): T[][] {\n return Array.from(Array(Math.ceil(array.length / size)), (_, i) => {\n return array.slice(i * size, i * size + size)\n })\n }\n\n public static splitClassesAndStrings<T>(\n classesAndStrings: (string | T)[],\n ): [T[], string[]] {\n return [\n classesAndStrings.filter(\n (cls): cls is T => typeof cls !== \"string\",\n ),\n classesAndStrings.filter(\n (str): str is string => typeof str === \"string\",\n ),\n ]\n }\n\n public static groupBy<T, R>(\n array: T[],\n propertyCallback: (item: T) => R,\n ): { id: R; items: T[] }[] {\n return array.reduce((groupedArray, value) => {\n const key = propertyCallback(value)\n let grouped = groupedArray.find((i) => i.id === key)\n if (!grouped) {\n grouped = { id: key, items: [] }\n groupedArray.push(grouped)\n }\n grouped.items.push(value)\n return groupedArray\n }, [] as Array<{ id: R; items: T[] }>)\n }\n\n public static uniq<T>(array: T[], criteria?: (item: T) => any): T[]\n public static uniq<T, K extends keyof T>(array: T[], property: K): T[]\n public static uniq<T, K extends keyof T>(\n array: T[],\n criteriaOrProperty?: ((item: T) => any) | K,\n ): T[] {\n return array.reduce((uniqueArray, item) => {\n let found: boolean = false\n if (typeof criteriaOrProperty === \"function\") {\n const itemValue = criteriaOrProperty(item)\n found = !!uniqueArray.find(\n (uniqueItem) =>\n criteriaOrProperty(uniqueItem) === itemValue,\n )\n } else if (typeof criteriaOrProperty === \"string\") {\n found = !!uniqueArray.find(\n (uniqueItem) =>\n uniqueItem[criteriaOrProperty] ===\n item[criteriaOrProperty],\n )\n } else {\n found = uniqueArray.indexOf(item) !== -1\n }\n\n if (!found) uniqueArray.push(item)\n\n return uniqueArray\n }, [] as T[])\n }\n\n /**\n * Deep Object.assign.\n */\n public static mergeDeep(target: any, ...sources: any[]): any {\n if (!sources.length) {\n return target\n }\n\n for (const source of sources) {\n OrmUtils.merge(target, source)\n }\n\n return target\n }\n\n /**\n * Deep compare objects.\n *\n * @see http://stackoverflow.com/a/1144249\n */\n public static deepCompare(...args: any[]): boolean {\n let i: any, l: any, leftChain: any, rightChain: any\n\n if (arguments.length < 1) {\n return true // Die silently? Don't know how to handle such case, please help...\n // throw \"Need two or more arguments to compare\";\n }\n\n for (i = 1, l = arguments.length; i < l; i++) {\n leftChain = [] // Todo: this can be cached\n rightChain = []\n\n if (\n !this.compare2Objects(\n leftChain,\n rightChain,\n arguments[0],\n arguments[i],\n )\n ) {\n return false\n }\n }\n\n return true\n }\n\n /**\n * Gets deeper value of object.\n */\n public static deepValue(obj: ObjectLiteral, path: string) {\n const segments = path.split(\".\")\n for (let i = 0, len = segments.length; i < len; i++) {\n obj = obj[segments[i]]\n }\n return obj\n }\n\n public static replaceEmptyObjectsWithBooleans(obj: any) {\n for (const key in obj) {\n if (obj[key] && typeof obj[key] === \"object\") {\n if (Object.keys(obj[key]).length === 0) {\n obj[key] = true\n } else {\n this.replaceEmptyObjectsWithBooleans(obj[key])\n }\n }\n }\n }\n\n public static propertyPathsToTruthyObject(paths: string[]) {\n const obj: any = {}\n for (const path of paths) {\n const props = path.split(\".\")\n if (!props.length) continue\n\n if (!obj[props[0]] || obj[props[0]] === true) {\n obj[props[0]] = {}\n }\n let recursiveChild = obj[props[0]]\n for (const [key, prop] of props.entries()) {\n if (key === 0) continue\n\n if (recursiveChild[prop]) {\n recursiveChild = recursiveChild[prop]\n } else if (key === props.length - 1) {\n recursiveChild[prop] = {}\n recursiveChild = null\n } else {\n recursiveChild[prop] = {}\n recursiveChild = recursiveChild[prop]\n }\n }\n }\n this.replaceEmptyObjectsWithBooleans(obj)\n return obj\n }\n\n /**\n * Check if two entity-id-maps are the same\n */\n public static compareIds(\n firstId: ObjectLiteral | undefined,\n secondId: ObjectLiteral | undefined,\n ): boolean {\n if (\n firstId === undefined ||\n firstId === null ||\n secondId === undefined ||\n secondId === null\n )\n return false\n\n // Optimized version for the common case\n if (\n ((typeof firstId.id === \"string\" &&\n typeof secondId.id === \"string\") ||\n (typeof firstId.id === \"number\" &&\n typeof secondId.id === \"number\")) &&\n Object.keys(firstId).length === 1 &&\n Object.keys(secondId).length === 1\n ) {\n return firstId.id === secondId.id\n }\n\n return OrmUtils.deepCompare(firstId, secondId)\n }\n\n /**\n * Transforms given value into boolean value.\n */\n public static toBoolean(value: any): boolean {\n if (typeof value === \"boolean\") return value\n\n if (typeof value === \"string\") return value === \"true\" || value === \"1\"\n\n if (typeof value === \"number\") return value > 0\n\n return false\n }\n\n /**\n * Composes an object from the given array of keys and values.\n */\n public static zipObject(keys: any[], values: any[]): ObjectLiteral {\n return keys.reduce((object, column, index) => {\n object[column] = values[index]\n return object\n }, {} as ObjectLiteral)\n }\n\n /**\n * Compares two arrays.\n */\n public static isArraysEqual(arr1: any[], arr2: any[]): boolean {\n if (arr1.length !== arr2.length) return false\n return arr1.every((element) => {\n return arr2.indexOf(element) !== -1\n })\n }\n\n public static areMutuallyExclusive<T>(...lists: T[][]): boolean {\n const haveSharedObjects = lists.some((list) => {\n const otherLists = lists.filter((otherList) => otherList !== list)\n return list.some((item) =>\n otherLists.some((otherList) => otherList.includes(item)),\n )\n })\n return !haveSharedObjects\n }\n\n /**\n * Parses the CHECK constraint on the specified column and returns\n * all values allowed by the constraint or undefined if the constraint\n * is not present.\n */\n public static parseSqlCheckExpression(\n sql: string,\n columnName: string,\n ): string[] | undefined {\n const enumMatch = sql.match(\n new RegExp(\n `\"${columnName}\" varchar CHECK\\\\s*\\\\(\\\\s*\"${columnName}\"\\\\s+IN\\\\s*`,\n ),\n )\n\n if (enumMatch && enumMatch.index) {\n const afterMatch = sql.substring(\n enumMatch.index + enumMatch[0].length,\n )\n\n // This is an enum\n // all enum values stored as a comma separated list\n const chars = afterMatch\n\n /**\n * * When outside quotes: empty string\n * * When inside single quotes: `'`\n */\n let currentQuotes = \"\"\n let nextValue = \"\"\n const enumValues: string[] = []\n for (let idx = 0; idx < chars.length; idx++) {\n const char = chars[idx]\n switch (char) {\n case \",\":\n if (currentQuotes == \"\") {\n enumValues.push(nextValue)\n nextValue = \"\"\n } else {\n nextValue += char\n }\n break\n case \"'\":\n if (currentQuotes == char) {\n const isNextCharQuote = chars[idx + 1] === char\n if (isNextCharQuote) {\n // double quote in sql should be treated as a\n // single quote that's part of the quoted string\n nextValue += char\n idx += 1 // skip that next quote\n } else {\n currentQuotes = \"\"\n }\n } else {\n currentQuotes = char\n }\n break\n case \")\":\n if (currentQuotes == \"\") {\n enumValues.push(nextValue)\n return enumValues\n } else {\n nextValue += char\n }\n break\n default:\n if (currentQuotes != \"\") {\n nextValue += char\n }\n }\n }\n }\n return undefined\n }\n\n /**\n * Checks if given criteria is null or empty.\n */\n public static isCriteriaNullOrEmpty(criteria: unknown): boolean {\n return (\n criteria === undefined ||\n criteria === null ||\n criteria === \"\" ||\n (Array.isArray(criteria) && criteria.length === 0) ||\n (this.isPlainObject(criteria) && Object.keys(criteria).length === 0)\n )\n }\n\n /**\n * Checks if given criteria is a primitive value.\n * Primitive values are strings, numbers and dates.\n */\n public static isSinglePrimitiveCriteria(\n criteria: unknown,\n ): criteria is SinglePrimitiveCriteria {\n return (\n typeof criteria === \"string\" ||\n typeof criteria === \"number\" ||\n criteria instanceof Date\n )\n }\n\n /**\n * Checks if given criteria is a primitive value or an array of primitive values.\n */\n public static isPrimitiveCriteria(\n criteria: unknown,\n ): criteria is PrimitiveCriteria {\n if (Array.isArray(criteria)) {\n return criteria.every((value) =>\n this.isSinglePrimitiveCriteria(value),\n )\n }\n\n return this.isSinglePrimitiveCriteria(criteria)\n }\n\n // -------------------------------------------------------------------------\n // Private methods\n // -------------------------------------------------------------------------\n\n private static compare2Objects(\n leftChain: any,\n rightChain: any,\n x: any,\n y: any,\n ) {\n let p\n\n // remember that NaN === NaN returns false\n // and isNaN(undefined) returns true\n if (Number.isNaN(x) && Number.isNaN(y)) return true\n\n // Compare primitives and functions.\n // Check if both arguments link to the same object.\n // Especially useful on the step where we compare prototypes\n if (x === y) return true\n\n // Unequal, but either is null or undefined (use case: jsonb comparison)\n // PR #3776, todo: add tests\n if (x === null || y === null || x === undefined || y === undefined)\n return false\n\n // Fix the buffer compare bug.\n // See: https://github.com/typeorm/typeorm/issues/3654\n if (\n (typeof x.equals === \"function\" ||\n typeof x.equals === \"function\") &&\n x.equals(y)\n )\n return true\n\n // Works in case when functions are created in constructor.\n // Comparing dates is a common scenario. Another built-ins?\n // We can even handle functions passed across iframes\n if (\n (typeof x === \"function\" && typeof y === \"function\") ||\n (x instanceof Date && y instanceof Date) ||\n (x instanceof RegExp && y instanceof RegExp) ||\n (typeof x === \"string\" && typeof y === \"string\") ||\n (typeof x === \"number\" && typeof y === \"number\")\n )\n return x.toString() === y.toString()\n\n // At last checking prototypes as good as we can\n if (!(typeof x === \"object\" && typeof y === \"object\")) return false\n\n if (\n Object.prototype.isPrototypeOf.call(x, y) ||\n Object.prototype.isPrototypeOf.call(y, x)\n )\n return false\n\n if (x.constructor !== y.constructor) return false\n\n if (x.prototype !== y.prototype) return false\n\n // Check for infinitive linking loops\n if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1)\n return false\n\n // Quick checking of one object being a subset of another.\n // todo: cache the structure of arguments[0] for performance\n for (p in y) {\n if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {\n return false\n } else if (typeof y[p] !== typeof x[p]) {\n return false\n }\n }\n\n for (p in x) {\n if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {\n return false\n } else if (typeof y[p] !== typeof x[p]) {\n return false\n }\n\n switch (typeof x[p]) {\n case \"object\":\n case \"function\":\n leftChain.push(x)\n rightChain.push(y)\n\n if (\n !this.compare2Objects(leftChain, rightChain, x[p], y[p])\n ) {\n return false\n }\n\n leftChain.pop()\n rightChain.pop()\n break\n\n default:\n if (x[p] !== y[p]) {\n return false\n }\n break\n }\n }\n\n return true\n }\n\n // Checks if it's an object made by Object.create(null), {} or new Object()\n private static isPlainObject(item: any) {\n if (item === null || item === undefined) {\n return false\n }\n\n return !item.constructor || item.constructor === Object\n }\n\n private static mergeArrayKey(\n target: any,\n key: number,\n value: any,\n memo: Map<any, any>,\n ) {\n // Have we seen this before? Prevent infinite recursion.\n if (memo.has(value)) {\n target[key] = memo.get(value)\n return\n }\n\n if (value instanceof Promise) {\n // Skip promises entirely.\n // This is a hold-over from the old code & is because we don't want to pull in\n // the lazy fields. Ideally we'd remove these promises via another function first\n // but for now we have to do it here.\n return\n }\n\n if (!this.isPlainObject(value) && !Array.isArray(value)) {\n target[key] = value\n return\n }\n\n if (!target[key]) {\n target[key] = Array.isArray(value) ? [] : {}\n }\n\n memo.set(value, target[key])\n this.merge(target[key], value, memo)\n memo.delete(value)\n }\n\n private static mergeObjectKey(\n target: any,\n key: string,\n value: any,\n memo: Map<any, any>,\n ) {\n // Have we seen this before? Prevent infinite recursion.\n if (memo.has(value)) {\n Object.assign(target, { [key]: memo.get(value) })\n return\n }\n\n if (value instanceof Promise) {\n // Skip promises entirely.\n // This is a hold-over from the old code & is because we don't want to pull in\n // the lazy fields. Ideally we'd remove these promises via another function first\n // but for now we have to do it here.\n return\n }\n\n if (!this.isPlainObject(value) && !Array.isArray(value)) {\n Object.assign(target, { [key]: value })\n return\n }\n\n if (!target[key]) {\n Object.assign(target, { [key]: Array.isArray(value) ? [] : {} })\n }\n\n memo.set(value, target[key])\n this.merge(target[key], value, memo)\n memo.delete(value)\n }\n\n private static merge(\n target: any,\n source: any,\n memo: Map<any, any> = new Map(),\n ): any {\n if (this.isPlainObject(target) && this.isPlainObject(source)) {\n for (const key of Object.keys(source)) {\n if (key === \"__proto__\") continue\n this.mergeObjectKey(target, key, source[key], memo)\n }\n }\n\n if (Array.isArray(target) && Array.isArray(source)) {\n for (let key = 0; key < source.length; key++) {\n this.mergeArrayKey(target, key, source[key], memo)\n }\n }\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../browser/src/util/OrmUtils.ts"],"names":[],"mappings":"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","file":"OrmUtils.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport {\n PrimitiveCriteria,\n SinglePrimitiveCriteria,\n} from \"../common/PrimitiveCriteria\"\n\nexport class OrmUtils {\n // -------------------------------------------------------------------------\n // Public methods\n // -------------------------------------------------------------------------\n\n /**\n * Chunks array into pieces.\n */\n public static chunk<T>(array: T[], size: number): T[][] {\n return Array.from(Array(Math.ceil(array.length / size)), (_, i) => {\n return array.slice(i * size, i * size + size)\n })\n }\n\n public static splitClassesAndStrings<T>(\n classesAndStrings: (string | T)[],\n ): [T[], string[]] {\n return [\n classesAndStrings.filter(\n (cls): cls is T => typeof cls !== \"string\",\n ),\n classesAndStrings.filter(\n (str): str is string => typeof str === \"string\",\n ),\n ]\n }\n\n public static groupBy<T, R>(\n array: T[],\n propertyCallback: (item: T) => R,\n ): { id: R; items: T[] }[] {\n return array.reduce((groupedArray, value) => {\n const key = propertyCallback(value)\n let grouped = groupedArray.find((i) => i.id === key)\n if (!grouped) {\n grouped = { id: key, items: [] }\n groupedArray.push(grouped)\n }\n grouped.items.push(value)\n return groupedArray\n }, [] as Array<{ id: R; items: T[] }>)\n }\n\n public static uniq<T>(array: T[], criteria?: (item: T) => any): T[]\n public static uniq<T, K extends keyof T>(array: T[], property: K): T[]\n public static uniq<T, K extends keyof T>(\n array: T[],\n criteriaOrProperty?: ((item: T) => any) | K,\n ): T[] {\n return array.reduce((uniqueArray, item) => {\n let found: boolean = false\n if (typeof criteriaOrProperty === \"function\") {\n const itemValue = criteriaOrProperty(item)\n found = !!uniqueArray.find(\n (uniqueItem) =>\n criteriaOrProperty(uniqueItem) === itemValue,\n )\n } else if (typeof criteriaOrProperty === \"string\") {\n found = !!uniqueArray.find(\n (uniqueItem) =>\n uniqueItem[criteriaOrProperty] ===\n item[criteriaOrProperty],\n )\n } else {\n found = uniqueArray.indexOf(item) !== -1\n }\n\n if (!found) uniqueArray.push(item)\n\n return uniqueArray\n }, [] as T[])\n }\n\n /**\n * Deep Object.assign.\n */\n public static mergeDeep(target: any, ...sources: any[]): any {\n if (!sources.length) {\n return target\n }\n\n for (const source of sources) {\n OrmUtils.merge(target, source)\n }\n\n return target\n }\n\n /**\n * Creates a shallow copy of the object, without invoking the constructor\n */\n public static cloneObject<T extends object>(object: T): T {\n if (object === null || object === undefined) {\n return object\n }\n\n return Object.assign(\n Object.create(Object.getPrototypeOf(object)),\n object,\n )\n }\n\n /**\n * Deep compare objects.\n *\n * @see http://stackoverflow.com/a/1144249\n */\n public static deepCompare(...args: any[]): boolean {\n let i: any, l: any, leftChain: any, rightChain: any\n\n if (arguments.length < 1) {\n return true // Die silently? Don't know how to handle such case, please help...\n // throw \"Need two or more arguments to compare\";\n }\n\n for (i = 1, l = arguments.length; i < l; i++) {\n leftChain = [] // Todo: this can be cached\n rightChain = []\n\n if (\n !this.compare2Objects(\n leftChain,\n rightChain,\n arguments[0],\n arguments[i],\n )\n ) {\n return false\n }\n }\n\n return true\n }\n\n /**\n * Gets deeper value of object.\n */\n public static deepValue(obj: ObjectLiteral, path: string) {\n const segments = path.split(\".\")\n for (let i = 0, len = segments.length; i < len; i++) {\n obj = obj[segments[i]]\n }\n return obj\n }\n\n public static replaceEmptyObjectsWithBooleans(obj: any) {\n for (const key in obj) {\n if (obj[key] && typeof obj[key] === \"object\") {\n if (Object.keys(obj[key]).length === 0) {\n obj[key] = true\n } else {\n this.replaceEmptyObjectsWithBooleans(obj[key])\n }\n }\n }\n }\n\n public static propertyPathsToTruthyObject(paths: string[]) {\n const obj: any = {}\n for (const path of paths) {\n const props = path.split(\".\")\n if (!props.length) continue\n\n if (!obj[props[0]] || obj[props[0]] === true) {\n obj[props[0]] = {}\n }\n let recursiveChild = obj[props[0]]\n for (const [key, prop] of props.entries()) {\n if (key === 0) continue\n\n if (recursiveChild[prop]) {\n recursiveChild = recursiveChild[prop]\n } else if (key === props.length - 1) {\n recursiveChild[prop] = {}\n recursiveChild = null\n } else {\n recursiveChild[prop] = {}\n recursiveChild = recursiveChild[prop]\n }\n }\n }\n this.replaceEmptyObjectsWithBooleans(obj)\n return obj\n }\n\n /**\n * Check if two entity-id-maps are the same\n */\n public static compareIds(\n firstId: ObjectLiteral | undefined,\n secondId: ObjectLiteral | undefined,\n ): boolean {\n if (\n firstId === undefined ||\n firstId === null ||\n secondId === undefined ||\n secondId === null\n )\n return false\n\n // Optimized version for the common case\n if (\n ((typeof firstId.id === \"string\" &&\n typeof secondId.id === \"string\") ||\n (typeof firstId.id === \"number\" &&\n typeof secondId.id === \"number\")) &&\n Object.keys(firstId).length === 1 &&\n Object.keys(secondId).length === 1\n ) {\n return firstId.id === secondId.id\n }\n\n return OrmUtils.deepCompare(firstId, secondId)\n }\n\n /**\n * Transforms given value into boolean value.\n */\n public static toBoolean(value: any): boolean {\n if (typeof value === \"boolean\") return value\n\n if (typeof value === \"string\") return value === \"true\" || value === \"1\"\n\n if (typeof value === \"number\") return value > 0\n\n return false\n }\n\n /**\n * Composes an object from the given array of keys and values.\n */\n public static zipObject(keys: any[], values: any[]): ObjectLiteral {\n return keys.reduce((object, column, index) => {\n object[column] = values[index]\n return object\n }, {} as ObjectLiteral)\n }\n\n /**\n * Compares two arrays.\n */\n public static isArraysEqual(arr1: any[], arr2: any[]): boolean {\n if (arr1.length !== arr2.length) return false\n return arr1.every((element) => {\n return arr2.indexOf(element) !== -1\n })\n }\n\n public static areMutuallyExclusive<T>(...lists: T[][]): boolean {\n const haveSharedObjects = lists.some((list) => {\n const otherLists = lists.filter((otherList) => otherList !== list)\n return list.some((item) =>\n otherLists.some((otherList) => otherList.includes(item)),\n )\n })\n return !haveSharedObjects\n }\n\n /**\n * Parses the CHECK constraint on the specified column and returns\n * all values allowed by the constraint or undefined if the constraint\n * is not present.\n */\n public static parseSqlCheckExpression(\n sql: string,\n columnName: string,\n ): string[] | undefined {\n const enumMatch = sql.match(\n new RegExp(\n `\"${columnName}\" varchar CHECK\\\\s*\\\\(\\\\s*\"${columnName}\"\\\\s+IN\\\\s*`,\n ),\n )\n\n if (enumMatch && enumMatch.index) {\n const afterMatch = sql.substring(\n enumMatch.index + enumMatch[0].length,\n )\n\n // This is an enum\n // all enum values stored as a comma separated list\n const chars = afterMatch\n\n /**\n * * When outside quotes: empty string\n * * When inside single quotes: `'`\n */\n let currentQuotes = \"\"\n let nextValue = \"\"\n const enumValues: string[] = []\n for (let idx = 0; idx < chars.length; idx++) {\n const char = chars[idx]\n switch (char) {\n case \",\":\n if (currentQuotes == \"\") {\n enumValues.push(nextValue)\n nextValue = \"\"\n } else {\n nextValue += char\n }\n break\n case \"'\":\n if (currentQuotes == char) {\n const isNextCharQuote = chars[idx + 1] === char\n if (isNextCharQuote) {\n // double quote in sql should be treated as a\n // single quote that's part of the quoted string\n nextValue += char\n idx += 1 // skip that next quote\n } else {\n currentQuotes = \"\"\n }\n } else {\n currentQuotes = char\n }\n break\n case \")\":\n if (currentQuotes == \"\") {\n enumValues.push(nextValue)\n return enumValues\n } else {\n nextValue += char\n }\n break\n default:\n if (currentQuotes != \"\") {\n nextValue += char\n }\n }\n }\n }\n return undefined\n }\n\n /**\n * Checks if given criteria is null or empty.\n */\n public static isCriteriaNullOrEmpty(criteria: unknown): boolean {\n return (\n criteria === undefined ||\n criteria === null ||\n criteria === \"\" ||\n (Array.isArray(criteria) && criteria.length === 0) ||\n (this.isPlainObject(criteria) && Object.keys(criteria).length === 0)\n )\n }\n\n /**\n * Checks if given criteria is a primitive value.\n * Primitive values are strings, numbers and dates.\n */\n public static isSinglePrimitiveCriteria(\n criteria: unknown,\n ): criteria is SinglePrimitiveCriteria {\n return (\n typeof criteria === \"string\" ||\n typeof criteria === \"number\" ||\n criteria instanceof Date\n )\n }\n\n /**\n * Checks if given criteria is a primitive value or an array of primitive values.\n */\n public static isPrimitiveCriteria(\n criteria: unknown,\n ): criteria is PrimitiveCriteria {\n if (Array.isArray(criteria)) {\n return criteria.every((value) =>\n this.isSinglePrimitiveCriteria(value),\n )\n }\n\n return this.isSinglePrimitiveCriteria(criteria)\n }\n\n // -------------------------------------------------------------------------\n // Private methods\n // -------------------------------------------------------------------------\n\n private static compare2Objects(\n leftChain: any,\n rightChain: any,\n x: any,\n y: any,\n ) {\n let p\n\n // remember that NaN === NaN returns false\n // and isNaN(undefined) returns true\n if (Number.isNaN(x) && Number.isNaN(y)) return true\n\n // Compare primitives and functions.\n // Check if both arguments link to the same object.\n // Especially useful on the step where we compare prototypes\n if (x === y) return true\n\n // Unequal, but either is null or undefined (use case: jsonb comparison)\n // PR #3776, todo: add tests\n if (x === null || y === null || x === undefined || y === undefined)\n return false\n\n // Fix the buffer compare bug.\n // See: https://github.com/typeorm/typeorm/issues/3654\n if (\n (typeof x.equals === \"function\" ||\n typeof x.equals === \"function\") &&\n x.equals(y)\n )\n return true\n\n // Works in case when functions are created in constructor.\n // Comparing dates is a common scenario. Another built-ins?\n // We can even handle functions passed across iframes\n if (\n (typeof x === \"function\" && typeof y === \"function\") ||\n (x instanceof Date && y instanceof Date) ||\n (x instanceof RegExp && y instanceof RegExp) ||\n (typeof x === \"string\" && typeof y === \"string\") ||\n (typeof x === \"number\" && typeof y === \"number\")\n )\n return x.toString() === y.toString()\n\n // At last checking prototypes as good as we can\n if (!(typeof x === \"object\" && typeof y === \"object\")) return false\n\n if (\n Object.prototype.isPrototypeOf.call(x, y) ||\n Object.prototype.isPrototypeOf.call(y, x)\n )\n return false\n\n if (x.constructor !== y.constructor) return false\n\n if (x.prototype !== y.prototype) return false\n\n // Check for infinitive linking loops\n if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1)\n return false\n\n // Quick checking of one object being a subset of another.\n // todo: cache the structure of arguments[0] for performance\n for (p in y) {\n if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {\n return false\n } else if (typeof y[p] !== typeof x[p]) {\n return false\n }\n }\n\n for (p in x) {\n if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {\n return false\n } else if (typeof y[p] !== typeof x[p]) {\n return false\n }\n\n switch (typeof x[p]) {\n case \"object\":\n case \"function\":\n leftChain.push(x)\n rightChain.push(y)\n\n if (\n !this.compare2Objects(leftChain, rightChain, x[p], y[p])\n ) {\n return false\n }\n\n leftChain.pop()\n rightChain.pop()\n break\n\n default:\n if (x[p] !== y[p]) {\n return false\n }\n break\n }\n }\n\n return true\n }\n\n // Checks if it's an object made by Object.create(null), {} or new Object()\n private static isPlainObject(item: any) {\n if (item === null || item === undefined) {\n return false\n }\n\n return !item.constructor || item.constructor === Object\n }\n\n private static mergeArrayKey(\n target: any,\n key: number,\n value: any,\n memo: Map<any, any>,\n ) {\n // Have we seen this before? Prevent infinite recursion.\n if (memo.has(value)) {\n target[key] = memo.get(value)\n return\n }\n\n if (value instanceof Promise) {\n // Skip promises entirely.\n // This is a hold-over from the old code & is because we don't want to pull in\n // the lazy fields. Ideally we'd remove these promises via another function first\n // but for now we have to do it here.\n return\n }\n\n if (!this.isPlainObject(value) && !Array.isArray(value)) {\n target[key] = value\n return\n }\n\n if (!target[key]) {\n target[key] = Array.isArray(value) ? [] : {}\n }\n\n memo.set(value, target[key])\n this.merge(target[key], value, memo)\n memo.delete(value)\n }\n\n private static mergeObjectKey(\n target: any,\n key: string,\n value: any,\n memo: Map<any, any>,\n ) {\n // Have we seen this before? Prevent infinite recursion.\n if (memo.has(value)) {\n Object.assign(target, { [key]: memo.get(value) })\n return\n }\n\n if (value instanceof Promise) {\n // Skip promises entirely.\n // This is a hold-over from the old code & is because we don't want to pull in\n // the lazy fields. Ideally we'd remove these promises via another function first\n // but for now we have to do it here.\n return\n }\n\n if (!this.isPlainObject(value) && !Array.isArray(value)) {\n Object.assign(target, { [key]: value })\n return\n }\n\n if (!target[key]) {\n Object.assign(target, { [key]: Array.isArray(value) ? [] : {} })\n }\n\n memo.set(value, target[key])\n this.merge(target[key], value, memo)\n memo.delete(value)\n }\n\n private static merge(\n target: any,\n source: any,\n memo: Map<any, any> = new Map(),\n ): any {\n if (this.isPlainObject(target) && this.isPlainObject(source)) {\n for (const key of Object.keys(source)) {\n if (key === \"__proto__\") continue\n this.mergeObjectKey(target, key, source[key], memo)\n }\n }\n\n if (Array.isArray(target) && Array.isArray(source)) {\n for (let key = 0; key < source.length; key++) {\n this.mergeArrayKey(target, key, source[key], memo)\n }\n }\n }\n}\n"],"sourceRoot":".."}
|
|
@@ -57,6 +57,13 @@ class ClosureJunctionEntityMetadataBuilder {
|
|
|
57
57
|
primary: true,
|
|
58
58
|
length: primaryColumn.length,
|
|
59
59
|
type: primaryColumn.type,
|
|
60
|
+
unsigned: primaryColumn.unsigned,
|
|
61
|
+
width: primaryColumn.width,
|
|
62
|
+
precision: primaryColumn.precision,
|
|
63
|
+
scale: primaryColumn.scale,
|
|
64
|
+
zerofill: primaryColumn.zerofill,
|
|
65
|
+
charset: primaryColumn.charset,
|
|
66
|
+
collation: primaryColumn.collation,
|
|
60
67
|
},
|
|
61
68
|
},
|
|
62
69
|
}));
|
|
@@ -77,6 +84,13 @@ class ClosureJunctionEntityMetadataBuilder {
|
|
|
77
84
|
primary: true,
|
|
78
85
|
length: primaryColumn.length,
|
|
79
86
|
type: primaryColumn.type,
|
|
87
|
+
unsigned: primaryColumn.unsigned,
|
|
88
|
+
width: primaryColumn.width,
|
|
89
|
+
precision: primaryColumn.precision,
|
|
90
|
+
scale: primaryColumn.scale,
|
|
91
|
+
zerofill: primaryColumn.zerofill,
|
|
92
|
+
charset: primaryColumn.charset,
|
|
93
|
+
collation: primaryColumn.collation,
|
|
80
94
|
},
|
|
81
95
|
},
|
|
82
96
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/metadata-builder/ClosureJunctionEntityMetadataBuilder.ts"],"names":[],"mappings":"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","file":"ClosureJunctionEntityMetadataBuilder.js","sourcesContent":["import { EntityMetadata } from \"../metadata/EntityMetadata\"\nimport { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { ForeignKeyMetadata } from \"../metadata/ForeignKeyMetadata\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { IndexMetadata } from \"../metadata/IndexMetadata\"\n\n/**\n * Creates EntityMetadata for junction tables of the closure entities.\n * Closure junction tables are tables generated by closure entities.\n */\nexport class ClosureJunctionEntityMetadataBuilder {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private connection: DataSource) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Builds EntityMetadata for the closure junction of the given closure entity.\n */\n build(parentClosureEntityMetadata: EntityMetadata) {\n // create entity metadata itself\n const entityMetadata = new EntityMetadata({\n parentClosureEntityMetadata: parentClosureEntityMetadata,\n connection: this.connection,\n args: {\n target: \"\",\n name:\n parentClosureEntityMetadata.treeOptions &&\n parentClosureEntityMetadata.treeOptions.closureTableName\n ? parentClosureEntityMetadata.treeOptions\n .closureTableName\n : parentClosureEntityMetadata.tableNameWithoutPrefix,\n type: \"closure-junction\",\n },\n })\n entityMetadata.build()\n\n // create ancestor and descendant columns for new closure junction table\n parentClosureEntityMetadata.primaryColumns.forEach((primaryColumn) => {\n entityMetadata.ownColumns.push(\n new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n closureType: \"ancestor\",\n referencedColumn: primaryColumn,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName:\n parentClosureEntityMetadata.treeOptions &&\n parentClosureEntityMetadata.treeOptions\n .ancestorColumnName\n ? parentClosureEntityMetadata.treeOptions.ancestorColumnName(\n primaryColumn,\n )\n : primaryColumn.propertyName + \"_ancestor\",\n options: {\n primary: true,\n length: primaryColumn.length,\n type: primaryColumn.type,\n },\n },\n }),\n )\n entityMetadata.ownColumns.push(\n new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n closureType: \"descendant\",\n referencedColumn: primaryColumn,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName:\n parentClosureEntityMetadata.treeOptions &&\n parentClosureEntityMetadata.treeOptions\n .descendantColumnName\n ? parentClosureEntityMetadata.treeOptions.descendantColumnName(\n primaryColumn,\n )\n : primaryColumn.propertyName + \"_descendant\",\n options: {\n primary: true,\n length: primaryColumn.length,\n type: primaryColumn.type,\n },\n },\n }),\n )\n })\n\n entityMetadata.ownIndices = [\n new IndexMetadata({\n entityMetadata: entityMetadata,\n columns: [entityMetadata.ownColumns[0]],\n args: {\n target: entityMetadata.target,\n synchronize: true,\n },\n }),\n new IndexMetadata({\n entityMetadata: entityMetadata,\n columns: [entityMetadata.ownColumns[1]],\n args: {\n target: entityMetadata.target,\n synchronize: true,\n },\n }),\n ]\n\n // if tree level column was defined by a closure entity then add it to the junction columns as well\n if (parentClosureEntityMetadata.treeLevelColumn) {\n entityMetadata.ownColumns.push(\n new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName: \"level\",\n options: {\n type: this.connection.driver.mappedDataTypes\n .treeLevel,\n },\n },\n }),\n )\n }\n\n // create junction table foreign keys\n // Note: CASCADE is not applied to mssql because it does not support multi cascade paths\n entityMetadata.foreignKeys = [\n new ForeignKeyMetadata({\n entityMetadata: entityMetadata,\n referencedEntityMetadata: parentClosureEntityMetadata,\n columns: [entityMetadata.ownColumns[0]],\n referencedColumns: parentClosureEntityMetadata.primaryColumns,\n onDelete:\n this.connection.driver.options.type === \"mssql\"\n ? \"NO ACTION\"\n : \"CASCADE\",\n }),\n new ForeignKeyMetadata({\n entityMetadata: entityMetadata,\n referencedEntityMetadata: parentClosureEntityMetadata,\n columns: [entityMetadata.ownColumns[1]],\n referencedColumns: parentClosureEntityMetadata.primaryColumns,\n onDelete:\n this.connection.driver.options.type === \"mssql\"\n ? \"NO ACTION\"\n : \"CASCADE\",\n }),\n ]\n\n return entityMetadata\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../../src/metadata-builder/ClosureJunctionEntityMetadataBuilder.ts"],"names":[],"mappings":"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","file":"ClosureJunctionEntityMetadataBuilder.js","sourcesContent":["import { EntityMetadata } from \"../metadata/EntityMetadata\"\nimport { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { ForeignKeyMetadata } from \"../metadata/ForeignKeyMetadata\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { IndexMetadata } from \"../metadata/IndexMetadata\"\n\n/**\n * Creates EntityMetadata for junction tables of the closure entities.\n * Closure junction tables are tables generated by closure entities.\n */\nexport class ClosureJunctionEntityMetadataBuilder {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private connection: DataSource) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Builds EntityMetadata for the closure junction of the given closure entity.\n */\n build(parentClosureEntityMetadata: EntityMetadata) {\n // create entity metadata itself\n const entityMetadata = new EntityMetadata({\n parentClosureEntityMetadata: parentClosureEntityMetadata,\n connection: this.connection,\n args: {\n target: \"\",\n name:\n parentClosureEntityMetadata.treeOptions &&\n parentClosureEntityMetadata.treeOptions.closureTableName\n ? parentClosureEntityMetadata.treeOptions\n .closureTableName\n : parentClosureEntityMetadata.tableNameWithoutPrefix,\n type: \"closure-junction\",\n },\n })\n entityMetadata.build()\n\n // create ancestor and descendant columns for new closure junction table\n parentClosureEntityMetadata.primaryColumns.forEach((primaryColumn) => {\n entityMetadata.ownColumns.push(\n new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n closureType: \"ancestor\",\n referencedColumn: primaryColumn,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName:\n parentClosureEntityMetadata.treeOptions &&\n parentClosureEntityMetadata.treeOptions\n .ancestorColumnName\n ? parentClosureEntityMetadata.treeOptions.ancestorColumnName(\n primaryColumn,\n )\n : primaryColumn.propertyName + \"_ancestor\",\n options: {\n primary: true,\n length: primaryColumn.length,\n type: primaryColumn.type,\n unsigned: primaryColumn.unsigned,\n width: primaryColumn.width,\n precision: primaryColumn.precision,\n scale: primaryColumn.scale,\n zerofill: primaryColumn.zerofill,\n charset: primaryColumn.charset,\n collation: primaryColumn.collation,\n },\n },\n }),\n )\n entityMetadata.ownColumns.push(\n new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n closureType: \"descendant\",\n referencedColumn: primaryColumn,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName:\n parentClosureEntityMetadata.treeOptions &&\n parentClosureEntityMetadata.treeOptions\n .descendantColumnName\n ? parentClosureEntityMetadata.treeOptions.descendantColumnName(\n primaryColumn,\n )\n : primaryColumn.propertyName + \"_descendant\",\n options: {\n primary: true,\n length: primaryColumn.length,\n type: primaryColumn.type,\n unsigned: primaryColumn.unsigned,\n width: primaryColumn.width,\n precision: primaryColumn.precision,\n scale: primaryColumn.scale,\n zerofill: primaryColumn.zerofill,\n charset: primaryColumn.charset,\n collation: primaryColumn.collation,\n },\n },\n }),\n )\n })\n\n entityMetadata.ownIndices = [\n new IndexMetadata({\n entityMetadata: entityMetadata,\n columns: [entityMetadata.ownColumns[0]],\n args: {\n target: entityMetadata.target,\n synchronize: true,\n },\n }),\n new IndexMetadata({\n entityMetadata: entityMetadata,\n columns: [entityMetadata.ownColumns[1]],\n args: {\n target: entityMetadata.target,\n synchronize: true,\n },\n }),\n ]\n\n // if tree level column was defined by a closure entity then add it to the junction columns as well\n if (parentClosureEntityMetadata.treeLevelColumn) {\n entityMetadata.ownColumns.push(\n new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName: \"level\",\n options: {\n type: this.connection.driver.mappedDataTypes\n .treeLevel,\n },\n },\n }),\n )\n }\n\n // create junction table foreign keys\n // Note: CASCADE is not applied to mssql because it does not support multi cascade paths\n entityMetadata.foreignKeys = [\n new ForeignKeyMetadata({\n entityMetadata: entityMetadata,\n referencedEntityMetadata: parentClosureEntityMetadata,\n columns: [entityMetadata.ownColumns[0]],\n referencedColumns: parentClosureEntityMetadata.primaryColumns,\n onDelete:\n this.connection.driver.options.type === \"mssql\"\n ? \"NO ACTION\"\n : \"CASCADE\",\n }),\n new ForeignKeyMetadata({\n entityMetadata: entityMetadata,\n referencedEntityMetadata: parentClosureEntityMetadata,\n columns: [entityMetadata.ownColumns[1]],\n referencedColumns: parentClosureEntityMetadata.primaryColumns,\n onDelete:\n this.connection.driver.options.type === \"mssql\"\n ? \"NO ACTION\"\n : \"CASCADE\",\n }),\n ]\n\n return entityMetadata\n }\n}\n"],"sourceRoot":".."}
|
|
@@ -6,6 +6,7 @@ const UniqueMetadata_1 = require("../metadata/UniqueMetadata");
|
|
|
6
6
|
const ForeignKeyMetadata_1 = require("../metadata/ForeignKeyMetadata");
|
|
7
7
|
const error_1 = require("../error");
|
|
8
8
|
const DriverUtils_1 = require("../driver/DriverUtils");
|
|
9
|
+
const OrmUtils_1 = require("../util/OrmUtils");
|
|
9
10
|
/**
|
|
10
11
|
* Builds join column for the many-to-one and one-to-one owner relations.
|
|
11
12
|
*
|
|
@@ -172,6 +173,12 @@ class RelationJoinColumnBuilder {
|
|
|
172
173
|
});
|
|
173
174
|
relation.entityMetadata.registerColumn(relationalColumn);
|
|
174
175
|
}
|
|
176
|
+
else if (relationalColumn.referencedColumn) {
|
|
177
|
+
// Clone the relational column to prevent modifying the original when multiple
|
|
178
|
+
// relations reference the same column. This ensures each relation gets its own
|
|
179
|
+
// copy with independent referencedColumn and type properties.
|
|
180
|
+
relationalColumn = OrmUtils_1.OrmUtils.cloneObject(relationalColumn);
|
|
181
|
+
}
|
|
175
182
|
relationalColumn.referencedColumn = referencedColumn; // its important to set it here because we need to set referenced column for user defined join column
|
|
176
183
|
relationalColumn.type = referencedColumn.type; // also since types of relational column and join column must be equal we override user defined column type
|
|
177
184
|
relationalColumn.relationMetadata = relation;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/metadata-builder/RelationJoinColumnBuilder.ts"],"names":[],"mappings":"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","file":"RelationJoinColumnBuilder.js","sourcesContent":["import { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { UniqueMetadata } from \"../metadata/UniqueMetadata\"\nimport { ForeignKeyMetadata } from \"../metadata/ForeignKeyMetadata\"\nimport { RelationMetadata } from \"../metadata/RelationMetadata\"\nimport { JoinColumnMetadataArgs } from \"../metadata-args/JoinColumnMetadataArgs\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { TypeORMError } from \"../error\"\nimport { DriverUtils } from \"../driver/DriverUtils\"\n\n/**\n * Builds join column for the many-to-one and one-to-one owner relations.\n *\n * Cases it should cover:\n * 1. when join column is set with custom name and without referenced column name\n * we need automatically set referenced column name - primary ids by default\n * @JoinColumn({ name: \"custom_name\" })\n *\n * 2. when join column is set with only referenced column name\n * we need automatically set join column name - relation name + referenced column name\n * @JoinColumn({ referencedColumnName: \"title\" })\n *\n * 3. when join column is set without both referenced column name and join column name\n * we need to automatically set both of them\n * @JoinColumn()\n *\n * 4. when join column is not set at all (as in case of @ManyToOne relation)\n * we need to create join column for it with proper referenced column name and join column name\n *\n * 5. when multiple join columns set none of referencedColumnName and name can be optional\n * both options are required\n * @JoinColumn([\n * { name: \"category_title\", referencedColumnName: \"type\" },\n * { name: \"category_title\", referencedColumnName: \"name\" },\n * ])\n *\n * Since for many-to-one relations having JoinColumn decorator is not required,\n * we need to go through each many-to-one relation without join column decorator set\n * and create join column metadata args for them.\n */\nexport class RelationJoinColumnBuilder {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private connection: DataSource) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Builds a foreign key of the many-to-one or one-to-one owner relations.\n */\n build(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n ): {\n foreignKey: ForeignKeyMetadata | undefined\n columns: ColumnMetadata[]\n uniqueConstraint: UniqueMetadata | undefined\n } {\n const referencedColumns = this.collectReferencedColumns(\n joinColumns,\n relation,\n )\n const columns = this.collectColumns(\n joinColumns,\n relation,\n referencedColumns,\n )\n if (!referencedColumns.length || !relation.createForeignKeyConstraints)\n return {\n foreignKey: undefined,\n columns,\n uniqueConstraint: undefined,\n } // this case is possible for one-to-one non owning side and relations with createForeignKeyConstraints = false\n\n const foreignKey = new ForeignKeyMetadata({\n name: joinColumns[0]?.foreignKeyConstraintName,\n entityMetadata: relation.entityMetadata,\n referencedEntityMetadata: relation.inverseEntityMetadata,\n namingStrategy: this.connection.namingStrategy,\n columns,\n referencedColumns,\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n deferrable: relation.deferrable,\n })\n\n // SQL requires UNIQUE/PK constraints on columns referenced by a FK\n // Skip creating the unique constraint for the referenced columns if\n // they are already contained in the PK of the referenced entity\n if (\n columns.every((column) => column.isPrimary) ||\n !relation.isOneToOne\n ) {\n return { foreignKey, columns, uniqueConstraint: undefined }\n }\n\n const uniqueConstraint = new UniqueMetadata({\n entityMetadata: relation.entityMetadata,\n columns: foreignKey.columns,\n args: {\n name: this.connection.namingStrategy.relationConstraintName(\n relation.entityMetadata.tableName,\n foreignKey.columns.map((column) => column.databaseName),\n ),\n target: relation.entityMetadata.target,\n },\n })\n uniqueConstraint.build(this.connection.namingStrategy)\n\n return { foreignKey, columns, uniqueConstraint }\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Collects referenced columns from the given join column args.\n */\n protected collectReferencedColumns(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n ): ColumnMetadata[] {\n const hasAnyReferencedColumnName = joinColumns.find(\n (joinColumnArgs) => !!joinColumnArgs.referencedColumnName,\n )\n const manyToOneWithoutJoinColumn =\n joinColumns.length === 0 && relation.isManyToOne\n const hasJoinColumnWithoutAnyReferencedColumnName =\n joinColumns.length > 0 && !hasAnyReferencedColumnName\n\n if (\n manyToOneWithoutJoinColumn ||\n hasJoinColumnWithoutAnyReferencedColumnName\n ) {\n // covers case3 and case1\n return relation.inverseEntityMetadata.primaryColumns\n } else {\n // cases with referenced columns defined\n return joinColumns.map((joinColumn) => {\n const referencedColumn =\n relation.inverseEntityMetadata.ownColumns.find(\n (column) =>\n column.propertyName ===\n joinColumn.referencedColumnName,\n ) // todo: can we also search in relations?\n if (!referencedColumn)\n throw new TypeORMError(\n `Referenced column ${joinColumn.referencedColumnName} was not found in entity ${relation.inverseEntityMetadata.name}`,\n )\n\n return referencedColumn\n })\n }\n }\n\n /**\n * Collects columns from the given join column args.\n */\n private collectColumns(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n referencedColumns: ColumnMetadata[],\n ): ColumnMetadata[] {\n return referencedColumns.map((referencedColumn) => {\n // in the case if relation has join column with only name set we need this check\n const joinColumnMetadataArg = joinColumns.find((joinColumn) => {\n return (\n (!joinColumn.referencedColumnName ||\n joinColumn.referencedColumnName ===\n referencedColumn.propertyName) &&\n !!joinColumn.name\n )\n })\n const joinColumnName = joinColumnMetadataArg\n ? joinColumnMetadataArg.name\n : this.connection.namingStrategy.joinColumnName(\n relation.propertyName,\n referencedColumn.propertyName,\n )\n\n const relationalColumns = relation.embeddedMetadata\n ? relation.embeddedMetadata.columns\n : relation.entityMetadata.ownColumns\n let relationalColumn = relationalColumns.find(\n (column) =>\n column.databaseNameWithoutPrefixes === joinColumnName,\n )\n if (!relationalColumn) {\n relationalColumn = new ColumnMetadata({\n connection: this.connection,\n entityMetadata: relation.entityMetadata,\n embeddedMetadata: relation.embeddedMetadata,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName: relation.propertyName,\n options: {\n name: joinColumnName,\n type: referencedColumn.type,\n length:\n !referencedColumn.length &&\n (DriverUtils.isMySQLFamily(\n this.connection.driver,\n ) ||\n this.connection.driver.options.type ===\n \"aurora-mysql\") &&\n // some versions of mariadb support the column type and should not try to provide the length property\n this.connection.driver.normalizeType(\n referencedColumn,\n ) !== \"uuid\" &&\n (referencedColumn.generationStrategy ===\n \"uuid\" ||\n referencedColumn.type === \"uuid\")\n ? \"36\"\n : referencedColumn.length, // fix https://github.com/typeorm/typeorm/issues/3604\n width: referencedColumn.width,\n charset: referencedColumn.charset,\n collation: referencedColumn.collation,\n precision: referencedColumn.precision,\n scale: referencedColumn.scale,\n zerofill: referencedColumn.zerofill,\n unsigned: referencedColumn.unsigned,\n comment: referencedColumn.comment,\n enum: referencedColumn.enum,\n enumName: referencedColumn.enumName,\n primary: relation.isPrimary,\n nullable: relation.isNullable,\n },\n },\n })\n relation.entityMetadata.registerColumn(relationalColumn)\n }\n relationalColumn.referencedColumn = referencedColumn // its important to set it here because we need to set referenced column for user defined join column\n relationalColumn.type = referencedColumn.type // also since types of relational column and join column must be equal we override user defined column type\n relationalColumn.relationMetadata = relation\n relationalColumn.build(this.connection)\n return relationalColumn\n })\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../../src/metadata-builder/RelationJoinColumnBuilder.ts"],"names":[],"mappings":"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","file":"RelationJoinColumnBuilder.js","sourcesContent":["import { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { UniqueMetadata } from \"../metadata/UniqueMetadata\"\nimport { ForeignKeyMetadata } from \"../metadata/ForeignKeyMetadata\"\nimport { RelationMetadata } from \"../metadata/RelationMetadata\"\nimport { JoinColumnMetadataArgs } from \"../metadata-args/JoinColumnMetadataArgs\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { TypeORMError } from \"../error\"\nimport { DriverUtils } from \"../driver/DriverUtils\"\nimport { OrmUtils } from \"../util/OrmUtils\"\n\n/**\n * Builds join column for the many-to-one and one-to-one owner relations.\n *\n * Cases it should cover:\n * 1. when join column is set with custom name and without referenced column name\n * we need automatically set referenced column name - primary ids by default\n * @JoinColumn({ name: \"custom_name\" })\n *\n * 2. when join column is set with only referenced column name\n * we need automatically set join column name - relation name + referenced column name\n * @JoinColumn({ referencedColumnName: \"title\" })\n *\n * 3. when join column is set without both referenced column name and join column name\n * we need to automatically set both of them\n * @JoinColumn()\n *\n * 4. when join column is not set at all (as in case of @ManyToOne relation)\n * we need to create join column for it with proper referenced column name and join column name\n *\n * 5. when multiple join columns set none of referencedColumnName and name can be optional\n * both options are required\n * @JoinColumn([\n * { name: \"category_title\", referencedColumnName: \"type\" },\n * { name: \"category_title\", referencedColumnName: \"name\" },\n * ])\n *\n * Since for many-to-one relations having JoinColumn decorator is not required,\n * we need to go through each many-to-one relation without join column decorator set\n * and create join column metadata args for them.\n */\nexport class RelationJoinColumnBuilder {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private connection: DataSource) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Builds a foreign key of the many-to-one or one-to-one owner relations.\n */\n build(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n ): {\n foreignKey: ForeignKeyMetadata | undefined\n columns: ColumnMetadata[]\n uniqueConstraint: UniqueMetadata | undefined\n } {\n const referencedColumns = this.collectReferencedColumns(\n joinColumns,\n relation,\n )\n const columns = this.collectColumns(\n joinColumns,\n relation,\n referencedColumns,\n )\n if (!referencedColumns.length || !relation.createForeignKeyConstraints)\n return {\n foreignKey: undefined,\n columns,\n uniqueConstraint: undefined,\n } // this case is possible for one-to-one non owning side and relations with createForeignKeyConstraints = false\n\n const foreignKey = new ForeignKeyMetadata({\n name: joinColumns[0]?.foreignKeyConstraintName,\n entityMetadata: relation.entityMetadata,\n referencedEntityMetadata: relation.inverseEntityMetadata,\n namingStrategy: this.connection.namingStrategy,\n columns,\n referencedColumns,\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n deferrable: relation.deferrable,\n })\n\n // SQL requires UNIQUE/PK constraints on columns referenced by a FK\n // Skip creating the unique constraint for the referenced columns if\n // they are already contained in the PK of the referenced entity\n if (\n columns.every((column) => column.isPrimary) ||\n !relation.isOneToOne\n ) {\n return { foreignKey, columns, uniqueConstraint: undefined }\n }\n\n const uniqueConstraint = new UniqueMetadata({\n entityMetadata: relation.entityMetadata,\n columns: foreignKey.columns,\n args: {\n name: this.connection.namingStrategy.relationConstraintName(\n relation.entityMetadata.tableName,\n foreignKey.columns.map((column) => column.databaseName),\n ),\n target: relation.entityMetadata.target,\n },\n })\n uniqueConstraint.build(this.connection.namingStrategy)\n\n return { foreignKey, columns, uniqueConstraint }\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Collects referenced columns from the given join column args.\n */\n protected collectReferencedColumns(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n ): ColumnMetadata[] {\n const hasAnyReferencedColumnName = joinColumns.find(\n (joinColumnArgs) => !!joinColumnArgs.referencedColumnName,\n )\n const manyToOneWithoutJoinColumn =\n joinColumns.length === 0 && relation.isManyToOne\n const hasJoinColumnWithoutAnyReferencedColumnName =\n joinColumns.length > 0 && !hasAnyReferencedColumnName\n\n if (\n manyToOneWithoutJoinColumn ||\n hasJoinColumnWithoutAnyReferencedColumnName\n ) {\n // covers case3 and case1\n return relation.inverseEntityMetadata.primaryColumns\n } else {\n // cases with referenced columns defined\n return joinColumns.map((joinColumn) => {\n const referencedColumn =\n relation.inverseEntityMetadata.ownColumns.find(\n (column) =>\n column.propertyName ===\n joinColumn.referencedColumnName,\n ) // todo: can we also search in relations?\n if (!referencedColumn)\n throw new TypeORMError(\n `Referenced column ${joinColumn.referencedColumnName} was not found in entity ${relation.inverseEntityMetadata.name}`,\n )\n\n return referencedColumn\n })\n }\n }\n\n /**\n * Collects columns from the given join column args.\n */\n private collectColumns(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n referencedColumns: ColumnMetadata[],\n ): ColumnMetadata[] {\n return referencedColumns.map((referencedColumn) => {\n // in the case if relation has join column with only name set we need this check\n const joinColumnMetadataArg = joinColumns.find((joinColumn) => {\n return (\n (!joinColumn.referencedColumnName ||\n joinColumn.referencedColumnName ===\n referencedColumn.propertyName) &&\n !!joinColumn.name\n )\n })\n const joinColumnName = joinColumnMetadataArg\n ? joinColumnMetadataArg.name\n : this.connection.namingStrategy.joinColumnName(\n relation.propertyName,\n referencedColumn.propertyName,\n )\n\n const relationalColumns = relation.embeddedMetadata\n ? relation.embeddedMetadata.columns\n : relation.entityMetadata.ownColumns\n let relationalColumn = relationalColumns.find(\n (column) =>\n column.databaseNameWithoutPrefixes === joinColumnName,\n )\n if (!relationalColumn) {\n relationalColumn = new ColumnMetadata({\n connection: this.connection,\n entityMetadata: relation.entityMetadata,\n embeddedMetadata: relation.embeddedMetadata,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName: relation.propertyName,\n options: {\n name: joinColumnName,\n type: referencedColumn.type,\n length:\n !referencedColumn.length &&\n (DriverUtils.isMySQLFamily(\n this.connection.driver,\n ) ||\n this.connection.driver.options.type ===\n \"aurora-mysql\") &&\n // some versions of mariadb support the column type and should not try to provide the length property\n this.connection.driver.normalizeType(\n referencedColumn,\n ) !== \"uuid\" &&\n (referencedColumn.generationStrategy ===\n \"uuid\" ||\n referencedColumn.type === \"uuid\")\n ? \"36\"\n : referencedColumn.length, // fix https://github.com/typeorm/typeorm/issues/3604\n width: referencedColumn.width,\n charset: referencedColumn.charset,\n collation: referencedColumn.collation,\n precision: referencedColumn.precision,\n scale: referencedColumn.scale,\n zerofill: referencedColumn.zerofill,\n unsigned: referencedColumn.unsigned,\n comment: referencedColumn.comment,\n enum: referencedColumn.enum,\n enumName: referencedColumn.enumName,\n primary: relation.isPrimary,\n nullable: relation.isNullable,\n },\n },\n })\n relation.entityMetadata.registerColumn(relationalColumn)\n } else if (relationalColumn.referencedColumn) {\n // Clone the relational column to prevent modifying the original when multiple\n // relations reference the same column. This ensures each relation gets its own\n // copy with independent referencedColumn and type properties.\n relationalColumn = OrmUtils.cloneObject(relationalColumn)\n }\n relationalColumn.referencedColumn = referencedColumn // its important to set it here because we need to set referenced column for user defined join column\n relationalColumn.type = referencedColumn.type // also since types of relational column and join column must be equal we override user defined column type\n relationalColumn.relationMetadata = relation\n relationalColumn.build(this.connection)\n return relationalColumn\n })\n }\n}\n"],"sourceRoot":".."}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{ "name": "typeorm", "version": "0.3.25-dev.
|
|
1
|
+
{ "name": "typeorm", "version": "0.3.25-dev.42e7cbe", "description": "Data-Mapper ORM for TypeScript and ES2021+. Supports MySQL/MariaDB, PostgreSQL, MS SQL Server, Oracle, SAP HANA, SQLite, MongoDB databases.", "homepage": "https://typeorm.io", "bugs": { "url": "https://github.com/typeorm/typeorm/issues" }, "repository": { "type": "git", "url": "https://github.com/typeorm/typeorm.git" }, "funding": "https://opencollective.com/typeorm", "license": "MIT", "author": { "name": "Umed Khudoiberdiev", "email": "pleerock.me@gmail.com" }, "exports": { ".": { "types": "./index.d.ts", "node": { "import": "./index.mjs", "require": "./index.js", "types": "./index.d.ts" }, "browser": { "require": "./index.js", "import": "./browser/index.js", "default": "./index.js" } }, "./browser": { "types": "./index.d.ts", "default": "./browser/index.js" }, "./*.js": "./*.js", "./*": { "require": "./*.js", "import": "./*" } }, "main": "./index.js", "module": "./index.mjs", "browser": { "./browser/connection/ConnectionOptionsReader.js": "./browser/platform/BrowserConnectionOptionsReaderDummy.js", "./browser/connection/options-reader/ConnectionOptionsXmlReader.js": "./browser/platform/BrowserConnectionOptionsReaderDummy.js", "./browser/connection/options-reader/ConnectionOptionsYmlReader.js": "./browser/platform/BrowserConnectionOptionsReaderDummy.js", "./browser/driver/aurora-data-api/AuroraDataApiDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/better-sqlite3/BetterSqlite3Driver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/cockroachdb/CockroachDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/mongodb/MongoDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/mongodb/MongoQueryRunner.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/mongodb/bson.typings.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/mongodb/typings.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/mysql/MysqlDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/oracle/OracleDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/postgres/PostgresDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/sap/SapDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/sqlite/SqliteDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/sqlserver/SqlServerDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/entity-manager/MongoEntityManager.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/logger/FileLogger.js": "./browser/platform/BrowserFileLoggerDummy.js", "./browser/platform/PlatformTools.js": "./browser/platform/BrowserPlatformTools.js", "./browser/repository/MongoRepository.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/util/DirectoryExportedClassesLoader.js": "./browser/platform/BrowserDirectoryExportedClassesLoader.js", "./index.js": "./browser/index.js", "./index.mjs": "./browser/index.js" }, "types": "./index.d.ts", "bin": { "typeorm": "./cli.js", "typeorm-ts-node-commonjs": "./cli-ts-node-commonjs.js", "typeorm-ts-node-esm": "./cli-ts-node-esm.js" }, "scripts": { "changelog": "standard-changelog", "compile": "rimraf ./build && tsc", "docs:dev": "cd docs && npm run start", "format": "prettier --cache --write \"./**/*.ts\"", "format:ci": "prettier --check \"./**/*.ts\"", "lint": "eslint .", "pack": "gulp pack", "package": "gulp package", "pre-commit": "lint-staged", "prepare": "husky", "publish:preview": "pkg-pr-new publish './build/package' --pnpm --template='./sample/playground'", "test": "npm run compile && npm run test:fast --", "test:ci": "mocha --bail", "test:fast": "mocha", "watch": "tsc --watch" }, "dependencies": { "@sqltools/formatter": "^1.2.5", "ansis": "^3.17.0", "app-root-path": "^3.1.0", "buffer": "^6.0.3", "dayjs": "^1.11.13", "debug": "^4.4.0", "dedent": "^1.6.0", "dotenv": "^16.4.7", "glob": "^10.4.5", "sha.js": "^2.4.11", "sql-highlight": "^6.0.0", "tslib": "^2.8.1", "uuid": "^11.1.0", "yargs": "^17.7.2" }, "devDependencies": { "@eslint/js": "^9.28.0", "@sap/hana-client": "^2.24.21", "@tsconfig/node16": "^16.1.4", "@types/chai": "^4.3.20", "@types/chai-as-promised": "^7.1.8", "@types/debug": "^4.1.12", "@types/gulp-rename": "^2.0.6", "@types/gulp-sourcemaps": "^0.0.38", "@types/mocha": "^10.0.10", "@types/node": "^16.18.126", "@types/sha.js": "^2.4.4", "@types/sinon": "^10.0.20", "@types/sinon-chai": "^4.0.0", "@types/source-map-support": "^0.5.10", "@types/yargs": "^17.0.33", "better-sqlite3": "^8.7.0", "chai": "^4.5.0", "chai-as-promised": "^7.1.2", "class-transformer": "^0.5.1", "eslint": "^9.28.0", "globals": "^16.2.0", "gulp": "^4.0.2", "gulp-rename": "^2.0.0", "gulp-replace": "^1.1.4", "gulp-shell": "^0.8.0", "gulp-sourcemaps": "^3.0.0", "gulp-typescript": "^6.0.0-alpha.1", "gulpclass": "^0.2.0", "hdb-pool": "^0.1.6", "husky": "^9.1.7", "lint-staged": "^15.5.2", "mocha": "^10.8.2", "mongodb": "^6.15.0", "mssql": "^11.0.1", "mysql": "^2.18.1", "mysql2": "^3.14.0", "nyc": "^17.1.0", "oracledb": "^6.8.0", "pg": "^8.14.1", "pg-query-stream": "^4.8.1", "pkg-pr-new": "^0.0.43", "prettier": "^2.8.8", "redis": "^4.7.0", "remap-istanbul": "^0.13.0", "rimraf": "^5.0.10", "sinon": "^15.2.0", "sinon-chai": "^3.7.0", "sort-package-json": "^2.15.1", "source-map-support": "^0.5.21", "sql.js": "^1.13.0", "sqlite3": "^5.1.7", "standard-changelog": "^6.0.0", "ts-node": "^10.9.2", "typescript": "^5.8.3", "typescript-eslint": "^8.33.1" }, "peerDependencies": { "@google-cloud/spanner": "^5.18.0 || ^6.0.0 || ^7.0.0", "@sap/hana-client": "^2.12.25", "better-sqlite3": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", "hdb-pool": "^0.1.6", "ioredis": "^5.0.4", "mongodb": "^5.8.0 || ^6.0.0", "mssql": "^9.1.1 || ^10.0.1 || ^11.0.1", "mysql2": "^2.2.5 || ^3.0.1", "oracledb": "^6.3.0", "pg": "^8.5.1", "pg-native": "^3.0.0", "pg-query-stream": "^4.0.0", "redis": "^3.1.1 || ^4.0.0", "reflect-metadata": "^0.1.14 || ^0.2.0", "sql.js": "^1.4.0", "sqlite3": "^5.0.3", "ts-node": "^10.7.0", "typeorm-aurora-data-api-driver": "^2.0.0 || ^3.0.0" }, "peerDependenciesMeta": { "@google-cloud/spanner": { "optional": true }, "@sap/hana-client": { "optional": true }, "better-sqlite3": { "optional": true }, "hdb-pool": { "optional": true }, "ioredis": { "optional": true }, "mongodb": { "optional": true }, "mssql": { "optional": true }, "mysql2": { "optional": true }, "oracledb": { "optional": true }, "pg": { "optional": true }, "pg-native": { "optional": true }, "pg-query-stream": { "optional": true }, "redis": { "optional": true }, "sql.js": { "optional": true }, "sqlite3": { "optional": true }, "ts-node": { "optional": true }, "typeorm-aurora-data-api-driver": { "optional": true } }, "engines": { "node": ">=16.13.0" }, "collective": { "type": "opencollective", "url": "https://opencollective.com/typeorm", "logo": "https://opencollective.com/opencollective/logo.txt" }, "readmeFilename": "README.md", "tags": [ "orm", "typescript", "typescript-orm", "mariadb", "mariadb-orm", "mysql", "mysql-orm", "oracle", "oracle-orm", "postgresql", "postgresql-orm", "sap-hana", "sap-hana-orm", "spanner", "cloud-spanner", "cloud-spanner-orm", "sqlite", "sqlite-orm", "sql-server", "sql-server-orm" ] }
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SubjectChangedColumnsComputer = void 0;
|
|
4
|
-
const DateUtils_1 = require("../util/DateUtils");
|
|
5
|
-
const OrmUtils_1 = require("../util/OrmUtils");
|
|
6
4
|
const ApplyValueTransformers_1 = require("../util/ApplyValueTransformers");
|
|
5
|
+
const DateUtils_1 = require("../util/DateUtils");
|
|
7
6
|
const ObjectUtils_1 = require("../util/ObjectUtils");
|
|
7
|
+
const OrmUtils_1 = require("../util/OrmUtils");
|
|
8
8
|
/**
|
|
9
9
|
* Finds what columns are changed in the subject entities.
|
|
10
10
|
*/
|
|
@@ -62,8 +62,8 @@ class SubjectChangedColumnsComputer {
|
|
|
62
62
|
return;
|
|
63
63
|
}
|
|
64
64
|
let normalizedValue = entityValue;
|
|
65
|
-
// normalize special values to make proper comparision
|
|
66
|
-
if (entityValue !== null) {
|
|
65
|
+
// if both values are not null, normalize special values to make proper comparision
|
|
66
|
+
if (entityValue !== null && databaseValue !== null) {
|
|
67
67
|
switch (column.type) {
|
|
68
68
|
case "date":
|
|
69
69
|
normalizedValue = column.isArray
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/persistence/SubjectChangedColumnsComputer.ts"],"names":[],"mappings":"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","file":"SubjectChangedColumnsComputer.js","sourcesContent":["import { Subject } from \"./Subject\"\nimport { DateUtils } from \"../util/DateUtils\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { OrmUtils } from \"../util/OrmUtils\"\nimport { ApplyValueTransformers } from \"../util/ApplyValueTransformers\"\nimport { ObjectUtils } from \"../util/ObjectUtils\"\n\n/**\n * Finds what columns are changed in the subject entities.\n */\nexport class SubjectChangedColumnsComputer {\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Finds what columns are changed in the subject entities.\n */\n compute(subjects: Subject[]) {\n subjects.forEach((subject) => {\n this.computeDiffColumns(subject)\n this.computeDiffRelationalColumns(subjects, subject)\n })\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Differentiate columns from the updated entity and entity stored in the database.\n */\n protected computeDiffColumns(subject: Subject): void {\n // if there is no persisted entity then nothing to compute changed in it\n if (!subject.entity) return\n\n subject.metadata.columns.forEach((column) => {\n // ignore special columns\n if (\n column.isVirtual ||\n column.isDiscriminator // ||\n // column.isUpdateDate ||\n // column.isVersion ||\n // column.isCreateDate\n )\n return\n\n const changeMap = subject.changeMaps.find(\n (changeMap) => changeMap.column === column,\n )\n if (changeMap) {\n subject.changeMaps.splice(\n subject.changeMaps.indexOf(changeMap),\n 1,\n )\n }\n\n // get user provided value - column value from the user provided persisted entity\n const entityValue = column.getEntityValue(subject.entity!)\n\n // we don't perform operation over undefined properties (but we DO need null properties!)\n if (entityValue === undefined) return\n\n // if there is no database entity then all columns are treated as new, e.g. changed\n if (subject.databaseEntity) {\n // skip transform database value for json / jsonb for comparison later on\n const shouldTransformDatabaseEntity =\n column.type !== \"json\" && column.type !== \"jsonb\"\n\n // get database value of the column\n let databaseValue = column.getEntityValue(\n subject.databaseEntity,\n shouldTransformDatabaseEntity,\n )\n\n // filter out \"relational columns\" only in the case if there is a relation object in entity\n if (column.relationMetadata) {\n const value = column.relationMetadata.getEntityValue(\n subject.entity!,\n )\n if (value !== null && value !== undefined) return\n }\n let normalizedValue = entityValue\n // normalize special values to make proper comparision\n if (entityValue !== null) {\n switch (column.type) {\n case \"date\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToDateString(date),\n )\n : DateUtils.mixedDateToDateString(entityValue)\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToDateString(date),\n )\n : DateUtils.mixedDateToDateString(databaseValue)\n break\n\n case \"time\":\n case \"time with time zone\":\n case \"time without time zone\":\n case \"timetz\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToTimeString(date),\n )\n : DateUtils.mixedDateToTimeString(entityValue)\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToTimeString(date),\n )\n : DateUtils.mixedDateToTimeString(databaseValue)\n break\n\n case \"datetime\":\n case \"datetime2\":\n case Date:\n case \"timestamp\":\n case \"timestamp without time zone\":\n case \"timestamp with time zone\":\n case \"timestamp with local time zone\":\n case \"timestamptz\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToUtcDatetimeString(\n date,\n ),\n )\n : DateUtils.mixedDateToUtcDatetimeString(\n entityValue,\n )\n\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToUtcDatetimeString(\n date,\n ),\n )\n : DateUtils.mixedDateToUtcDatetimeString(\n databaseValue,\n )\n\n break\n\n case \"json\":\n case \"jsonb\":\n // JSON.stringify doesn't work because postgresql sorts jsonb before save.\n // If you try to save json '[{\"messages\": \"\", \"attribute Key\": \"\", \"level\":\"\"}] ' as jsonb,\n // then postgresql will save it as '[{\"level\": \"\", \"message\":\"\", \"attributeKey\": \"\"}]'\n if (\n OrmUtils.deepCompare(entityValue, databaseValue)\n )\n return\n break\n\n case \"simple-array\":\n normalizedValue =\n DateUtils.simpleArrayToString(entityValue)\n databaseValue =\n DateUtils.simpleArrayToString(databaseValue)\n break\n case \"simple-enum\":\n normalizedValue =\n DateUtils.simpleEnumToString(entityValue)\n databaseValue =\n DateUtils.simpleEnumToString(databaseValue)\n break\n case \"simple-json\":\n normalizedValue =\n DateUtils.simpleJsonToString(entityValue)\n databaseValue =\n DateUtils.simpleJsonToString(databaseValue)\n break\n }\n\n if (column.transformer) {\n normalizedValue = ApplyValueTransformers.transformTo(\n column.transformer,\n entityValue,\n )\n }\n }\n\n // if value is not changed - then do nothing\n if (column.isArray) {\n if (OrmUtils.deepCompare(normalizedValue, databaseValue))\n return\n } else if (\n Buffer.isBuffer(normalizedValue) &&\n Buffer.isBuffer(databaseValue)\n ) {\n if (normalizedValue.equals(databaseValue)) {\n return\n }\n } else {\n if (normalizedValue === databaseValue) return\n }\n }\n\n if (!subject.diffColumns.includes(column))\n subject.diffColumns.push(column)\n\n subject.changeMaps.push({\n column: column,\n value: entityValue,\n })\n })\n }\n\n /**\n * Difference columns of the owning one-to-one and many-to-one columns.\n */\n protected computeDiffRelationalColumns(\n allSubjects: Subject[],\n subject: Subject,\n ): void {\n // if there is no persisted entity then nothing to compute changed in it\n if (!subject.entity) return\n\n subject.metadata.relationsWithJoinColumns.forEach((relation) => {\n // get the related entity from the persisted entity\n let relatedEntity = relation.getEntityValue(subject.entity!)\n\n // we don't perform operation over undefined properties (but we DO need null properties!)\n if (relatedEntity === undefined) return\n\n // if there is no database entity then all relational columns are treated as new, e.g. changed\n if (subject.databaseEntity) {\n // here we cover two scenarios:\n // 1. related entity can be another entity which is natural way\n // 2. related entity can be just an entity id\n // if relation entity is just a relation id set (for example post.tag = 1)\n // then we create an id map from it to make a proper comparision\n let relatedEntityRelationIdMap: ObjectLiteral = relatedEntity\n if (\n relatedEntityRelationIdMap !== null &&\n ObjectUtils.isObject(relatedEntityRelationIdMap)\n )\n relatedEntityRelationIdMap = relation.getRelationIdMap(\n relatedEntityRelationIdMap,\n )!\n\n // get database related entity. Since loadRelationIds are used on databaseEntity\n // related entity will contain only its relation ids\n const databaseRelatedEntityRelationIdMap =\n relation.getEntityValue(subject.databaseEntity)\n\n // if relation ids are equal then we don't need to update anything\n const areRelatedIdsEqual = OrmUtils.compareIds(\n relatedEntityRelationIdMap,\n databaseRelatedEntityRelationIdMap,\n )\n if (areRelatedIdsEqual) {\n return\n } else {\n subject.diffRelations.push(relation)\n }\n }\n\n // if there is an inserted subject for the related entity of the persisted entity then use it as related entity\n // this code is used for related entities without ids to be properly inserted (and then updated if needed)\n const valueSubject = allSubjects.find(\n (subject) =>\n subject.mustBeInserted && subject.entity === relatedEntity,\n )\n if (valueSubject) relatedEntity = valueSubject\n\n // find if there is already a relation to be changed\n const changeMap = subject.changeMaps.find(\n (changeMap) => changeMap.relation === relation,\n )\n if (changeMap) {\n // and update its value if it was found\n changeMap.value = relatedEntity\n } else {\n // if it wasn't found add a new relation for change\n subject.changeMaps.push({\n relation: relation,\n value: relatedEntity,\n })\n }\n })\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../../src/persistence/SubjectChangedColumnsComputer.ts"],"names":[],"mappings":"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","file":"SubjectChangedColumnsComputer.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { ApplyValueTransformers } from \"../util/ApplyValueTransformers\"\nimport { DateUtils } from \"../util/DateUtils\"\nimport { ObjectUtils } from \"../util/ObjectUtils\"\nimport { OrmUtils } from \"../util/OrmUtils\"\nimport { Subject } from \"./Subject\"\n\n/**\n * Finds what columns are changed in the subject entities.\n */\nexport class SubjectChangedColumnsComputer {\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Finds what columns are changed in the subject entities.\n */\n compute(subjects: Subject[]) {\n subjects.forEach((subject) => {\n this.computeDiffColumns(subject)\n this.computeDiffRelationalColumns(subjects, subject)\n })\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Differentiate columns from the updated entity and entity stored in the database.\n */\n protected computeDiffColumns(subject: Subject): void {\n // if there is no persisted entity then nothing to compute changed in it\n if (!subject.entity) return\n\n subject.metadata.columns.forEach((column) => {\n // ignore special columns\n if (\n column.isVirtual ||\n column.isDiscriminator // ||\n // column.isUpdateDate ||\n // column.isVersion ||\n // column.isCreateDate\n )\n return\n\n const changeMap = subject.changeMaps.find(\n (changeMap) => changeMap.column === column,\n )\n if (changeMap) {\n subject.changeMaps.splice(\n subject.changeMaps.indexOf(changeMap),\n 1,\n )\n }\n\n // get user provided value - column value from the user provided persisted entity\n const entityValue = column.getEntityValue(subject.entity!)\n\n // we don't perform operation over undefined properties (but we DO need null properties!)\n if (entityValue === undefined) return\n\n // if there is no database entity then all columns are treated as new, e.g. changed\n if (subject.databaseEntity) {\n // skip transform database value for json / jsonb for comparison later on\n const shouldTransformDatabaseEntity =\n column.type !== \"json\" && column.type !== \"jsonb\"\n\n // get database value of the column\n let databaseValue = column.getEntityValue(\n subject.databaseEntity,\n shouldTransformDatabaseEntity,\n )\n\n // filter out \"relational columns\" only in the case if there is a relation object in entity\n if (column.relationMetadata) {\n const value = column.relationMetadata.getEntityValue(\n subject.entity!,\n )\n if (value !== null && value !== undefined) return\n }\n let normalizedValue = entityValue\n // if both values are not null, normalize special values to make proper comparision\n if (entityValue !== null && databaseValue !== null) {\n switch (column.type) {\n case \"date\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToDateString(date),\n )\n : DateUtils.mixedDateToDateString(entityValue)\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToDateString(date),\n )\n : DateUtils.mixedDateToDateString(databaseValue)\n break\n\n case \"time\":\n case \"time with time zone\":\n case \"time without time zone\":\n case \"timetz\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToTimeString(date),\n )\n : DateUtils.mixedDateToTimeString(entityValue)\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToTimeString(date),\n )\n : DateUtils.mixedDateToTimeString(databaseValue)\n break\n\n case \"datetime\":\n case \"datetime2\":\n case Date:\n case \"timestamp\":\n case \"timestamp without time zone\":\n case \"timestamp with time zone\":\n case \"timestamp with local time zone\":\n case \"timestamptz\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToUtcDatetimeString(\n date,\n ),\n )\n : DateUtils.mixedDateToUtcDatetimeString(\n entityValue,\n )\n\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToUtcDatetimeString(\n date,\n ),\n )\n : DateUtils.mixedDateToUtcDatetimeString(\n databaseValue,\n )\n\n break\n\n case \"json\":\n case \"jsonb\":\n // JSON.stringify doesn't work because postgresql sorts jsonb before save.\n // If you try to save json '[{\"messages\": \"\", \"attribute Key\": \"\", \"level\":\"\"}] ' as jsonb,\n // then postgresql will save it as '[{\"level\": \"\", \"message\":\"\", \"attributeKey\": \"\"}]'\n if (\n OrmUtils.deepCompare(entityValue, databaseValue)\n )\n return\n break\n\n case \"simple-array\":\n normalizedValue =\n DateUtils.simpleArrayToString(entityValue)\n databaseValue =\n DateUtils.simpleArrayToString(databaseValue)\n break\n case \"simple-enum\":\n normalizedValue =\n DateUtils.simpleEnumToString(entityValue)\n databaseValue =\n DateUtils.simpleEnumToString(databaseValue)\n break\n case \"simple-json\":\n normalizedValue =\n DateUtils.simpleJsonToString(entityValue)\n databaseValue =\n DateUtils.simpleJsonToString(databaseValue)\n break\n }\n\n if (column.transformer) {\n normalizedValue = ApplyValueTransformers.transformTo(\n column.transformer,\n entityValue,\n )\n }\n }\n\n // if value is not changed - then do nothing\n if (column.isArray) {\n if (OrmUtils.deepCompare(normalizedValue, databaseValue))\n return\n } else if (\n Buffer.isBuffer(normalizedValue) &&\n Buffer.isBuffer(databaseValue)\n ) {\n if (normalizedValue.equals(databaseValue)) {\n return\n }\n } else {\n if (normalizedValue === databaseValue) return\n }\n }\n\n if (!subject.diffColumns.includes(column))\n subject.diffColumns.push(column)\n\n subject.changeMaps.push({\n column: column,\n value: entityValue,\n })\n })\n }\n\n /**\n * Difference columns of the owning one-to-one and many-to-one columns.\n */\n protected computeDiffRelationalColumns(\n allSubjects: Subject[],\n subject: Subject,\n ): void {\n // if there is no persisted entity then nothing to compute changed in it\n if (!subject.entity) return\n\n subject.metadata.relationsWithJoinColumns.forEach((relation) => {\n // get the related entity from the persisted entity\n let relatedEntity = relation.getEntityValue(subject.entity!)\n\n // we don't perform operation over undefined properties (but we DO need null properties!)\n if (relatedEntity === undefined) return\n\n // if there is no database entity then all relational columns are treated as new, e.g. changed\n if (subject.databaseEntity) {\n // here we cover two scenarios:\n // 1. related entity can be another entity which is natural way\n // 2. related entity can be just an entity id\n // if relation entity is just a relation id set (for example post.tag = 1)\n // then we create an id map from it to make a proper comparision\n let relatedEntityRelationIdMap: ObjectLiteral = relatedEntity\n if (\n relatedEntityRelationIdMap !== null &&\n ObjectUtils.isObject(relatedEntityRelationIdMap)\n )\n relatedEntityRelationIdMap = relation.getRelationIdMap(\n relatedEntityRelationIdMap,\n )!\n\n // get database related entity. Since loadRelationIds are used on databaseEntity\n // related entity will contain only its relation ids\n const databaseRelatedEntityRelationIdMap =\n relation.getEntityValue(subject.databaseEntity)\n\n // if relation ids are equal then we don't need to update anything\n const areRelatedIdsEqual = OrmUtils.compareIds(\n relatedEntityRelationIdMap,\n databaseRelatedEntityRelationIdMap,\n )\n if (areRelatedIdsEqual) {\n return\n } else {\n subject.diffRelations.push(relation)\n }\n }\n\n // if there is an inserted subject for the related entity of the persisted entity then use it as related entity\n // this code is used for related entities without ids to be properly inserted (and then updated if needed)\n const valueSubject = allSubjects.find(\n (subject) =>\n subject.mustBeInserted && subject.entity === relatedEntity,\n )\n if (valueSubject) relatedEntity = valueSubject\n\n // find if there is already a relation to be changed\n const changeMap = subject.changeMaps.find(\n (changeMap) => changeMap.relation === relation,\n )\n if (changeMap) {\n // and update its value if it was found\n changeMap.value = relatedEntity\n } else {\n // if it wasn't found add a new relation for change\n subject.changeMaps.push({\n relation: relation,\n value: relatedEntity,\n })\n }\n })\n }\n}\n"],"sourceRoot":".."}
|
package/util/OrmUtils.d.ts
CHANGED
|
@@ -16,6 +16,10 @@ export declare class OrmUtils {
|
|
|
16
16
|
* Deep Object.assign.
|
|
17
17
|
*/
|
|
18
18
|
static mergeDeep(target: any, ...sources: any[]): any;
|
|
19
|
+
/**
|
|
20
|
+
* Creates a shallow copy of the object, without invoking the constructor
|
|
21
|
+
*/
|
|
22
|
+
static cloneObject<T extends object>(object: T): T;
|
|
19
23
|
/**
|
|
20
24
|
* Deep compare objects.
|
|
21
25
|
*
|
package/util/OrmUtils.js
CHANGED
|
@@ -62,6 +62,15 @@ class OrmUtils {
|
|
|
62
62
|
}
|
|
63
63
|
return target;
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Creates a shallow copy of the object, without invoking the constructor
|
|
67
|
+
*/
|
|
68
|
+
static cloneObject(object) {
|
|
69
|
+
if (object === null || object === undefined) {
|
|
70
|
+
return object;
|
|
71
|
+
}
|
|
72
|
+
return Object.assign(Object.create(Object.getPrototypeOf(object)), object);
|
|
73
|
+
}
|
|
65
74
|
/**
|
|
66
75
|
* Deep compare objects.
|
|
67
76
|
*
|
package/util/OrmUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/util/OrmUtils.ts"],"names":[],"mappings":"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","file":"OrmUtils.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport {\n PrimitiveCriteria,\n SinglePrimitiveCriteria,\n} from \"../common/PrimitiveCriteria\"\n\nexport class OrmUtils {\n // -------------------------------------------------------------------------\n // Public methods\n // -------------------------------------------------------------------------\n\n /**\n * Chunks array into pieces.\n */\n public static chunk<T>(array: T[], size: number): T[][] {\n return Array.from(Array(Math.ceil(array.length / size)), (_, i) => {\n return array.slice(i * size, i * size + size)\n })\n }\n\n public static splitClassesAndStrings<T>(\n classesAndStrings: (string | T)[],\n ): [T[], string[]] {\n return [\n classesAndStrings.filter(\n (cls): cls is T => typeof cls !== \"string\",\n ),\n classesAndStrings.filter(\n (str): str is string => typeof str === \"string\",\n ),\n ]\n }\n\n public static groupBy<T, R>(\n array: T[],\n propertyCallback: (item: T) => R,\n ): { id: R; items: T[] }[] {\n return array.reduce((groupedArray, value) => {\n const key = propertyCallback(value)\n let grouped = groupedArray.find((i) => i.id === key)\n if (!grouped) {\n grouped = { id: key, items: [] }\n groupedArray.push(grouped)\n }\n grouped.items.push(value)\n return groupedArray\n }, [] as Array<{ id: R; items: T[] }>)\n }\n\n public static uniq<T>(array: T[], criteria?: (item: T) => any): T[]\n public static uniq<T, K extends keyof T>(array: T[], property: K): T[]\n public static uniq<T, K extends keyof T>(\n array: T[],\n criteriaOrProperty?: ((item: T) => any) | K,\n ): T[] {\n return array.reduce((uniqueArray, item) => {\n let found: boolean = false\n if (typeof criteriaOrProperty === \"function\") {\n const itemValue = criteriaOrProperty(item)\n found = !!uniqueArray.find(\n (uniqueItem) =>\n criteriaOrProperty(uniqueItem) === itemValue,\n )\n } else if (typeof criteriaOrProperty === \"string\") {\n found = !!uniqueArray.find(\n (uniqueItem) =>\n uniqueItem[criteriaOrProperty] ===\n item[criteriaOrProperty],\n )\n } else {\n found = uniqueArray.indexOf(item) !== -1\n }\n\n if (!found) uniqueArray.push(item)\n\n return uniqueArray\n }, [] as T[])\n }\n\n /**\n * Deep Object.assign.\n */\n public static mergeDeep(target: any, ...sources: any[]): any {\n if (!sources.length) {\n return target\n }\n\n for (const source of sources) {\n OrmUtils.merge(target, source)\n }\n\n return target\n }\n\n /**\n * Deep compare objects.\n *\n * @see http://stackoverflow.com/a/1144249\n */\n public static deepCompare(...args: any[]): boolean {\n let i: any, l: any, leftChain: any, rightChain: any\n\n if (arguments.length < 1) {\n return true // Die silently? Don't know how to handle such case, please help...\n // throw \"Need two or more arguments to compare\";\n }\n\n for (i = 1, l = arguments.length; i < l; i++) {\n leftChain = [] // Todo: this can be cached\n rightChain = []\n\n if (\n !this.compare2Objects(\n leftChain,\n rightChain,\n arguments[0],\n arguments[i],\n )\n ) {\n return false\n }\n }\n\n return true\n }\n\n /**\n * Gets deeper value of object.\n */\n public static deepValue(obj: ObjectLiteral, path: string) {\n const segments = path.split(\".\")\n for (let i = 0, len = segments.length; i < len; i++) {\n obj = obj[segments[i]]\n }\n return obj\n }\n\n public static replaceEmptyObjectsWithBooleans(obj: any) {\n for (const key in obj) {\n if (obj[key] && typeof obj[key] === \"object\") {\n if (Object.keys(obj[key]).length === 0) {\n obj[key] = true\n } else {\n this.replaceEmptyObjectsWithBooleans(obj[key])\n }\n }\n }\n }\n\n public static propertyPathsToTruthyObject(paths: string[]) {\n const obj: any = {}\n for (const path of paths) {\n const props = path.split(\".\")\n if (!props.length) continue\n\n if (!obj[props[0]] || obj[props[0]] === true) {\n obj[props[0]] = {}\n }\n let recursiveChild = obj[props[0]]\n for (const [key, prop] of props.entries()) {\n if (key === 0) continue\n\n if (recursiveChild[prop]) {\n recursiveChild = recursiveChild[prop]\n } else if (key === props.length - 1) {\n recursiveChild[prop] = {}\n recursiveChild = null\n } else {\n recursiveChild[prop] = {}\n recursiveChild = recursiveChild[prop]\n }\n }\n }\n this.replaceEmptyObjectsWithBooleans(obj)\n return obj\n }\n\n /**\n * Check if two entity-id-maps are the same\n */\n public static compareIds(\n firstId: ObjectLiteral | undefined,\n secondId: ObjectLiteral | undefined,\n ): boolean {\n if (\n firstId === undefined ||\n firstId === null ||\n secondId === undefined ||\n secondId === null\n )\n return false\n\n // Optimized version for the common case\n if (\n ((typeof firstId.id === \"string\" &&\n typeof secondId.id === \"string\") ||\n (typeof firstId.id === \"number\" &&\n typeof secondId.id === \"number\")) &&\n Object.keys(firstId).length === 1 &&\n Object.keys(secondId).length === 1\n ) {\n return firstId.id === secondId.id\n }\n\n return OrmUtils.deepCompare(firstId, secondId)\n }\n\n /**\n * Transforms given value into boolean value.\n */\n public static toBoolean(value: any): boolean {\n if (typeof value === \"boolean\") return value\n\n if (typeof value === \"string\") return value === \"true\" || value === \"1\"\n\n if (typeof value === \"number\") return value > 0\n\n return false\n }\n\n /**\n * Composes an object from the given array of keys and values.\n */\n public static zipObject(keys: any[], values: any[]): ObjectLiteral {\n return keys.reduce((object, column, index) => {\n object[column] = values[index]\n return object\n }, {} as ObjectLiteral)\n }\n\n /**\n * Compares two arrays.\n */\n public static isArraysEqual(arr1: any[], arr2: any[]): boolean {\n if (arr1.length !== arr2.length) return false\n return arr1.every((element) => {\n return arr2.indexOf(element) !== -1\n })\n }\n\n public static areMutuallyExclusive<T>(...lists: T[][]): boolean {\n const haveSharedObjects = lists.some((list) => {\n const otherLists = lists.filter((otherList) => otherList !== list)\n return list.some((item) =>\n otherLists.some((otherList) => otherList.includes(item)),\n )\n })\n return !haveSharedObjects\n }\n\n /**\n * Parses the CHECK constraint on the specified column and returns\n * all values allowed by the constraint or undefined if the constraint\n * is not present.\n */\n public static parseSqlCheckExpression(\n sql: string,\n columnName: string,\n ): string[] | undefined {\n const enumMatch = sql.match(\n new RegExp(\n `\"${columnName}\" varchar CHECK\\\\s*\\\\(\\\\s*\"${columnName}\"\\\\s+IN\\\\s*`,\n ),\n )\n\n if (enumMatch && enumMatch.index) {\n const afterMatch = sql.substring(\n enumMatch.index + enumMatch[0].length,\n )\n\n // This is an enum\n // all enum values stored as a comma separated list\n const chars = afterMatch\n\n /**\n * * When outside quotes: empty string\n * * When inside single quotes: `'`\n */\n let currentQuotes = \"\"\n let nextValue = \"\"\n const enumValues: string[] = []\n for (let idx = 0; idx < chars.length; idx++) {\n const char = chars[idx]\n switch (char) {\n case \",\":\n if (currentQuotes == \"\") {\n enumValues.push(nextValue)\n nextValue = \"\"\n } else {\n nextValue += char\n }\n break\n case \"'\":\n if (currentQuotes == char) {\n const isNextCharQuote = chars[idx + 1] === char\n if (isNextCharQuote) {\n // double quote in sql should be treated as a\n // single quote that's part of the quoted string\n nextValue += char\n idx += 1 // skip that next quote\n } else {\n currentQuotes = \"\"\n }\n } else {\n currentQuotes = char\n }\n break\n case \")\":\n if (currentQuotes == \"\") {\n enumValues.push(nextValue)\n return enumValues\n } else {\n nextValue += char\n }\n break\n default:\n if (currentQuotes != \"\") {\n nextValue += char\n }\n }\n }\n }\n return undefined\n }\n\n /**\n * Checks if given criteria is null or empty.\n */\n public static isCriteriaNullOrEmpty(criteria: unknown): boolean {\n return (\n criteria === undefined ||\n criteria === null ||\n criteria === \"\" ||\n (Array.isArray(criteria) && criteria.length === 0) ||\n (this.isPlainObject(criteria) && Object.keys(criteria).length === 0)\n )\n }\n\n /**\n * Checks if given criteria is a primitive value.\n * Primitive values are strings, numbers and dates.\n */\n public static isSinglePrimitiveCriteria(\n criteria: unknown,\n ): criteria is SinglePrimitiveCriteria {\n return (\n typeof criteria === \"string\" ||\n typeof criteria === \"number\" ||\n criteria instanceof Date\n )\n }\n\n /**\n * Checks if given criteria is a primitive value or an array of primitive values.\n */\n public static isPrimitiveCriteria(\n criteria: unknown,\n ): criteria is PrimitiveCriteria {\n if (Array.isArray(criteria)) {\n return criteria.every((value) =>\n this.isSinglePrimitiveCriteria(value),\n )\n }\n\n return this.isSinglePrimitiveCriteria(criteria)\n }\n\n // -------------------------------------------------------------------------\n // Private methods\n // -------------------------------------------------------------------------\n\n private static compare2Objects(\n leftChain: any,\n rightChain: any,\n x: any,\n y: any,\n ) {\n let p\n\n // remember that NaN === NaN returns false\n // and isNaN(undefined) returns true\n if (Number.isNaN(x) && Number.isNaN(y)) return true\n\n // Compare primitives and functions.\n // Check if both arguments link to the same object.\n // Especially useful on the step where we compare prototypes\n if (x === y) return true\n\n // Unequal, but either is null or undefined (use case: jsonb comparison)\n // PR #3776, todo: add tests\n if (x === null || y === null || x === undefined || y === undefined)\n return false\n\n // Fix the buffer compare bug.\n // See: https://github.com/typeorm/typeorm/issues/3654\n if (\n (typeof x.equals === \"function\" ||\n typeof x.equals === \"function\") &&\n x.equals(y)\n )\n return true\n\n // Works in case when functions are created in constructor.\n // Comparing dates is a common scenario. Another built-ins?\n // We can even handle functions passed across iframes\n if (\n (typeof x === \"function\" && typeof y === \"function\") ||\n (x instanceof Date && y instanceof Date) ||\n (x instanceof RegExp && y instanceof RegExp) ||\n (typeof x === \"string\" && typeof y === \"string\") ||\n (typeof x === \"number\" && typeof y === \"number\")\n )\n return x.toString() === y.toString()\n\n // At last checking prototypes as good as we can\n if (!(typeof x === \"object\" && typeof y === \"object\")) return false\n\n if (\n Object.prototype.isPrototypeOf.call(x, y) ||\n Object.prototype.isPrototypeOf.call(y, x)\n )\n return false\n\n if (x.constructor !== y.constructor) return false\n\n if (x.prototype !== y.prototype) return false\n\n // Check for infinitive linking loops\n if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1)\n return false\n\n // Quick checking of one object being a subset of another.\n // todo: cache the structure of arguments[0] for performance\n for (p in y) {\n if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {\n return false\n } else if (typeof y[p] !== typeof x[p]) {\n return false\n }\n }\n\n for (p in x) {\n if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {\n return false\n } else if (typeof y[p] !== typeof x[p]) {\n return false\n }\n\n switch (typeof x[p]) {\n case \"object\":\n case \"function\":\n leftChain.push(x)\n rightChain.push(y)\n\n if (\n !this.compare2Objects(leftChain, rightChain, x[p], y[p])\n ) {\n return false\n }\n\n leftChain.pop()\n rightChain.pop()\n break\n\n default:\n if (x[p] !== y[p]) {\n return false\n }\n break\n }\n }\n\n return true\n }\n\n // Checks if it's an object made by Object.create(null), {} or new Object()\n private static isPlainObject(item: any) {\n if (item === null || item === undefined) {\n return false\n }\n\n return !item.constructor || item.constructor === Object\n }\n\n private static mergeArrayKey(\n target: any,\n key: number,\n value: any,\n memo: Map<any, any>,\n ) {\n // Have we seen this before? Prevent infinite recursion.\n if (memo.has(value)) {\n target[key] = memo.get(value)\n return\n }\n\n if (value instanceof Promise) {\n // Skip promises entirely.\n // This is a hold-over from the old code & is because we don't want to pull in\n // the lazy fields. Ideally we'd remove these promises via another function first\n // but for now we have to do it here.\n return\n }\n\n if (!this.isPlainObject(value) && !Array.isArray(value)) {\n target[key] = value\n return\n }\n\n if (!target[key]) {\n target[key] = Array.isArray(value) ? [] : {}\n }\n\n memo.set(value, target[key])\n this.merge(target[key], value, memo)\n memo.delete(value)\n }\n\n private static mergeObjectKey(\n target: any,\n key: string,\n value: any,\n memo: Map<any, any>,\n ) {\n // Have we seen this before? Prevent infinite recursion.\n if (memo.has(value)) {\n Object.assign(target, { [key]: memo.get(value) })\n return\n }\n\n if (value instanceof Promise) {\n // Skip promises entirely.\n // This is a hold-over from the old code & is because we don't want to pull in\n // the lazy fields. Ideally we'd remove these promises via another function first\n // but for now we have to do it here.\n return\n }\n\n if (!this.isPlainObject(value) && !Array.isArray(value)) {\n Object.assign(target, { [key]: value })\n return\n }\n\n if (!target[key]) {\n Object.assign(target, { [key]: Array.isArray(value) ? [] : {} })\n }\n\n memo.set(value, target[key])\n this.merge(target[key], value, memo)\n memo.delete(value)\n }\n\n private static merge(\n target: any,\n source: any,\n memo: Map<any, any> = new Map(),\n ): any {\n if (this.isPlainObject(target) && this.isPlainObject(source)) {\n for (const key of Object.keys(source)) {\n if (key === \"__proto__\") continue\n this.mergeObjectKey(target, key, source[key], memo)\n }\n }\n\n if (Array.isArray(target) && Array.isArray(source)) {\n for (let key = 0; key < source.length; key++) {\n this.mergeArrayKey(target, key, source[key], memo)\n }\n }\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../../src/util/OrmUtils.ts"],"names":[],"mappings":"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","file":"OrmUtils.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport {\n PrimitiveCriteria,\n SinglePrimitiveCriteria,\n} from \"../common/PrimitiveCriteria\"\n\nexport class OrmUtils {\n // -------------------------------------------------------------------------\n // Public methods\n // -------------------------------------------------------------------------\n\n /**\n * Chunks array into pieces.\n */\n public static chunk<T>(array: T[], size: number): T[][] {\n return Array.from(Array(Math.ceil(array.length / size)), (_, i) => {\n return array.slice(i * size, i * size + size)\n })\n }\n\n public static splitClassesAndStrings<T>(\n classesAndStrings: (string | T)[],\n ): [T[], string[]] {\n return [\n classesAndStrings.filter(\n (cls): cls is T => typeof cls !== \"string\",\n ),\n classesAndStrings.filter(\n (str): str is string => typeof str === \"string\",\n ),\n ]\n }\n\n public static groupBy<T, R>(\n array: T[],\n propertyCallback: (item: T) => R,\n ): { id: R; items: T[] }[] {\n return array.reduce((groupedArray, value) => {\n const key = propertyCallback(value)\n let grouped = groupedArray.find((i) => i.id === key)\n if (!grouped) {\n grouped = { id: key, items: [] }\n groupedArray.push(grouped)\n }\n grouped.items.push(value)\n return groupedArray\n }, [] as Array<{ id: R; items: T[] }>)\n }\n\n public static uniq<T>(array: T[], criteria?: (item: T) => any): T[]\n public static uniq<T, K extends keyof T>(array: T[], property: K): T[]\n public static uniq<T, K extends keyof T>(\n array: T[],\n criteriaOrProperty?: ((item: T) => any) | K,\n ): T[] {\n return array.reduce((uniqueArray, item) => {\n let found: boolean = false\n if (typeof criteriaOrProperty === \"function\") {\n const itemValue = criteriaOrProperty(item)\n found = !!uniqueArray.find(\n (uniqueItem) =>\n criteriaOrProperty(uniqueItem) === itemValue,\n )\n } else if (typeof criteriaOrProperty === \"string\") {\n found = !!uniqueArray.find(\n (uniqueItem) =>\n uniqueItem[criteriaOrProperty] ===\n item[criteriaOrProperty],\n )\n } else {\n found = uniqueArray.indexOf(item) !== -1\n }\n\n if (!found) uniqueArray.push(item)\n\n return uniqueArray\n }, [] as T[])\n }\n\n /**\n * Deep Object.assign.\n */\n public static mergeDeep(target: any, ...sources: any[]): any {\n if (!sources.length) {\n return target\n }\n\n for (const source of sources) {\n OrmUtils.merge(target, source)\n }\n\n return target\n }\n\n /**\n * Creates a shallow copy of the object, without invoking the constructor\n */\n public static cloneObject<T extends object>(object: T): T {\n if (object === null || object === undefined) {\n return object\n }\n\n return Object.assign(\n Object.create(Object.getPrototypeOf(object)),\n object,\n )\n }\n\n /**\n * Deep compare objects.\n *\n * @see http://stackoverflow.com/a/1144249\n */\n public static deepCompare(...args: any[]): boolean {\n let i: any, l: any, leftChain: any, rightChain: any\n\n if (arguments.length < 1) {\n return true // Die silently? Don't know how to handle such case, please help...\n // throw \"Need two or more arguments to compare\";\n }\n\n for (i = 1, l = arguments.length; i < l; i++) {\n leftChain = [] // Todo: this can be cached\n rightChain = []\n\n if (\n !this.compare2Objects(\n leftChain,\n rightChain,\n arguments[0],\n arguments[i],\n )\n ) {\n return false\n }\n }\n\n return true\n }\n\n /**\n * Gets deeper value of object.\n */\n public static deepValue(obj: ObjectLiteral, path: string) {\n const segments = path.split(\".\")\n for (let i = 0, len = segments.length; i < len; i++) {\n obj = obj[segments[i]]\n }\n return obj\n }\n\n public static replaceEmptyObjectsWithBooleans(obj: any) {\n for (const key in obj) {\n if (obj[key] && typeof obj[key] === \"object\") {\n if (Object.keys(obj[key]).length === 0) {\n obj[key] = true\n } else {\n this.replaceEmptyObjectsWithBooleans(obj[key])\n }\n }\n }\n }\n\n public static propertyPathsToTruthyObject(paths: string[]) {\n const obj: any = {}\n for (const path of paths) {\n const props = path.split(\".\")\n if (!props.length) continue\n\n if (!obj[props[0]] || obj[props[0]] === true) {\n obj[props[0]] = {}\n }\n let recursiveChild = obj[props[0]]\n for (const [key, prop] of props.entries()) {\n if (key === 0) continue\n\n if (recursiveChild[prop]) {\n recursiveChild = recursiveChild[prop]\n } else if (key === props.length - 1) {\n recursiveChild[prop] = {}\n recursiveChild = null\n } else {\n recursiveChild[prop] = {}\n recursiveChild = recursiveChild[prop]\n }\n }\n }\n this.replaceEmptyObjectsWithBooleans(obj)\n return obj\n }\n\n /**\n * Check if two entity-id-maps are the same\n */\n public static compareIds(\n firstId: ObjectLiteral | undefined,\n secondId: ObjectLiteral | undefined,\n ): boolean {\n if (\n firstId === undefined ||\n firstId === null ||\n secondId === undefined ||\n secondId === null\n )\n return false\n\n // Optimized version for the common case\n if (\n ((typeof firstId.id === \"string\" &&\n typeof secondId.id === \"string\") ||\n (typeof firstId.id === \"number\" &&\n typeof secondId.id === \"number\")) &&\n Object.keys(firstId).length === 1 &&\n Object.keys(secondId).length === 1\n ) {\n return firstId.id === secondId.id\n }\n\n return OrmUtils.deepCompare(firstId, secondId)\n }\n\n /**\n * Transforms given value into boolean value.\n */\n public static toBoolean(value: any): boolean {\n if (typeof value === \"boolean\") return value\n\n if (typeof value === \"string\") return value === \"true\" || value === \"1\"\n\n if (typeof value === \"number\") return value > 0\n\n return false\n }\n\n /**\n * Composes an object from the given array of keys and values.\n */\n public static zipObject(keys: any[], values: any[]): ObjectLiteral {\n return keys.reduce((object, column, index) => {\n object[column] = values[index]\n return object\n }, {} as ObjectLiteral)\n }\n\n /**\n * Compares two arrays.\n */\n public static isArraysEqual(arr1: any[], arr2: any[]): boolean {\n if (arr1.length !== arr2.length) return false\n return arr1.every((element) => {\n return arr2.indexOf(element) !== -1\n })\n }\n\n public static areMutuallyExclusive<T>(...lists: T[][]): boolean {\n const haveSharedObjects = lists.some((list) => {\n const otherLists = lists.filter((otherList) => otherList !== list)\n return list.some((item) =>\n otherLists.some((otherList) => otherList.includes(item)),\n )\n })\n return !haveSharedObjects\n }\n\n /**\n * Parses the CHECK constraint on the specified column and returns\n * all values allowed by the constraint or undefined if the constraint\n * is not present.\n */\n public static parseSqlCheckExpression(\n sql: string,\n columnName: string,\n ): string[] | undefined {\n const enumMatch = sql.match(\n new RegExp(\n `\"${columnName}\" varchar CHECK\\\\s*\\\\(\\\\s*\"${columnName}\"\\\\s+IN\\\\s*`,\n ),\n )\n\n if (enumMatch && enumMatch.index) {\n const afterMatch = sql.substring(\n enumMatch.index + enumMatch[0].length,\n )\n\n // This is an enum\n // all enum values stored as a comma separated list\n const chars = afterMatch\n\n /**\n * * When outside quotes: empty string\n * * When inside single quotes: `'`\n */\n let currentQuotes = \"\"\n let nextValue = \"\"\n const enumValues: string[] = []\n for (let idx = 0; idx < chars.length; idx++) {\n const char = chars[idx]\n switch (char) {\n case \",\":\n if (currentQuotes == \"\") {\n enumValues.push(nextValue)\n nextValue = \"\"\n } else {\n nextValue += char\n }\n break\n case \"'\":\n if (currentQuotes == char) {\n const isNextCharQuote = chars[idx + 1] === char\n if (isNextCharQuote) {\n // double quote in sql should be treated as a\n // single quote that's part of the quoted string\n nextValue += char\n idx += 1 // skip that next quote\n } else {\n currentQuotes = \"\"\n }\n } else {\n currentQuotes = char\n }\n break\n case \")\":\n if (currentQuotes == \"\") {\n enumValues.push(nextValue)\n return enumValues\n } else {\n nextValue += char\n }\n break\n default:\n if (currentQuotes != \"\") {\n nextValue += char\n }\n }\n }\n }\n return undefined\n }\n\n /**\n * Checks if given criteria is null or empty.\n */\n public static isCriteriaNullOrEmpty(criteria: unknown): boolean {\n return (\n criteria === undefined ||\n criteria === null ||\n criteria === \"\" ||\n (Array.isArray(criteria) && criteria.length === 0) ||\n (this.isPlainObject(criteria) && Object.keys(criteria).length === 0)\n )\n }\n\n /**\n * Checks if given criteria is a primitive value.\n * Primitive values are strings, numbers and dates.\n */\n public static isSinglePrimitiveCriteria(\n criteria: unknown,\n ): criteria is SinglePrimitiveCriteria {\n return (\n typeof criteria === \"string\" ||\n typeof criteria === \"number\" ||\n criteria instanceof Date\n )\n }\n\n /**\n * Checks if given criteria is a primitive value or an array of primitive values.\n */\n public static isPrimitiveCriteria(\n criteria: unknown,\n ): criteria is PrimitiveCriteria {\n if (Array.isArray(criteria)) {\n return criteria.every((value) =>\n this.isSinglePrimitiveCriteria(value),\n )\n }\n\n return this.isSinglePrimitiveCriteria(criteria)\n }\n\n // -------------------------------------------------------------------------\n // Private methods\n // -------------------------------------------------------------------------\n\n private static compare2Objects(\n leftChain: any,\n rightChain: any,\n x: any,\n y: any,\n ) {\n let p\n\n // remember that NaN === NaN returns false\n // and isNaN(undefined) returns true\n if (Number.isNaN(x) && Number.isNaN(y)) return true\n\n // Compare primitives and functions.\n // Check if both arguments link to the same object.\n // Especially useful on the step where we compare prototypes\n if (x === y) return true\n\n // Unequal, but either is null or undefined (use case: jsonb comparison)\n // PR #3776, todo: add tests\n if (x === null || y === null || x === undefined || y === undefined)\n return false\n\n // Fix the buffer compare bug.\n // See: https://github.com/typeorm/typeorm/issues/3654\n if (\n (typeof x.equals === \"function\" ||\n typeof x.equals === \"function\") &&\n x.equals(y)\n )\n return true\n\n // Works in case when functions are created in constructor.\n // Comparing dates is a common scenario. Another built-ins?\n // We can even handle functions passed across iframes\n if (\n (typeof x === \"function\" && typeof y === \"function\") ||\n (x instanceof Date && y instanceof Date) ||\n (x instanceof RegExp && y instanceof RegExp) ||\n (typeof x === \"string\" && typeof y === \"string\") ||\n (typeof x === \"number\" && typeof y === \"number\")\n )\n return x.toString() === y.toString()\n\n // At last checking prototypes as good as we can\n if (!(typeof x === \"object\" && typeof y === \"object\")) return false\n\n if (\n Object.prototype.isPrototypeOf.call(x, y) ||\n Object.prototype.isPrototypeOf.call(y, x)\n )\n return false\n\n if (x.constructor !== y.constructor) return false\n\n if (x.prototype !== y.prototype) return false\n\n // Check for infinitive linking loops\n if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1)\n return false\n\n // Quick checking of one object being a subset of another.\n // todo: cache the structure of arguments[0] for performance\n for (p in y) {\n if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {\n return false\n } else if (typeof y[p] !== typeof x[p]) {\n return false\n }\n }\n\n for (p in x) {\n if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {\n return false\n } else if (typeof y[p] !== typeof x[p]) {\n return false\n }\n\n switch (typeof x[p]) {\n case \"object\":\n case \"function\":\n leftChain.push(x)\n rightChain.push(y)\n\n if (\n !this.compare2Objects(leftChain, rightChain, x[p], y[p])\n ) {\n return false\n }\n\n leftChain.pop()\n rightChain.pop()\n break\n\n default:\n if (x[p] !== y[p]) {\n return false\n }\n break\n }\n }\n\n return true\n }\n\n // Checks if it's an object made by Object.create(null), {} or new Object()\n private static isPlainObject(item: any) {\n if (item === null || item === undefined) {\n return false\n }\n\n return !item.constructor || item.constructor === Object\n }\n\n private static mergeArrayKey(\n target: any,\n key: number,\n value: any,\n memo: Map<any, any>,\n ) {\n // Have we seen this before? Prevent infinite recursion.\n if (memo.has(value)) {\n target[key] = memo.get(value)\n return\n }\n\n if (value instanceof Promise) {\n // Skip promises entirely.\n // This is a hold-over from the old code & is because we don't want to pull in\n // the lazy fields. Ideally we'd remove these promises via another function first\n // but for now we have to do it here.\n return\n }\n\n if (!this.isPlainObject(value) && !Array.isArray(value)) {\n target[key] = value\n return\n }\n\n if (!target[key]) {\n target[key] = Array.isArray(value) ? [] : {}\n }\n\n memo.set(value, target[key])\n this.merge(target[key], value, memo)\n memo.delete(value)\n }\n\n private static mergeObjectKey(\n target: any,\n key: string,\n value: any,\n memo: Map<any, any>,\n ) {\n // Have we seen this before? Prevent infinite recursion.\n if (memo.has(value)) {\n Object.assign(target, { [key]: memo.get(value) })\n return\n }\n\n if (value instanceof Promise) {\n // Skip promises entirely.\n // This is a hold-over from the old code & is because we don't want to pull in\n // the lazy fields. Ideally we'd remove these promises via another function first\n // but for now we have to do it here.\n return\n }\n\n if (!this.isPlainObject(value) && !Array.isArray(value)) {\n Object.assign(target, { [key]: value })\n return\n }\n\n if (!target[key]) {\n Object.assign(target, { [key]: Array.isArray(value) ? [] : {} })\n }\n\n memo.set(value, target[key])\n this.merge(target[key], value, memo)\n memo.delete(value)\n }\n\n private static merge(\n target: any,\n source: any,\n memo: Map<any, any> = new Map(),\n ): any {\n if (this.isPlainObject(target) && this.isPlainObject(source)) {\n for (const key of Object.keys(source)) {\n if (key === \"__proto__\") continue\n this.mergeObjectKey(target, key, source[key], memo)\n }\n }\n\n if (Array.isArray(target) && Array.isArray(source)) {\n for (let key = 0; key < source.length; key++) {\n this.mergeArrayKey(target, key, source[key], memo)\n }\n }\n }\n}\n"],"sourceRoot":".."}
|