velocious 1.0.112 → 1.0.114

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 (28) hide show
  1. package/dist/src/database/query/index.d.ts +46 -120
  2. package/dist/src/database/query/index.d.ts.map +1 -1
  3. package/dist/src/database/query/index.js +31 -219
  4. package/dist/src/database/query/join-object.d.ts.map +1 -1
  5. package/dist/src/database/query/join-object.js +7 -2
  6. package/dist/src/database/query/model-class-query.d.ts +77 -0
  7. package/dist/src/database/query/model-class-query.d.ts.map +1 -0
  8. package/dist/src/database/query/model-class-query.js +212 -0
  9. package/dist/src/database/query-parser/select-parser.d.ts.map +1 -1
  10. package/dist/src/database/query-parser/select-parser.js +3 -1
  11. package/dist/src/database/record/index.d.ts +42 -67
  12. package/dist/src/database/record/index.d.ts.map +1 -1
  13. package/dist/src/database/record/index.js +33 -57
  14. package/dist/src/database/record/instance-relationships/base.d.ts +35 -24
  15. package/dist/src/database/record/instance-relationships/base.d.ts.map +1 -1
  16. package/dist/src/database/record/instance-relationships/base.js +24 -11
  17. package/dist/src/database/record/instance-relationships/belongs-to.d.ts +11 -1
  18. package/dist/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
  19. package/dist/src/database/record/instance-relationships/belongs-to.js +14 -3
  20. package/dist/src/database/record/instance-relationships/has-many.d.ts +23 -3
  21. package/dist/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
  22. package/dist/src/database/record/instance-relationships/has-many.js +16 -4
  23. package/dist/src/database/record/instance-relationships/has-one.d.ts +21 -4
  24. package/dist/src/database/record/instance-relationships/has-one.d.ts.map +1 -1
  25. package/dist/src/database/record/instance-relationships/has-one.js +19 -8
  26. package/dist/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  27. package/dist/src/environment-handlers/node/cli/commands/generate/base-models.js +26 -10
  28. package/package.json +1 -1
@@ -1,44 +1,32 @@
1
1
  /**
2
- * A generic query over some model type.
2
+ * @typedef {{[key: string]: boolean | NestedPreloadRecord }} NestedPreloadRecord
3
+ * @typedef {string | string[] | import("./select-base.js").default | import("./select-base.js").default[]} SelectArgumentType
4
+ * @typedef {object | string} WhereArgumentType
5
+ */
6
+ /**
7
+ * @typedef {object} QueryArgsType
8
+ * @property {import("../drivers/base.js").default} driver
9
+ * @property {Array<import("./from-base.js").default>} [froms]
10
+ * @property {string[]} [groups]
11
+ * @property {Array<import("./join-base.js").default>} [joins]
12
+ * @property {import("../handler.js").default} handler
13
+ * @property {number | null} [limit]
14
+ * @property {number | null} [offset]
15
+ * @property {Array<import("./order-base.js").default>} [orders]
16
+ * @property {number | null} [page]
17
+ * @property {number} [perPage]
18
+ * @property {NestedPreloadRecord} [preload]
19
+ * @property {Array<import("./select-base.js").default>} [selects]
20
+ * @property {Array<import("./where-base.js").default>} [wheres]
3
21
  */
