velocious 1.0.106 → 1.0.107

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 (82) hide show
  1. package/package.json +3 -1
  2. package/peak_flow.yml +1 -0
  3. package/spec/cli/commands/db/migrate-spec.js +7 -2
  4. package/spec/cli/commands/test/test-files-finder-spec.js +2 -0
  5. package/spec/database/connection/drivers/mysql/query-parser-spec.js +3 -1
  6. package/spec/database/drivers/mysql/connection-spec.js +1 -1
  7. package/spec/database/record/find-or-create-spec.js +3 -3
  8. package/spec/database/record/find-spec.js +1 -1
  9. package/spec/database/record/instance-relationships/belongs-to-relationship-spec.js +1 -1
  10. package/spec/database/record/instance-relationships/has-many-relationship-spec.js +3 -3
  11. package/spec/database/record/instance-relationships/has-one-relationship-spec.js +1 -1
  12. package/spec/database/record/last-spec.js +2 -2
  13. package/spec/database/record/preloader/belongs-to-spec.js +1 -1
  14. package/spec/database/record/preloader/has-many-spec.js +4 -4
  15. package/spec/database/record/preloader/has-one-spec.js +1 -1
  16. package/spec/database/record/query-spec.js +8 -6
  17. package/spec/database/record/translation-fallbacks-spec.js +1 -1
  18. package/spec/dummy/src/config/configuration.example.js +1 -0
  19. package/spec/dummy/src/model-bases/account.js +2 -2
  20. package/spec/dummy/src/model-bases/authentication-token.js +3 -3
  21. package/spec/dummy/src/model-bases/project-detail.js +3 -3
  22. package/spec/dummy/src/model-bases/project-translation.js +3 -3
  23. package/spec/dummy/src/model-bases/project.js +12 -12
  24. package/spec/dummy/src/model-bases/task.js +3 -3
  25. package/spec/dummy/src/model-bases/user.js +9 -9
  26. package/spec/dummy/src/routes/projects/controller.js +1 -1
  27. package/spec/dummy/src/routes/tasks/controller.js +1 -3
  28. package/spec/http-server/client-spec.js +1 -1
  29. package/spec/http-server/get-spec.js +1 -1
  30. package/spec/http-server/post-spec.js +9 -9
  31. package/spec/http-server/root-get-spec.js +2 -1
  32. package/src/application.js +1 -0
  33. package/src/cli/base-command.js +1 -1
  34. package/src/cli/commands/db/create.js +1 -1
  35. package/src/cli/use-browser-cli.js +2 -0
  36. package/src/configuration-types.js +11 -6
  37. package/src/controller.js +1 -2
  38. package/src/database/drivers/base.js +9 -9
  39. package/src/database/drivers/mssql/index.js +11 -11
  40. package/src/database/drivers/mssql/options.js +10 -6
  41. package/src/database/drivers/mysql/index.js +8 -8
  42. package/src/database/drivers/mysql/options.js +10 -6
  43. package/src/database/drivers/pgsql/index.js +10 -10
  44. package/src/database/drivers/pgsql/options.js +9 -6
  45. package/src/database/drivers/sqlite/base.js +10 -10
  46. package/src/database/drivers/sqlite/connection-sql-js.js +2 -0
  47. package/src/database/drivers/sqlite/index.js +8 -2
  48. package/src/database/drivers/sqlite/index.native.js +5 -1
  49. package/src/database/drivers/sqlite/index.web.js +2 -1
  50. package/src/database/drivers/sqlite/options.js +10 -7
  51. package/src/database/drivers/sqlite/sql/alter-table.js +3 -3
  52. package/src/database/migration/index.js +16 -5
  53. package/src/database/migrator.js +5 -1
  54. package/src/database/pool/base-methods-forward.js +0 -4
  55. package/src/database/query/alter-table-base.js +2 -2
  56. package/src/database/query/base.js +2 -2
  57. package/src/database/query/create-index-base.js +2 -2
  58. package/src/database/query/create-table-base.js +4 -4
  59. package/src/database/query/drop-table-base.js +2 -2
  60. package/src/database/query/index.js +2 -2
  61. package/src/database/record/index.js +11 -44
  62. package/src/database/record/instance-relationships/base.js +2 -2
  63. package/src/database/record/instance-relationships/has-many.js +1 -1
  64. package/src/database/use-database.js +1 -0
  65. package/src/environment-handlers/base.js +2 -2
  66. package/src/environment-handlers/browser.js +40 -18
  67. package/src/environment-handlers/node/cli/commands/destroy/migration.js +5 -1
  68. package/src/environment-handlers/node/cli/commands/generate/base-models.js +20 -9
  69. package/src/environment-handlers/node/cli/commands/generate/migration.js +5 -1
  70. package/src/environment-handlers/node/cli/commands/generate/model.js +5 -1
  71. package/src/environment-handlers/node/cli/commands/init.js +5 -1
  72. package/src/environment-handlers/node.js +1 -1
  73. package/src/http-server/client/index.js +2 -1
  74. package/src/http-server/client/params-to-object.js +0 -8
  75. package/src/http-server/client/request-buffer/index.js +1 -0
  76. package/src/routes/basic-route.js +1 -1
  77. package/src/testing/test-files-finder.js +1 -1
  78. package/src/testing/test-runner.js +3 -0
  79. package/src/testing/test.js +0 -2
  80. package/src/utils/with-tracked-stack-async-hooks.js +0 -2
  81. package/src/utils/with-tracked-stack.js +0 -2
  82. package/tsconfig.json +15 -0
