velocious 1.0.430 → 1.0.431
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/velocious.js +48 -0
- package/build/bin/velocious.js +39 -34
- package/build/index.js +1 -2
- package/build/src/application.js +214 -187
- package/build/src/authorization/ability.d.ts +24 -23
- package/build/src/authorization/ability.d.ts.map +1 -1
- package/build/src/authorization/ability.js +300 -252
- package/build/src/authorization/base-resource.d.ts +20 -26
- package/build/src/authorization/base-resource.d.ts.map +1 -1
- package/build/src/authorization/base-resource.js +136 -118
- package/build/src/background-jobs/client.js +47 -43
- package/build/src/background-jobs/cron-expression.js +166 -127
- package/build/src/background-jobs/forked-runner-child.js +47 -37
- package/build/src/background-jobs/job-record.js +10 -8
- package/build/src/background-jobs/job-registry.js +84 -72
- package/build/src/background-jobs/job-runner.js +81 -74
- package/build/src/background-jobs/job.js +72 -62
- package/build/src/background-jobs/json-socket.js +70 -65
- package/build/src/background-jobs/main.js +900 -841
- package/build/src/background-jobs/normalize-error.js +11 -12
- package/build/src/background-jobs/scheduler.js +247 -205
- package/build/src/background-jobs/socket-request.js +65 -60
- package/build/src/background-jobs/status-reporter.js +96 -86
- package/build/src/background-jobs/store.js +980 -862
- package/build/src/background-jobs/types.js +3 -2
- package/build/src/background-jobs/web/authorization.js +50 -38
- package/build/src/background-jobs/web/controller.js +268 -232
- package/build/src/background-jobs/web/index.js +40 -36
- package/build/src/background-jobs/web/path-matcher.js +48 -45
- package/build/src/background-jobs/web/registry.js +14 -9
- package/build/src/background-jobs/worker.js +639 -585
- package/build/src/beacon/client.js +293 -264
- package/build/src/beacon/in-process-broker.js +25 -20
- package/build/src/beacon/in-process-client.js +116 -104
- package/build/src/beacon/server.js +126 -110
- package/build/src/beacon/types.js +8 -2
- package/build/src/cli/base-command.js +57 -49
- package/build/src/cli/browser-cli.js +42 -37
- package/build/src/cli/commands/background-jobs-main.js +5 -5
- package/build/src/cli/commands/background-jobs-runner.js +5 -5
- package/build/src/cli/commands/background-jobs-worker.js +5 -5
- package/build/src/cli/commands/beacon.js +5 -5
- package/build/src/cli/commands/console.js +10 -10
- package/build/src/cli/commands/db/base-command.js +76 -71
- package/build/src/cli/commands/db/create.js +61 -53
- package/build/src/cli/commands/db/drop.js +71 -62
- package/build/src/cli/commands/db/migrate.js +15 -13
- package/build/src/cli/commands/db/reset.js +19 -16
- package/build/src/cli/commands/db/rollback.js +13 -12
- package/build/src/cli/commands/db/schema/dump.js +9 -9
- package/build/src/cli/commands/db/schema/load.js +9 -9
- package/build/src/cli/commands/db/seed.js +9 -9
- package/build/src/cli/commands/db/tenants/check.js +35 -32
- package/build/src/cli/commands/db/tenants/create.js +29 -26
- package/build/src/cli/commands/db/tenants/migrate.js +44 -40
- package/build/src/cli/commands/destroy/migration.js +5 -5
- package/build/src/cli/commands/generate/base-models.js +5 -5
- package/build/src/cli/commands/generate/frontend-models.js +9 -9
- package/build/src/cli/commands/generate/migration.js +5 -5
- package/build/src/cli/commands/generate/model.js +5 -5
- package/build/src/cli/commands/init.js +9 -7
- package/build/src/cli/commands/routes.js +6 -6
- package/build/src/cli/commands/run-script.js +9 -9
- package/build/src/cli/commands/runner.js +9 -9
- package/build/src/cli/commands/server.js +6 -6
- package/build/src/cli/commands/test.js +7 -6
- package/build/src/cli/index.js +141 -127
- package/build/src/cli/tenant-database-command-helper.js +185 -154
- package/build/src/cli/use-browser-cli.js +20 -15
- package/build/src/configuration-resolver.js +54 -47
- package/build/src/configuration-types.d.ts +21 -2
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +60 -3
- package/build/src/configuration.js +2547 -2240
- package/build/src/controller.js +407 -363
- package/build/src/current-configuration.js +12 -9
- package/build/src/current.js +75 -70
- package/build/src/database/annotations-async-hooks.js +22 -16
- package/build/src/database/annotations.js +18 -12
- package/build/src/database/drivers/base-column.js +179 -155
- package/build/src/database/drivers/base-columns-index.js +78 -69
- package/build/src/database/drivers/base-foreign-key.js +101 -89
- package/build/src/database/drivers/base-table.js +149 -124
- package/build/src/database/drivers/base.js +1489 -1306
- package/build/src/database/drivers/mssql/column.js +50 -39
- package/build/src/database/drivers/mssql/columns-index.js +3 -2
- package/build/src/database/drivers/mssql/connect-connection.js +9 -11
- package/build/src/database/drivers/mssql/foreign-key.js +9 -8
- package/build/src/database/drivers/mssql/index.js +587 -507
- package/build/src/database/drivers/mssql/options.js +75 -68
- package/build/src/database/drivers/mssql/query-parser.js +3 -2
- package/build/src/database/drivers/mssql/sql/alter-table.js +2 -2
- package/build/src/database/drivers/mssql/sql/create-database.js +31 -24
- package/build/src/database/drivers/mssql/sql/create-index.js +2 -2
- package/build/src/database/drivers/mssql/sql/create-table.js +2 -2
- package/build/src/database/drivers/mssql/sql/delete.js +16 -14
- package/build/src/database/drivers/mssql/sql/drop-database.js +31 -24
- package/build/src/database/drivers/mssql/sql/drop-table.js +2 -2
- package/build/src/database/drivers/mssql/sql/insert.js +2 -2
- package/build/src/database/drivers/mssql/sql/update.js +28 -24
- package/build/src/database/drivers/mssql/sql/upsert.js +20 -18
- package/build/src/database/drivers/mssql/structure-sql.js +114 -102
- package/build/src/database/drivers/mssql/table.js +96 -81
- package/build/src/database/drivers/mysql/column.js +92 -75
- package/build/src/database/drivers/mysql/columns-index.js +19 -16
- package/build/src/database/drivers/mysql/foreign-key.js +9 -8
- package/build/src/database/drivers/mysql/index.js +457 -396
- package/build/src/database/drivers/mysql/options.js +30 -26
- package/build/src/database/drivers/mysql/query-parser.js +3 -2
- package/build/src/database/drivers/mysql/query.js +29 -26
- package/build/src/database/drivers/mysql/sql/alter-table.js +3 -2
- package/build/src/database/drivers/mysql/sql/create-database.js +28 -23
- package/build/src/database/drivers/mysql/sql/create-index.js +3 -2
- package/build/src/database/drivers/mysql/sql/create-table.js +3 -2
- package/build/src/database/drivers/mysql/sql/delete.js +17 -14
- package/build/src/database/drivers/mysql/sql/drop-database.js +3 -2
- package/build/src/database/drivers/mysql/sql/drop-table.js +3 -2
- package/build/src/database/drivers/mysql/sql/insert.js +3 -2
- package/build/src/database/drivers/mysql/sql/update.js +29 -24
- package/build/src/database/drivers/mysql/sql/upsert.js +10 -8
- package/build/src/database/drivers/mysql/structure-sql.js +88 -79
- package/build/src/database/drivers/mysql/table.js +98 -83
- package/build/src/database/drivers/pgsql/column.js +72 -56
- package/build/src/database/drivers/pgsql/columns-index.js +3 -2
- package/build/src/database/drivers/pgsql/foreign-key.js +9 -8
- package/build/src/database/drivers/pgsql/index.js +438 -377
- package/build/src/database/drivers/pgsql/options.js +28 -25
- package/build/src/database/drivers/pgsql/query-parser.js +3 -2
- package/build/src/database/drivers/pgsql/sql/alter-table.js +3 -2
- package/build/src/database/drivers/pgsql/sql/create-database.js +23 -19
- package/build/src/database/drivers/pgsql/sql/create-index.js +3 -2
- package/build/src/database/drivers/pgsql/sql/create-table.js +3 -2
- package/build/src/database/drivers/pgsql/sql/delete.js +17 -14
- package/build/src/database/drivers/pgsql/sql/drop-database.js +3 -2
- package/build/src/database/drivers/pgsql/sql/drop-table.js +3 -2
- package/build/src/database/drivers/pgsql/sql/insert.js +3 -2
- package/build/src/database/drivers/pgsql/sql/update.js +29 -24
- package/build/src/database/drivers/pgsql/sql/upsert.js +11 -9
- package/build/src/database/drivers/pgsql/structure-sql.js +120 -108
- package/build/src/database/drivers/pgsql/table.js +77 -60
- package/build/src/database/drivers/sqlite/base.js +478 -405
- package/build/src/database/drivers/sqlite/column.js +69 -54
- package/build/src/database/drivers/sqlite/columns-index.js +27 -22
- package/build/src/database/drivers/sqlite/connection-sql-js.js +42 -35
- package/build/src/database/drivers/sqlite/foreign-key.js +21 -18
- package/build/src/database/drivers/sqlite/index.js +373 -330
- package/build/src/database/drivers/sqlite/index.native.js +64 -55
- package/build/src/database/drivers/sqlite/index.web.js +87 -69
- package/build/src/database/drivers/sqlite/options.js +28 -25
- package/build/src/database/drivers/sqlite/query-parser.js +3 -2
- package/build/src/database/drivers/sqlite/query.js +24 -21
- package/build/src/database/drivers/sqlite/query.native.js +25 -20
- package/build/src/database/drivers/sqlite/query.web.js +37 -30
- package/build/src/database/drivers/sqlite/sql/alter-table.js +179 -159
- package/build/src/database/drivers/sqlite/sql/create-index.js +3 -2
- package/build/src/database/drivers/sqlite/sql/create-table.js +3 -2
- package/build/src/database/drivers/sqlite/sql/delete.js +22 -17
- package/build/src/database/drivers/sqlite/sql/drop-table.js +3 -2
- package/build/src/database/drivers/sqlite/sql/insert.js +3 -2
- package/build/src/database/drivers/sqlite/sql/update.js +29 -24
- package/build/src/database/drivers/sqlite/sql/upsert.js +11 -9
- package/build/src/database/drivers/sqlite/structure-sql.js +52 -49
- package/build/src/database/drivers/sqlite/table-rebuilder.js +75 -62
- package/build/src/database/drivers/sqlite/table.js +125 -102
- package/build/src/database/drivers/structure-sql/utils.js +17 -14
- package/build/src/database/handler.js +10 -9
- package/build/src/database/initializer-from-require-context.js +87 -76
- package/build/src/database/migration/index.js +395 -332
- package/build/src/database/migrator/files-finder.js +50 -40
- package/build/src/database/migrator/types.js +30 -2
- package/build/src/database/migrator.js +526 -454
- package/build/src/database/pool/async-tracked-multi-connection.js +1147 -997
- package/build/src/database/pool/base-methods-forward.js +43 -40
- package/build/src/database/pool/base.js +343 -298
- package/build/src/database/pool/single-multi-use.js +110 -93
- package/build/src/database/query/alter-table-base.js +99 -84
- package/build/src/database/query/base.js +46 -39
- package/build/src/database/query/create-database-base.js +30 -25
- package/build/src/database/query/create-index-base.js +94 -75
- package/build/src/database/query/create-table-base.js +193 -151
- package/build/src/database/query/delete-base.js +16 -14
- package/build/src/database/query/drop-database-base.js +28 -23
- package/build/src/database/query/drop-table-base.js +53 -42
- package/build/src/database/query/from-base.js +33 -30
- package/build/src/database/query/from-plain.js +13 -11
- package/build/src/database/query/from-table.js +15 -13
- package/build/src/database/query/index.js +472 -410
- package/build/src/database/query/insert-base.js +164 -143
- package/build/src/database/query/join-base.js +40 -35
- package/build/src/database/query/join-object.js +153 -128
- package/build/src/database/query/join-plain.js +15 -13
- package/build/src/database/query/join-tracker.js +90 -76
- package/build/src/database/query/model-class-query.js +1370 -1134
- package/build/src/database/query/order-base.js +30 -27
- package/build/src/database/query/order-column.js +53 -44
- package/build/src/database/query/order-plain.js +24 -20
- package/build/src/database/query/preloader/belongs-to.js +258 -210
- package/build/src/database/query/preloader/ensure-model-class-initialized.js +9 -8
- package/build/src/database/query/preloader/has-many.js +301 -240
- package/build/src/database/query/preloader/has-one.js +117 -91
- package/build/src/database/query/preloader/selection.js +129 -117
- package/build/src/database/query/preloader.js +185 -160
- package/build/src/database/query/query-data.js +201 -157
- package/build/src/database/query/select-base.js +27 -25
- package/build/src/database/query/select-plain.js +15 -13
- package/build/src/database/query/select-table-and-column.js +25 -21
- package/build/src/database/query/update-base.js +38 -35
- package/build/src/database/query/upsert-base.js +100 -93
- package/build/src/database/query/where-base.js +35 -32
- package/build/src/database/query/where-combinator.d.ts.map +1 -1
- package/build/src/database/query/where-combinator.js +28 -26
- package/build/src/database/query/where-hash.js +68 -61
- package/build/src/database/query/where-model-class-hash.js +469 -414
- package/build/src/database/query/where-not.js +20 -18
- package/build/src/database/query/where-plain.js +17 -15
- package/build/src/database/query/with-count.js +159 -125
- package/build/src/database/query-parser/base-query-parser.js +37 -32
- package/build/src/database/query-parser/from-parser.js +45 -36
- package/build/src/database/query-parser/group-parser.js +50 -42
- package/build/src/database/query-parser/joins-parser.js +33 -28
- package/build/src/database/query-parser/limit-parser.js +70 -67
- package/build/src/database/query-parser/options.js +82 -75
- package/build/src/database/query-parser/order-parser.js +40 -36
- package/build/src/database/query-parser/select-parser.js +60 -49
- package/build/src/database/query-parser/where-parser.js +41 -36
- package/build/src/database/record/acts-as-list.js +273 -235
- package/build/src/database/record/attachments/download.js +45 -44
- package/build/src/database/record/attachments/handle.js +161 -141
- package/build/src/database/record/attachments/normalize-input.js +138 -128
- package/build/src/database/record/attachments/storage-drivers/filesystem.js +91 -77
- package/build/src/database/record/attachments/storage-drivers/native.js +121 -112
- package/build/src/database/record/attachments/storage-drivers/s3.js +208 -177
- package/build/src/database/record/attachments/store.d.ts +1 -1
- package/build/src/database/record/attachments/store.d.ts.map +1 -1
- package/build/src/database/record/attachments/store.js +540 -468
- package/build/src/database/record/index.d.ts +17 -15
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +3894 -3361
- package/build/src/database/record/instance-relationships/base.js +268 -234
- package/build/src/database/record/instance-relationships/belongs-to.js +73 -58
- package/build/src/database/record/instance-relationships/has-many.js +264 -225
- package/build/src/database/record/instance-relationships/has-one.js +105 -85
- package/build/src/database/record/record-not-found-error.js +2 -3
- package/build/src/database/record/relationships/base.d.ts +2 -2
- package/build/src/database/record/relationships/base.d.ts.map +1 -1
- package/build/src/database/record/relationships/base.js +167 -145
- package/build/src/database/record/relationships/belongs-to.js +51 -44
- package/build/src/database/record/relationships/has-many.js +40 -32
- package/build/src/database/record/relationships/has-one.js +40 -32
- package/build/src/database/record/state-machine.js +208 -156
- package/build/src/database/record/user-module.js +38 -32
- package/build/src/database/record/validators/base.js +24 -22
- package/build/src/database/record/validators/format.js +46 -36
- package/build/src/database/record/validators/presence.js +20 -18
- package/build/src/database/record/validators/uniqueness.js +117 -99
- package/build/src/database/table-data/index.js +231 -199
- package/build/src/database/table-data/table-column.js +382 -338
- package/build/src/database/table-data/table-foreign-key.js +66 -57
- package/build/src/database/table-data/table-index.js +36 -29
- package/build/src/database/table-data/table-reference.js +10 -10
- package/build/src/database/use-database.js +40 -32
- package/build/src/environment-handlers/base.js +544 -484
- package/build/src/environment-handlers/browser.js +294 -241
- package/build/src/environment-handlers/node/cli/commands/background-jobs-main.js +19 -16
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +21 -18
- package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.js +29 -22
- package/build/src/environment-handlers/node/cli/commands/beacon.js +19 -16
- package/build/src/environment-handlers/node/cli/commands/cli-command-context.js +15 -14
- package/build/src/environment-handlers/node/cli/commands/console.js +120 -99
- package/build/src/environment-handlers/node/cli/commands/db/schema/dump.js +39 -34
- package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +63 -57
- package/build/src/environment-handlers/node/cli/commands/db/seed.js +63 -51
- package/build/src/environment-handlers/node/cli/commands/destroy/migration.js +40 -32
- package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +353 -298
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +844 -729
- package/build/src/environment-handlers/node/cli/commands/generate/migration.js +38 -34
- package/build/src/environment-handlers/node/cli/commands/generate/model.js +38 -34
- package/build/src/environment-handlers/node/cli/commands/init.js +61 -56
- package/build/src/environment-handlers/node/cli/commands/routes.js +59 -51
- package/build/src/environment-handlers/node/cli/commands/run-script.js +68 -54
- package/build/src/environment-handlers/node/cli/commands/runner.js +74 -56
- package/build/src/environment-handlers/node/cli/commands/server.js +106 -93
- package/build/src/environment-handlers/node/cli/commands/test.js +113 -97
- package/build/src/environment-handlers/node.js +874 -753
- package/build/src/error-logger.js +21 -22
- package/build/src/frontend-model-controller.d.ts +6 -6
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +3288 -2788
- package/build/src/frontend-model-resource/base-resource.d.ts +18 -17
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +869 -759
- package/build/src/frontend-models/base.d.ts +19 -12
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +3602 -3114
- package/build/src/frontend-models/clear-pending-debounced-callback.js +8 -7
- package/build/src/frontend-models/event-hook-models.js +21 -16
- package/build/src/frontend-models/model-registry.js +11 -9
- package/build/src/frontend-models/outgoing-event-buffer.js +17 -10
- package/build/src/frontend-models/preloader.d.ts +6 -6
- package/build/src/frontend-models/preloader.d.ts.map +1 -1
- package/build/src/frontend-models/preloader.js +149 -131
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +1855 -1560
- package/build/src/frontend-models/resource-config-validation.js +37 -27
- package/build/src/frontend-models/resource-definition.js +288 -234
- package/build/src/frontend-models/transport-serialization.js +266 -203
- package/build/src/frontend-models/use-created-event.js +7 -5
- package/build/src/frontend-models/use-destroyed-event.js +93 -80
- package/build/src/frontend-models/use-model-class-event.js +91 -79
- package/build/src/frontend-models/use-updated-event.js +97 -84
- package/build/src/frontend-models/websocket-channel.js +441 -381
- package/build/src/frontend-models/websocket-publishers.js +173 -140
- package/build/src/http-client/header.js +14 -13
- package/build/src/http-client/index.js +132 -116
- package/build/src/http-client/request.js +87 -71
- package/build/src/http-client/response.js +140 -122
- package/build/src/http-client/websocket-client.js +17 -15
- package/build/src/http-server/client/index.js +465 -409
- package/build/src/http-server/client/params-to-object.js +135 -124
- package/build/src/http-server/client/request-buffer/form-data-part.js +132 -111
- package/build/src/http-server/client/request-buffer/header.js +16 -15
- package/build/src/http-server/client/request-buffer/index.js +506 -446
- package/build/src/http-server/client/request-parser.js +186 -163
- package/build/src/http-server/client/request-runner.js +259 -226
- package/build/src/http-server/client/request-timing.js +151 -132
- package/build/src/http-server/client/request.js +108 -96
- package/build/src/http-server/client/response.js +235 -213
- package/build/src/http-server/client/uploaded-file/memory-uploaded-file.js +29 -25
- package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.js +29 -25
- package/build/src/http-server/client/uploaded-file/uploaded-file.js +33 -33
- package/build/src/http-server/client/websocket-request.js +137 -114
- package/build/src/http-server/client/websocket-session.js +1657 -1452
- package/build/src/http-server/cookie.js +236 -216
- package/build/src/http-server/development-reloader.js +221 -190
- package/build/src/http-server/index.js +525 -451
- package/build/src/http-server/remote-address.js +50 -38
- package/build/src/http-server/server-client.js +208 -181
- package/build/src/http-server/server-lock.js +167 -153
- package/build/src/http-server/websocket-channel-subscribers.js +93 -81
- package/build/src/http-server/websocket-channel.js +117 -104
- package/build/src/http-server/websocket-connection.js +104 -96
- package/build/src/http-server/websocket-event-log-store.js +404 -350
- package/build/src/http-server/websocket-events-host.js +164 -145
- package/build/src/http-server/websocket-events.js +47 -47
- package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +14 -13
- package/build/src/http-server/worker-handler/in-process.js +141 -123
- package/build/src/http-server/worker-handler/index.js +349 -313
- package/build/src/http-server/worker-handler/worker-script.js +5 -4
- package/build/src/http-server/worker-handler/worker-thread.js +269 -240
- package/build/src/initializer.js +36 -31
- package/build/src/jobs/mail-delivery.js +15 -13
- package/build/src/logger/base-logger.js +26 -24
- package/build/src/logger/console-logger.js +23 -21
- package/build/src/logger/file-logger.js +31 -29
- package/build/src/logger/outputs/array-output.js +42 -37
- package/build/src/logger/outputs/console-output.js +24 -20
- package/build/src/logger/outputs/file-output.js +48 -43
- package/build/src/logger/outputs/stdout-output.js +48 -39
- package/build/src/logger.js +394 -338
- package/build/src/mailer/backends/smtp.js +163 -134
- package/build/src/mailer/base.js +251 -211
- package/build/src/mailer/delivery.js +64 -56
- package/build/src/mailer/index.js +22 -4
- package/build/src/mailer.js +13 -4
- package/build/src/plugins/sqljs-wasm-route-controller.js +52 -42
- package/build/src/plugins/sqljs-wasm-route.js +38 -28
- package/build/src/record-payload-values.js +28 -25
- package/build/src/routes/app-routes.js +14 -12
- package/build/src/routes/base-route.js +130 -112
- package/build/src/routes/basic-route.js +102 -83
- package/build/src/routes/built-in/debug/controller.js +10 -10
- package/build/src/routes/built-in/errors/controller.js +5 -5
- package/build/src/routes/get-route.js +63 -50
- package/build/src/routes/hooks/frontend-model-command-route-hook.js +80 -66
- package/build/src/routes/index.js +43 -36
- package/build/src/routes/namespace-route.js +47 -38
- package/build/src/routes/plugin-routes.js +124 -107
- package/build/src/routes/post-route.js +62 -51
- package/build/src/routes/resolver.js +494 -422
- package/build/src/routes/resource-route.js +143 -124
- package/build/src/routes/root-route.js +8 -7
- package/build/src/testing/base-expect.js +14 -13
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +405 -329
- package/build/src/testing/browser-test-app.js +29 -23
- package/build/src/testing/expect-to-change.js +50 -41
- package/build/src/testing/expect-utils.js +184 -139
- package/build/src/testing/expect.js +731 -638
- package/build/src/testing/request-client.js +85 -70
- package/build/src/testing/test-files-finder.js +339 -285
- package/build/src/testing/test-filter-parser.js +155 -124
- package/build/src/testing/test-runner.js +1020 -883
- package/build/src/testing/test-suite-splitter.js +142 -114
- package/build/src/testing/test.js +256 -216
- package/build/src/utils/backtrace-cleaner-node.js +69 -62
- package/build/src/utils/backtrace-cleaner.js +216 -188
- package/build/src/utils/ensure-error.js +7 -7
- package/build/src/utils/event-emitter.js +6 -4
- package/build/src/utils/file-exists.js +10 -9
- package/build/src/utils/format-value.js +76 -67
- package/build/src/utils/model-scope.js +31 -27
- package/build/src/utils/nest-callbacks.js +13 -10
- package/build/src/utils/plain-object.js +6 -5
- package/build/src/utils/ransack.d.ts.map +1 -1
- package/build/src/utils/ransack.js +563 -449
- package/build/src/utils/rest-args-error.js +6 -5
- package/build/src/utils/singularize-model-name.js +11 -9
- package/build/src/utils/split-sql-statements.js +79 -68
- package/build/src/utils/to-import-specifier.js +30 -24
- package/build/src/utils/with-tracked-stack-async-hooks.js +74 -60
- package/build/src/utils/with-tracked-stack.js +18 -14
- package/build/src/velocious-error.js +30 -27
- package/index.js +1 -0
- package/package.json +10 -4
- package/scripts/clean-build.js +8 -0
- package/scripts/ensure-bin-executable.js +13 -0
- package/scripts/run-tests.js +37 -0
- package/scripts/test-browser.js +486 -0
- package/src/application.js +229 -0
- package/src/authorization/ability.js +329 -0
- package/src/authorization/base-resource.js +143 -0
- package/src/background-jobs/client.js +50 -0
- package/src/background-jobs/cron-expression.js +277 -0
- package/src/background-jobs/forked-runner-child.js +86 -0
- package/src/background-jobs/job-record.js +13 -0
- package/src/background-jobs/job-registry.js +92 -0
- package/src/background-jobs/job-runner.js +107 -0
- package/src/background-jobs/job.js +77 -0
- package/src/background-jobs/json-socket.js +78 -0
- package/src/background-jobs/main.js +926 -0
- package/src/background-jobs/normalize-error.js +26 -0
- package/src/background-jobs/scheduler.js +274 -0
- package/src/background-jobs/socket-request.js +68 -0
- package/src/background-jobs/status-reporter.js +101 -0
- package/src/background-jobs/store.js +994 -0
- package/src/background-jobs/types.js +70 -0
- package/src/background-jobs/web/authorization.js +89 -0
- package/src/background-jobs/web/controller.js +280 -0
- package/src/background-jobs/web/index.js +57 -0
- package/src/background-jobs/web/path-matcher.js +74 -0
- package/src/background-jobs/web/registry.js +49 -0
- package/src/background-jobs/worker.js +683 -0
- package/src/beacon/client.js +330 -0
- package/src/beacon/in-process-broker.js +71 -0
- package/src/beacon/in-process-client.js +139 -0
- package/src/beacon/server.js +148 -0
- package/src/beacon/types.js +55 -0
- package/src/cli/base-command.js +67 -0
- package/src/cli/browser-cli.js +45 -0
- package/src/cli/commands/background-jobs-main.js +7 -0
- package/src/cli/commands/background-jobs-runner.js +7 -0
- package/src/cli/commands/background-jobs-worker.js +7 -0
- package/src/cli/commands/beacon.js +7 -0
- package/src/cli/commands/console.js +12 -0
- package/src/cli/commands/db/base-command.js +82 -0
- package/src/cli/commands/db/create.js +64 -0
- package/src/cli/commands/db/drop.js +75 -0
- package/src/cli/commands/db/migrate.js +17 -0
- package/src/cli/commands/db/reset.js +22 -0
- package/src/cli/commands/db/rollback.js +15 -0
- package/src/cli/commands/db/schema/dump.js +12 -0
- package/src/cli/commands/db/schema/load.js +12 -0
- package/src/cli/commands/db/seed.js +12 -0
- package/src/cli/commands/db/tenants/check.js +38 -0
- package/src/cli/commands/db/tenants/create.js +33 -0
- package/src/cli/commands/db/tenants/migrate.js +49 -0
- package/src/cli/commands/destroy/migration.js +7 -0
- package/src/cli/commands/generate/base-models.js +7 -0
- package/src/cli/commands/generate/frontend-models.js +12 -0
- package/src/cli/commands/generate/migration.js +7 -0
- package/src/cli/commands/generate/model.js +7 -0
- package/src/cli/commands/init.js +11 -0
- package/src/cli/commands/routes.js +7 -0
- package/src/cli/commands/run-script.js +12 -0
- package/src/cli/commands/runner.js +12 -0
- package/src/cli/commands/server.js +7 -0
- package/src/cli/commands/test.js +9 -0
- package/src/cli/index.js +152 -0
- package/src/cli/tenant-database-command-helper.js +198 -0
- package/src/cli/use-browser-cli.js +30 -0
- package/src/configuration-resolver.js +65 -0
- package/src/configuration-types.js +429 -0
- package/src/configuration.js +2590 -0
- package/src/controller.js +421 -0
- package/src/current-configuration.js +31 -0
- package/src/current.js +80 -0
- package/src/database/annotations-async-hooks.js +47 -0
- package/src/database/annotations.js +40 -0
- package/src/database/drivers/base-column.js +182 -0
- package/src/database/drivers/base-columns-index.js +81 -0
- package/src/database/drivers/base-foreign-key.js +104 -0
- package/src/database/drivers/base-table.js +156 -0
- package/src/database/drivers/base.js +1609 -0
- package/src/database/drivers/mssql/column.js +74 -0
- package/src/database/drivers/mssql/columns-index.js +6 -0
- package/src/database/drivers/mssql/connect-connection.js +16 -0
- package/src/database/drivers/mssql/foreign-key.js +12 -0
- package/src/database/drivers/mssql/index.js +590 -0
- package/src/database/drivers/mssql/options.js +79 -0
- package/src/database/drivers/mssql/query-parser.js +6 -0
- package/src/database/drivers/mssql/sql/alter-table.js +4 -0
- package/src/database/drivers/mssql/sql/create-database.js +36 -0
- package/src/database/drivers/mssql/sql/create-index.js +4 -0
- package/src/database/drivers/mssql/sql/create-table.js +4 -0
- package/src/database/drivers/mssql/sql/delete.js +19 -0
- package/src/database/drivers/mssql/sql/drop-database.js +36 -0
- package/src/database/drivers/mssql/sql/drop-table.js +4 -0
- package/src/database/drivers/mssql/sql/insert.js +4 -0
- package/src/database/drivers/mssql/sql/update.js +31 -0
- package/src/database/drivers/mssql/sql/upsert.js +23 -0
- package/src/database/drivers/mssql/structure-sql.js +120 -0
- package/src/database/drivers/mssql/table.js +145 -0
- package/src/database/drivers/mysql/column.js +112 -0
- package/src/database/drivers/mysql/columns-index.js +22 -0
- package/src/database/drivers/mysql/foreign-key.js +12 -0
- package/src/database/drivers/mysql/index.js +473 -0
- package/src/database/drivers/mysql/options.js +34 -0
- package/src/database/drivers/mysql/query-parser.js +6 -0
- package/src/database/drivers/mysql/query.js +37 -0
- package/src/database/drivers/mysql/sql/alter-table.js +6 -0
- package/src/database/drivers/mysql/sql/create-database.js +39 -0
- package/src/database/drivers/mysql/sql/create-index.js +6 -0
- package/src/database/drivers/mysql/sql/create-table.js +6 -0
- package/src/database/drivers/mysql/sql/delete.js +21 -0
- package/src/database/drivers/mysql/sql/drop-database.js +6 -0
- package/src/database/drivers/mysql/sql/drop-table.js +6 -0
- package/src/database/drivers/mysql/sql/insert.js +6 -0
- package/src/database/drivers/mysql/sql/update.js +33 -0
- package/src/database/drivers/mysql/sql/upsert.js +13 -0
- package/src/database/drivers/mysql/structure-sql.js +93 -0
- package/src/database/drivers/mysql/table.js +121 -0
- package/src/database/drivers/pgsql/column.js +90 -0
- package/src/database/drivers/pgsql/columns-index.js +6 -0
- package/src/database/drivers/pgsql/foreign-key.js +12 -0
- package/src/database/drivers/pgsql/index.js +441 -0
- package/src/database/drivers/pgsql/options.js +32 -0
- package/src/database/drivers/pgsql/query-parser.js +6 -0
- package/src/database/drivers/pgsql/sql/alter-table.js +6 -0
- package/src/database/drivers/pgsql/sql/create-database.js +38 -0
- package/src/database/drivers/pgsql/sql/create-index.js +6 -0
- package/src/database/drivers/pgsql/sql/create-table.js +6 -0
- package/src/database/drivers/pgsql/sql/delete.js +21 -0
- package/src/database/drivers/pgsql/sql/drop-database.js +6 -0
- package/src/database/drivers/pgsql/sql/drop-table.js +6 -0
- package/src/database/drivers/pgsql/sql/insert.js +6 -0
- package/src/database/drivers/pgsql/sql/update.js +33 -0
- package/src/database/drivers/pgsql/sql/upsert.js +14 -0
- package/src/database/drivers/pgsql/structure-sql.js +126 -0
- package/src/database/drivers/pgsql/table.js +135 -0
- package/src/database/drivers/sqlite/base.js +509 -0
- package/src/database/drivers/sqlite/column.js +75 -0
- package/src/database/drivers/sqlite/columns-index.js +30 -0
- package/src/database/drivers/sqlite/connection-sql-js.js +46 -0
- package/src/database/drivers/sqlite/foreign-key.js +24 -0
- package/src/database/drivers/sqlite/index.js +394 -0
- package/src/database/drivers/sqlite/index.native.js +72 -0
- package/src/database/drivers/sqlite/index.web.js +99 -0
- package/src/database/drivers/sqlite/options.js +32 -0
- package/src/database/drivers/sqlite/query-parser.js +6 -0
- package/src/database/drivers/sqlite/query.js +35 -0
- package/src/database/drivers/sqlite/query.native.js +35 -0
- package/src/database/drivers/sqlite/query.web.js +49 -0
- package/src/database/drivers/sqlite/sql/alter-table.js +187 -0
- package/src/database/drivers/sqlite/sql/create-index.js +6 -0
- package/src/database/drivers/sqlite/sql/create-table.js +6 -0
- package/src/database/drivers/sqlite/sql/delete.js +26 -0
- package/src/database/drivers/sqlite/sql/drop-table.js +6 -0
- package/src/database/drivers/sqlite/sql/insert.js +6 -0
- package/src/database/drivers/sqlite/sql/update.js +33 -0
- package/src/database/drivers/sqlite/sql/upsert.js +14 -0
- package/src/database/drivers/sqlite/structure-sql.js +56 -0
- package/src/database/drivers/sqlite/table-rebuilder.js +96 -0
- package/src/database/drivers/sqlite/table.js +131 -0
- package/src/database/drivers/structure-sql/utils.js +35 -0
- package/src/database/handler.js +13 -0
- package/src/database/initializer-from-require-context.js +101 -0
- package/src/database/migration/index.js +438 -0
- package/src/database/migrator/files-finder.js +55 -0
- package/src/database/migrator/types.js +31 -0
- package/src/database/migrator.js +557 -0
- package/src/database/pool/async-tracked-multi-connection.js +1164 -0
- package/src/database/pool/base-methods-forward.js +52 -0
- package/src/database/pool/base.js +380 -0
- package/src/database/pool/single-multi-use.js +118 -0
- package/src/database/query/alter-table-base.js +104 -0
- package/src/database/query/base.js +49 -0
- package/src/database/query/create-database-base.js +42 -0
- package/src/database/query/create-index-base.js +117 -0
- package/src/database/query/create-table-base.js +205 -0
- package/src/database/query/delete-base.js +19 -0
- package/src/database/query/drop-database-base.js +38 -0
- package/src/database/query/drop-table-base.js +58 -0
- package/src/database/query/from-base.js +36 -0
- package/src/database/query/from-plain.js +16 -0
- package/src/database/query/from-table.js +18 -0
- package/src/database/query/index.js +533 -0
- package/src/database/query/insert-base.js +172 -0
- package/src/database/query/join-base.js +43 -0
- package/src/database/query/join-object.js +167 -0
- package/src/database/query/join-plain.js +18 -0
- package/src/database/query/join-tracker.js +93 -0
- package/src/database/query/model-class-query.js +1577 -0
- package/src/database/query/order-base.js +33 -0
- package/src/database/query/order-column.js +77 -0
- package/src/database/query/order-plain.js +28 -0
- package/src/database/query/preloader/belongs-to.js +267 -0
- package/src/database/query/preloader/ensure-model-class-initialized.js +18 -0
- package/src/database/query/preloader/has-many.js +316 -0
- package/src/database/query/preloader/has-one.js +123 -0
- package/src/database/query/preloader/selection.js +152 -0
- package/src/database/query/preloader.js +201 -0
- package/src/database/query/query-data.js +305 -0
- package/src/database/query/select-base.js +30 -0
- package/src/database/query/select-plain.js +18 -0
- package/src/database/query/select-table-and-column.js +28 -0
- package/src/database/query/update-base.js +41 -0
- package/src/database/query/upsert-base.js +103 -0
- package/src/database/query/where-base.js +38 -0
- package/src/database/query/where-combinator.js +31 -0
- package/src/database/query/where-hash.js +77 -0
- package/src/database/query/where-model-class-hash.js +505 -0
- package/src/database/query/where-not.js +23 -0
- package/src/database/query/where-plain.js +20 -0
- package/src/database/query/with-count.js +219 -0
- package/src/database/query-parser/base-query-parser.js +40 -0
- package/src/database/query-parser/from-parser.js +49 -0
- package/src/database/query-parser/group-parser.js +55 -0
- package/src/database/query-parser/joins-parser.js +37 -0
- package/src/database/query-parser/limit-parser.js +77 -0
- package/src/database/query-parser/options.js +94 -0
- package/src/database/query-parser/order-parser.js +45 -0
- package/src/database/query-parser/select-parser.js +67 -0
- package/src/database/query-parser/where-parser.js +46 -0
- package/src/database/record/acts-as-list.js +374 -0
- package/src/database/record/attachments/download.js +49 -0
- package/src/database/record/attachments/handle.js +188 -0
- package/src/database/record/attachments/normalize-input.js +213 -0
- package/src/database/record/attachments/storage-drivers/filesystem.js +114 -0
- package/src/database/record/attachments/storage-drivers/native.js +146 -0
- package/src/database/record/attachments/storage-drivers/s3.js +245 -0
- package/src/database/record/attachments/store.js +591 -0
- package/src/database/record/index.js +3970 -0
- package/src/database/record/instance-relationships/base.js +289 -0
- package/src/database/record/instance-relationships/belongs-to.js +84 -0
- package/src/database/record/instance-relationships/has-many.js +284 -0
- package/src/database/record/instance-relationships/has-one.js +117 -0
- package/src/database/record/record-not-found-error.js +3 -0
- package/src/database/record/relationships/base.js +195 -0
- package/src/database/record/relationships/belongs-to.js +57 -0
- package/src/database/record/relationships/has-many.js +46 -0
- package/src/database/record/relationships/has-one.js +46 -0
- package/src/database/record/state-machine.js +278 -0
- package/src/database/record/user-module.js +43 -0
- package/src/database/record/validators/base.js +27 -0
- package/src/database/record/validators/format.js +50 -0
- package/src/database/record/validators/presence.js +24 -0
- package/src/database/record/validators/uniqueness.js +124 -0
- package/src/database/table-data/index.js +241 -0
- package/src/database/table-data/table-column.js +416 -0
- package/src/database/table-data/table-foreign-key.js +69 -0
- package/src/database/table-data/table-index.js +46 -0
- package/src/database/table-data/table-reference.js +13 -0
- package/src/database/use-database.js +48 -0
- package/src/environment-handlers/base.js +561 -0
- package/src/environment-handlers/browser.js +338 -0
- package/src/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
- package/src/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
- package/src/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
- package/src/environment-handlers/node/cli/commands/beacon.js +21 -0
- package/src/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
- package/src/environment-handlers/node/cli/commands/console.js +149 -0
- package/src/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
- package/src/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
- package/src/environment-handlers/node/cli/commands/db/seed.js +79 -0
- package/src/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
- package/src/environment-handlers/node/cli/commands/generate/base-models.js +367 -0
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
- package/src/environment-handlers/node/cli/commands/generate/migration.js +45 -0
- package/src/environment-handlers/node/cli/commands/generate/model.js +45 -0
- package/src/environment-handlers/node/cli/commands/init.js +68 -0
- package/src/environment-handlers/node/cli/commands/routes.js +63 -0
- package/src/environment-handlers/node/cli/commands/run-script.js +85 -0
- package/src/environment-handlers/node/cli/commands/runner.js +84 -0
- package/src/environment-handlers/node/cli/commands/server.js +151 -0
- package/src/environment-handlers/node/cli/commands/test.js +118 -0
- package/src/environment-handlers/node.js +887 -0
- package/src/error-logger.js +30 -0
- package/src/frontend-model-controller.js +3491 -0
- package/src/frontend-model-resource/base-resource.js +935 -0
- package/src/frontend-models/base.js +4004 -0
- package/src/frontend-models/clear-pending-debounced-callback.js +16 -0
- package/src/frontend-models/event-hook-models.js +49 -0
- package/src/frontend-models/model-registry.js +28 -0
- package/src/frontend-models/outgoing-event-buffer.js +51 -0
- package/src/frontend-models/preloader.js +169 -0
- package/src/frontend-models/query.js +2245 -0
- package/src/frontend-models/resource-config-validation.js +56 -0
- package/src/frontend-models/resource-definition.js +399 -0
- package/src/frontend-models/transport-serialization.js +369 -0
- package/src/frontend-models/use-created-event.js +21 -0
- package/src/frontend-models/use-destroyed-event.js +148 -0
- package/src/frontend-models/use-model-class-event.js +164 -0
- package/src/frontend-models/use-updated-event.js +152 -0
- package/src/frontend-models/websocket-channel.js +494 -0
- package/src/frontend-models/websocket-publishers.js +224 -0
- package/src/http-client/header.js +17 -0
- package/src/http-client/index.js +139 -0
- package/src/http-client/request.js +94 -0
- package/src/http-client/response.js +151 -0
- package/src/http-client/websocket-client.js +27 -0
- package/src/http-server/client/index.js +507 -0
- package/src/http-server/client/params-to-object.js +152 -0
- package/src/http-server/client/request-buffer/form-data-part.js +139 -0
- package/src/http-server/client/request-buffer/header.js +19 -0
- package/src/http-server/client/request-buffer/index.js +535 -0
- package/src/http-server/client/request-parser.js +195 -0
- package/src/http-server/client/request-runner.js +321 -0
- package/src/http-server/client/request-timing.js +171 -0
- package/src/http-server/client/request.js +114 -0
- package/src/http-server/client/response.js +251 -0
- package/src/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
- package/src/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
- package/src/http-server/client/uploaded-file/uploaded-file.js +36 -0
- package/src/http-server/client/websocket-request.js +147 -0
- package/src/http-server/client/websocket-session.js +1755 -0
- package/src/http-server/cookie.js +245 -0
- package/src/http-server/development-reloader.js +240 -0
- package/src/http-server/index.js +561 -0
- package/src/http-server/remote-address.js +77 -0
- package/src/http-server/server-client.js +222 -0
- package/src/http-server/server-lock.js +178 -0
- package/src/http-server/websocket-channel-subscribers.js +110 -0
- package/src/http-server/websocket-channel.js +137 -0
- package/src/http-server/websocket-connection.js +118 -0
- package/src/http-server/websocket-event-log-store.js +433 -0
- package/src/http-server/websocket-events-host.js +170 -0
- package/src/http-server/websocket-events.js +50 -0
- package/src/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
- package/src/http-server/worker-handler/in-process.js +155 -0
- package/src/http-server/worker-handler/index.js +370 -0
- package/src/http-server/worker-handler/worker-script.js +6 -0
- package/src/http-server/worker-handler/worker-thread.js +286 -0
- package/src/initializer.js +39 -0
- package/src/jobs/.gitkeep +1 -0
- package/src/jobs/mail-delivery.js +22 -0
- package/src/logger/base-logger.js +34 -0
- package/src/logger/console-logger.js +28 -0
- package/src/logger/file-logger.js +36 -0
- package/src/logger/outputs/array-output.js +50 -0
- package/src/logger/outputs/console-output.js +32 -0
- package/src/logger/outputs/file-output.js +55 -0
- package/src/logger/outputs/stdout-output.js +64 -0
- package/src/logger.js +507 -0
- package/src/mailer/backends/smtp.js +197 -0
- package/src/mailer/base.js +337 -0
- package/src/mailer/delivery.js +70 -0
- package/src/mailer/index.js +24 -0
- package/src/mailer.js +15 -0
- package/src/plugins/sqljs-wasm-route-controller.js +70 -0
- package/src/plugins/sqljs-wasm-route.js +71 -0
- package/src/record-payload-values.js +83 -0
- package/src/routes/app-routes.js +17 -0
- package/src/routes/base-route.js +133 -0
- package/src/routes/basic-route.js +109 -0
- package/src/routes/built-in/debug/controller.js +12 -0
- package/src/routes/built-in/errors/controller.js +7 -0
- package/src/routes/built-in/errors/not-found.ejs +1 -0
- package/src/routes/get-route.js +75 -0
- package/src/routes/hooks/frontend-model-command-route-hook.js +100 -0
- package/src/routes/index.js +50 -0
- package/src/routes/namespace-route.js +51 -0
- package/src/routes/plugin-routes.js +141 -0
- package/src/routes/post-route.js +74 -0
- package/src/routes/resolver.js +535 -0
- package/src/routes/resource-route.js +154 -0
- package/src/routes/root-route.js +11 -0
- package/src/templates/configuration.js +61 -0
- package/src/templates/generate-migration.js +11 -0
- package/src/templates/generate-model.js +6 -0
- package/src/templates/routes.js +11 -0
- package/src/testing/base-expect.js +17 -0
- package/src/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
- package/src/testing/browser-test-app.js +32 -0
- package/src/testing/expect-to-change.js +55 -0
- package/src/testing/expect-utils.js +269 -0
- package/src/testing/expect.js +763 -0
- package/src/testing/request-client.js +90 -0
- package/src/testing/test-files-finder.js +364 -0
- package/src/testing/test-filter-parser.js +198 -0
- package/src/testing/test-runner.js +1168 -0
- package/src/testing/test-suite-splitter.js +177 -0
- package/src/testing/test.js +370 -0
- package/src/types/external-modules.d.ts +57 -0
- package/src/utils/backtrace-cleaner-node.js +87 -0
- package/src/utils/backtrace-cleaner.js +266 -0
- package/src/utils/ensure-error.js +15 -0
- package/src/utils/event-emitter.js +8 -0
- package/src/utils/file-exists.js +18 -0
- package/src/utils/format-value.js +101 -0
- package/src/utils/model-scope.js +56 -0
- package/src/utils/nest-callbacks.js +22 -0
- package/src/utils/plain-object.js +14 -0
- package/src/utils/ransack.js +859 -0
- package/src/utils/rest-args-error.js +14 -0
- package/src/utils/singularize-model-name.js +18 -0
- package/src/utils/split-sql-statements.js +88 -0
- package/src/utils/to-import-specifier.js +53 -0
- package/src/utils/with-tracked-stack-async-hooks.js +103 -0
- package/src/utils/with-tracked-stack.js +38 -0
- package/src/velocious-error.js +34 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import BelongsToPreloader from "./preloader/belongs-to.js"
|
|
4
|
+
import HasManyPreloader from "./preloader/has-many.js"
|
|
5
|
+
import HasOnePreloader from "./preloader/has-one.js"
|
|
6
|
+
import PreloaderSelection from "./preloader/selection.js"
|
|
7
|
+
import restArgsError from "../../utils/rest-args-error.js"
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Runs normalize nested preload.
|
|
11
|
+
* @param {import("../query/index.js").NestedPreloadRecord | string | string[] | boolean} preload - Preload data in shorthand or nested form.
|
|
12
|
+
* @returns {import("../query/index.js").NestedPreloadRecord | null} - Normalized nested preload record.
|
|
13
|
+
*/
|
|
14
|
+
function normalizeNestedPreload(preload) {
|
|
15
|
+
if (!preload || typeof preload == "boolean") return null
|
|
16
|
+
|
|
17
|
+
if (typeof preload == "string") {
|
|
18
|
+
return {[preload]: true}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (Array.isArray(preload)) {
|
|
22
|
+
/**
|
|
23
|
+
* Result.
|
|
24
|
+
@type {import("../query/index.js").NestedPreloadRecord} */
|
|
25
|
+
const result = {}
|
|
26
|
+
|
|
27
|
+
for (const entry of preload) {
|
|
28
|
+
if (typeof entry == "string") {
|
|
29
|
+
result[entry] = true
|
|
30
|
+
continue
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (entry && typeof entry == "object") {
|
|
34
|
+
const normalizedEntry = normalizeNestedPreload(entry)
|
|
35
|
+
|
|
36
|
+
if (normalizedEntry) {
|
|
37
|
+
for (const [key, value] of Object.entries(normalizedEntry)) {
|
|
38
|
+
result[key] = value
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
continue
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
throw new Error(`Invalid preload entry type: ${typeof entry}`)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return result
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (preload && typeof preload == "object") {
|
|
51
|
+
/**
|
|
52
|
+
* Result.
|
|
53
|
+
@type {import("../query/index.js").NestedPreloadRecord} */
|
|
54
|
+
const result = {}
|
|
55
|
+
|
|
56
|
+
for (const [key, value] of Object.entries(preload)) {
|
|
57
|
+
if (value === true || value === false) {
|
|
58
|
+
result[key] = value
|
|
59
|
+
continue
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const normalizedValue = normalizeNestedPreload(value)
|
|
63
|
+
|
|
64
|
+
if (normalizedValue) {
|
|
65
|
+
result[key] = normalizedValue
|
|
66
|
+
} else {
|
|
67
|
+
throw new Error(`Invalid preload value for ${key}: ${typeof value}`)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return result
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
throw new Error(`Invalid preload type: ${typeof preload}`)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export default class VelociousDatabaseQueryPreloader {
|
|
78
|
+
/**
|
|
79
|
+
* Preloads relationship(s) onto one or more already-loaded model instances.
|
|
80
|
+
* Accepts either a query built via `Model.preload(...).select(...)` (its
|
|
81
|
+
* preload graph and selects are used) or a raw preload spec
|
|
82
|
+
* (string / array / nested object).
|
|
83
|
+
* @param {Array<import("../record/index.js").default>} models - Model instances to preload onto.
|
|
84
|
+
* @param {import("./model-class-query.js").default | import("./index.js").NestedPreloadRecord | string | Array<string | import("./index.js").NestedPreloadRecord>} queryOrSpec - Preload source.
|
|
85
|
+
* @param {{force?: boolean}} [options] - Options.
|
|
86
|
+
* @returns {Promise<void>} - Resolves when preloading completes.
|
|
87
|
+
*/
|
|
88
|
+
static async preload(models, queryOrSpec, {force = false} = {}) {
|
|
89
|
+
if (models.length == 0) return
|
|
90
|
+
|
|
91
|
+
const modelClass = /**
|
|
92
|
+
* Narrows the runtime value to the documented type.
|
|
93
|
+
@type {typeof import("../record/index.js").default} */ (models[0].constructor)
|
|
94
|
+
const isQuery = Boolean(queryOrSpec) && typeof queryOrSpec == "object" && "_preload" in queryOrSpec
|
|
95
|
+
// Reuse the query builder's preload/select normalization for raw specs
|
|
96
|
+
// instead of duplicating it here.
|
|
97
|
+
const query = isQuery
|
|
98
|
+
? /**
|
|
99
|
+
* Narrows the runtime value to the documented type.
|
|
100
|
+
@type {import("./model-class-query.js").default} */ (queryOrSpec)
|
|
101
|
+
: modelClass.preload(/**
|
|
102
|
+
* Narrows the runtime value to the documented type.
|
|
103
|
+
@type {?} */ (queryOrSpec))
|
|
104
|
+
|
|
105
|
+
const preloader = new VelociousDatabaseQueryPreloader({
|
|
106
|
+
modelClass,
|
|
107
|
+
models,
|
|
108
|
+
preload: query._preload,
|
|
109
|
+
selection: new PreloaderSelection({
|
|
110
|
+
preloadSelects: query._preloadSelects,
|
|
111
|
+
preloadSelectsExtra: query._preloadSelectsExtra,
|
|
112
|
+
force
|
|
113
|
+
})
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
await preloader.run()
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Runs constructor.
|
|
121
|
+
* @param {object} args - Options object.
|
|
122
|
+
* @param {typeof import("../record/index.js").default} args.modelClass - Model class.
|
|
123
|
+
* @param {import("../record/index.js").default[]} args.models - Model instances.
|
|
124
|
+
* @param {import("../query/index.js").NestedPreloadRecord} args.preload - Preload.
|
|
125
|
+
* @param {Record<string, string[]>} [args.preloadSelects] - Narrowing selects keyed by target model name.
|
|
126
|
+
* @param {Record<string, string[]>} [args.preloadSelectsExtra] - Extra selects keyed by target model name.
|
|
127
|
+
* @param {PreloaderSelection} [args.selection] - Pre-built selection (takes precedence over the select maps when given).
|
|
128
|
+
*/
|
|
129
|
+
constructor({modelClass, models, preload, preloadSelects = {}, preloadSelectsExtra = {}, selection, ...restArgs}) {
|
|
130
|
+
restArgsError(restArgs)
|
|
131
|
+
|
|
132
|
+
this.modelClass = modelClass
|
|
133
|
+
this.models = models
|
|
134
|
+
this.preload = preload
|
|
135
|
+
this.selection = selection || new PreloaderSelection({preloadSelects, preloadSelectsExtra})
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async run() {
|
|
139
|
+
for (const preloadRelationshipName in this.preload) {
|
|
140
|
+
const relationship = this.modelClass.getRelationshipByName(preloadRelationshipName)
|
|
141
|
+
let preloadResult
|
|
142
|
+
|
|
143
|
+
if (relationship.getType() == "belongsTo") {
|
|
144
|
+
const belongsToRelationship = /**
|
|
145
|
+
* Narrows the runtime value to the documented type.
|
|
146
|
+
@type {import("../record/relationships/belongs-to.js").default} */ (relationship)
|
|
147
|
+
const hasManyPreloader = new BelongsToPreloader({models: this.models, relationship: belongsToRelationship, selection: this.selection})
|
|
148
|
+
|
|
149
|
+
preloadResult = await hasManyPreloader.run()
|
|
150
|
+
} else if (relationship.getType() == "hasMany") {
|
|
151
|
+
const hasManyRelationship = /**
|
|
152
|
+
* Narrows the runtime value to the documented type.
|
|
153
|
+
@type {import("../record/relationships/has-many.js").default} */ (relationship)
|
|
154
|
+
const hasManyPreloader = new HasManyPreloader({models: this.models, relationship: hasManyRelationship, selection: this.selection})
|
|
155
|
+
|
|
156
|
+
preloadResult = await hasManyPreloader.run()
|
|
157
|
+
} else if (relationship.getType() == "hasOne") {
|
|
158
|
+
const hasOneRelationship = /**
|
|
159
|
+
* Narrows the runtime value to the documented type.
|
|
160
|
+
@type {import("../record/relationships/has-one.js").default} */ (relationship)
|
|
161
|
+
const hasOnePreloader = new HasOnePreloader({models: this.models, relationship: hasOneRelationship, selection: this.selection})
|
|
162
|
+
|
|
163
|
+
preloadResult = await hasOnePreloader.run()
|
|
164
|
+
} else {
|
|
165
|
+
throw new Error(`Unknown relationship type: ${relationship.getType()}`)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const targetModels = Array.isArray(preloadResult) ? preloadResult : (preloadResult?.targetModels || [])
|
|
169
|
+
const targetModelsByClassName = Array.isArray(preloadResult) ? undefined : preloadResult?.targetModelsByClassName
|
|
170
|
+
|
|
171
|
+
// Handle any further preloads in the tree
|
|
172
|
+
const newPreload = this.preload[preloadRelationshipName]
|
|
173
|
+
const normalizedPreload = normalizeNestedPreload(newPreload)
|
|
174
|
+
|
|
175
|
+
if (normalizedPreload && targetModels.length > 0) {
|
|
176
|
+
if (relationship.getPolymorphic() && targetModelsByClassName) {
|
|
177
|
+
const configuration = relationship.getConfiguration()
|
|
178
|
+
|
|
179
|
+
for (const className in targetModelsByClassName) {
|
|
180
|
+
const models = targetModelsByClassName[className]
|
|
181
|
+
|
|
182
|
+
if (models.length == 0) continue
|
|
183
|
+
|
|
184
|
+
const targetModelClass = configuration.getModelClass(className)
|
|
185
|
+
const preloader = new VelociousDatabaseQueryPreloader({modelClass: targetModelClass, models, preload: normalizedPreload, selection: this.selection})
|
|
186
|
+
|
|
187
|
+
await preloader.run()
|
|
188
|
+
}
|
|
189
|
+
} else {
|
|
190
|
+
const targetModelClass = relationship.getTargetModelClass()
|
|
191
|
+
|
|
192
|
+
if (!targetModelClass) throw new Error("No target model class could be gotten from relationship")
|
|
193
|
+
|
|
194
|
+
const preloader = new VelociousDatabaseQueryPreloader({modelClass: targetModelClass, models: targetModels, preload: normalizedPreload, selection: this.selection})
|
|
195
|
+
|
|
196
|
+
await preloader.run()
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import {isPlainObject} from "is-plain-object"
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* QueryDataEntry type.
|
|
7
|
+
* @typedef {object} QueryDataEntry
|
|
8
|
+
* @property {string[]} chain - Relationship chain from the root model to the model that declares the fn. Empty for a root-level entry.
|
|
9
|
+
* @property {string} fnName - Identifier under which the fn is registered on the declaring model.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Defines this typedef.
|
|
14
|
+
* @typedef {string | Array<string | Record<string, ?>> | {[key: string]: true | false | string | string[] | Record<string, ?>}} QueryDataSpec
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* QueryDataCallbackArgs type.
|
|
19
|
+
* @typedef {object} QueryDataCallbackArgs
|
|
20
|
+
* @property {string} attributeName - Name under which the fn was registered. Convenient when a fn is reused across aliases.
|
|
21
|
+
* @property {import("../drivers/base.js").default} driver - Active database driver, for quoting helpers and type-specific SQL.
|
|
22
|
+
* @property {typeof import("../record/index.js").default} modelClass - Model class the fn is registered on (the chain's target).
|
|
23
|
+
* @property {Array<string | number>} parentIds - Primary-key values of the loaded root records.
|
|
24
|
+
* @property {import("./model-class-query.js").default} query - Grouped query already joined down the chain, filtered by `parentIds`, with `parent_id` pre-selected.
|
|
25
|
+
* @property {string} tableName - Unquoted table reference (alias or table name) for the chain's target, ready to paste into SQL.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* QueryDataFn type.
|
|
30
|
+
* @typedef {(args: QueryDataCallbackArgs) => void | import("./model-class-query.js").default} QueryDataFn
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Normalize a user-supplied queryData spec into a flat list of entries
|
|
35
|
+
* the runner can consume. The spec mirrors the shape of `preload`, with
|
|
36
|
+
* the important distinction that **leaf strings are fn names**, not
|
|
37
|
+
* further relationship segments. Nested keys are relationship names
|
|
38
|
+
* along the join chain from the root model to the declaring model.
|
|
39
|
+
*
|
|
40
|
+
* Accepted shapes (all yield the same flat entries):
|
|
41
|
+
* "foo" → [{chain: [], fnName: "foo"}]
|
|
42
|
+
* ["foo", "bar"] → [{chain: [], fnName: "foo"}, {chain: [], fnName: "bar"}]
|
|
43
|
+
* {foo: true} → [{chain: [], fnName: "foo"}]
|
|
44
|
+
* {projects: ["tasksCount"]} → [{chain: ["projects"], fnName: "tasksCount"}]
|
|
45
|
+
* {projects: {tasks: ["transportSecondsSum", {timelogs: ["timeSecondsSum"]}]}}
|
|
46
|
+
* → [{chain: ["projects","tasks"], fnName: "transportSecondsSum"},
|
|
47
|
+
* {chain: ["projects","tasks","timelogs"], fnName: "timeSecondsSum"}]
|
|
48
|
+
* @param {QueryDataSpec} spec - User-supplied spec.
|
|
49
|
+
* @param {string[]} [chain] - Current chain (internal recursion).
|
|
50
|
+
* @returns {QueryDataEntry[]} - Flat list of entries.
|
|
51
|
+
*/
|
|
52
|
+
export function normalizeQueryDataSpec(spec, chain = []) {
|
|
53
|
+
if (spec == null) return []
|
|
54
|
+
|
|
55
|
+
if (typeof spec === "string") {
|
|
56
|
+
return [{chain: [...chain], fnName: spec}]
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (Array.isArray(spec)) {
|
|
60
|
+
/**
|
|
61
|
+
* Entries.
|
|
62
|
+
@type {QueryDataEntry[]} */
|
|
63
|
+
const entries = []
|
|
64
|
+
|
|
65
|
+
for (const item of spec) {
|
|
66
|
+
if (typeof item === "string") {
|
|
67
|
+
entries.push({chain: [...chain], fnName: item})
|
|
68
|
+
continue
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (isPlainObject(item)) {
|
|
72
|
+
for (const nested of normalizeQueryDataSpec(/**
|
|
73
|
+
* Narrows the runtime value to the documented type.
|
|
74
|
+
@type {?} */ (item), chain)) {
|
|
75
|
+
entries.push(nested)
|
|
76
|
+
}
|
|
77
|
+
continue
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
throw new Error(`Invalid queryData array entry: ${typeof item}`)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return entries
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (isPlainObject(spec)) {
|
|
87
|
+
/**
|
|
88
|
+
* Entries.
|
|
89
|
+
@type {QueryDataEntry[]} */
|
|
90
|
+
const entries = []
|
|
91
|
+
|
|
92
|
+
for (const [key, value] of Object.entries(spec)) {
|
|
93
|
+
if (value === true) {
|
|
94
|
+
entries.push({chain: [...chain], fnName: key})
|
|
95
|
+
continue
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (value === false) continue
|
|
99
|
+
|
|
100
|
+
if (typeof value === "string" || Array.isArray(value) || isPlainObject(value)) {
|
|
101
|
+
for (const nested of normalizeQueryDataSpec(/**
|
|
102
|
+
* Narrows the runtime value to the documented type.
|
|
103
|
+
@type {?} */ (value), [...chain, key])) {
|
|
104
|
+
entries.push(nested)
|
|
105
|
+
}
|
|
106
|
+
continue
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
throw new Error(`Invalid queryData value for "${key}": ${typeof value}`)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return entries
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
throw new Error(`Invalid queryData spec: ${typeof spec}`)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Build the nested `joins(...)` descriptor for a chain of relationship names.
|
|
120
|
+
* `["projects", "tasks"]` → `{projects: {tasks: true}}`. Used internally so
|
|
121
|
+
* the runner can reuse the existing `joins` path-registration machinery
|
|
122
|
+
* (JoinTracker, alias generation, scope application).
|
|
123
|
+
* @param {string[]} chain - Relationship chain.
|
|
124
|
+
* @returns {true | Record<string, ?>} - Nested join descriptor, or `true` when the chain is empty.
|
|
125
|
+
*/
|
|
126
|
+
function buildNestedJoinDescriptor(chain) {
|
|
127
|
+
if (chain.length === 0) return true
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Obj.
|
|
131
|
+
@type {Record<string, ?>} */
|
|
132
|
+
const obj = {}
|
|
133
|
+
let cursor = obj
|
|
134
|
+
|
|
135
|
+
for (let i = 0; i < chain.length; i += 1) {
|
|
136
|
+
const seg = chain[i]
|
|
137
|
+
const isLast = i === chain.length - 1
|
|
138
|
+
|
|
139
|
+
cursor[seg] = isLast ? true : {}
|
|
140
|
+
|
|
141
|
+
if (!isLast) cursor = cursor[seg]
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return obj
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Walk a relationship chain from the root model and return the model
|
|
149
|
+
* class at its tail. Throws with a clear message when any segment is
|
|
150
|
+
* unknown.
|
|
151
|
+
* @param {typeof import("../record/index.js").default} rootModelClass - Root model class.
|
|
152
|
+
* @param {string[]} chain - Relationship chain.
|
|
153
|
+
* @returns {typeof import("../record/index.js").default} - Target model class.
|
|
154
|
+
*/
|
|
155
|
+
function resolveTargetModelClass(rootModelClass, chain) {
|
|
156
|
+
let modelClass = rootModelClass
|
|
157
|
+
|
|
158
|
+
for (const segment of chain) {
|
|
159
|
+
const relationship = modelClass.getRelationshipByName(segment)
|
|
160
|
+
const target = relationship.getTargetModelClass()
|
|
161
|
+
|
|
162
|
+
if (!target) {
|
|
163
|
+
throw new Error(`queryData: could not resolve target model for ${modelClass.name}#${segment}`)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
modelClass = target
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return modelClass
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Run every queryData entry against the loaded root records, attaching
|
|
174
|
+
* the resulting values as queryData entries on each root record.
|
|
175
|
+
*
|
|
176
|
+
* One grouped query per entry: the runner builds a fresh query over the
|
|
177
|
+
* root model, joins down the chain, groups by the root table's primary
|
|
178
|
+
* key, and invokes the registered fn to add its own SELECT (and any
|
|
179
|
+
* additional joins/where). Results are mapped back to root models by
|
|
180
|
+
* primary key and attached via `_setQueryData(name, value)` for every
|
|
181
|
+
* selected alias (except the reserved `parent_id`). Rows missing from
|
|
182
|
+
* the result keep `null` — matches the feature's documented default.
|
|
183
|
+
*
|
|
184
|
+
* Mirrors the shape of `runWithCount`: one query per entry, a separate
|
|
185
|
+
* storage map on the record, never touches `_attributes`.
|
|
186
|
+
* @param {object} args - Options.
|
|
187
|
+
* @param {typeof import("../record/index.js").default} args.rootModelClass - Root model class.
|
|
188
|
+
* @param {import("../record/index.js").default[]} args.rootModels - Loaded root records.
|
|
189
|
+
* @param {QueryDataEntry[]} args.entries - Normalized queryData entries.
|
|
190
|
+
* @returns {Promise<void>}
|
|
191
|
+
*/
|
|
192
|
+
export async function runQueryData({rootModelClass, rootModels, entries}) {
|
|
193
|
+
if (rootModels.length === 0 || entries.length === 0) return
|
|
194
|
+
|
|
195
|
+
const primaryKey = rootModelClass.primaryKey()
|
|
196
|
+
const rootIds = rootModels.map((model) => /**
|
|
197
|
+
* Narrows the runtime value to the documented type.
|
|
198
|
+
@type {string | number} */ (model.readColumn(primaryKey)))
|
|
199
|
+
|
|
200
|
+
for (const entry of entries) {
|
|
201
|
+
await runEntry({entry, primaryKey, rootIds, rootModelClass, rootModels})
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Runs run entry.
|
|
207
|
+
* @param {object} args - Options.
|
|
208
|
+
* @param {QueryDataEntry} args.entry - Entry being evaluated.
|
|
209
|
+
* @param {string} args.primaryKey - Root model primary key column.
|
|
210
|
+
* @param {Array<string | number>} args.rootIds - Root primary-key values.
|
|
211
|
+
* @param {typeof import("../record/index.js").default} args.rootModelClass - Root model class.
|
|
212
|
+
* @param {import("../record/index.js").default[]} args.rootModels - Loaded root records.
|
|
213
|
+
* @returns {Promise<void>}
|
|
214
|
+
*/
|
|
215
|
+
async function runEntry({entry, primaryKey, rootIds, rootModelClass, rootModels}) {
|
|
216
|
+
const targetModelClass = resolveTargetModelClass(rootModelClass, entry.chain)
|
|
217
|
+
const fn = targetModelClass.getQueryDataByName(entry.fnName)
|
|
218
|
+
|
|
219
|
+
if (!fn) {
|
|
220
|
+
throw new Error(`queryData: ${targetModelClass.name} has no entry registered as ${JSON.stringify(entry.fnName)}. ` +
|
|
221
|
+
`Declare it with ${targetModelClass.name}.queryData(${JSON.stringify(entry.fnName)}, ({query, tableName}) => query.select(...))`)
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const query = rootModelClass._newQuery()
|
|
225
|
+
|
|
226
|
+
// Empty out any defaults the query factory added — queryData runs
|
|
227
|
+
// a bare aggregate, not a full model load.
|
|
228
|
+
query._selects = []
|
|
229
|
+
query._preload = {}
|
|
230
|
+
|
|
231
|
+
// Force the root WHERE to qualify by table name so it survives the
|
|
232
|
+
// joins the fn may add later (otherwise a child table sharing the
|
|
233
|
+
// root PK column name, e.g. `id`, makes the clause ambiguous).
|
|
234
|
+
query._forceQualifyBaseTable = true
|
|
235
|
+
|
|
236
|
+
const driver = query.driver
|
|
237
|
+
const rootTable = rootModelClass.tableName()
|
|
238
|
+
const rootPkSql = `${driver.quoteTable(rootTable)}.${driver.quoteColumn(primaryKey)}`
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Root where.
|
|
242
|
+
@type {Record<string, ?>} */
|
|
243
|
+
const rootWhere = {}
|
|
244
|
+
rootWhere[primaryKey] = rootIds
|
|
245
|
+
query.where(rootWhere)
|
|
246
|
+
|
|
247
|
+
const joinDescriptor = buildNestedJoinDescriptor(entry.chain)
|
|
248
|
+
|
|
249
|
+
if (joinDescriptor !== true) {
|
|
250
|
+
query.joins(joinDescriptor)
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
query.group(rootPkSql)
|
|
254
|
+
query.select(`${rootPkSql} AS parent_id`)
|
|
255
|
+
|
|
256
|
+
const targetTableRef = entry.chain.length === 0
|
|
257
|
+
? rootTable
|
|
258
|
+
: query.getTableReferenceForJoin(...entry.chain)
|
|
259
|
+
|
|
260
|
+
// NB: we intentionally leave `_joinBasePath` at [] so the outer chain
|
|
261
|
+
// joins continue to resolve from the root model at render time. The
|
|
262
|
+
// fn gets `tableName` for self-reference; additional joins from
|
|
263
|
+
// nested levels should use full paths from the root.
|
|
264
|
+
fn({
|
|
265
|
+
attributeName: entry.fnName,
|
|
266
|
+
driver,
|
|
267
|
+
modelClass: targetModelClass,
|
|
268
|
+
parentIds: rootIds,
|
|
269
|
+
query,
|
|
270
|
+
tableName: targetTableRef
|
|
271
|
+
})
|
|
272
|
+
|
|
273
|
+
const rows = /**
|
|
274
|
+
* Narrows the runtime value to the documented type.
|
|
275
|
+
@type {Array<Record<string, ?>>} */ (await query._executeQuery())
|
|
276
|
+
const byParent = new Map()
|
|
277
|
+
|
|
278
|
+
for (const row of rows) {
|
|
279
|
+
const parentId = row.parent_id
|
|
280
|
+
|
|
281
|
+
if (parentId == null) continue
|
|
282
|
+
|
|
283
|
+
byParent.set(parentId, row)
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
for (const model of rootModels) {
|
|
287
|
+
const modelId = /**
|
|
288
|
+
* Narrows the runtime value to the documented type.
|
|
289
|
+
@type {string | number} */ (model.readColumn(primaryKey))
|
|
290
|
+
// Driver-type tolerance: MySQL can return PKs as strings even when
|
|
291
|
+
// the column is numeric. Fall back to a string lookup so results
|
|
292
|
+
// still land on the right model.
|
|
293
|
+
const row = byParent.has(modelId)
|
|
294
|
+
? byParent.get(modelId)
|
|
295
|
+
: byParent.get(String(modelId))
|
|
296
|
+
|
|
297
|
+
if (!row) continue
|
|
298
|
+
|
|
299
|
+
for (const [columnName, value] of Object.entries(row)) {
|
|
300
|
+
if (columnName === "parent_id") continue
|
|
301
|
+
|
|
302
|
+
model._setQueryData(columnName, value)
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
export default class VelociousDatabaseQuerySelectBase {
|
|
4
|
+
/**
|
|
5
|
+
* Runs get options.
|
|
6
|
+
* @returns {import("../query-parser/options.js").default} - The options options.
|
|
7
|
+
*/
|
|
8
|
+
getOptions() {
|
|
9
|
+
if (!this.query) throw new Error("'query' hasn't been set")
|
|
10
|
+
|
|
11
|
+
return this.query.driver.options()
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Runs set query.
|
|
16
|
+
* @param {import("./index.js").default} query - Query instance.
|
|
17
|
+
*/
|
|
18
|
+
setQuery(query) {
|
|
19
|
+
this.query = query
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Runs to sql.
|
|
24
|
+
* @abstract
|
|
25
|
+
* @returns {string} - SQL string.
|
|
26
|
+
*/
|
|
27
|
+
toSql() {
|
|
28
|
+
throw new Error("'toSql' wasn't implemented")
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import SelectBase from "./select-base.js"
|
|
4
|
+
|
|
5
|
+
export default class VelociousDatabaseQuerySelectPlain extends SelectBase {
|
|
6
|
+
/**
|
|
7
|
+
* Runs constructor.
|
|
8
|
+
* @param {string} plain - Plain.
|
|
9
|
+
*/
|
|
10
|
+
constructor(plain) {
|
|
11
|
+
super()
|
|
12
|
+
this.plain = plain
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
toSql() {
|
|
16
|
+
return this.plain
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import SelectBase from "./select-base.js"
|
|
4
|
+
|
|
5
|
+
export default class VelociousDatabaseQuerySelectTableAndColumn extends SelectBase {
|
|
6
|
+
/**
|
|
7
|
+
* Runs constructor.
|
|
8
|
+
* @param {string} tableName - Table name.
|
|
9
|
+
* @param {string} columnName - Column name.
|
|
10
|
+
*/
|
|
11
|
+
constructor(tableName, columnName) {
|
|
12
|
+
super()
|
|
13
|
+
this.columnName = columnName
|
|
14
|
+
this.tableName = tableName
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
getColumnName() {
|
|
18
|
+
return this.columnName
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
getTableName() {
|
|
22
|
+
return this.tableName
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
toSql() {
|
|
26
|
+
return `${this.getOptions().quoteTableName(this.tableName)}.${this.getOptions().quoteColumnName(this.columnName)}`
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
export default class VelociousDatabaseQueryUpdateBase {
|
|
4
|
+
/**
|
|
5
|
+
* Runs constructor.
|
|
6
|
+
* @param {object} args - Options object.
|
|
7
|
+
* @param {Record<string, ?>} args.conditions - Conditions.
|
|
8
|
+
* @param {Record<string, ?>} args.data - Data payload.
|
|
9
|
+
* @param {import("../drivers/base.js").default} args.driver - Database driver instance.
|
|
10
|
+
* @param {string} args.tableName - Table name.
|
|
11
|
+
*/
|
|
12
|
+
constructor({conditions, data, driver, tableName}) {
|
|
13
|
+
this.conditions = conditions
|
|
14
|
+
this.data = data
|
|
15
|
+
this.driver = driver
|
|
16
|
+
this.tableName = tableName
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Runs get options.
|
|
21
|
+
* @returns {import("../query-parser/options.js").default} - The options options.
|
|
22
|
+
*/
|
|
23
|
+
getOptions() {
|
|
24
|
+
return this.driver.options()
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Runs format value.
|
|
29
|
+
* @param {?} value - Value to format.
|
|
30
|
+
* @returns {string | number} - SQL literal.
|
|
31
|
+
*/
|
|
32
|
+
formatValue(value) {
|
|
33
|
+
if (value === null) return "NULL"
|
|
34
|
+
|
|
35
|
+
return this.getOptions().quote(value)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
toSql() {
|
|
39
|
+
throw new Error("'toSql' wasn't implemented")
|
|
40
|
+
}
|
|
41
|
+
}
|