4
22
  export default class VelociousDatabaseQuery {
5
23
  /**
6
- * @param {object} args
7
- * @param {import("../drivers/base.js").default} args.driver
8
- * @param {Array<import("./from-base.js").default>} [args.froms]
9
- * @param {string[]} [args.groups]
10
- * @param {Array<import("./join-base.js").default>} [args.joins]
11
- * @param {import("../handler.js").default} args.handler
12
- * @param {number | null} [args.limit]
13
- * @param {typeof import("../record/index.js").default} [args.modelClass]
14
- * @param {number | null} [args.offset]
15
- * @param {Array<import("./order-base.js").default>} [args.orders]
16
- * @param {number | null} [args.page]
17
- * @param {number} [args.perPage]
18
- * @param {NestedPreloadRecord} [args.preload]
19
- * @param {Array<import("./select-base.js").default>} [args.selects]
20
- * @param {Array<import("./where-base.js").default>} [args.wheres]
24
+ * @param {QueryArgsType} args
21
25
  */
22
- constructor({ driver, froms, groups, joins, handler, limit, modelClass, offset, orders, page, perPage, preload, selects, wheres, ...restArgs }: {
23
- driver: import("../drivers/base.js").default;
24
- froms?: Array<import("./from-base.js").default>;
25
- groups?: string[];
26
- joins?: Array<import("./join-base.js").default>;
27
- handler: import("../handler.js").default;
28
- limit?: number | null;
29
- modelClass?: typeof import("../record/index.js").default;
30
- offset?: number | null;
31
- orders?: Array<import("./order-base.js").default>;
32
- page?: number | null;
33
- perPage?: number;
34
- preload?: NestedPreloadRecord;
35
- selects?: Array<import("./select-base.js").default>;
36
- wheres?: Array<import("./where-base.js").default>;
37
- });
26
+ constructor({ driver, froms, groups, joins, handler, limit, offset, orders, page, perPage, preload, selects, wheres }: QueryArgsType);
38
27
  driver: import("../drivers/base.js").default;
39
28
  handler: import("../handler.js").default;
40
29
  logger: Logger;
41
- modelClass: typeof import("../record/index.js").default;
42
30
  _froms: import("./from-base.js").default[];
43
31
  _groups: string[];
44
32
  _joins: import("./join-base.js").default[];
@@ -51,75 +39,16 @@ export default class VelociousDatabaseQuery {
51
39
  _selects: SelectBase[];
52
40
  /** @type {import("./where-base.js").default[]} */
53
41
  _wheres: import("./where-base.js").default[];
54
- /**
55
- * @returns {VelociousDatabaseQuery}
56
- */
57
- clone(): VelociousDatabaseQuery;
58
- /**
59
- * @returns {Promise<number>}
60
- */
61
- count(): Promise<number>;
62
- /**
63
- * @returns {import("./from-base.js").default[]}
64
- */
42
+ /** @returns {this} */
43
+ clone(): this;
44
+ /** @returns {import("./from-base.js").default[]} */
65
45
  getFroms(): import("./from-base.js").default[];
66
- /**
67
- * @returns {string[]}
68
- */
46
+ /** @returns {string[]} */
69
47
  getGroups(): string[];
70
- /**
71
- * @returns {typeof import("../record/index.js").default}
72
- */
73
- getModelClass(): typeof import("../record/index.js").default;
74
- /**
75
- * @returns {import("../query-parser/options.js").default}
76
- */
48
+ /** @returns {import("../query-parser/options.js").default} */
77
49
  getOptions(): import("../query-parser/options.js").default;
78
- /**
79
- * @returns {Array<import("./select-base.js").default>}
80
- */
50
+ /** @returns {Array<import("./select-base.js").default>} */
81
51
  getSelects(): Array<import("./select-base.js").default>;
82
- /**
83
- * @returns {Promise<void>}
84
- */
85
- destroyAll(): Promise<void>;
86
- /**
87
- * @param {number|string} recordId
88
- * @returns {Promise<import("../record/index.js").default>}
89
- */
90
- find(recordId: number | string): Promise<import("../record/index.js").default>;
91
- /**
92
- * @param {{[key: string]: any}} conditions
93
- * @returns {Promise<import("../record/index.js").default|null>}
94
- */
95
- findBy(conditions: {
96
- [key: string]: any;
97
- }): Promise<import("../record/index.js").default | null>;
98
- /**
99
- * @param {{[key: string]: any}} conditions
100
- * @param {function() : void} callback
101
- * @returns {Promise<import("../record/index.js").default>}
102
- */
103
- findOrCreateBy(conditions: {
104
- [key: string]: any;
105
- }, callback: () => void): Promise<import("../record/index.js").default>;
106
- /**
107
- * @param {{[key: string]: any}} conditions
108
- * @returns {Promise<import("../record/index.js").default>}
109
- */
110
- findByOrFail(conditions: {
111
- [key: string]: any;
112
- }): Promise<import("../record/index.js").default>;
113
- /**
114
- * @param {object} conditions
115
- * @param {function(import("../record/index.js").default) : void} callback
116
- * @returns {Promise<import("../record/index.js").default>}
117
- */
118
- findOrInitializeBy(conditions: object, callback: (arg0: import("../record/index.js").default) => void): Promise<import("../record/index.js").default>;
119
- /**
120
- * @returns {Promise<import("../record/index.js").default>}
121
- */
122
- first(): Promise<import("../record/index.js").default>;
123
52
  /**
124
53
  * @param {string|import("./from-base.js").default} from
125
54
  * @returns {this}
@@ -137,10 +66,6 @@ export default class VelociousDatabaseQuery {
137
66
  joins(join: string | {
138
67
  [key: string]: any;
139
68
  }): this;
140
- /**
141
- * @returns {Promise<import("../record/index.js").default>}
142
- */
143
- last(): Promise<import("../record/index.js").default>;
144
69
  /**
145
70
  * @param {number} value
146
71
  * @returns {this}
@@ -166,19 +91,12 @@ export default class VelociousDatabaseQuery {
166
91
  * @returns {this}
167
92
  */
168
93
  perPage(perPage: number): this;
169
- /**
170
- * @param {NestedPreloadRecord} data
171
- * @returns {this}
172
- */
173
- preload(data: NestedPreloadRecord): this;
174
94
  /**
175
95
  * @param {string | number} order
176
96
  * @returns {this}
177
97
  */
178
98
  reorder(order: string | number): this;
179
- /**
180
- * @returns {this}
181
- */
99
+ /** @returns {this} */
182
100
  reverseOrder(): this;
183
101
  /**
184
102
  * @param {SelectArgumentType} select
@@ -189,15 +107,8 @@ export default class VelociousDatabaseQuery {
189
107
  * @returns {Promise<Array<object>>} Array of results from the database
190
108
  */
191
109
  _executeQuery(): Promise<Array<object>>;
192
- /**
193
- * @returns {Promise<Array<object>>} Array of results from the database
194
- */
110
+ /** @returns {Promise<Array<object>>} Array of results from the database */
195
111
  results(): Promise<Array<object>>;
196
- /**
197
- * Converts query results to array of model instances
198
- * @returns {Promise<Array<import("../record/index.js").default>>}
199
- */
200
- toArray(): Promise<Array<import("../record/index.js").default>>;
201
112
  /**
202
113
  * Generates SQL string representing this query
203
114
  * @returns {string} SQL string representing this query
@@ -205,15 +116,30 @@ export default class VelociousDatabaseQuery {
205
116
  toSql(): string;
206
117
  /**
207
118
  * @param {WhereArgumentType} where
208
- * @returns {VelociousDatabaseQuery} This query instance
119
+ * @returns {this} This query instance
209
120
  */
210
- where(where: WhereArgumentType): VelociousDatabaseQuery;
121
+ where(where: WhereArgumentType): this;
211
122
  }
212
123
  export type NestedPreloadRecord = {
213
124
  [key: string]: boolean | NestedPreloadRecord;
214
125
  };
215
126
  export type SelectArgumentType = string | string[] | import("./select-base.js").default | import("./select-base.js").default[];
216
127
  export type WhereArgumentType = object | string;
128
+ export type QueryArgsType = {
129
+ driver: import("../drivers/base.js").default;
130
+ froms?: Array<import("./from-base.js").default>;
131
+ groups?: string[];
132
+ joins?: Array<import("./join-base.js").default>;
133
+ handler: import("../handler.js").default;
134
+ limit?: number | null;
135
+ offset?: number | null;
136
+ orders?: Array<import("./order-base.js").default>;
137
+ page?: number | null;
138
+ perPage?: number;
139
+ preload?: NestedPreloadRecord;
140
+ selects?: Array<import("./select-base.js").default>;
141
+ wheres?: Array<import("./where-base.js").default>;
142
+ };
217
143
  import { Logger } from "../../logger.js";
218
144
  import SelectBase from "./select-base.js";
219
145
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/database/query/index.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/database/query/index.js"],"names":[],"mappings":"AAaA;;;;GAIG;AAEH;;;;;;;;;;;;;;;GAeG;AAEH;IACE;;OAEG;IACH,uHAFW,aAAa,EAoCvB;IAhBC,6CAAoB;IACpB,yCAAsB;IACtB,eAA8B;IAC9B,2CAAmB;IACnB,kBAAqB;IACrB,2CAAmB;IACnB,eAAmB;IACnB,gBAAqB;IACrB,6CAAqB;IACrB,cAAiB;IACjB,iBAAuB;IACvB,8BAAuB;IACvB,uBAAuB;IAEvB,kDAAkD;IAClD,SADW,OAAO,iBAAiB,EAAE,OAAO,EAAE,CACzB;IAGvB,sBAAsB;IACtB,SADc,IAAI,CAoBjB;IAED,oDAAoD;IACpD,YADc,OAAO,gBAAgB,EAAE,OAAO,EAAE,CAG/C;IAED,0BAA0B;IAC1B,aADc,MAAM,EAAE,CAGrB;IAED,8DAA8D;IAC9D,cADc,OAAO,4BAA4B,EAAE,OAAO,CACb;IAE7C,2DAA2D;IAC3D,cADc,KAAK,CAAC,OAAO,kBAAkB,EAAE,OAAO,CAAC,CAClB;IAErC;;;OAGG;IACH,WAHW,MAAM,GAAC,OAAO,gBAAgB,EAAE,OAAO,GACrC,IAAI,CAOhB;IAED;;;OAGG;IACH,aAHW,MAAM,GACJ,IAAI,CAKhB;IAED;;;OAGG;IACH,YAHW,MAAM,GAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAC,GACzB,IAAI,CAYhB;IAED;;;OAGG;IACH,aAHW,MAAM,GACJ,IAAI,CAKhB;IAED;;;OAGG;IACH,cAHW,MAAM,GACJ,IAAI,CAKhB;IAED;;;OAGG;IACH,aAHW,MAAM,GAAG,MAAM,GACb,IAAI,CAYhB;IAED;;;OAGG;IACH,iBAHW,MAAM,GACJ,IAAI,CAWhB;IAED;;;OAGG;IACH,iBAHW,MAAM,GACJ,IAAI,CAKhB;IAED;;;OAGG;IACH,eAHW,MAAM,GAAG,MAAM,GACb,IAAI,CAMhB;IAED,sBAAsB;IACtB,gBADc,IAAI,CAOjB;IAED;;;OAGG;IACH,eAHW,kBAAkB,GAChB,IAAI,CAoBhB;IAED;;OAEG;IACH,iBAFa,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CASlC;IAED,2EAA2E;IAC3E,WADc,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAGnC;IAED;;;OAGG;IACH,SAFa,MAAM,CAE4B;IAE/C;;;OAGG;IACH,aAHW,iBAAiB,GACf,IAAI,CAYhB;CACF;kCAnRY;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,mBAAmB,CAAA;CAAE;iCAC/C,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,kBAAkB,EAAE,OAAO,GAAG,OAAO,kBAAkB,EAAE,OAAO,EAAE;gCAC7F,MAAM,GAAG,MAAM;;YAKd,OAAO,oBAAoB,EAAE,OAAO;YACpC,KAAK,CAAC,OAAO,gBAAgB,EAAE,OAAO,CAAC;aACvC,MAAM,EAAE;YACR,KAAK,CAAC,OAAO,gBAAgB,EAAE,OAAO,CAAC;aACvC,OAAO,eAAe,EAAE,OAAO;YAC/B,MAAM,GAAG,IAAI;aACb,MAAM,GAAG,IAAI;aACb,KAAK,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC;WACxC,MAAM,GAAG,IAAI;cACb,MAAM;cACN,mBAAmB;cACnB,KAAK,CAAC,OAAO,kBAAkB,EAAE,OAAO,CAAC;aACzC,KAAK,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC;;uBA3BjC,iBAAiB;uBAEf,kBAAkB"}
@@ -1,55 +1,47 @@
1
1
  // @ts-check
2
- /**
3
- * @typedef {{[key: string]: boolean | NestedPreloadRecord }} NestedPreloadRecord
4
- * @typedef {string | string[] | import("./select-base.js").default | import("./select-base.js").default[]} SelectArgumentType
5
- * @typedef {object | string} WhereArgumentType
6
- */
7
2
  import FromPlain from "./from-plain.js";
8
- import { incorporate } from "incorporator";
9
- import * as inflection from "inflection";
10
3
  import { isPlainObject } from "is-plain-object";
11
4
  import JoinObject from "./join-object.js";
12
5
  import JoinPlain from "./join-plain.js";
13
6
  import { Logger } from "../../logger.js";
14
7
  import OrderPlain from "./order-plain.js";
15
- import Preloader from "./preloader.js";
16
- import RecordNotFoundError from "../record/record-not-found-error.js";
17
8
  import SelectBase from "./select-base.js";
18
9
  import SelectPlain from "./select-plain.js";
19
10
  import WhereHash from "./where-hash.js";
20
11
  import WherePlain from "./where-plain.js";
21
- import restArgsError from "../../utils/rest-args-error.js";
22
12
  /**
23
- * A generic query over some model type.
13
+ * @typedef {{[key: string]: boolean | NestedPreloadRecord }} NestedPreloadRecord
14
+ * @typedef {string | string[] | import("./select-base.js").default | import("./select-base.js").default[]} SelectArgumentType
15
+ * @typedef {object | string} WhereArgumentType
16
+ */
17
+ /**
18
+ * @typedef {object} QueryArgsType
19
+ * @property {import("../drivers/base.js").default} driver
20
+ * @property {Array<import("./from-base.js").default>} [froms]
21
+ * @property {string[]} [groups]
22
+ * @property {Array<import("./join-base.js").default>} [joins]
23
+ * @property {import("../handler.js").default} handler
24
+ * @property {number | null} [limit]
25
+ * @property {number | null} [offset]
26
+ * @property {Array<import("./order-base.js").default>} [orders]
27
+ * @property {number | null} [page]
28
+ * @property {number} [perPage]
29
+ * @property {NestedPreloadRecord} [preload]
30
+ * @property {Array<import("./select-base.js").default>} [selects]
31
+ * @property {Array<import("./where-base.js").default>} [wheres]
24
32
  */
25
33
  export default class VelociousDatabaseQuery {
26
34
  /**
27
- * @param {object} args
28
- * @param {import("../drivers/base.js").default} args.driver
29
- * @param {Array<import("./from-base.js").default>} [args.froms]
30
- * @param {string[]} [args.groups]
31
- * @param {Array<import("./join-base.js").default>} [args.joins]
32
- * @param {import("../handler.js").default} args.handler
33
- * @param {number | null} [args.limit]
34
- * @param {typeof import("../record/index.js").default} [args.modelClass]
35
- * @param {number | null} [args.offset]
36
- * @param {Array<import("./order-base.js").default>} [args.orders]
37
- * @param {number | null} [args.page]
38
- * @param {number} [args.perPage]
39
- * @param {NestedPreloadRecord} [args.preload]
40
- * @param {Array<import("./select-base.js").default>} [args.selects]
41
- * @param {Array<import("./where-base.js").default>} [args.wheres]
35
+ * @param {QueryArgsType} args
42
36
  */
43
- constructor({ driver, froms = [], groups = [], joins = [], handler, limit = null, modelClass, offset = null, orders = [], page = null, perPage, preload = {}, selects = [], wheres = [], ...restArgs }) {
37
+ constructor({ driver, froms = [], groups = [], joins = [], handler, limit = null, offset = null, orders = [], page = null, perPage, preload = {}, selects = [], wheres = [] }) {
44
38
  if (!driver)
45
39
  throw new Error("No driver given to query");
46
40
  if (!handler)
47
41
  throw new Error("No handler given to query");
48
- restArgsError(restArgs);
49
42
  this.driver = driver;
50
43
  this.handler = handler;
51
44
  this.logger = new Logger(this);
52
- this.modelClass = modelClass;
53
45
  this._froms = froms;
54
46
  this._groups = groups;
55
47
  this._joins = joins;
@@ -63,18 +55,16 @@ export default class VelociousDatabaseQuery {
63
55
  /** @type {import("./where-base.js").default[]} */
64
56
  this._wheres = wheres;
65
57
  }
66
- /**
67
- * @returns {VelociousDatabaseQuery}
68
- */
58
+ /** @returns {this} */
69
59
  clone() {
70
- const newQuery = new VelociousDatabaseQuery({
60
+ const QueryClass = /** @type {new (args: QueryArgsType) => this} */ (this.constructor);
61
+ const newQuery = new QueryClass({
71
62
  driver: this.driver,
72
63
  froms: [...this._froms],
73
64
  handler: this.handler.clone(),
74
65
  groups: [...this._groups],
75
66
  joins: [...this._joins],
76
67
  limit: this._limit,
77
- modelClass: this.modelClass,
78
68
  offset: this._offset,
79
69
  orders: [...this._orders],
80
70
  page: this._page,
@@ -85,152 +75,18 @@ export default class VelociousDatabaseQuery {
85
75
  });
86
76
  return newQuery;
87
77
  }
88
- /**
89
- * @returns {Promise<number>}
90
- */
91
- async count() {
92
- // Generate count SQL
93
- let sql = `COUNT(${this.driver.quoteTable(this.getModelClass().tableName())}.${this.driver.quoteColumn(this.getModelClass().primaryKey())})`;
94
- if (this.driver.getType() == "pgsql")
95
- sql += "::int";
96
- sql += " AS count";
97
- // Clone query and execute count
98
- const countQuery = this.clone();
99
- countQuery._selects = [];
100
- countQuery.select(sql);
101
- const results = /** @type {{ count: number }[]} */ (await countQuery._executeQuery());
102
- // The query isn't grouped and a single result has been given
103
- if (results.length == 1) {
104
- return results[0].count;
105
- }
106
- // The query may be grouped and a lot of different counts a given
107
- let countResult = 0;
108
- for (const result of results) {
109
- if (!("count" in result)) {
110
- throw new Error("Invalid count result");
111
- }
112
- countResult += result.count;
113
- }
114
- return countResult;
115
- }
116
- /**
117
- * @returns {import("./from-base.js").default[]}
118
- */
78
+ /** @returns {import("./from-base.js").default[]} */
119
79
  getFroms() {
120
80
  return this._froms;
121
81
  }
122
- /**
123
- * @returns {string[]}
124
- */
82
+ /** @returns {string[]} */
125
83
  getGroups() {
126
84
  return this._groups;
127
85
  }
128
- /**
129
- * @returns {typeof import("../record/index.js").default}
130
- */
131
- getModelClass() {
132
- if (!this.modelClass)
133
- throw new Error("modelClass not set");
134
- return this.modelClass;
135
- }
136
- /**
137
- * @returns {import("../query-parser/options.js").default}
138
- */
86
+ /** @returns {import("../query-parser/options.js").default} */
139
87
  getOptions() { return this.driver.options(); }
140
- /**
141
- * @returns {Array<import("./select-base.js").default>}
142
- */
88
+ /** @returns {Array<import("./select-base.js").default>} */
143
89
  getSelects() { return this._selects; }
144
- /**
145
- * @returns {Promise<void>}
146
- */
147
- async destroyAll() {
148
- const records = await this.toArray();
149
- for (const record of records) {
150
- await record.destroy();
151
- }
152
- }
153
- /**
154
- * @param {number|string} recordId
155
- * @returns {Promise<import("../record/index.js").default>}
156
- */
157
- async find(recordId) {
158
- /** @type {{[key: string]: number | string}} */
159
- const conditions = {};
160
- conditions[this.getModelClass().primaryKey()] = recordId;
161
- const query = this.clone().where(conditions);
162
- const record = await query.first();
163
- if (!record) {
164
- throw new RecordNotFoundError(`Couldn't find ${this.getModelClass().name} with '${this.getModelClass().primaryKey()}'=${recordId}`);
165
- }
166
- return record;
167
- }
168
- /**
169
- * @param {{[key: string]: any}} conditions
170
- * @returns {Promise<import("../record/index.js").default|null>}
171
- */
172
- async findBy(conditions) {
173
- /** @type {{[key: string]: number | string}} */
174
- const newConditions = {};
175
- for (const key in conditions) {
176
- const keyUnderscore = inflection.underscore(key);
177
- newConditions[keyUnderscore] = conditions[key];
178
- }
179
- return await this.clone().where(newConditions).first();
180
- }
181
- /**
182
- * @param {{[key: string]: any}} conditions
183
- * @param {function() : void} callback
184
- * @returns {Promise<import("../record/index.js").default>}
185
- */
186
- async findOrCreateBy(conditions, callback) {
187
- const record = await this.findOrInitializeBy(conditions, callback);
188
- if (record.isNewRecord()) {
189
- await record.save();
190
- }
191
- return record;
192
- }
193
- /**
194
- * @param {{[key: string]: any}} conditions
195
- * @returns {Promise<import("../record/index.js").default>}
196
- */
197
- async findByOrFail(conditions) {
198
- /** @type {{[key: string]: number | string}} */
199
- const newConditions = {};
200
- for (const key in conditions) {
201
- const keyUnderscore = inflection.underscore(key);
202
- newConditions[keyUnderscore] = conditions[key];
203
- }
204
- const model = await this.clone().where(newConditions).first();
205
- if (!model) {
206
- throw new Error("Record not found");
207
- }
208
- return model;
209
- }
210
- /**
211
- * @param {object} conditions
212
- * @param {function(import("../record/index.js").default) : void} callback
213
- * @returns {Promise<import("../record/index.js").default>}
214
- */
215
- async findOrInitializeBy(conditions, callback) {
216
- const record = await this.findBy(conditions);
217
- if (record)
218
- return record;
219
- const ModelClass = this.getModelClass();
220
- const newRecord = new ModelClass(conditions);
221
- if (callback) {
222
- callback(newRecord);
223
- }
224
- return newRecord;
225
- }
226
- /**
227
- * @returns {Promise<import("../record/index.js").default>}
228
- */
229
- async first() {
230
- const newQuery = this.clone().limit(1).reorder(`${this.driver.quoteTable(this.getModelClass().tableName())}.${this.driver.quoteColumn(this.getModelClass().orderableColumn())}`);
231
- const results = await newQuery.toArray();
232
- return results[0];
233
- }
234
90
  /**
235
91
  * @param {string|import("./from-base.js").default} from
236
92
  * @returns {this}
@@ -265,15 +121,6 @@ export default class VelociousDatabaseQuery {
265
121
  }
266
122
  return this;
267
123
  }
268
- /**
269
- * @returns {Promise<import("../record/index.js").default>}
270
- */
271
- async last() {
272
- const primaryKey = this.getModelClass().primaryKey();
273
- const tableName = this.getModelClass().tableName();
274
- const results = await this.clone().reorder(`${this.driver.quoteTable(tableName)}.${this.driver.quoteColumn(primaryKey)} DESC`).limit(1).toArray();
275
- return results[0];
276
- }
277
124
  /**
278
125
  * @param {number} value
279
126
  * @returns {this}
@@ -327,14 +174,6 @@ export default class VelociousDatabaseQuery {
327
174
  this._perPage = perPage;
328
175
  return this;
329
176
  }
330
- /**
331
- * @param {NestedPreloadRecord} data
332
- * @returns {this}
333
- */
334
- preload(data) {
335
- incorporate(this._preload, data);
336
- return this;
337
- }
338
177
  /**
339
178
  * @param {string | number} order
340
179
  * @returns {this}
@@ -344,9 +183,7 @@ export default class VelociousDatabaseQuery {
344
183
  this.order(order);
345
184
  return this;
346
185
  }
347
- /**
348
- * @returns {this}
349
- */
186
+ /** @returns {this} */
350
187
  reverseOrder() {
351
188
  for (const order of this._orders) {
352
189
  order.setReverseOrder(true);
@@ -384,35 +221,10 @@ export default class VelociousDatabaseQuery {
384
221
  this.logger.debug(() => ["SQL:", sql]);
385
222
  return results;
386
223
  }
387
- /**
388
- * @returns {Promise<Array<object>>} Array of results from the database
389
- */
224
+ /** @returns {Promise<Array<object>>} Array of results from the database */
390
225
  async results() {
391
226
  return await this._executeQuery();
392
227
  }
393
- /**
394
- * Converts query results to array of model instances
395
- * @returns {Promise<Array<import("../record/index.js").default>>}
396
- */
397
- async toArray() {
398
- const models = [];
399
- const results = await this.results();
400
- for (const result of results) {
401
- const ModelClass = this.getModelClass();
402
- const model = new ModelClass();
403
- model.loadExistingRecord(result);
404
- models.push(model);
405
- }
406
- if (Object.keys(this._preload).length > 0 && models.length > 0) {
407
- const preloader = new Preloader({
408
- modelClass: this.modelClass,
409
- models,
410
- preload: this._preload
411
- });
412
- await preloader.run();
413
- }
414
- return models;
415
- }
416
228
  /**
417
229
  * Generates SQL string representing this query
418
230
  * @returns {string} SQL string representing this query
@@ -420,7 +232,7 @@ export default class VelociousDatabaseQuery {
420
232
  toSql() { return this.driver.queryToSql(this); }
421
233
  /**
422
234
  * @param {WhereArgumentType} where
423
- * @returns {VelociousDatabaseQuery} This query instance
235
+ * @returns {this} This query instance
424
236
  */
425
237
  where(where) {
426
238
  if (typeof where == "string") {
@@ -1 +1 @@
1
- {"version":3,"file":"join-object.d.ts","sourceRoot":"","sources":["../../../../src/database/query/join-object.js"],"names":[],"mappings":"AAIA;;GAEG;AAEH;IACE;;OAEG;IACH,oBAFW,UAAU,EAKpB;IADC,mBAAoB;IAGtB,gBAIC;IAED;;;;;;OAMG;IACH,iBANW,UAAU,cACV,cAAc,oBAAoB,EAAE,OAAO,OAC3C,MAAM,cACN,MAAM,GACJ,MAAM,CAqClB;CACF;yBA7DY;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAA;CAAC;qBAH7B,gBAAgB"}
1
+ {"version":3,"file":"join-object.d.ts","sourceRoot":"","sources":["../../../../src/database/query/join-object.js"],"names":[],"mappings":"AAIA;;GAEG;AAEH;IACE;;OAEG;IACH,oBAFW,UAAU,EAKpB;IADC,mBAAoB;IAGtB,gBAWC;IAED;;;;;;OAMG;IACH,iBANW,UAAU,cACV,cAAc,oBAAoB,EAAE,OAAO,OAC3C,MAAM,cACN,MAAM,GACJ,MAAM,CAqClB;CACF;yBApEY;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAA;CAAC;qBAH7B,gBAAgB"}
@@ -12,8 +12,13 @@ export default class VelociousDatabaseQueryJoinObject extends JoinBase {
12
12
  this.object = object;
13
13
  }
14
14
  toSql() {
15
- const modelClass = this.getQuery().modelClass;
16
- return this.joinObject(this.object, modelClass, "", 0);
15
+ const query = this.getQuery();
16
+ if (query.constructor.name != "VelociousDatabaseQueryModelClassQuery") {
17
+ throw new Error(`Query has to be a ModelClassQuery but was a ${query.constructor.name}`);
18
+ }
19
+ // @ts-expect-error
20
+ const ModelClass = /** @type {typeof import("../record/index.js").default} */ (query.modelClass);
21
+ return this.joinObject(this.object, ModelClass, "", 0);
17
22
  }
18
23
  /**
19
24
  * @param {JoinObject} join