velocious 1.0.446 → 1.0.448

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.
Files changed (71) hide show
  1. package/README.md +2 -2
  2. package/build/configuration-types.js +4 -2
  3. package/build/database/pool/async-tracked-multi-connection.js +125 -8
  4. package/build/database/pool/base.js +14 -1
  5. package/build/database/record/index.js +10 -10
  6. package/build/frontend-models/base.js +99 -91
  7. package/build/frontend-models/preloader.js +7 -7
  8. package/build/frontend-models/query.js +18 -18
  9. package/build/frontend-models/use-created-event.js +1 -1
  10. package/build/frontend-models/use-destroyed-event.js +1 -1
  11. package/build/frontend-models/use-model-class-event.js +1 -1
  12. package/build/frontend-models/use-updated-event.js +1 -1
  13. package/build/routes/resolver.js +17 -14
  14. package/build/src/configuration-types.d.ts +16 -6
  15. package/build/src/configuration-types.d.ts.map +1 -1
  16. package/build/src/configuration-types.js +5 -3
  17. package/build/src/database/pool/async-tracked-multi-connection.d.ts +60 -4
  18. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  19. package/build/src/database/pool/async-tracked-multi-connection.js +116 -9
  20. package/build/src/database/pool/base.d.ts +38 -1
  21. package/build/src/database/pool/base.d.ts.map +1 -1
  22. package/build/src/database/pool/base.js +14 -2
  23. package/build/src/database/record/index.d.ts +19 -19
  24. package/build/src/database/record/index.d.ts.map +1 -1
  25. package/build/src/database/record/index.js +11 -11
  26. package/build/src/frontend-models/base.d.ts +163 -153
  27. package/build/src/frontend-models/base.d.ts.map +1 -1
  28. package/build/src/frontend-models/base.js +100 -92
  29. package/build/src/frontend-models/preloader.d.ts +10 -10
  30. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  31. package/build/src/frontend-models/preloader.js +8 -8
  32. package/build/src/frontend-models/query.d.ts +8 -8
  33. package/build/src/frontend-models/query.d.ts.map +1 -1
  34. package/build/src/frontend-models/query.js +19 -19
  35. package/build/src/frontend-models/use-created-event.d.ts +2 -2
  36. package/build/src/frontend-models/use-created-event.d.ts.map +1 -1
  37. package/build/src/frontend-models/use-created-event.js +2 -2
  38. package/build/src/frontend-models/use-destroyed-event.d.ts +1 -1
  39. package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
  40. package/build/src/frontend-models/use-destroyed-event.js +2 -2
  41. package/build/src/frontend-models/use-model-class-event.d.ts +1 -1
  42. package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
  43. package/build/src/frontend-models/use-model-class-event.js +2 -2
  44. package/build/src/frontend-models/use-updated-event.d.ts +1 -1
  45. package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
  46. package/build/src/frontend-models/use-updated-event.js +2 -2
  47. package/build/src/routes/resolver.d.ts.map +1 -1
  48. package/build/src/routes/resolver.js +7 -4
  49. package/build/src/utils/model-scope.d.ts +4 -4
  50. package/build/src/utils/model-scope.d.ts.map +1 -1
  51. package/build/src/utils/model-scope.js +3 -3
  52. package/build/src/utils/ransack.d.ts +1 -1
  53. package/build/src/utils/ransack.d.ts.map +1 -1
  54. package/build/src/utils/ransack.js +2 -2
  55. package/build/utils/model-scope.js +2 -2
  56. package/build/utils/ransack.js +1 -1
  57. package/package.json +1 -1
  58. package/src/configuration-types.js +4 -2
  59. package/src/database/pool/async-tracked-multi-connection.js +125 -8
  60. package/src/database/pool/base.js +14 -1
  61. package/src/database/record/index.js +10 -10
  62. package/src/frontend-models/base.js +99 -91
  63. package/src/frontend-models/preloader.js +7 -7
  64. package/src/frontend-models/query.js +18 -18
  65. package/src/frontend-models/use-created-event.js +1 -1
  66. package/src/frontend-models/use-destroyed-event.js +1 -1
  67. package/src/frontend-models/use-model-class-event.js +1 -1
  68. package/src/frontend-models/use-updated-event.js +1 -1
  69. package/src/routes/resolver.js +17 -14
  70. package/src/utils/model-scope.js +2 -2
  71. package/src/utils/ransack.js +1 -1
