objection
Advanced tools
Comparing version 3.1.3 to 3.1.4
@@ -222,3 +222,3 @@ 'use strict'; | ||
$omitFromJson(props) { | ||
$omitFromJson(...props) { | ||
if (arguments.length === 0) { | ||
@@ -228,10 +228,10 @@ return this.$$omitFromJson; | ||
if (!this.hasOwnProperty('$$omitFromJson')) { | ||
defineNonEnumerableProperty(this, '$$omitFromJson', props); | ||
} else { | ||
this.$$omitFromJson = this.$$omitFromJson.concat(props); | ||
defineNonEnumerableProperty(this, '$$omitFromJson', []); | ||
} | ||
this.$$omitFromJson = this.$$omitFromJson.concat(asPropsArray(props)); | ||
return this; | ||
} | ||
} | ||
$omitFromDatabaseJson(props) { | ||
$omitFromDatabaseJson(...props) { | ||
if (arguments.length === 0) { | ||
@@ -241,6 +241,6 @@ return this.$$omitFromDatabaseJson; | ||
if (!this.hasOwnProperty('$$omitFromDatabaseJson')) { | ||
defineNonEnumerableProperty(this, '$$omitFromDatabaseJson', props); | ||
} else { | ||
this.$$omitFromDatabaseJson = this.$$omitFromDatabaseJson.concat(props); | ||
defineNonEnumerableProperty(this, '$$omitFromDatabaseJson', []); | ||
} | ||
this.$$omitFromDatabaseJson = this.$$omitFromDatabaseJson.concat(asPropsArray(props)); | ||
return this; | ||
} | ||
@@ -913,4 +913,18 @@ } | ||
function asPropsArray(props) { | ||
if (props.length === 1) { | ||
const arg = props[0]; | ||
if (Array.isArray(arg)) { | ||
return arg; | ||
} else if (arg && typeof arg === 'object') { | ||
return Object.entries(arg) | ||
.filter(([, value]) => value) | ||
.map(([key]) => key); | ||
} | ||
} | ||
return props; | ||
} | ||
module.exports = { | ||
Model, | ||
}; |
@@ -6,3 +6,3 @@ 'use strict'; | ||
const { isInternalProp } = require('../../../utils/internalPropUtils'); | ||
const { union, difference, isObject, jsonEquals } = require('../../../utils/objectUtils'); | ||
const { difference, isObject, jsonEquals } = require('../../../utils/objectUtils'); | ||
const promiseUtils = require('../../../utils/promiseUtils'); | ||
@@ -37,3 +37,3 @@ | ||
const { changedProps, unchangedProps } = this._findChanges(node); | ||
const allProps = union(changedProps, unchangedProps); | ||
const allProps = [...changedProps, ...unchangedProps]; | ||
@@ -64,3 +64,4 @@ const propsToUpdate = difference( | ||
// there is nothing to update. Otherwise, we need to wait for the hook to be | ||
// called before calling handleUpdate. See issue #2233. | ||
// called before calling handleUpdate, but only if the node contains changes | ||
// that aren't id properties (relates). See issues #2233, #2605. | ||
const hasBeforeUpdate = | ||
@@ -70,3 +71,6 @@ node.obj.constructor.beforeUpdate !== Model.beforeUpdate || | ||
if (!hasBeforeUpdate && !handleUpdate()) { | ||
if ( | ||
(hasBeforeUpdate && !this._hasNonIdPropertyChanges(node)) || | ||
(!hasBeforeUpdate && !handleUpdate()) | ||
) { | ||
return null; | ||
@@ -89,20 +93,11 @@ } | ||
if (hasBeforeUpdate) { | ||
updateBuilder | ||
.context({ | ||
runBefore: () => { | ||
// Call handleUpdate in the runBefore hook which runs after the | ||
// $beforeUpdate hook, allowing it to modify the object before the | ||
// updated properties are determined. See issue #2233. | ||
if (hasBeforeUpdate && !handleUpdate()) { | ||
throw new ReturnNullException(); | ||
} | ||
}, | ||
}) | ||
.onError((error) => { | ||
if (error instanceof ReturnNullException) { | ||
return null; | ||
} else { | ||
return Promise.reject(error); | ||
} | ||
}); | ||
updateBuilder.internalContext().runBefore.push((result, builder) => { | ||
// Call handleUpdate in the runBefore hook which runs after the | ||
// $beforeUpdate hook, allowing it to modify the object before the | ||
// updated properties are determined. See issue #2233. | ||
if (hasBeforeUpdate && !handleUpdate()) { | ||
builder.internalOptions().returnImmediatelyValue = null; | ||
} | ||
return result; | ||
}); | ||
} | ||
@@ -224,2 +219,7 @@ | ||
_hasNonIdPropertyChanges(node) { | ||
const idProps = node.modelClass.getIdPropertyArray(); | ||
return this._findChanges(node).changedProps.some((prop) => !idProps.includes(prop)); | ||
} | ||
_createBuilder(node) { | ||
@@ -244,4 +244,2 @@ if (node.parentEdge && !node.parentEdge.relation.isObjectionHasManyRelation) { | ||
class ReturnNullException {} | ||
function childQueryOptions() { | ||
@@ -248,0 +246,0 @@ return { |
@@ -7,2 +7,3 @@ 'use strict'; | ||
this.keepImplicitJoinProps = false; | ||
this.returnImmediatelyValue = undefined; | ||
this.isInternalQuery = false; | ||
@@ -18,2 +19,3 @@ this.debug = false; | ||
copy.keepImplicitJoinProps = this.keepImplicitJoinProps; | ||
copy.returnImmediatelyValue = this.returnImmediatelyValue; | ||
copy.isInternalQuery = this.isInternalQuery; | ||
@@ -20,0 +22,0 @@ copy.debug = this.debug; |
@@ -1122,3 +1122,20 @@ 'use strict'; | ||
class ReturnImmediatelyException { | ||
constructor(value) { | ||
this.value = value; | ||
} | ||
} | ||
function handleReturnImmediatelyValue(builder) { | ||
const { returnImmediatelyValue } = builder.internalOptions(); | ||
if (returnImmediatelyValue !== undefined) { | ||
throw new ReturnImmediatelyException(returnImmediatelyValue); | ||
} | ||
} | ||
function handleExecuteError(builder, err) { | ||
if (err instanceof ReturnImmediatelyException) { | ||
return Promise.resolve(err.value); | ||
} | ||
let promise = Promise.reject(wrapError(err)); | ||
@@ -1143,5 +1160,7 @@ | ||
if (op.hasHook(hookName)) { | ||
promise = promise.then((result) => | ||
builder.callAsyncOperationMethod(op, hookName, [builder, result]), | ||
); | ||
promise = promise.then((result) => { | ||
const res = builder.callAsyncOperationMethod(op, hookName, [builder, result]); | ||
handleReturnImmediatelyValue(builder); | ||
return res; | ||
}); | ||
} | ||
@@ -1266,3 +1285,7 @@ }); | ||
if (isFunction(func)) { | ||
promise = promise.then((result) => func.call(builder, result, builder)); | ||
promise = promise.then((result) => { | ||
const res = func.call(builder, result, builder); | ||
handleReturnImmediatelyValue(builder); | ||
return res; | ||
}); | ||
} else if (Array.isArray(func)) { | ||
@@ -1269,0 +1292,0 @@ func.forEach((func) => { |
{ | ||
"name": "objection", | ||
"version": "3.1.3", | ||
"version": "3.1.4", | ||
"description": "An SQL-friendly ORM for Node.js", | ||
@@ -75,3 +75,3 @@ "main": "lib/objection.js", | ||
"pg": "^8.11.3", | ||
"prettier": "3.1.0", | ||
"prettier": "3.2.5", | ||
"sqlite3": "^5.1.6", | ||
@@ -78,0 +78,0 @@ "typescript": ">=5.3.2", |
@@ -232,9 +232,10 @@ /// <reference types="node" /> | ||
type PartialModelGraphField<F> = Defined<F> extends Model | ||
? PartialModelGraph<Defined<F>> | ||
: Defined<F> extends Array<infer I> | ||
? I extends Model | ||
? PartialModelGraph<I>[] | ||
: Expression<F> | ||
: Expression<F>; | ||
type PartialModelGraphField<F> = | ||
Defined<F> extends Model | ||
? PartialModelGraph<Defined<F>> | ||
: Defined<F> extends Array<infer I> | ||
? I extends Model | ||
? PartialModelGraph<I>[] | ||
: Expression<F> | ||
: Expression<F>; | ||
@@ -1703,4 +1704,2 @@ /** | ||
$set(obj: Pojo): this; | ||
$omit(keys: string | string[] | { [key: string]: boolean }): this; | ||
$pick(keys: string | string[] | { [key: string]: boolean }): this; | ||
$clone(opt?: CloneOptions): this; | ||
@@ -1711,2 +1710,4 @@ $traverse(filterConstructor: typeof Model, traverser: TraverserFunction): this; | ||
$traverseAsync(traverser: TraverserFunction): Promise<this>; | ||
$omitFromJson(keys: string | string[] | { [key: string]: boolean }): this; | ||
$omitFromDatabaseJson(keys: string | string[] | { [key: string]: boolean }): this; | ||
@@ -1713,0 +1714,0 @@ $knex(): Knex; |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
643597
19994