* Defines getter and setter for every owning side of m:1 and 1:1 relation. This is then used for propagation of * changes to the inverse side of bi-directional relations. Rest of the properties are also defined this way to * achieve dirtiness, which is then used for fast checks whether we need
(meta: EntityMetadata<T>, em: EntityManager)
| 134 | * than on its prototype. Thanks to this we still have those properties enumerable (e.g. part of `Object.keys(entity)`). |
| 135 | */ |
| 136 | private static defineProperties<T extends object>(meta: EntityMetadata<T>, em: EntityManager): void { |
| 137 | Object.values<EntityProperty<T>>(meta.properties).forEach(prop => { |
| 138 | const isCollection = [ReferenceKind.ONE_TO_MANY, ReferenceKind.MANY_TO_MANY].includes(prop.kind); |
| 139 | // oxfmt-ignore |
| 140 | const isReference = [ReferenceKind.ONE_TO_ONE, ReferenceKind.MANY_TO_ONE].includes(prop.kind) && (prop.inversedBy || prop.mappedBy) && !prop.mapToPk; |
| 141 | |
| 142 | if (isReference) { |
| 143 | Object.defineProperty(meta.prototype, prop.name, { |
| 144 | set(val: AnyEntity) { |
| 145 | EntityHelper.defineReferenceProperty(meta, prop, this, em.getHydrator()); |
| 146 | this[prop.name] = val; |
| 147 | }, |
| 148 | configurable: true, |
| 149 | }); |
| 150 | return; |
| 151 | } |
| 152 | |
| 153 | if (prop.inherited || prop.primary || prop.accessor || prop.persist === false || prop.embedded || isCollection) { |
| 154 | return; |
| 155 | } |
| 156 | |
| 157 | Object.defineProperty(meta.prototype, prop.name, { |
| 158 | set(val) { |
| 159 | Object.defineProperty(this, prop.name, { |
| 160 | get() { |
| 161 | return this.__helper?.__data[prop.name]; |
| 162 | }, |
| 163 | set(val) { |
| 164 | this.__helper.__data[prop.name] = val; |
| 165 | }, |
| 166 | enumerable: true, |
| 167 | configurable: true, |
| 168 | }); |
| 169 | this.__helper.__data[prop.name] = val; |
| 170 | }, |
| 171 | configurable: true, |
| 172 | }); |
| 173 | }); |
| 174 | } |
| 175 | |
| 176 | static defineCustomInspect<T extends object>(meta: EntityMetadata<T>): void { |
| 177 | // @ts-ignore |
no test coverage detected