velocious 1.0.439 → 1.0.441
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/build/database/query/model-class-query.js +20 -7
- package/build/database/record/index.js +79 -8
- package/build/frontend-model-controller.js +4 -7
- package/build/frontend-model-resource/base-resource.js +5 -2
- package/build/frontend-models/websocket-publishers.js +10 -12
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +19 -8
- package/build/src/database/record/index.d.ts +18 -0
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +73 -11
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +6 -8
- package/build/src/frontend-model-resource/base-resource.js +6 -3
- package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-publishers.js +11 -11
- package/package.json +1 -1
- package/src/database/query/model-class-query.js +20 -7
- package/src/database/record/index.js +79 -8
- package/src/frontend-model-controller.js +4 -7
- package/src/frontend-model-resource/base-resource.js +5 -2
- package/src/frontend-models/websocket-publishers.js +10 -12
|
@@ -301,17 +301,30 @@ export default class VelociousDatabaseQueryModelClassQuery extends DatabaseQuery
|
|
|
301
301
|
* @returns {Promise<number>} - Resolves with the count.
|
|
302
302
|
*/
|
|
303
303
|
async count() {
|
|
304
|
-
//
|
|
305
|
-
// legacy tables
|
|
306
|
-
//
|
|
307
|
-
//
|
|
308
|
-
|
|
309
|
-
|
|
304
|
+
// A model without a single primary-key column — setPrimaryKey(null) or a composite
|
|
305
|
+
// setPrimaryKey([...]) on legacy tables — has no column COUNT can reference (an array primary key
|
|
306
|
+
// cannot be quoted as a single COUNT(column), and primaryKey() falls back to "id" for the no-pk
|
|
307
|
+
// case, so hasPrimaryKey() detects that one).
|
|
308
|
+
const hasSingleColumnPrimaryKey = this.getModelClass().hasPrimaryKey() && !Array.isArray(this.getModelClass().primaryKey())
|
|
309
|
+
|
|
310
|
+
// Pagination, or an ungrouped query on a model with no single primary-key column, counts via the
|
|
311
|
+
// subquery form. It references no primary-key column and preserves DISTINCT over joins — which a
|
|
312
|
+
// bare COUNT(*) would not (it would count joined duplicate rows instead of distinct root rows).
|
|
313
|
+
// A grouped query stays on the per-group flow below, because the subquery form would count one
|
|
314
|
+
// row per group instead of summing each group's row count.
|
|
315
|
+
if (this._limit !== null || this._offset !== null || (!hasSingleColumnPrimaryKey && this._groups.length == 0)) {
|
|
310
316
|
return await this.paginatedCount()
|
|
311
317
|
}
|
|
312
318
|
|
|
319
|
+
if (!hasSingleColumnPrimaryKey && this._distinct) {
|
|
320
|
+
throw new Error(`Can't count a grouped distinct query on ${this.getModelClass().name} because it has no single primary-key column to count distinct values of`)
|
|
321
|
+
}
|
|
322
|
+
|
|
313
323
|
const distinctPrefix = this._distinct ? "DISTINCT " : ""
|
|
314
|
-
|
|
324
|
+
const countExpression = hasSingleColumnPrimaryKey
|
|
325
|
+
? `${this.driver.quoteTable(this.getModelClass().tableName())}.${this.driver.quoteColumn(this.getModelClass().primaryKey())}`
|
|
326
|
+
: "*"
|
|
327
|
+
let sql = `COUNT(${distinctPrefix}${countExpression})`
|
|
315
328
|
|
|
316
329
|
if (this.driver.getType() == "pgsql") sql += "::int"
|
|
317
330
|
|
|
@@ -266,11 +266,75 @@ class VelociousDatabaseRecord {
|
|
|
266
266
|
* @returns {string} - Mapped column name, or the underscored attribute name when no mapping exists.
|
|
267
267
|
*/
|
|
268
268
|
static getColumnNameForAttributeName(attributeName) {
|
|
269
|
-
const
|
|
269
|
+
const resolvedAttributeName = this.resolveAttributeName(attributeName)
|
|
270
|
+
|
|
271
|
+
if (resolvedAttributeName) return this.getAttributeNameToColumnNameMap()[resolvedAttributeName]
|
|
272
|
+
|
|
273
|
+
return inflection.underscore(inflection.camelize(deburrColumnName(attributeName), true))
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Resolves an incoming attribute or column name to the canonical attribute name this model exposes.
|
|
278
|
+
* Accepts the canonical (deburred) attribute name, a raw umlaut/acronym column name, a pre-deburr
|
|
279
|
+
* camelization, and camelCase casing variants (e.g. "vAFunktionID" vs "vAFunktionid"). Returns null
|
|
280
|
+
* when nothing matches, so callers keep their own not-found handling.
|
|
281
|
+
* @param {string} name - Attribute name or column name to resolve.
|
|
282
|
+
* @returns {string | null} - Canonical attribute name, or null.
|
|
283
|
+
*/
|
|
284
|
+
static resolveAttributeName(name) {
|
|
285
|
+
const attributeNameToColumnNameMap = this.getAttributeNameToColumnNameMap()
|
|
286
|
+
|
|
287
|
+
if (name in attributeNameToColumnNameMap) return name
|
|
288
|
+
|
|
289
|
+
const normalizedAttributeName = inflection.camelize(deburrColumnName(name), true)
|
|
290
|
+
|
|
291
|
+
if (normalizedAttributeName in attributeNameToColumnNameMap) return normalizedAttributeName
|
|
292
|
+
|
|
293
|
+
const columnNameToAttributeNameMap = this.getColumnNameToAttributeNameMap()
|
|
294
|
+
|
|
295
|
+
if (name in columnNameToAttributeNameMap) return columnNameToAttributeNameMap[name]
|
|
296
|
+
|
|
297
|
+
// Final fallback: match camelCase casing variants against the model's generated accessors. These
|
|
298
|
+
// exist on the prototype before runtime initialization (unlike the attribute map), so this also
|
|
299
|
+
// resolves names looked up during create, before the map is built. inflection lower-cases trailing
|
|
300
|
+
// acronyms ("ID" -> "id"), so "vAFunktionID"/"VA_FunktionID" still resolve to "vAFunktionid".
|
|
301
|
+
const lowerNormalizedAttributeName = normalizedAttributeName.toLowerCase()
|
|
302
|
+
let prototype = this.prototype
|
|
270
303
|
|
|
271
|
-
|
|
304
|
+
while (prototype && prototype !== Object.prototype) {
|
|
305
|
+
for (const accessorName of Object.getOwnPropertyNames(prototype)) {
|
|
306
|
+
if (accessorName.toLowerCase() === lowerNormalizedAttributeName) return accessorName
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
prototype = Object.getPrototypeOf(prototype)
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
return null
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Finds the member name on a target's prototype chain matching `memberName`, falling back to a
|
|
317
|
+
* case-insensitive match. Resolves setters when a read-only attribute alias differs only in camelCase
|
|
318
|
+
* casing from the generated accessor (e.g. a "vAFunktionID" alias whose setter is "setVAFunktionid").
|
|
319
|
+
* @param {object} target - Instance or prototype to search.
|
|
320
|
+
* @param {string} memberName - Member name to find.
|
|
321
|
+
* @returns {string | null} - Matching member name, or null when absent.
|
|
322
|
+
*/
|
|
323
|
+
static findMemberNameInsensitive(target, memberName) {
|
|
324
|
+
if (memberName in target) return memberName
|
|
325
|
+
|
|
326
|
+
const lowerMemberName = memberName.toLowerCase()
|
|
327
|
+
let current = target
|
|
328
|
+
|
|
329
|
+
while (current && current !== Object.prototype) {
|
|
330
|
+
for (const candidateName of Object.getOwnPropertyNames(current)) {
|
|
331
|
+
if (candidateName.toLowerCase() === lowerMemberName) return candidateName
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
current = Object.getPrototypeOf(current)
|
|
335
|
+
}
|
|
272
336
|
|
|
273
|
-
return
|
|
337
|
+
return null
|
|
274
338
|
}
|
|
275
339
|
|
|
276
340
|
/**
|
|
@@ -1666,7 +1730,11 @@ class VelociousDatabaseRecord {
|
|
|
1666
1730
|
* @returns {void} - No return value.
|
|
1667
1731
|
*/
|
|
1668
1732
|
setAttribute(name, newValue) {
|
|
1669
|
-
|
|
1733
|
+
// Resolve raw column names ("VA_ÜbAttributID", "IP") and casing variants ("vAFunktionID") to the
|
|
1734
|
+
// canonical attribute the model base generates its setter from (setVAUebattributid, setIp, …).
|
|
1735
|
+
const canonicalName = this.getModelClass().resolveAttributeName(name) ?? name
|
|
1736
|
+
const requestedSetterName = `set${inflection.camelize(canonicalName)}`
|
|
1737
|
+
const setterName = this.getModelClass().findMemberNameInsensitive(this, requestedSetterName)
|
|
1670
1738
|
const dynamicThis = /**
|
|
1671
1739
|
* Narrows the runtime value to the documented type.
|
|
1672
1740
|
@type {Record<string, (value: ?) => void>} */ (/**
|
|
@@ -1675,7 +1743,7 @@ class VelociousDatabaseRecord {
|
|
|
1675
1743
|
|
|
1676
1744
|
this.getModelClass()._assertHasBeenInitialized()
|
|
1677
1745
|
if (!this.getModelClass().isInitialized()) throw new Error(`${this.constructor.name} model isn't initialized yet`)
|
|
1678
|
-
if (!
|
|
1746
|
+
if (!setterName) throw new Error(`No such setter method: ${this.constructor.name}#${requestedSetterName}`)
|
|
1679
1747
|
|
|
1680
1748
|
dynamicThis[setterName](newValue)
|
|
1681
1749
|
}
|
|
@@ -1689,7 +1757,8 @@ class VelociousDatabaseRecord {
|
|
|
1689
1757
|
this.getModelClass()._assertHasBeenInitialized()
|
|
1690
1758
|
if (!this.getModelClass()._attributeNameToColumnName) throw new Error("No attribute-to-column mapping. Has record been initialized?")
|
|
1691
1759
|
|
|
1692
|
-
const
|
|
1760
|
+
const resolvedName = this.getModelClass().resolveAttributeName(name)
|
|
1761
|
+
const columnName = resolvedName ? this.getModelClass().getAttributeNameToColumnNameMap()[resolvedName] : undefined
|
|
1693
1762
|
|
|
1694
1763
|
if (!columnName) throw new Error(`Couldn't figure out column name for attribute: ${name}`)
|
|
1695
1764
|
|
|
@@ -3540,9 +3609,11 @@ class VelociousDatabaseRecord {
|
|
|
3540
3609
|
*/
|
|
3541
3610
|
readAttribute(attributeName) {
|
|
3542
3611
|
this.getModelClass()._assertHasBeenInitialized()
|
|
3543
|
-
const
|
|
3612
|
+
const map = this.getModelClass().getAttributeNameToColumnNameMap()
|
|
3613
|
+
const resolvedAttributeName = this.getModelClass().resolveAttributeName(attributeName)
|
|
3614
|
+
const columnName = resolvedAttributeName ? map[resolvedAttributeName] : undefined
|
|
3544
3615
|
|
|
3545
|
-
if (!columnName) throw new Error(`Couldn't figure out column name for attribute: ${attributeName} from these mappings: ${Object.keys(
|
|
3616
|
+
if (!columnName) throw new Error(`Couldn't figure out column name for attribute: ${attributeName} from these mappings: ${Object.keys(map).join(", ")}`)
|
|
3546
3617
|
|
|
3547
3618
|
return /** @type {V} */ (this.readColumn(columnName))
|
|
3548
3619
|
}
|
|
@@ -1828,15 +1828,12 @@ export default class FrontendModelController extends Controller {
|
|
|
1828
1828
|
* @returns {string | undefined} - Resolved DB column name, or `undefined`.
|
|
1829
1829
|
*/
|
|
1830
1830
|
resolveFrontendModelColumnName(modelClass, key) {
|
|
1831
|
-
const
|
|
1832
|
-
const columnName = attributeNameToColumnNameMap[key]
|
|
1833
|
-
|
|
1834
|
-
if (columnName) return columnName
|
|
1831
|
+
const resolvedAttributeName = modelClass.resolveAttributeName(key)
|
|
1835
1832
|
|
|
1836
|
-
|
|
1837
|
-
const columnNameToAttributeNameMap = modelClass.getColumnNameToAttributeNameMap()
|
|
1833
|
+
if (resolvedAttributeName) return modelClass.getAttributeNameToColumnNameMap()[resolvedAttributeName]
|
|
1838
1834
|
|
|
1839
|
-
|
|
1835
|
+
// Fall back: the key may already be a raw DB column name not present in the attribute map.
|
|
1836
|
+
if (modelClass.getColumnNameToAttributeNameMap()[key]) return key
|
|
1840
1837
|
|
|
1841
1838
|
return undefined
|
|
1842
1839
|
}
|
|
@@ -906,8 +906,11 @@ function filterWritableFrontendModelAttributes(receiver, attributes, resource =
|
|
|
906
906
|
continue
|
|
907
907
|
}
|
|
908
908
|
|
|
909
|
-
const
|
|
910
|
-
const
|
|
909
|
+
const modelClass = /** Narrows the runtime value to the documented type. @type {?} */ (receiver).constructor
|
|
910
|
+
const resolvedAttributeName = (modelClass && typeof modelClass.resolveAttributeName === "function" && modelClass.resolveAttributeName(attributeName)) || attributeName
|
|
911
|
+
const requestedSetterName = `set${inflection.camelize(resolvedAttributeName)}`
|
|
912
|
+
const setterName = (modelClass && typeof modelClass.findMemberNameInsensitive === "function" && modelClass.findMemberNameInsensitive(receiver, requestedSetterName)) || requestedSetterName
|
|
913
|
+
const resourceSetterName = `set${inflection.camelize(attributeName)}Attribute`
|
|
911
914
|
|
|
912
915
|
if (setterName in receiver) {
|
|
913
916
|
writableAttributes[attributeName] = value
|
|
@@ -5,7 +5,7 @@ import FrontendModelBaseResource from "../frontend-model-resource/base-resource.
|
|
|
5
5
|
import {frontendModelResourcesForBackendProject} from "./resource-definition.js"
|
|
6
6
|
import {serializeFrontendModelTransportValue} from "./transport-serialization.js"
|
|
7
7
|
|
|
8
|
-
const
|
|
8
|
+
const modelClassesWithRegisteredHooks = new WeakSet()
|
|
9
9
|
const channelClassRegisteredConfigurations = new WeakSet()
|
|
10
10
|
|
|
11
11
|
/** Shared channel name for all frontend-model lifecycle subscriptions. */
|
|
@@ -149,16 +149,14 @@ export async function ensureFrontendModelWebsocketPublishersRegistered(configura
|
|
|
149
149
|
|
|
150
150
|
if (!modelClass) continue
|
|
151
151
|
|
|
152
|
-
|
|
152
|
+
// Register lifecycle hooks once per model class, not per configuration. A model class belongs to a
|
|
153
|
+
// single backend project/config in production, so per-config registration only differs in tests where
|
|
154
|
+
// the same model class is reachable from multiple configs — there it attaches duplicate beforeCreate/
|
|
155
|
+
// afterSave/afterDestroy hooks that double-fire broadcasts (and leak across specs). The hooks read the
|
|
156
|
+
// model's runtime configuration when broadcasting, so a single registration is sufficient.
|
|
157
|
+
if (modelClassesWithRegisteredHooks.has(modelClass)) continue
|
|
153
158
|
|
|
154
|
-
|
|
155
|
-
registeredConfigurations = new WeakSet()
|
|
156
|
-
registeredConfigurationsByModelClass.set(modelClass, registeredConfigurations)
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
if (registeredConfigurations.has(configuration)) continue
|
|
160
|
-
|
|
161
|
-
registeredConfigurations.add(configuration)
|
|
159
|
+
modelClassesWithRegisteredHooks.add(modelClass)
|
|
162
160
|
|
|
163
161
|
modelClass.beforeCreate((model) => {
|
|
164
162
|
/**
|
|
@@ -181,7 +179,7 @@ export async function ensureFrontendModelWebsocketPublishersRegistered(configura
|
|
|
181
179
|
if (action !== "create" && action !== "update") return
|
|
182
180
|
|
|
183
181
|
void model.getModelClass().connection().afterCommit(async () => {
|
|
184
|
-
broadcastFrontendModelEvent(
|
|
182
|
+
broadcastFrontendModelEvent(model._getConfiguration(), modelName, {
|
|
185
183
|
action,
|
|
186
184
|
id: model.id(),
|
|
187
185
|
record: model.attributes()
|
|
@@ -192,7 +190,7 @@ export async function ensureFrontendModelWebsocketPublishersRegistered(configura
|
|
|
192
190
|
|
|
193
191
|
modelClass.afterDestroy((model) => {
|
|
194
192
|
void model.getModelClass().connection().afterCommit(async () => {
|
|
195
|
-
broadcastFrontendModelEvent(
|
|
193
|
+
broadcastFrontendModelEvent(model._getConfiguration(), modelName, {
|
|
196
194
|
action: "destroy",
|
|
197
195
|
id: model.id()
|
|
198
196
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-class-query.d.ts","sourceRoot":"","sources":["../../../../src/database/query/model-class-query.js"],"names":[],"mappings":"AAmKA;;;GAGG;AACH;;;;GAIG;AAEH;;;GAGG;AACH,2DAZ4D,EAAE,SAAjD,cAAe,oBAAoB,EAAE,OAAQ;IAaxD;;;OAGG;IACH,kBAFW,uBAAuB,CAAC,EAAE,CAAC,EA+BrC;IArBC;;mBAEe;IACf,YADS,EAAE,CACiB;IAE5B;;yBAEqB;IACrB,eADS,MAAM,EAAE,CAC2B;IAC5C,0BAAsF;IACtF,gCAAiE;IAEjE;;2DAEuD;IACvD,YADS,OAAO,iBAAiB,EAAE,cAAc,EAAE,CACQ;IAE3D;;2DAEuD;IACvD,YADS,OAAO,iBAAiB,EAAE,cAAc,EAAE,CACQ;IAG7D;;;OAGG;IACH,SAFa,IAAI,CAgChB;IAED;;;;;;OAMG;IACH,gBAHW,OAAO,iBAAiB,EAAE,aAAa,GACrC,IAAI,CAQhB;IAED;;;;;;;;;;;;OAYG;IACH,gBAHW,OAAO,iBAAiB,EAAE,aAAa,GACrC,IAAI,CAQhB;IAED;;;;;;;;OAQG;IACH,sBAHc,MAAM,EAAA,GACP,MAAM,CAIlB;IAED;;;OAGG;IACH,SAFa,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"model-class-query.d.ts","sourceRoot":"","sources":["../../../../src/database/query/model-class-query.js"],"names":[],"mappings":"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"}
|