@@ -20,9 +20,9 @@ export default class VelociousDatabaseQueryAlterTableBase extends QueryBase {
20
20
  }
21
21
 
22
22
  /**
23
- * @returns {string[]}
23
+ * @returns {Promise<string[]>}
24
24
  */
25
- toSQLs() {
25
+ async toSQLs() {
26
26
  const databaseType = this.getDriver().getType()
27
27
  const sqls = []
28
28
  const {tableData} = this
@@ -38,9 +38,9 @@ export default class VelociousDatabaseQueryBase {
38
38
 
39
39
  /**
40
40
  * @abstract
41
- * @returns {string[]}
41
+ * @returns {Promise<string[]>}
42
42
  */
43
- toSQLs() {
43
+ async toSQLs() {
44
44
  throw new Error("'toSQLs' wasn't implemented")
45
45
  }
46
46
  }
@@ -52,9 +52,9 @@ export default class VelociousDatabaseQueryCreateIndexBase extends QueryBase {
52
52
  }
53
53
 
54
54
  /**
55
- * @returns {string[]}
55
+ * @returns {Promise<string[]>}
56
56
  */
57
- toSQLs() {
57
+ async toSQLs() {
58
58
  const databaseType = this.getDriver().getType()
59
59
  const indexName = this.name || this.generateIndexName()
60
60
  const options = this.getOptions()
@@ -24,9 +24,9 @@ export default class VelociousDatabaseQueryCreateTableBase extends QueryBase {
24
24
  }
25
25
 
26
26
  /**
27
- * @returns {string[]}
27
+ * @returns {Promise<string[]>}
28
28
  */
29
- toSql() {
29
+ async toSql() {
30
30
  const databaseType = this.getDatabaseType()
31
31
  const driver = this.getDriver()
32
32
  const options = this.getOptions()
@@ -128,7 +128,7 @@ export default class VelociousDatabaseQueryCreateTableBase extends QueryBase {
128
128
  tableName: tableData.getName(),
129
129
  unique: index.getUnique()
130
130
  }
131
- const createIndexSQLs = new CreateIndexBase(createIndexArgs).toSQLs()
131
+ const createIndexSQLs = await new CreateIndexBase(createIndexArgs).toSQLs()
132
132
 
133
133
  for (const createIndexSQL of createIndexSQLs) {
134
134
  sqls.push(createIndexSQL)
@@ -156,7 +156,7 @@ export default class VelociousDatabaseQueryCreateTableBase extends QueryBase {
156
156
  tableName: tableData.getName(),
157
157
  unique
158
158
  }
159
- const createIndexSQLs = new CreateIndexBase(createIndexArgs).toSQLs()
159
+ const createIndexSQLs = await new CreateIndexBase(createIndexArgs).toSQLs()
160
160
 
161
161
  for (const createIndexSQL of createIndexSQLs) {
162
162
  sqls.push(createIndexSQL)
@@ -22,9 +22,9 @@ export default class VelociousDatabaseQueryDropTableBase extends QueryBase {
22
22
  }
23
23
 
24
24
  /**
25
- * @returns {string[]}
25
+ * @returns {Promise<string[]>}
26
26
  */
27
- toSQLs() {
27
+ async toSQLs() {
28
28
  const databaseType = this.getDatabaseType()
29
29
  const options = this.getOptions()
30
30
  const {cascade, ifExists, tableName} = this
@@ -2,8 +2,8 @@
2
2
 
3
3
  /**
4
4
  * @typedef {{[key: string]: boolean | NestedPreloadRecord }} NestedPreloadRecord
5
- * @typedef {string|SelectPlain} SelectArgumentType
6
- * @typedef {object|string} WhereArgumentType
5
+ * @typedef {string | string[] | import("./select-base.js").default | import("./select-base.js").default[]} SelectArgumentType
6
+ * @typedef {object | string} WhereArgumentType
7
7
  */
8
8
 
9
9
  import FromPlain from "./from-plain.js"
@@ -181,29 +181,20 @@ class VelociousDatabaseRecord {
181
181
  actualData.className = inflection.camelize(inflection.singularize(relationshipName))
182
182
  }
183
183
 
184
- /** @type {Record<string, (this: VelociousDatabaseRecord) => unknown>} */
185
- const proto = /** @type {any} */ (this.prototype);
186
-
187
184
  let relationship
188
185
 
189
186
  if (actualData.type == "belongsTo") {
190
187
  relationship = new BelongsToRelationship(actualData)
191
188
 
192
- proto[relationshipName] = function() {
189
+ this.prototype[relationshipName] = function() {
193
190
  const relationship = this.getRelationshipByName(relationshipName)
194
191
 
195
192
  return relationship.loaded()
196
193
  }
197
194
 
198
- // @ts-expect-error
199
- proto[`build${inflection.camelize(relationshipName)}`] = function(attributes) {
200
- // @ts-expect-error
195
+ this.prototype[`build${inflection.camelize(relationshipName)}`] = function(attributes) {
201
196
  const instanceRelationship = this.getRelationshipByName(relationshipName)
202
-
203
- // @ts-expect-error
204
197
  const record = instanceRelationship.build(attributes)
205
-
206
- // @ts-expect-error
207
198
  const inverseOf = instanceRelationship.getRelationship().getInverseOf()
208
199
 
209
200
  if (inverseOf) {
@@ -223,51 +214,40 @@ class VelociousDatabaseRecord {
223
214
  return record
224
215
  }
225
216
 
226
- proto[`load${inflection.camelize(relationshipName)}`] = async function() {
217
+ this.prototype[`load${inflection.camelize(relationshipName)}`] = async function() {
227
218
  await this.getRelationshipByName(relationshipName).load()
228
219
  }
229
220
 
230
- // @ts-expect-error
231
- proto[`set${inflection.camelize(relationshipName)}`] = function(model) {
232
- // @ts-expect-error
221
+ this.prototype[`set${inflection.camelize(relationshipName)}`] = function(model) {
233
222
  const relationship = this.getRelationshipByName(relationshipName)
234
223
 
235
- // @ts-expect-error
236
224
  relationship.setLoaded(model)
237
-
238
- // @ts-expect-error
239
225
  relationship.setDirty(true)
240
226
  }
241
227
  } else if (actualData.type == "hasMany") {
242
228
  relationship = new HasManyRelationship(actualData)
243
229
 
244
- proto[relationshipName] = function() {
245
- return this.getRelationshipByName(relationshipName)
230
+ this.prototype[relationshipName] = function() {
231
+ return /** @type {import("./instance-relationships/has-many.js").default} */ (this.getRelationshipByName(relationshipName))
246
232
  }
247
233
 
248
- proto[`${relationshipName}Loaded`] = function() {
234
+ this.prototype[`${relationshipName}Loaded`] = function() {
249
235
  return this.getRelationshipByName(relationshipName).loaded()
250
236
  }
251
237
 
252
- proto[`load${inflection.camelize(relationshipName)}`] = async function() {
238
+ this.prototype[`load${inflection.camelize(relationshipName)}`] = async function() {
253
239
  await this.getRelationshipByName(relationshipName).load()
254
240
  }
255
241
  } else if (actualData.type == "hasOne") {
256
242
  relationship = new HasOneRelationship(actualData)
257
243
 
258
- proto[relationshipName] = function() {
244
+ this.prototype[relationshipName] = function() {
259
245
  return this.getRelationshipByName(relationshipName).loaded()
260
246
  }
261
247
 
262
- // @ts-expect-error
263
- proto[`build${inflection.camelize(relationshipName)}`] = function(attributes) {
264
- // @ts-expect-error
248
+ this.prototype[`build${inflection.camelize(relationshipName)}`] = function(attributes) {
265
249
  const instanceRelationship = this.getRelationshipByName(relationshipName)
266
-
267
- // @ts-expect-error
268
250
  const record = instanceRelationship.build(attributes)
269
-
270
- // @ts-expect-error
271
251
  const inverseOf = instanceRelationship.getRelationship().getInverseOf()
272
252
 
273
253
  if (inverseOf) {
@@ -280,7 +260,7 @@ class VelociousDatabaseRecord {
280
260
  return record
281
261
  }
282
262
 
283
- proto[`load${inflection.camelize(relationshipName)}`] = async function() {
263
+ this.prototype[`load${inflection.camelize(relationshipName)}`] = async function() {
284
264
  await this.getRelationshipByName(relationshipName).load()
285
265
  }
286
266
  } else {
@@ -477,19 +457,15 @@ class VelociousDatabaseRecord {
477
457
  attributeNameToColumnName[camelizedColumnName] = column.getName()
478
458
  columnNameToAttributeName[column.getName()] = camelizedColumnName
479
459
 
480
- // @ts-expect-error
481
460
  this.prototype[camelizedColumnName] = function() {
482
461
  return this.readAttribute(camelizedColumnName)
483
462
  }
484
463
 
485
- // @ts-expect-error
486
464
  this.prototype[`set${camelizedColumnNameBigFirst}`] = function(newValue) {
487
465
  return this._setColumnAttribute(camelizedColumnName, newValue)
488
466
  }
489
467
 
490
- // @ts-expect-error
491
468
  this.prototype[`has${camelizedColumnNameBigFirst}`] = function() {
492
- // @ts-expect-error
493
469
  let value = this[camelizedColumnName]()
494
470
 
495
471
  return this._hasAttribute(value)
@@ -537,16 +513,13 @@ class VelociousDatabaseRecord {
537
513
  const nameCamelized = inflection.camelize(name)
538
514
  const setterMethodName = `set${nameCamelized}`
539
515
 
540
- // @ts-expect-error
541
516
  this.prototype[name] = function getTranslatedAttribute() {
542
517
  const locale = this._getConfiguration().getLocale()
543
518
 
544
519
  return this._getTranslatedAttributeWithFallback(name, locale)
545
520
  }
546
521
 
547
- // @ts-expect-error
548
522
  this.prototype[`has${nameCamelized}`] = function hasTranslatedAttribute() {
549
- // @ts-expect-error
550
523
  const candidate = this[name]
551
524
 
552
525
  if (typeof candidate == "function") {
@@ -558,7 +531,6 @@ class VelociousDatabaseRecord {
558
531
  }
559
532
  }
560
533
 
561
- // @ts-expect-error
562
534
  this.prototype[setterMethodName] = function setTranslatedAttribute(newValue) {
563
535
  const locale = this._getConfiguration().getLocale()
564
536
 
@@ -571,19 +543,15 @@ class VelociousDatabaseRecord {
571
543
  const setterMethodNameLocalized = `${setterMethodName}${localeCamelized}`
572
544
  const hasMethodNameLocalized = `has${inflection.camelize(name)}${localeCamelized}`
573
545
 
574
- // @ts-expect-error
575
546
  this.prototype[getterMethodNameLocalized] = function getTranslatedAttributeWithLocale() {
576
547
  return this._getTranslatedAttribute(name, locale)
577
548
  }
578
549
 
579
- // @ts-expect-error
580
550
  this.prototype[setterMethodNameLocalized] = function setTranslatedAttributeWithLocale(newValue) {
581
551
  return this._setTranslatedAttribute(name, locale, newValue)
582
552
  }
583
553
 
584
- // @ts-expect-error
585
554
  this.prototype[hasMethodNameLocalized] = function hasTranslatedAttribute() {
586
- // @ts-expect-error
587
555
  const candidate = this[getterMethodNameLocalized]
588
556
 
589
557
  if (typeof candidate == "function") {
@@ -646,7 +614,6 @@ class VelociousDatabaseRecord {
646
614
  if (!this.getModelClass().isInitialized()) throw new Error(`${this.constructor.name} model isn't initialized yet`)
647
615
  if (!(setterName in this)) throw new Error(`No such setter method: ${this.constructor.name}#${setterName}`)
648
616
 
649
- // @ts-expect-error
650
617
  this[setterName](newValue)
651
618
  }
652
619
 
@@ -17,10 +17,10 @@ export default class VelociousDatabaseRecordBaseInstanceRelationship {
17
17
 
18
18
  /**
19
19
  * @abstract
20
- * @param {import("../index.js").default[]} records
20
+ * @param {import("../index.js").default[] | import("../index.js").default} models
21
21
  * @returns {void}
22
22
  */
23
- addToLoaded(records) { // eslint-disable-line no-unused-vars
23
+ addToLoaded(models) { // eslint-disable-line no-unused-vars
24
24
  throw new Error("addToLoaded not implemented")
25
25
  }
26
26
 
@@ -78,7 +78,7 @@ export default class VelociousDatabaseRecordHasManyInstanceRelationship extends
78
78
  }
79
79
 
80
80
  /**
81
- * @param {import("../index.js").default[]} models
81
+ * @param {import("../index.js").default[] | import("../index.js").default} models
82
82
  * @returns {void}
83
83
  */
84
84
  addToLoaded(models) {
@@ -1,5 +1,6 @@
1
1
  // @ts-check
2
2
 
3
+ // @ts-expect-error
3
4
  import React from "react"
4
5
  import useEnvSense from "env-sense/src/use-env-sense.js"
5
6
 
@@ -122,10 +122,10 @@ export default class VelociousEnvironmentHandlerBase {
122
122
  importTestingConfigPath() { throw new Error(`'importTestingConfigPath' not implemented`) }
123
123
 
124
124
  /**
125
+ * @abstract
125
126
  * @param {object} args
126
127
  * @param {string[]} args.commandParts
127
- * @returns {Promise<import ("../cli/base-command.js").default>}
128
- * @abstract
128
+ * @returns {Promise<typeof import ("../cli/base-command.js").default>}
129
129
  */
130
130
  async requireCommand({commandParts}) { throw new Error("'requireCommand' not implemented") } // eslint-disable-line no-unused-vars
131
131
 
@@ -1,12 +1,33 @@
1
1
  import Base from "./base.js"
2
- import {digg} from "diggerize"
3
2
  import * as inflection from "inflection"
4
3
  import restArgsError from "../utils/rest-args-error.js"
5
4
 
5
+ /**
6
+ * @typedef {(id: string) => {default: typeof import("../database/migration/index.js").default}} MigrationsRequireContextIDFunctionType
7
+ * @typedef {MigrationsRequireContextIDFunctionType & {
8
+ * keys: () => string[],
9
+ * id: string
10
+ * }} MigrationsRequireContextType
11
+ */
12
+
13
+ /**
14
+ * @typedef {(id: string) => {default: typeof import("../cli/base-command.js").default}} CommandsRequireContextIDFunctionType
15
+ * @typedef {CommandsRequireContextIDFunctionType & {
16
+ * keys: () => string[],
17
+ * id: string
18
+ * }} CommandsRequireContextType
19
+ */
20
+
6
21
  export default class VelociousEnvironmentsHandlerBrowser extends Base {
22
+ /** @type {CommandsRequireContextType | undefined} */
23
+ findCommandsRequireContextResult = undefined
24
+
25
+ /** @type {MigrationsRequireContextType | undefined} */
26
+ _migrationsRequireContextResult = undefined
27
+
7
28
  /**
8
29
  * @param {object} args
9
- * @param {function() : void} args.migrationsRequireContextCallback
30
+ * @param {() => Promise<MigrationsRequireContextType>} [args.migrationsRequireContextCallback]
10
31
  */
11
32
  constructor({migrationsRequireContextCallback, ...restArgs} = {}) {
12
33
  super()
@@ -16,29 +37,33 @@ export default class VelociousEnvironmentsHandlerBrowser extends Base {
16
37
  }
17
38
 
18
39
  /**
19
- * @returns {object}
40
+ * @returns {Promise<MigrationsRequireContextType>}
20
41
  */
21
- migrationsRequireContext() {
22
- const migrationsRequireContextCallback = digg(this, "migrationsRequireContextCallback")
42
+ async migrationsRequireContext() {
43
+ const {migrationsRequireContextCallback} = this
23
44
 
24
45
  if (!migrationsRequireContextCallback) throw new Error("migrationsRequireContextCallback is required")
25
46
 
26
- this._migrationsRequireContextResult ||= migrationsRequireContextCallback()
47
+ this._migrationsRequireContextResult ||= await migrationsRequireContextCallback()
27
48
 
28
49
  return this._migrationsRequireContextResult
29
50
  }
30
51
 
31
52
  /**
32
- * @returns {Promise<Array<{name: string, file: string}>>}
53
+ * @returns {Promise<Array<import("./base.js").CommandFileObjectType>>}
33
54
  */
34
- findCommands() {
55
+ async findCommands() {
35
56
  this._findCommandsResult = this._actualFindCommands()
36
57
 
37
58
  return this._findCommandsResult
38
59
  }
39
60
 
61
+ /**
62
+ * @returns {CommandsRequireContextType}
63
+ */
40
64
  _findCommandsRequireContext() {
41
- this.findCommandsRequireContextResult ||= require.context("../cli/commands", true, /\.js$/)
65
+ // @ts-expect-error
66
+ this.findCommandsRequireContextResult ||= /** @type {CommandsRequireContextType} */ (require.context("../cli/commands", true, /\.js$/))
42
67
 
43
68
  return this.findCommandsRequireContextResult
44
69
  }
@@ -65,13 +90,11 @@ export default class VelociousEnvironmentsHandlerBrowser extends Base {
65
90
  }
66
91
 
67
92
  /**
68
- * @param {Array<string>} commandParts
69
- * @template T extends import("./base-command.js").default
70
- * @returns {Promise<T>}
93
+ * @param {object} args
94
+ * @param {Array<string>} args.commandParts
95
+ * @returns {Promise<typeof import("../cli/base-command.js").default>}
71
96
  */
72
- async requireCommand({commandParts, ...restArgs}) {
73
- restArgsError(restArgs)
74
-
97
+ async requireCommand({commandParts}) {
75
98
  let filePath = "."
76
99
 
77
100
  for (let commandPart of commandParts) {
@@ -109,7 +132,7 @@ export default class VelociousEnvironmentsHandlerBrowser extends Base {
109
132
  }
110
133
 
111
134
  /**
112
- * @returns {Promise<Array<{name: string, file: string}>>}
135
+ * @returns {Promise<Array<import("./base.js").MigrationObjectType>>}
113
136
  */
114
137
  async findMigrations() {
115
138
  const migrationsRequireContext = await this.migrationsRequireContext()
@@ -150,8 +173,7 @@ export default class VelociousEnvironmentsHandlerBrowser extends Base {
150
173
 
151
174
  /**
152
175
  * @param {string} filePath
153
- * @template T extends import("../migration/index.js").default
154
- * @returns {Promise<T>}
176
+ * @returns {Promise<typeof import("../database/migration/index.js").default>}
155
177
  */
156
178
  requireMigration = async (filePath) => {
157
179
  if (!filePath) throw new Error("filePath is required")
@@ -1,9 +1,13 @@
1
1
  import BaseCommand from "../../../../../cli/base-command.js"
2
2
  import fs from "fs/promises"
3
3
 
4
+ /**
5
+ * @typedef {{destroyed: string[]}} DestroyMigrationResult
6
+ */
7
+
4
8
  export default class DbDestroyMigration extends BaseCommand {
5
9
  /**
6
- * @returns {Promise<void>}
10
+ * @returns {Promise<void | DestroyMigrationResult>}
7
11
  */
8
12
  async execute() {
9
13
  const migrationName = this.processArgs[1]
@@ -29,14 +29,19 @@ export default class DbGenerateModel extends BaseCommand {
29
29
  console.log(`create src/model-bases/${modelBaseFileName}`)
30
30
 
31
31
  let fileContent = ""
32
+ let velociousPath = "velocious"
32
33
 
33
34
  if (devMode) {
34
- fileContent += `import Record from "../../../../src/database/record/index.js"\n\n`
35
+ velociousPath = "../../../.."
36
+ fileContent += `import DatabaseRecord from "../../../../src/database/record/index.js"\n\n`
37
+ // /** @type {import("./instance-relationships/has-many.js").default} */
35
38
  } else {
36
- fileContent += `import Record from "velocious/src/database/record/index.js"\n\n`
39
+ fileContent += `import DatabaseRecord from "velocious/src/database/record/index.js"\n\n`
37
40
  }
38
41
 
39
- fileContent += `export default class ${modelNameCamelized}Base extends Record {\n`
42
+ const hasManyRelationFilePath = `${velociousPath}/src/database/record/instance-relationships/has-many.js`
43
+
44
+ fileContent += `export default class ${modelNameCamelized}Base extends DatabaseRecord {\n`
40
45
 
41
46
  const columns = await modelClass._getTable().getColumns()
42
47
  let methodsCount = 0
@@ -135,13 +140,15 @@ export default class DbGenerateModel extends BaseCommand {
135
140
  }
136
141
 
137
142
  for (const relationship of modelClass.getRelationships()) {
138
- let fileName, fullFilePath
143
+ let baseFilePath, baseFullFilePath, fileName, fullFilePath
139
144
 
140
145
  if (relationship.getPolymorphic()) {
141
146
  fileName = "velocious/src/database/record/index.js"
142
147
  } else {
143
148
  fileName = inflection.dasherize(inflection.underscore(relationship.getTargetModelClass().name))
144
149
  fullFilePath = `src/models/${fileName}.js`
150
+ baseFilePath = `../model-bases/${fileName}.js`
151
+ baseFullFilePath = `src/model-bases/${fileName}.js`
145
152
  }
146
153
 
147
154
  if (methodsCount > 0) {
@@ -153,6 +160,8 @@ export default class DbGenerateModel extends BaseCommand {
153
160
 
154
161
  if (fullFilePath && await fileExists(fullFilePath)) {
155
162
  modelFilePath = `../models/${fileName}.js`
163
+ } else if (baseFullFilePath && await fileExists(baseFullFilePath)) {
164
+ modelFilePath = baseFilePath
156
165
  } else {
157
166
  modelFilePath = "velocious/src/database/record/index.js"
158
167
  }
@@ -160,7 +169,7 @@ export default class DbGenerateModel extends BaseCommand {
160
169
  fileContent += " /**\n"
161
170
  fileContent += ` * @returns {import("${modelFilePath}").default}\n`
162
171
  fileContent += " */\n"
163
- fileContent += ` ${relationship.getRelationshipName()}() { return this.getRelationshipByName("${relationship.getRelationshipName()}").loaded() }\n`
172
+ fileContent += ` ${relationship.getRelationshipName()}() { return /** @type {import("${modelFilePath}").default} */ (this.getRelationshipByName("${relationship.getRelationshipName()}").loaded()) }\n`
164
173
 
165
174
  fileContent += "\n"
166
175
  fileContent += " /**\n"
@@ -189,20 +198,22 @@ export default class DbGenerateModel extends BaseCommand {
189
198
 
190
199
  if (fullFilePath && await fileExists(fullFilePath)) {
191
200
  recordImport = `../models/${fileName}.js`
201
+ } else if (baseFullFilePath && await fileExists(baseFullFilePath)) {
202
+ recordImport = `../model-bases/${fileName}.js`
192
203
  } else {
193
- recordImport = "velocious/src/database/record/index.js"
204
+ recordImport = `${velociousPath}/src/database/record/index.js`
194
205
  }
195
206
 
196
207
  fileContent += " /**\n"
197
- fileContent += ` * @returns {import("velocious/src/database/query/index.js").default<import("${recordImport}").default>}\n`
208
+ fileContent += ` * @returns {import("${hasManyRelationFilePath}").default}\n`
198
209
  fileContent += " */\n"
199
- fileContent += ` ${relationship.getRelationshipName()}() { return this.getRelationshipByName("${relationship.getRelationshipName()}") }\n`
210
+ fileContent += ` ${relationship.getRelationshipName()}() { return /** @type {import("${hasManyRelationFilePath}").default} */ (this.getRelationshipByName("${relationship.getRelationshipName()}")) }\n`
200
211
 
201
212
  fileContent += "\n"
202
213
  fileContent += " /**\n"
203
214
  fileContent += ` * @returns {Array<import("${recordImport}").default>}\n`
204
215
  fileContent += " */\n"
205
- fileContent += ` ${relationship.getRelationshipName()}Loaded() { return this.getRelationshipByName("${relationship.getRelationshipName()}").loaded() }\n`
216
+ fileContent += ` ${relationship.getRelationshipName()}Loaded() { return /** @type {Array<import("${recordImport}").default>} */ (this.getRelationshipByName("${relationship.getRelationshipName()}").loaded()) }\n`
206
217
 
207
218
  fileContent += "\n"
208
219
  fileContent += " /**\n"
@@ -4,9 +4,13 @@ import fs from "fs/promises"
4
4
  import * as inflection from "inflection"
5
5
  import strftime from "strftime"
6
6
 
7
+ /**
8
+ * @typedef {{date: Date, migrationContent: string, migrationName: string, migrationNameCamelized: string, migrationNumber: string, migrationPath: string}} DbGenerateMigrationReturnType
9
+ */
10
+
7
11
  export default class DbGenerateMigration extends BaseCommand {
8
12
  /**
9
- * @returns {Promise<void>}
13
+ * @returns {Promise<void | DbGenerateMigrationReturnType>}
10
14
  */
11
15
  async execute() {
12
16
  const migrationName = this.processArgs[1]
@@ -3,9 +3,13 @@ import fileExists from "../../../../../utils/file-exists.js"
3
3
  import fs from "fs/promises"
4
4
  import * as inflection from "inflection"
5
5
 
6
+ /**
7
+ * @typedef {{date: Date, modelContent: string, modelName: string, modelNameCamelized: string, modelPath: string}} DbGenerateModelResult
8
+ */
9
+
6
10
  export default class DbGenerateModel extends BaseCommand {
7
11
  /**
8
- * @returns {Promise<void>}
12
+ * @returns {Promise<void | DbGenerateModelResult>}
9
13
  */
10
14
  async execute() {
11
15
  const modelName = this.processArgs[1]
@@ -2,9 +2,13 @@ import BaseCommand from "../../../../cli/base-command.js"
2
2
  import fileExists from "../../../../utils/file-exists.js"
3
3
  import fs from "fs/promises"
4
4
 
5
+ /**
6
+ * @typedef {{source: string, target: string}} FileMappingType
7
+ */
8
+
5
9
  export default class VelociousCliCommandsInit extends BaseCommand {
6
10
  /**
7
- * @returns {Promise<void>}
11
+ * @returns {Promise<void | {fileMappings: FileMappingType[]}>}
8
12
  */
9
13
  async execute() {
10
14
  const velociousPath = await this.getEnvironmentHandler().getVelociousPath()
@@ -115,7 +115,7 @@ export default class VelociousEnvironmentHandlerNode extends Base{
115
115
  /**
116
116
  * @param {object} args
117
117
  * @param {string[]} args.commandParts
118
- * @returns {Promise<import ("../cli/base-command.js").default>}
118
+ * @returns {Promise<typeof import ("../cli/base-command.js").default>}
119
119
  */
120
120
  async requireCommand({commandParts}) {
121
121
  const commands = await this.findCommands()
@@ -46,7 +46,8 @@ export default class VeoliciousHttpServerClient {
46
46
  }
47
47
 
48
48
  /**
49
- * @param {string} data
49
+ * @param {Buffer} data
50
+ * @returns {void}
50
51
  */
51
52
  onWrite(data) {
52
53
  if (this.state == "initial") {
@@ -36,21 +36,17 @@ export default class ParamsToObject {
36
36
  let newResult
37
37
 
38
38
  if (inputName in result) {
39
- // @ts-expect-error
40
39
  newResult = result[inputName]
41
40
  } else if (rest == "[]") {
42
41
  newResult = []
43
- // @ts-expect-error
44
42
  result[inputName] = newResult
45
43
  } else {
46
44
  newResult = {}
47
- // @ts-expect-error
48
45
  result[inputName] = newResult
49
46
  }
50
47
 
51
48
  this.treatSecond(value, rest, newResult)
52
49
  } else {
53
- // @ts-expect-error
54
50
  result[key] = value
55
51
  }
56
52
  }
@@ -74,19 +70,15 @@ export default class ParamsToObject {
74
70
  if (rest == "[]") {
75
71
  result.push(value)
76
72
  } else if (newRest == "") {
77
- // @ts-expect-error
78
73
  result[key] = value
79
74
  } else {
80
75
  if (typeof result == "object" && key in result) {
81
- // @ts-expect-error
82
76
  newResult = result[key]
83
77
  } else if (newRest == "[]") {
84
78
  newResult = []
85
- // @ts-expect-error
86
79
  result[key] = newResult
87
80
  } else {
88
81
  newResult = {}
89
- // @ts-expect-error
90
82
  result[key] = newResult
91
83
  }
92
84
 
@@ -334,6 +334,7 @@ export default class RequestBuffer {
334
334
 
335
335
  parseQueryStringPostParams() {
336
336
  if (this.postBody) {
337
+ /** @type {Record<string, any>} */
337
338
  const unparsedParams = querystring.parse(this.postBody)
338
339
  const paramsToObject = new ParamsToObject(unparsedParams)
339
340
  const newParams = paramsToObject.toObject()
@@ -57,7 +57,7 @@ export default class VelociousBasicRoute extends BaseRoute {
57
57
 
58
58
  /**
59
59
  * @param {string} name
60
- * @param {function(import("./resource-route.js").default) : void} callback
60
+ * @param {function(import("./resource-route.js").default) : void} [callback]
61
61
  * @returns {void}
62
62
  */
63
63
  resources(name, callback) {