@@ -32,6 +32,14 @@ import {readPayloadAssociationCount, readPayloadComputedAbility, readPayloadQuer
32
32
  * Defines this typedef.
33
33
  * @typedef {{attributes?: string[], builtInCollectionCommands?: string[], builtInMemberCommands?: string[], collectionCommands?: string[], commands?: string[], memberCommands?: string[], attachments?: Record<string, FrontendModelAttachmentDefinition>, modelName?: string, nestedAttributes?: Record<string, {allowDestroy?: boolean, limit?: number}>, primaryKey?: string, relationships?: string[]}} FrontendModelResourceConfig
34
34
  */
35
+ /**
36
+ * Frontend model constructor type.
37
+ * @typedef {{new (attributes?: Record<string, ?>): FrontendModelBase}} FrontendModelConstructor
38
+ */
39
+ /**
40
+ * Frontend model static side without generated per-model create overloads.
41
+ * @typedef {FrontendModelConstructor & Omit<typeof FrontendModelBase, "create">} FrontendModelClass
42
+ */
35
43
  /**
36
44
  * FrontendModelTransportConfig type.
37
45
  * @typedef {object} FrontendModelTransportConfig
@@ -61,7 +69,7 @@ const QUERY_DATA_KEY = "__queryData"
61
69
  const ABILITIES_KEY = "__abilities"
62
70
  /**
63
71
  * Pending shared frontend model requests.
64
- @type {Array<{commandName?: string, commandType: FrontendModelRequestCommandType, customPath?: string, modelClass: typeof FrontendModelBase, payload: Record<string, ?>, requestId: string, resolve: (response: Record<string, ?>) => void, reject: (error: ?) => void, resourcePath?: string | null}>} */
72
+ @type {Array<{commandName?: string, commandType: FrontendModelRequestCommandType, customPath?: string, modelClass: FrontendModelClass, payload: Record<string, ?>, requestId: string, resolve: (response: Record<string, ?>) => void, reject: (error: ?) => void, resourcePath?: string | null}>} */
65
73
  let pendingSharedFrontendModelRequests = []
66
74
  let sharedFrontendModelRequestId = 0
67
75
  let sharedFrontendModelFlushScheduled = false
@@ -208,7 +216,7 @@ async function flushBufferedOutgoingEventsAfterReconnect() {
208
216
 
209
217
  /**
210
218
  * Runs default frontend model resource path.
211
- * @param {typeof FrontendModelBase} modelClass - Frontend model class.
219
+ * @param {FrontendModelClass} modelClass - Frontend model class.
212
220
  * @returns {string} - Default resource path for the model class.
213
221
  */
214
222
  function defaultFrontendModelResourcePath(modelClass) {
@@ -230,8 +238,8 @@ export class AttributeNotSelectedError extends Error {
230
238
 
231
239
  /**
232
240
  * Lightweight singular relationship state holder for frontend model instances.
233
- * @template {typeof FrontendModelBase} S
234
- * @template {typeof FrontendModelBase} T
241
+ * @template {FrontendModelClass} S
242
+ * @template {FrontendModelClass} T
235
243
  */
236
244
  export class FrontendModelSingularRelationship {
237
245
  /**
@@ -300,8 +308,8 @@ export class FrontendModelSingularRelationship {
300
308
 
301
309
  /**
302
310
  * Lightweight has-many relationship state holder for frontend model instances.
303
- * @template {typeof FrontendModelBase} S
304
- * @template {typeof FrontendModelBase} T
311
+ * @template {FrontendModelClass} S
312
+ * @template {FrontendModelClass} T
305
313
  */
306
314
  export class FrontendModelHasManyRelationship {
307
315
  /**
@@ -621,12 +629,12 @@ function frontendModelPayloadContainsAttachmentUpload(value) {
621
629
  /**
622
630
  * Returns the concrete frontend-model class for an instance.
623
631
  * @param {FrontendModelBase} model - Frontend model instance.
624
- * @returns {typeof FrontendModelBase} Concrete frontend-model class.
632
+ * @returns {FrontendModelClass} Concrete frontend-model class.
625
633
  */
626
634
  function frontendModelClassFor(model) {
627
635
  const constructorValue = model.constructor
628
636
 
629
- return /** @type {typeof FrontendModelBase} */ (constructorValue)
637
+ return /** @type {FrontendModelClass} */ (constructorValue)
630
638
  }
631
639
 
632
640
  /**
@@ -901,7 +909,7 @@ const FRONTEND_MODELS_CHANNEL_NAME = "frontend-models"
901
909
 
902
910
  /**
903
911
  * Defines this typedef.
904
- * @typedef {{callback: (payload: {id: string, model: InstanceType<typeof FrontendModelBase>}) => void, eventFilterKey: string | null, eventFilterPayload: import("./query.js").FrontendModelEventFilterPayload | null, projectionPayload: import("./query.js").FrontendModelProjectionPayload}} FrontendModelModelEventCallbackEntry
912
+ * @typedef {{callback: (payload: {id: string, model: FrontendModelBase}) => void, eventFilterKey: string | null, eventFilterPayload: import("./query.js").FrontendModelEventFilterPayload | null, projectionPayload: import("./query.js").FrontendModelProjectionPayload}} FrontendModelModelEventCallbackEntry
905
913
  */
906
914
  /**
907
915
  * Defines this typedef.
@@ -1051,7 +1059,7 @@ function frontendModelEventEntryMatches(entry, matchedEventFilterKeys) {
1051
1059
 
1052
1060
  /**
1053
1061
  * Runs assert no destroy event filter.
1054
- * @param {typeof FrontendModelBase} ModelClass - Event model class.
1062
+ * @param {FrontendModelClass} ModelClass - Event model class.
1055
1063
  * @param {import("./query.js").FrontendModelEventOptions} options - Event options.
1056
1064
  * @returns {void}
1057
1065
  */
@@ -1077,7 +1085,7 @@ function assertNoDestroyEventFilter(ModelClass, options) {
1077
1085
  class FrontendModelEventSubscription {
1078
1086
  /**
1079
1087
  * Runs constructor.
1080
- * @param {typeof FrontendModelBase} ModelClass - Frontend model class for this subscription bucket.
1088
+ * @param {FrontendModelClass} ModelClass - Frontend model class for this subscription bucket.
1081
1089
  */
1082
1090
  constructor(ModelClass) {
1083
1091
  this.ModelClass = ModelClass
@@ -1095,7 +1103,7 @@ class FrontendModelEventSubscription {
1095
1103
  this.classDestroyCallbacks = new Set()
1096
1104
  /**
1097
1105
  * Narrows the runtime value to the documented type.
1098
- @type {Map<string, {instance: InstanceType<typeof FrontendModelBase>, updateCallbacks: Set<FrontendModelModelEventCallbackEntry>, destroyCallbacks: Set<FrontendModelDestroyEventCallbackEntry>}>} */
1106
+ @type {Map<string, {instance: FrontendModelBase, updateCallbacks: Set<FrontendModelModelEventCallbackEntry>, destroyCallbacks: Set<FrontendModelDestroyEventCallbackEntry>}>} */
1099
1107
  this.instanceListeners = new Map()
1100
1108
  /**
1101
1109
  * Narrows the runtime value to the documented type.
@@ -1333,12 +1341,12 @@ class FrontendModelEventSubscription {
1333
1341
 
1334
1342
  /**
1335
1343
  * Frontend model event subscriptions.
1336
- @type {WeakMap<typeof FrontendModelBase, FrontendModelEventSubscription>} */
1344
+ @type {WeakMap<FrontendModelClass, FrontendModelEventSubscription>} */
1337
1345
  const frontendModelEventSubscriptions = new WeakMap()
1338
1346
 
1339
1347
  /**
1340
1348
  * Runs ensure frontend model event subscription.
1341
- * @param {typeof FrontendModelBase} ModelClass - Model class.
1349
+ * @param {FrontendModelClass} ModelClass - Model class.
1342
1350
  * @returns {FrontendModelEventSubscription} - Per-class subscription helper.
1343
1351
  */
1344
1352
  function ensureFrontendModelEventSubscription(ModelClass) {
@@ -1356,8 +1364,8 @@ function ensureFrontendModelEventSubscription(ModelClass) {
1356
1364
  * Runs ensure frontend model instance listener.
1357
1365
  * @param {FrontendModelEventSubscription} sub - Event subscription bucket.
1358
1366
  * @param {string} id - Model id.
1359
- * @param {InstanceType<typeof FrontendModelBase>} instance - Listener instance.
1360
- * @returns {{instance: InstanceType<typeof FrontendModelBase>, updateCallbacks: Set<FrontendModelModelEventCallbackEntry>, destroyCallbacks: Set<FrontendModelDestroyEventCallbackEntry>}} - Instance listener bucket.
1367
+ * @param {FrontendModelBase} instance - Listener instance.
1368
+ * @returns {{instance: FrontendModelBase, updateCallbacks: Set<FrontendModelModelEventCallbackEntry>, destroyCallbacks: Set<FrontendModelDestroyEventCallbackEntry>}} - Instance listener bucket.
1361
1369
  */
1362
1370
  function ensureFrontendModelInstanceListener(sub, id, instance) {
1363
1371
  let listener = sub.instanceListeners.get(id)
@@ -1718,7 +1726,7 @@ export default class FrontendModelBase {
1718
1726
  _attributes
1719
1727
  /**
1720
1728
  * Narrows the runtime value to the documented type.
1721
- @type {Record<string, FrontendModelHasManyRelationship<typeof FrontendModelBase, typeof FrontendModelBase> | FrontendModelSingularRelationship<typeof FrontendModelBase, typeof FrontendModelBase>>} */
1729
+ @type {Record<string, FrontendModelHasManyRelationship<FrontendModelClass, FrontendModelClass> | FrontendModelSingularRelationship<FrontendModelClass, FrontendModelClass>>} */
1722
1730
  _relationships
1723
1731
  /**
1724
1732
  * Narrows the runtime value to the documented type.
@@ -1772,7 +1780,7 @@ export default class FrontendModelBase {
1772
1780
 
1773
1781
  /**
1774
1782
  * Runs ensure generated attachment methods.
1775
- * @this {typeof FrontendModelBase}
1783
+ * @this {FrontendModelClass}
1776
1784
  * @returns {void} - Ensures attachment helper methods exist on the prototype.
1777
1785
  */
1778
1786
  static ensureGeneratedAttachmentMethods() {
@@ -1806,8 +1814,8 @@ export default class FrontendModelBase {
1806
1814
 
1807
1815
  /**
1808
1816
  * Runs relationship model classes.
1809
- * @this {typeof FrontendModelBase}
1810
- * @returns {Record<string, typeof FrontendModelBase | string>} - Relationship model classes (or class name strings) keyed by relationship name.
1817
+ * @this {FrontendModelClass}
1818
+ * @returns {Record<string, FrontendModelClass | string>} - Relationship model classes (or class name strings) keyed by relationship name.
1811
1819
  */
1812
1820
  static relationshipModelClasses() {
1813
1821
  return {}
@@ -1815,7 +1823,7 @@ export default class FrontendModelBase {
1815
1823
 
1816
1824
  /**
1817
1825
  * Register a frontend model class so it can be resolved by name in relationship lookups.
1818
- * @param {typeof FrontendModelBase} modelClass - Model class to register.
1826
+ * @param {FrontendModelClass} modelClass - Model class to register.
1819
1827
  * @returns {void}
1820
1828
  */
1821
1829
  static registerModel(modelClass) {
@@ -1825,7 +1833,7 @@ export default class FrontendModelBase {
1825
1833
  /**
1826
1834
  * Runs define scope.
1827
1835
  * @param {(...args: Array<?>) => ?} callback - Scope callback.
1828
- * @returns {((...args: Array<?>) => import("./query.js").default<typeof FrontendModelBase>) & {scope: (...args: Array<?>) => import("../utils/model-scope.js").ModelScopeDescriptor}} - Scope helper.
1836
+ * @returns {((...args: Array<?>) => import("./query.js").default<FrontendModelClass>) & {scope: (...args: Array<?>) => import("../utils/model-scope.js").ModelScopeDescriptor}} - Scope helper.
1829
1837
  */
1830
1838
  static defineScope(callback) {
1831
1839
  return defineModelScope({
@@ -1837,8 +1845,8 @@ export default class FrontendModelBase {
1837
1845
 
1838
1846
  /**
1839
1847
  * Resolve a relationship model class value that may be a class reference or a string name.
1840
- * @param {typeof FrontendModelBase | string | null | undefined} value - Class or class name.
1841
- * @returns {typeof FrontendModelBase | null} - Resolved model class.
1848
+ * @param {FrontendModelClass | string | null | undefined} value - Class or class name.
1849
+ * @returns {FrontendModelClass | null} - Resolved model class.
1842
1850
  */
1843
1851
  static resolveModelClass(value) {
1844
1852
  return resolveFrontendModelClass(value)
@@ -1846,7 +1854,7 @@ export default class FrontendModelBase {
1846
1854
 
1847
1855
  /**
1848
1856
  * Runs relationship definitions.
1849
- * @this {typeof FrontendModelBase}
1857
+ * @this {FrontendModelClass}
1850
1858
  * @returns {Record<string, {type: "belongsTo" | "hasOne" | "hasMany", autoload?: boolean}>} - Relationship definitions keyed by relationship name.
1851
1859
  */
1852
1860
  static relationshipDefinitions() {
@@ -1855,7 +1863,7 @@ export default class FrontendModelBase {
1855
1863
 
1856
1864
  /**
1857
1865
  * Runs attachment definitions.
1858
- * @this {typeof FrontendModelBase}
1866
+ * @this {FrontendModelClass}
1859
1867
  * @returns {Record<string, FrontendModelAttachmentDefinition>} - Attachment definitions keyed by attachment name.
1860
1868
  */
1861
1869
  static attachmentDefinitions() {
@@ -1864,7 +1872,7 @@ export default class FrontendModelBase {
1864
1872
 
1865
1873
  /**
1866
1874
  * Runs attachment definition.
1867
- * @this {typeof FrontendModelBase}
1875
+ * @this {FrontendModelClass}
1868
1876
  * @param {string} attachmentName - Attachment name.
1869
1877
  * @returns {FrontendModelAttachmentDefinition | null} - Attachment definition.
1870
1878
  */
@@ -1874,7 +1882,7 @@ export default class FrontendModelBase {
1874
1882
 
1875
1883
  /**
1876
1884
  * Runs relationship definition.
1877
- * @this {typeof FrontendModelBase}
1885
+ * @this {FrontendModelClass}
1878
1886
  * @param {string} relationshipName - Relationship name.
1879
1887
  * @returns {{type: "belongsTo" | "hasOne" | "hasMany", autoload?: boolean} | null} - Relationship definition.
1880
1888
  */
@@ -1886,7 +1894,7 @@ export default class FrontendModelBase {
1886
1894
 
1887
1895
  /**
1888
1896
  * Resolves a Rails-style nested attributes key to a configured relationship.
1889
- * @this {typeof FrontendModelBase}
1897
+ * @this {FrontendModelClass}
1890
1898
  * @param {string} attributeName - Candidate attribute name, such as `tasksAttributes`.
1891
1899
  * @returns {string | null} Relationship name when nested attributes are configured.
1892
1900
  */
@@ -1903,9 +1911,9 @@ export default class FrontendModelBase {
1903
1911
 
1904
1912
  /**
1905
1913
  * Runs relationship model class.
1906
- * @this {typeof FrontendModelBase}
1914
+ * @this {FrontendModelClass}
1907
1915
  * @param {string} relationshipName - Relationship name.
1908
- * @returns {typeof FrontendModelBase | null} - Target relationship model class.
1916
+ * @returns {FrontendModelClass | null} - Target relationship model class.
1909
1917
  */
1910
1918
  static relationshipModelClass(relationshipName) {
1911
1919
  const relationshipModelClasses = this.relationshipModelClasses()
@@ -2002,7 +2010,7 @@ export default class FrontendModelBase {
2002
2010
  /**
2003
2011
  * Runs get relationship by name.
2004
2012
  * @param {string} relationshipName - Relationship name.
2005
- * @returns {FrontendModelHasManyRelationship<typeof FrontendModelBase, typeof FrontendModelBase> | FrontendModelSingularRelationship<typeof FrontendModelBase, typeof FrontendModelBase>} - Relationship state object.
2013
+ * @returns {FrontendModelHasManyRelationship<FrontendModelClass, FrontendModelClass> | FrontendModelSingularRelationship<FrontendModelClass, FrontendModelClass>} - Relationship state object.
2006
2014
  */
2007
2015
  getRelationshipByName(relationshipName) {
2008
2016
  if (!this._relationships[relationshipName]) {
@@ -2068,7 +2076,7 @@ export default class FrontendModelBase {
2068
2076
  * required columns present are left untouched unless `force` is set. Carries
2069
2077
  * the query's preload graph, select, selectsExtra, withCount, abilities, and
2070
2078
  * queryData when re-fetching.
2071
- * @param {import("./query.js").default<typeof FrontendModelBase> | import("../database/query/index.js").NestedPreloadRecord | string | Array<string | import("../database/query/index.js").NestedPreloadRecord>} queryOrSpec - Preload source.
2079
+ * @param {import("./query.js").default<FrontendModelClass> | import("../database/query/index.js").NestedPreloadRecord | string | Array<string | import("../database/query/index.js").NestedPreloadRecord>} queryOrSpec - Preload source.
2072
2080
  * @param {{force?: boolean}} [options] - Options.
2073
2081
  * @returns {Promise<void>} - Resolves when preloading completes.
2074
2082
  */
@@ -2221,7 +2229,7 @@ export default class FrontendModelBase {
2221
2229
 
2222
2230
  /**
2223
2231
  * Runs primary key.
2224
- * @this {typeof FrontendModelBase}
2232
+ * @this {FrontendModelClass}
2225
2233
  * @returns {string} - Primary key name.
2226
2234
  */
2227
2235
  static primaryKey() {
@@ -2442,7 +2450,7 @@ export default class FrontendModelBase {
2442
2450
 
2443
2451
  /**
2444
2452
  * Runs resource path.
2445
- * @this {typeof FrontendModelBase}
2453
+ * @this {FrontendModelClass}
2446
2454
  * @returns {string} - Derived resource path.
2447
2455
  */
2448
2456
  static resourcePath() {
@@ -2454,7 +2462,7 @@ export default class FrontendModelBase {
2454
2462
 
2455
2463
  /**
2456
2464
  * Runs command name.
2457
- * @this {typeof FrontendModelBase}
2465
+ * @this {FrontendModelClass}
2458
2466
  * @param {FrontendModelCommandType} commandType - Command type.
2459
2467
  * @returns {string} - Resolved command name.
2460
2468
  */
@@ -2475,7 +2483,7 @@ export default class FrontendModelBase {
2475
2483
 
2476
2484
  /**
2477
2485
  * Runs normalize custom command payload arguments.
2478
- * @this {typeof FrontendModelBase}
2486
+ * @this {FrontendModelClass}
2479
2487
  * @param {Array<?>} args - Command arguments.
2480
2488
  * @returns {Record<string, ?>} - Command payload.
2481
2489
  */
@@ -2510,7 +2518,7 @@ export default class FrontendModelBase {
2510
2518
  * Returns the model name, preferring an explicit `static modelName` declaration
2511
2519
  * over the JavaScript class `.name` property. This allows minified builds to
2512
2520
  * preserve correct model names without relying on `keep_classnames`.
2513
- * @this {typeof FrontendModelBase}
2521
+ * @this {FrontendModelClass}
2514
2522
  * @returns {string} - The model name.
2515
2523
  */
2516
2524
  static getModelName() {
@@ -2802,7 +2810,7 @@ export default class FrontendModelBase {
2802
2810
 
2803
2811
  /**
2804
2812
  * Runs attributes from response.
2805
- * @this {typeof FrontendModelBase}
2813
+ * @this {FrontendModelClass}
2806
2814
  * @param {object} response - Response payload.
2807
2815
  * @returns {Record<string, ?>} - Attributes from payload.
2808
2816
  */
@@ -2814,7 +2822,7 @@ export default class FrontendModelBase {
2814
2822
 
2815
2823
  /**
2816
2824
  * Runs model data from response.
2817
- * @this {typeof FrontendModelBase}
2825
+ * @this {FrontendModelClass}
2818
2826
  * @param {object} response - Response payload.
2819
2827
  * @returns {{abilities: Record<string, boolean>, attributes: Record<string, ?>, associationCounts: Record<string, number>, queryData: Record<string, ?>, preloadedRelationships: Record<string, ?>, selectedAttributes: Set<string>}} - Attributes, preloaded relationships, association counts, queryData, abilities, and the selected-attributes set.
2820
2828
  */
@@ -2884,7 +2892,7 @@ export default class FrontendModelBase {
2884
2892
 
2885
2893
  /**
2886
2894
  * Runs apply preloaded relationships.
2887
- * @this {typeof FrontendModelBase}
2895
+ * @this {FrontendModelClass}
2888
2896
  * @param {FrontendModelBase} model - Model instance.
2889
2897
  * @param {Record<string, ?>} preloadedRelationships - Preloaded relationship payload.
2890
2898
  * @returns {void}
@@ -2905,9 +2913,9 @@ export default class FrontendModelBase {
2905
2913
 
2906
2914
  /**
2907
2915
  * Runs instantiate relationship value.
2908
- * @this {typeof FrontendModelBase}
2916
+ * @this {FrontendModelClass}
2909
2917
  * @param {?} relationshipPayload - Relationship payload value.
2910
- * @param {typeof FrontendModelBase | null} targetModelClass - Target model class.
2918
+ * @param {FrontendModelClass | null} targetModelClass - Target model class.
2911
2919
  * @returns {?} - Instantiated relationship value.
2912
2920
  */
2913
2921
  static instantiateRelationshipValue(relationshipPayload, targetModelClass) {
@@ -2920,7 +2928,7 @@ export default class FrontendModelBase {
2920
2928
 
2921
2929
  /**
2922
2930
  * Runs instantiate from response.
2923
- * @template {typeof FrontendModelBase} T
2931
+ * @template {FrontendModelClass} T
2924
2932
  * @this {T}
2925
2933
  * @param {Record<string, ?> | InstanceType<T>} response - Response payload, or an already-hydrated instance of this class.
2926
2934
  * @returns {InstanceType<T>} - New model instance, or the same instance unchanged if it was already hydrated.
@@ -2973,7 +2981,7 @@ export default class FrontendModelBase {
2973
2981
 
2974
2982
  /**
2975
2983
  * Runs find.
2976
- * @template {typeof FrontendModelBase} T
2984
+ * @template {FrontendModelClass} T
2977
2985
  * @this {T}
2978
2986
  * @param {number | string} id - Record identifier.
2979
2987
  * @returns {Promise<InstanceType<T>>} - Resolved model.
@@ -2984,7 +2992,7 @@ export default class FrontendModelBase {
2984
2992
 
2985
2993
  /**
2986
2994
  * Runs find by.
2987
- * @template {typeof FrontendModelBase} T
2995
+ * @template {FrontendModelClass} T
2988
2996
  * @this {T}
2989
2997
  * @param {Record<string, ?>} conditions - Attribute match conditions.
2990
2998
  * @returns {Promise<InstanceType<T> | null>} - Found model or null.
@@ -2995,7 +3003,7 @@ export default class FrontendModelBase {
2995
3003
 
2996
3004
  /**
2997
3005
  * Runs find by or fail.
2998
- * @template {typeof FrontendModelBase} T
3006
+ * @template {FrontendModelClass} T
2999
3007
  * @this {T}
3000
3008
  * @param {Record<string, ?>} conditions - Attribute match conditions.
3001
3009
  * @returns {Promise<InstanceType<T>>} - Found model.
@@ -3006,7 +3014,7 @@ export default class FrontendModelBase {
3006
3014
 
3007
3015
  /**
3008
3016
  * Runs to array.
3009
- * @template {typeof FrontendModelBase} T
3017
+ * @template {FrontendModelClass} T
3010
3018
  * @this {T}
3011
3019
  * @returns {Promise<InstanceType<T>[]>} - Loaded model instances.
3012
3020
  */
@@ -3016,7 +3024,7 @@ export default class FrontendModelBase {
3016
3024
 
3017
3025
  /**
3018
3026
  * Runs load.
3019
- * @template {typeof FrontendModelBase} T
3027
+ * @template {FrontendModelClass} T
3020
3028
  * @this {T}
3021
3029
  * @returns {Promise<InstanceType<T>[]>} - Loaded model instances.
3022
3030
  */
@@ -3026,7 +3034,7 @@ export default class FrontendModelBase {
3026
3034
 
3027
3035
  /**
3028
3036
  * Runs all.
3029
- * @template {typeof FrontendModelBase} T
3037
+ * @template {FrontendModelClass} T
3030
3038
  * @this {T}
3031
3039
  * @returns {FrontendModelQuery<T>} - Query builder.
3032
3040
  */
@@ -3036,7 +3044,7 @@ export default class FrontendModelBase {
3036
3044
 
3037
3045
  /**
3038
3046
  * Runs where.
3039
- * @template {typeof FrontendModelBase} T
3047
+ * @template {FrontendModelClass} T
3040
3048
  * @this {T}
3041
3049
  * @param {Record<string, ?>} conditions - Root-model where conditions.
3042
3050
  * @returns {import("./query.js").default<T>} - Query with where conditions.
@@ -3047,7 +3055,7 @@ export default class FrontendModelBase {
3047
3055
 
3048
3056
  /**
3049
3057
  * Runs joins.
3050
- * @template {typeof FrontendModelBase} T
3058
+ * @template {FrontendModelClass} T
3051
3059
  * @this {T}
3052
3060
  * @param {Record<string, ?> | Array<Record<string, ?>>} joins - Relationship descriptor joins.
3053
3061
  * @returns {import("./query.js").default<T>} - Query with joins.
@@ -3058,7 +3066,7 @@ export default class FrontendModelBase {
3058
3066
 
3059
3067
  /**
3060
3068
  * Runs limit.
3061
- * @template {typeof FrontendModelBase} T
3069
+ * @template {FrontendModelClass} T
3062
3070
  * @this {T}
3063
3071
  * @param {number} value - Maximum number of records.
3064
3072
  * @returns {import("./query.js").default<T>} - Query with limit.
@@ -3069,7 +3077,7 @@ export default class FrontendModelBase {
3069
3077
 
3070
3078
  /**
3071
3079
  * Runs offset.
3072
- * @template {typeof FrontendModelBase} T
3080
+ * @template {FrontendModelClass} T
3073
3081
  * @this {T}
3074
3082
  * @param {number} value - Number of records to skip.
3075
3083
  * @returns {import("./query.js").default<T>} - Query with offset.
@@ -3080,7 +3088,7 @@ export default class FrontendModelBase {
3080
3088
 
3081
3089
  /**
3082
3090
  * Runs page.
3083
- * @template {typeof FrontendModelBase} T
3091
+ * @template {FrontendModelClass} T
3084
3092
  * @this {T}
3085
3093
  * @param {number} pageNumber - 1-based page number.
3086
3094
  * @returns {import("./query.js").default<T>} - Query with page applied.
@@ -3091,7 +3099,7 @@ export default class FrontendModelBase {
3091
3099
 
3092
3100
  /**
3093
3101
  * Runs per page.
3094
- * @template {typeof FrontendModelBase} T
3102
+ * @template {FrontendModelClass} T
3095
3103
  * @this {T}
3096
3104
  * @param {number} value - Number of records per page.
3097
3105
  * @returns {import("./query.js").default<T>} - Query with page size.
@@ -3102,7 +3110,7 @@ export default class FrontendModelBase {
3102
3110
 
3103
3111
  /**
3104
3112
  * Runs count.
3105
- * @template {typeof FrontendModelBase} T
3113
+ * @template {FrontendModelClass} T
3106
3114
  * @this {T}
3107
3115
  * @returns {Promise<number>} - Number of loaded model instances.
3108
3116
  */
@@ -3116,8 +3124,8 @@ export default class FrontendModelBase {
3116
3124
  * accepted, future `create` events for this model are delivered
3117
3125
  * without re-checking per-record visibility. Query options can still
3118
3126
  * narrow which events reach this callback.
3119
- * @this {typeof FrontendModelBase}
3120
- * @param {(payload: {id: string, model: InstanceType<typeof FrontendModelBase>}) => void} callback - Event callback.
3127
+ * @this {FrontendModelClass}
3128
+ * @param {(payload: {id: string, model: FrontendModelBase}) => void} callback - Event callback.
3121
3129
  * @param {import("./query.js").FrontendModelEventOptions} [options] - Event query or record projection options.
3122
3130
  * @returns {Promise<() => void>} - Unsubscribe callback.
3123
3131
  */
@@ -3136,8 +3144,8 @@ export default class FrontendModelBase {
3136
3144
 
3137
3145
  /**
3138
3146
  * Class-level hook fired when any record of this model is updated.
3139
- * @this {typeof FrontendModelBase}
3140
- * @param {(payload: {id: string, model: InstanceType<typeof FrontendModelBase>}) => void} callback - Event callback.
3147
+ * @this {FrontendModelClass}
3148
+ * @param {(payload: {id: string, model: FrontendModelBase}) => void} callback - Event callback.
3141
3149
  * @param {import("./query.js").FrontendModelEventOptions} [options] - Event query or record projection options.
3142
3150
  * @returns {Promise<() => void>} - Unsubscribe callback.
3143
3151
  */
@@ -3156,7 +3164,7 @@ export default class FrontendModelBase {
3156
3164
 
3157
3165
  /**
3158
3166
  * Class-level hook fired when any record of this model is destroyed.
3159
- * @this {typeof FrontendModelBase}
3167
+ * @this {FrontendModelClass}
3160
3168
  * @param {(payload: {id: string}) => void} callback - Event callback.
3161
3169
  * @param {import("./query.js").FrontendModelEventOptions} [options] - Accepted for API symmetry; destroy events carry ids only.
3162
3170
  * @returns {Promise<() => void>} - Unsubscribe callback.
@@ -3181,7 +3189,7 @@ export default class FrontendModelBase {
3181
3189
  * instance's attributes are auto-merged with the broadcast payload
3182
3190
  * before the callback runs, so callers can read fresh values via
3183
3191
  * `this.someAttr()` without re-fetching.
3184
- * @param {(payload: {id: string, model: InstanceType<typeof FrontendModelBase>}) => void} callback - Event callback.
3192
+ * @param {(payload: {id: string, model: FrontendModelBase}) => void} callback - Event callback.
3185
3193
  * @param {import("./query.js").FrontendModelEventOptions} [options] - Event query or record projection options.
3186
3194
  * @returns {Promise<() => void>} - Unsubscribe callback.
3187
3195
  */
@@ -3248,7 +3256,7 @@ export default class FrontendModelBase {
3248
3256
 
3249
3257
  /**
3250
3258
  * Runs pluck.
3251
- * @template {typeof FrontendModelBase} T
3259
+ * @template {FrontendModelClass} T
3252
3260
  * @this {T}
3253
3261
  * @param {...(string | string[] | Record<string, ?> | Array<Record<string, ?>>)} columns - Pluck definition(s).
3254
3262
  * @returns {Promise<Array<?>>} - Plucked values.
@@ -3259,7 +3267,7 @@ export default class FrontendModelBase {
3259
3267
 
3260
3268
  /**
3261
3269
  * Runs search.
3262
- * @template {typeof FrontendModelBase} T
3270
+ * @template {FrontendModelClass} T
3263
3271
  * @this {T}
3264
3272
  * @param {string[]} path - Relationship path.
3265
3273
  * @param {string} column - Column or attribute name.
@@ -3273,7 +3281,7 @@ export default class FrontendModelBase {
3273
3281
 
3274
3282
  /**
3275
3283
  * Runs ransack.
3276
- * @template {typeof FrontendModelBase} T
3284
+ * @template {FrontendModelClass} T
3277
3285
  * @this {T}
3278
3286
  * @param {Record<string, ?>} params - Ransack-style params hash.
3279
3287
  * @returns {FrontendModelQuery<T>} - Query builder with Ransack filters applied.
@@ -3284,7 +3292,7 @@ export default class FrontendModelBase {
3284
3292
 
3285
3293
  /**
3286
3294
  * Runs sort.
3287
- * @template {typeof FrontendModelBase} T
3295
+ * @template {FrontendModelClass} T
3288
3296
  * @this {T}
3289
3297
  * @param {string | string[] | string[][] | [string, string] | Array<[string, string]> | Record<string, ?> | Array<Record<string, ?>>} sort - Sort definition(s).
3290
3298
  * @returns {FrontendModelQuery<T>} - Query builder with sort definitions.
@@ -3295,7 +3303,7 @@ export default class FrontendModelBase {
3295
3303
 
3296
3304
  /**
3297
3305
  * Runs order.
3298
- * @template {typeof FrontendModelBase} T
3306
+ * @template {FrontendModelClass} T
3299
3307
  * @this {T}
3300
3308
  * @param {string | string[] | string[][] | [string, string] | Array<[string, string]> | Record<string, ?> | Array<Record<string, ?>>} sort - Sort definition(s).
3301
3309
  * @returns {FrontendModelQuery<T>} - Query builder with sort definitions.
@@ -3306,7 +3314,7 @@ export default class FrontendModelBase {
3306
3314
 
3307
3315
  /**
3308
3316
  * Runs group.
3309
- * @template {typeof FrontendModelBase} T
3317
+ * @template {FrontendModelClass} T
3310
3318
  * @this {T}
3311
3319
  * @param {string | string[] | Record<string, ?> | Array<Record<string, ?>>} group - Group definition(s).
3312
3320
  * @returns {FrontendModelQuery<T>} - Query builder with group definitions.
@@ -3317,7 +3325,7 @@ export default class FrontendModelBase {
3317
3325
 
3318
3326
  /**
3319
3327
  * Runs distinct.
3320
- * @template {typeof FrontendModelBase} T
3328
+ * @template {FrontendModelClass} T
3321
3329
  * @this {T}
3322
3330
  * @param {boolean} [value] - Whether to request distinct rows.
3323
3331
  * @returns {FrontendModelQuery<T>} - Query builder with distinct flag.
@@ -3328,7 +3336,7 @@ export default class FrontendModelBase {
3328
3336
 
3329
3337
  /**
3330
3338
  * Runs query.
3331
- * @template {typeof FrontendModelBase} T
3339
+ * @template {FrontendModelClass} T
3332
3340
  * @this {T}
3333
3341
  * @returns {FrontendModelQuery<T>} - Query builder.
3334
3342
  */
@@ -3338,7 +3346,7 @@ export default class FrontendModelBase {
3338
3346
 
3339
3347
  /**
3340
3348
  * Runs preload.
3341
- * @template {typeof FrontendModelBase} T
3349
+ * @template {FrontendModelClass} T
3342
3350
  * @this {T}
3343
3351
  * @param {import("../database/query/index.js").NestedPreloadRecord | string | Array<string | import("../database/query/index.js").NestedPreloadRecord>} preload - Preload graph.
3344
3352
  * @returns {FrontendModelQuery<T>} - Query with preload.
@@ -3349,7 +3357,7 @@ export default class FrontendModelBase {
3349
3357
 
3350
3358
  /**
3351
3359
  * Runs select.
3352
- * @template {typeof FrontendModelBase} T
3360
+ * @template {FrontendModelClass} T
3353
3361
  * @this {T}
3354
3362
  * @param {Record<string, string[] | string> | string | string[]} select - Model-aware attribute select map or root-model shorthand.
3355
3363
  * @returns {FrontendModelQuery<T>} - Query with selected attributes.
@@ -3360,7 +3368,7 @@ export default class FrontendModelBase {
3360
3368
 
3361
3369
  /**
3362
3370
  * Runs selects extra.
3363
- * @template {typeof FrontendModelBase} T
3371
+ * @template {FrontendModelClass} T
3364
3372
  * @this {T}
3365
3373
  * @param {Record<string, string[] | string> | string | string[]} select - Extra attributes to load in addition to the defaults, keyed by model name or root-model shorthand.
3366
3374
  * @returns {FrontendModelQuery<T>} - Query with extra selected attributes.
@@ -3371,7 +3379,7 @@ export default class FrontendModelBase {
3371
3379
 
3372
3380
  /**
3373
3381
  * Runs first.
3374
- * @template {typeof FrontendModelBase} T
3382
+ * @template {FrontendModelClass} T
3375
3383
  * @this {T}
3376
3384
  * @returns {Promise<InstanceType<T> | null>} - First model or null.
3377
3385
  */
@@ -3381,7 +3389,7 @@ export default class FrontendModelBase {
3381
3389
 
3382
3390
  /**
3383
3391
  * Runs last.
3384
- * @template {typeof FrontendModelBase} T
3392
+ * @template {FrontendModelClass} T
3385
3393
  * @this {T}
3386
3394
  * @returns {Promise<InstanceType<T> | null>} - Last model or null.
3387
3395
  */
@@ -3391,7 +3399,7 @@ export default class FrontendModelBase {
3391
3399
 
3392
3400
  /**
3393
3401
  * Runs find or initialize by.
3394
- * @template {typeof FrontendModelBase} T
3402
+ * @template {FrontendModelClass} T
3395
3403
  * @this {T}
3396
3404
  * @param {Record<string, ?>} conditions - Attribute match conditions.
3397
3405
  * @returns {Promise<InstanceType<T>>} - Existing or initialized model.
@@ -3402,7 +3410,7 @@ export default class FrontendModelBase {
3402
3410
 
3403
3411
  /**
3404
3412
  * Runs find or create by.
3405
- * @template {typeof FrontendModelBase} T
3413
+ * @template {FrontendModelClass} T
3406
3414
  * @this {T}
3407
3415
  * @param {Record<string, ?>} conditions - Attribute match conditions.
3408
3416
  * @param {(model: InstanceType<T>) => Promise<void> | void} [callback] - Optional callback before save when created.
@@ -3414,7 +3422,7 @@ export default class FrontendModelBase {
3414
3422
 
3415
3423
  /**
3416
3424
  * Runs create.
3417
- * @template {typeof FrontendModelBase} T
3425
+ * @template {FrontendModelClass} T
3418
3426
  * @this {T}
3419
3427
  * @param {Record<string, ?>} [attributes] - Initial attributes.
3420
3428
  * @returns {Promise<InstanceType<T>>} - Persisted model.
@@ -3431,7 +3439,7 @@ export default class FrontendModelBase {
3431
3439
 
3432
3440
  /**
3433
3441
  * Runs assert find by conditions.
3434
- * @this {typeof FrontendModelBase}
3442
+ * @this {FrontendModelClass}
3435
3443
  * @param {Record<string, ?>} conditions - findBy conditions.
3436
3444
  * @returns {void}
3437
3445
  */
@@ -3445,7 +3453,7 @@ export default class FrontendModelBase {
3445
3453
 
3446
3454
  /**
3447
3455
  * Runs matches find by conditions.
3448
- * @this {typeof FrontendModelBase}
3456
+ * @this {FrontendModelClass}
3449
3457
  * @param {FrontendModelBase} model - Candidate model.
3450
3458
  * @param {Record<string, ?>} conditions - Match conditions.
3451
3459
  * @returns {boolean} - Whether the model matches all conditions.
@@ -3475,7 +3483,7 @@ export default class FrontendModelBase {
3475
3483
 
3476
3484
  /**
3477
3485
  * Runs find by condition value matches.
3478
- * @this {typeof FrontendModelBase}
3486
+ * @this {FrontendModelClass}
3479
3487
  * @param {?} actualValue - Actual model value.
3480
3488
  * @param {?} expectedValue - Expected find condition value.
3481
3489
  * @returns {boolean} - Whether values match.
@@ -3543,7 +3551,7 @@ export default class FrontendModelBase {
3543
3551
 
3544
3552
  /**
3545
3553
  * Runs find by primitive values match.
3546
- * @this {typeof FrontendModelBase}
3554
+ * @this {FrontendModelClass}
3547
3555
  * @param {?} actualValue - Actual model value.
3548
3556
  * @param {?} expectedValue - Expected find condition value.
3549
3557
  * @returns {boolean} - Whether primitive values match after safe coercion.
@@ -3574,7 +3582,7 @@ export default class FrontendModelBase {
3574
3582
 
3575
3583
  /**
3576
3584
  * Runs find by numeric string matches number.
3577
- * @this {typeof FrontendModelBase}
3585
+ * @this {FrontendModelClass}
3578
3586
  * @param {string} numericString - Numeric string value.
3579
3587
  * @param {number} expectedNumber - Number value.
3580
3588
  * @returns {boolean} - Whether values represent the same number.
@@ -3862,7 +3870,7 @@ export default class FrontendModelBase {
3862
3870
 
3863
3871
  /**
3864
3872
  * Builds nested entries from a Rails-style submitted `*Attributes` value.
3865
- * @param {typeof FrontendModelBase} ModelClass - Parent model class.
3873
+ * @param {FrontendModelClass} ModelClass - Parent model class.
3866
3874
  * @param {string} relationshipName - Nested relationship name.
3867
3875
  * @param {?} value - Submitted nested attributes value.
3868
3876
  * @returns {Promise<Array<Record<string, ?>>>} Nested entries for the transport payload.
@@ -3898,7 +3906,7 @@ export default class FrontendModelBase {
3898
3906
 
3899
3907
  /**
3900
3908
  * Converts one submitted Rails-style nested attributes object into transport payload shape.
3901
- * @param {typeof FrontendModelBase} ModelClass - Nested child model class.
3909
+ * @param {FrontendModelClass} ModelClass - Nested child model class.
3902
3910
  * @param {?} submittedEntry - Submitted nested attributes entry.
3903
3911
  * @returns {Promise<Record<string, ?>>} Transport nested-attributes entry.
3904
3912
  */
@@ -3950,7 +3958,7 @@ export default class FrontendModelBase {
3950
3958
 
3951
3959
  /**
3952
3960
  * Normalizes a submitted attachment value for transport.
3953
- * @param {typeof FrontendModelBase} ModelClass - Model class owning the attachment.
3961
+ * @param {FrontendModelClass} ModelClass - Model class owning the attachment.
3954
3962
  * @param {string} attachmentName - Attachment name.
3955
3963
  * @param {?} value - Submitted attachment value.
3956
3964
  * @returns {Promise<Record<string, ?> | Record<string, ?>[]>} Normalized attachment payload.
@@ -4014,7 +4022,7 @@ export default class FrontendModelBase {
4014
4022
 
4015
4023
  /**
4016
4024
  * Runs execute command.
4017
- * @this {typeof FrontendModelBase}
4025
+ * @this {FrontendModelClass}
4018
4026
  * @param {FrontendModelCommandType} commandType - Command type.
4019
4027
  * @param {Record<string, ?>} payload - Command payload.
4020
4028
  * @returns {Promise<Record<string, ?>>} - Parsed JSON response.
@@ -4091,7 +4099,7 @@ export default class FrontendModelBase {
4091
4099
 
4092
4100
  /**
4093
4101
  * Runs execute custom command.
4094
- * @this {typeof FrontendModelBase}
4102
+ * @this {FrontendModelClass}
4095
4103
  * @param {object} args - Command arguments.
4096
4104
  * @param {string} args.commandName - Raw command path segment.
4097
4105
  * @param {FrontendModelRequestCommandType} args.commandType - Logical command type for error handling.
@@ -4139,7 +4147,7 @@ export default class FrontendModelBase {
4139
4147
 
4140
4148
  /**
4141
4149
  * Runs throw on error frontend model response.
4142
- * @this {typeof FrontendModelBase}
4150
+ * @this {FrontendModelClass}
4143
4151
  * @param {object} args - Arguments.
4144
4152
  * @param {FrontendModelRequestCommandType} args.commandType - Command type.
4145
4153
  * @param {Record<string, ?>} args.response - Decoded response.
@@ -4198,7 +4206,7 @@ export default class FrontendModelBase {
4198
4206
 
4199
4207
  /**
4200
4208
  * Runs configured frontend model attribute names.
4201
- * @this {typeof FrontendModelBase}
4209
+ * @this {FrontendModelClass}
4202
4210
  * @returns {Set<string>} - Configured frontend model attribute names.
4203
4211
  */
4204
4212
  static configuredFrontendModelAttributeNames() {