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,337 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import ejs from "ejs"
|
|
4
|
+
import {incorporate} from "incorporator"
|
|
5
|
+
import * as inflection from "inflection"
|
|
6
|
+
import configurationResolver from "../configuration-resolver.js"
|
|
7
|
+
import restArgsError from "../utils/rest-args-error.js"
|
|
8
|
+
import MailerDelivery from "./delivery.js"
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Deliveries store.
|
|
12
|
+
@type {import("./index.js").MailerDeliveryPayload[]} */
|
|
13
|
+
const deliveriesStore = []
|
|
14
|
+
/**
|
|
15
|
+
* Delivery handler.
|
|
16
|
+
@type {((payload: import("./index.js").MailerDeliveryPayload) => Promise<?> | ?) | null} */
|
|
17
|
+
let deliveryHandler = null
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Runs view file name.
|
|
21
|
+
* @param {string} actionName - Mailer action name.
|
|
22
|
+
* @returns {string} - View file name.
|
|
23
|
+
*/
|
|
24
|
+
function viewFileName(actionName) {
|
|
25
|
+
return inflection.dasherize(inflection.underscore(actionName))
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Runs mailer directory name.
|
|
30
|
+
* @param {string} className - Mailer class name.
|
|
31
|
+
* @returns {string} - Mailer directory name.
|
|
32
|
+
*/
|
|
33
|
+
function mailerDirectoryName(className) {
|
|
34
|
+
const baseName = className.replace(/Mailer$/, "")
|
|
35
|
+
|
|
36
|
+
return inflection.dasherize(inflection.underscore(baseName))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Runs the inferActionName helper.
|
|
41
|
+
* @param {typeof VelociousMailerBase} mailerClass - Mailer class.
|
|
42
|
+
* @param {string} stack - Error stack.
|
|
43
|
+
* @returns {string | null} - Inferred action name.
|
|
44
|
+
*/
|
|
45
|
+
// fallow-ignore-next-line complexity
|
|
46
|
+
function inferActionName(mailerClass, stack) {
|
|
47
|
+
const prototype = mailerClass.prototype
|
|
48
|
+
let actionName = null
|
|
49
|
+
|
|
50
|
+
for (const line of stack.split("\n")) {
|
|
51
|
+
const match = line.match(/\bat (?:async )?(?:new )?[^\s.]+\.([^\s.]+) /)
|
|
52
|
+
|
|
53
|
+
if (!match) continue
|
|
54
|
+
|
|
55
|
+
const frameActionName = match[1]
|
|
56
|
+
|
|
57
|
+
if (frameActionName === "mail") continue
|
|
58
|
+
if (frameActionName.startsWith("_")) continue
|
|
59
|
+
if (frameActionName === "constructor") continue
|
|
60
|
+
if (Object.prototype.hasOwnProperty.call(VelociousMailerBase.prototype, frameActionName)) continue
|
|
61
|
+
if (typeof /**
|
|
62
|
+
* Narrows the runtime value to the documented type.
|
|
63
|
+
@type {Record<string, ?>} */ (/**
|
|
64
|
+
* Narrows the runtime value to the documented type.
|
|
65
|
+
@type {?} */ (prototype))[frameActionName] !== "function") continue
|
|
66
|
+
|
|
67
|
+
actionName = frameActionName
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return actionName
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Runs is testing environment.
|
|
75
|
+
* @returns {Promise<boolean>} - Whether the current environment is test.
|
|
76
|
+
*/
|
|
77
|
+
async function isTestingEnvironment() {
|
|
78
|
+
const configuration = await configurationResolver()
|
|
79
|
+
|
|
80
|
+
return configuration.getEnvironment() === "test"
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Base mailer with view rendering and delivery helpers.
|
|
85
|
+
*/
|
|
86
|
+
export class VelociousMailerBase {
|
|
87
|
+
/**
|
|
88
|
+
* Runs constructor.
|
|
89
|
+
* @param {object} [args] - Constructor args.
|
|
90
|
+
* @param {import("../configuration.js").default} [args.configuration] - Configuration instance.
|
|
91
|
+
*/
|
|
92
|
+
constructor({configuration} = {}) {
|
|
93
|
+
this._actionName = null
|
|
94
|
+
this._mailOptions = null
|
|
95
|
+
this._viewParams = {}
|
|
96
|
+
this._configurationPromise = configuration ? Promise.resolve(configuration) : configurationResolver()
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Runs assign view.
|
|
101
|
+
* @param {Record<string, ?>} params - View params.
|
|
102
|
+
* @returns {void} - No return value.
|
|
103
|
+
*/
|
|
104
|
+
assignView(params) {
|
|
105
|
+
this._viewParams = Object.assign(this._viewParams, params || {})
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Runs mail.
|
|
110
|
+
* @param {object} args - Mail options.
|
|
111
|
+
* @param {?} args.to - Recipient.
|
|
112
|
+
* @param {string} args.subject - Subject line.
|
|
113
|
+
* @param {?} [args.from] - Sender.
|
|
114
|
+
* @param {?} [args.cc] - CC recipients.
|
|
115
|
+
* @param {?} [args.bcc] - BCC recipients.
|
|
116
|
+
* @param {?} [args.replyTo] - Reply-to address.
|
|
117
|
+
* @param {Record<string, string>} [args.headers] - Custom headers.
|
|
118
|
+
* @param {string} [args.actionName] - Mailer action name.
|
|
119
|
+
* @param {Promise<?> | ?} [args.actionPromise] - Action completion promise.
|
|
120
|
+
* @returns {MailerDelivery} - Delivery wrapper.
|
|
121
|
+
*/
|
|
122
|
+
mail({to, subject, from, cc, bcc, replyTo, headers, actionName, actionPromise, ...restArgs}) {
|
|
123
|
+
restArgsError(restArgs)
|
|
124
|
+
|
|
125
|
+
const resolvedActionName = actionName || inferActionName(/**
|
|
126
|
+
* Narrows the runtime value to the documented type.
|
|
127
|
+
@type {typeof VelociousMailerBase} */ (this.constructor), new Error().stack || "")
|
|
128
|
+
|
|
129
|
+
if (!resolvedActionName) {
|
|
130
|
+
throw new Error(`Missing actionName for ${this.constructor.name}.mail()`)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
this._actionName = resolvedActionName
|
|
134
|
+
this._mailOptions = {to, subject, from, cc, bcc, replyTo, headers}
|
|
135
|
+
const resolvedActionPromise = actionPromise === undefined ? Promise.resolve() : Promise.resolve(actionPromise)
|
|
136
|
+
|
|
137
|
+
return new MailerDelivery({
|
|
138
|
+
mailer: this,
|
|
139
|
+
actionPromise: resolvedActionPromise,
|
|
140
|
+
actionName: resolvedActionName
|
|
141
|
+
})
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Runs get configuration.
|
|
146
|
+
* @returns {Promise<import("../configuration.js").default>} - Configuration instance.
|
|
147
|
+
*/
|
|
148
|
+
async _getConfiguration() {
|
|
149
|
+
return await this._configurationPromise
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Runs get action name.
|
|
154
|
+
* @returns {string} - Action name.
|
|
155
|
+
*/
|
|
156
|
+
_getActionName() {
|
|
157
|
+
if (!this._actionName) {
|
|
158
|
+
throw new Error(`No mailer action set on ${this.constructor.name}`)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return this._actionName
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Runs build payload sync.
|
|
166
|
+
* @param {string} html - Rendered HTML.
|
|
167
|
+
* @returns {import("./index.js").MailerDeliveryPayload} - Delivery payload.
|
|
168
|
+
*/
|
|
169
|
+
_buildPayloadSync(html) {
|
|
170
|
+
const mailOptions = this._mailOptions
|
|
171
|
+
|
|
172
|
+
if (!mailOptions) {
|
|
173
|
+
throw new Error(`Missing mail() options for ${this.constructor.name}#${this._getActionName()}. Got: ${String(mailOptions)}`)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (!mailOptions.to) {
|
|
177
|
+
throw new Error(`Missing "to" for ${this.constructor.name}#${this._getActionName()}. Got: ${String(mailOptions.to)}`)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (!mailOptions.subject) {
|
|
181
|
+
throw new Error(`Missing "subject" for ${this.constructor.name}#${this._getActionName()}. Got: ${String(mailOptions.subject)}`)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return {
|
|
185
|
+
to: mailOptions.to,
|
|
186
|
+
subject: mailOptions.subject,
|
|
187
|
+
from: mailOptions.from,
|
|
188
|
+
cc: mailOptions.cc,
|
|
189
|
+
bcc: mailOptions.bcc,
|
|
190
|
+
replyTo: mailOptions.replyTo,
|
|
191
|
+
headers: mailOptions.headers,
|
|
192
|
+
html,
|
|
193
|
+
mailer: this.constructor.name,
|
|
194
|
+
action: this._getActionName()
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Runs build payload.
|
|
200
|
+
* @returns {Promise<import("./index.js").MailerDeliveryPayload>} - Delivery payload.
|
|
201
|
+
*/
|
|
202
|
+
async _buildPayload() {
|
|
203
|
+
const html = await this._renderView()
|
|
204
|
+
|
|
205
|
+
return this._buildPayloadSync(html)
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Runs render view.
|
|
210
|
+
* @returns {Promise<string>} - Rendered HTML.
|
|
211
|
+
*/
|
|
212
|
+
async _renderView() {
|
|
213
|
+
const configuration = await this._getConfiguration()
|
|
214
|
+
const mailerDir = mailerDirectoryName(this.constructor.name)
|
|
215
|
+
const actionName = this._getActionName()
|
|
216
|
+
const fileName = viewFileName(actionName)
|
|
217
|
+
const viewPath = `${configuration.getDirectory()}/src/mailers/${mailerDir}/${fileName}.ejs`
|
|
218
|
+
const translate = (/**
|
|
219
|
+
* Narrows the runtime value to the documented type.
|
|
220
|
+
@type {string} */ msgID, /**
|
|
221
|
+
* Narrows the runtime value to the documented type.
|
|
222
|
+
@type {Record<string, ?> | undefined} */ args) => configuration.getTranslator()(msgID, args)
|
|
223
|
+
const viewParams = incorporate({mailer: this, _: translate}, this._viewParams)
|
|
224
|
+
|
|
225
|
+
return await new Promise((resolve, reject) => {
|
|
226
|
+
ejs.renderFile(viewPath, viewParams, {}, (err, str) => {
|
|
227
|
+
if (err) {
|
|
228
|
+
const errorCode = /**
|
|
229
|
+
* Narrows the runtime value to the documented type.
|
|
230
|
+
@type {{code?: string}} */ (err).code
|
|
231
|
+
|
|
232
|
+
if (errorCode === "ENOENT") {
|
|
233
|
+
reject(new Error(`Missing mailer view file: ${viewPath}`))
|
|
234
|
+
} else {
|
|
235
|
+
reject(err)
|
|
236
|
+
}
|
|
237
|
+
} else {
|
|
238
|
+
resolve(str)
|
|
239
|
+
}
|
|
240
|
+
})
|
|
241
|
+
})
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Runs deliver payload.
|
|
246
|
+
* @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
|
|
247
|
+
* @returns {Promise<import("./index.js").MailerDeliveryPayload | ?>} - Handler result.
|
|
248
|
+
*/
|
|
249
|
+
async _deliverPayload(payload) {
|
|
250
|
+
return await deliverPayload(payload)
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Runs enqueue payload.
|
|
255
|
+
* @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
|
|
256
|
+
* @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
|
|
257
|
+
*/
|
|
258
|
+
async _enqueuePayload(payload) {
|
|
259
|
+
return await enqueuePayload(payload)
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Runs the deliveries helper.
|
|
265
|
+
* @returns {import("./index.js").MailerDeliveryPayload[]} - Delivered payloads.
|
|
266
|
+
*/
|
|
267
|
+
export function deliveries() {
|
|
268
|
+
return deliveriesStore.slice()
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Runs the clearDeliveries helper.
|
|
273
|
+
* @returns {void} - No return value.
|
|
274
|
+
*/
|
|
275
|
+
export function clearDeliveries() {
|
|
276
|
+
deliveriesStore.length = 0
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Runs the setDeliveryHandler helper.
|
|
281
|
+
* @param {(payload: import("./index.js").MailerDeliveryPayload) => Promise<?> | ?} handler - Delivery handler.
|
|
282
|
+
* @returns {void} - No return value.
|
|
283
|
+
*/
|
|
284
|
+
export function setDeliveryHandler(handler) {
|
|
285
|
+
deliveryHandler = handler
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Runs the getDeliveryHandler helper.
|
|
290
|
+
* @returns {((payload: import("./index.js").MailerDeliveryPayload) => Promise<?> | ?) | null} - Handler or null.
|
|
291
|
+
*/
|
|
292
|
+
export function getDeliveryHandler() {
|
|
293
|
+
return deliveryHandler
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Runs the deliverPayload helper.
|
|
298
|
+
* @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
|
|
299
|
+
* @returns {Promise<import("./index.js").MailerDeliveryPayload | ?>} - Handler result.
|
|
300
|
+
*/
|
|
301
|
+
export async function deliverPayload(payload) {
|
|
302
|
+
if (await isTestingEnvironment()) {
|
|
303
|
+
deliveriesStore.push(payload)
|
|
304
|
+
return payload
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const configuration = await configurationResolver()
|
|
308
|
+
const backend = configuration.getMailerBackend()
|
|
309
|
+
|
|
310
|
+
if (backend?.deliver) {
|
|
311
|
+
return await backend.deliver({payload, configuration})
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
const handler = deliveryHandler
|
|
315
|
+
|
|
316
|
+
if (!handler) {
|
|
317
|
+
throw new Error(`No mail delivery handler configured for "${payload.subject}" to "${payload.to}"`)
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
return await handler(payload)
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Runs the enqueuePayload helper.
|
|
325
|
+
* @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
|
|
326
|
+
* @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
|
|
327
|
+
*/
|
|
328
|
+
export async function enqueuePayload(payload) {
|
|
329
|
+
if (await isTestingEnvironment()) {
|
|
330
|
+
deliveriesStore.push(payload)
|
|
331
|
+
return payload
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
const {default: mailDeliveryJob} = await import("../jobs/mail-delivery.js")
|
|
335
|
+
|
|
336
|
+
return await mailDeliveryJob.performLater(payload)
|
|
337
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Represents a prepared mail delivery.
|
|
5
|
+
*/
|
|
6
|
+
export default class MailerDelivery {
|
|
7
|
+
/**
|
|
8
|
+
* Narrows the runtime value to the documented type.
|
|
9
|
+
@type {import("./base.js").VelociousMailerBase} */
|
|
10
|
+
mailer
|
|
11
|
+
/**
|
|
12
|
+
* Narrows the runtime value to the documented type.
|
|
13
|
+
@type {Promise<?>} */
|
|
14
|
+
actionPromise
|
|
15
|
+
/**
|
|
16
|
+
* Narrows the runtime value to the documented type.
|
|
17
|
+
@type {string} */
|
|
18
|
+
actionName
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Runs constructor.
|
|
22
|
+
* @param {object} args - Constructor args.
|
|
23
|
+
* @param {import("./base.js").VelociousMailerBase} args.mailer - Mailer instance.
|
|
24
|
+
* @param {Promise<?>} args.actionPromise - Action promise.
|
|
25
|
+
* @param {string} args.actionName - Action name.
|
|
26
|
+
*/
|
|
27
|
+
constructor({mailer, actionPromise, actionName}) {
|
|
28
|
+
this.mailer = mailer
|
|
29
|
+
this.actionPromise = actionPromise
|
|
30
|
+
this.actionName = actionName
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Runs build payload.
|
|
35
|
+
* @returns {Promise<import("./index.js").MailerDeliveryPayload>} - Rendered mailer payload.
|
|
36
|
+
*/
|
|
37
|
+
async buildPayload() {
|
|
38
|
+
await this.actionPromise
|
|
39
|
+
|
|
40
|
+
return /** Narrows the runtime value to the documented type. @type {import("./index.js").MailerDeliveryPayload} */ (await this.mailer._buildPayload())
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Runs deliver now.
|
|
45
|
+
* @returns {Promise<import("./index.js").MailerDeliveryPayload | ?>} - Delivered payload or handler result.
|
|
46
|
+
*/
|
|
47
|
+
async deliverNow() {
|
|
48
|
+
const payload = await this.buildPayload()
|
|
49
|
+
|
|
50
|
+
return await this.mailer._deliverPayload(payload)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Runs deliver later.
|
|
55
|
+
* @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
|
|
56
|
+
*/
|
|
57
|
+
async deliverLater() {
|
|
58
|
+
const payload = await this.buildPayload()
|
|
59
|
+
|
|
60
|
+
return await this.mailer._enqueuePayload(payload)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Runs deliver laver.
|
|
65
|
+
* @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
|
|
66
|
+
*/
|
|
67
|
+
async deliverLaver() {
|
|
68
|
+
return await this.deliverLater()
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
/** @typedef {{to: ?, subject: string, from?: ?, cc?: ?, bcc?: ?, replyTo?: ?, headers?: Record<string, string>, html: string, mailer: string, action: string}} MailerDeliveryPayload */
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
clearDeliveries,
|
|
7
|
+
deliverPayload,
|
|
8
|
+
deliveries,
|
|
9
|
+
enqueuePayload,
|
|
10
|
+
getDeliveryHandler,
|
|
11
|
+
setDeliveryHandler,
|
|
12
|
+
VelociousMailerBase
|
|
13
|
+
} from "./base.js"
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
VelociousMailerBase,
|
|
17
|
+
clearDeliveries,
|
|
18
|
+
deliverPayload,
|
|
19
|
+
deliveries,
|
|
20
|
+
enqueuePayload,
|
|
21
|
+
getDeliveryHandler,
|
|
22
|
+
setDeliveryHandler
|
|
23
|
+
}
|
|
24
|
+
export default VelociousMailerBase
|
package/src/mailer.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
/** @typedef {{to: ?, subject: string, from?: ?, cc?: ?, bcc?: ?, replyTo?: ?, headers?: Record<string, string>, html: string, mailer: string, action: string}} MailerDeliveryPayload */
|
|
4
|
+
|
|
5
|
+
export {
|
|
6
|
+
VelociousMailerBase,
|
|
7
|
+
clearDeliveries,
|
|
8
|
+
deliverPayload,
|
|
9
|
+
deliveries,
|
|
10
|
+
enqueuePayload,
|
|
11
|
+
getDeliveryHandler,
|
|
12
|
+
setDeliveryHandler
|
|
13
|
+
} from "./mailer/index.js"
|
|
14
|
+
export {default as SmtpMailerBackend} from "./mailer/backends/smtp.js"
|
|
15
|
+
export {default} from "./mailer/index.js"
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import fs from "node:fs/promises"
|
|
2
|
+
import path from "node:path"
|
|
3
|
+
|
|
4
|
+
import Controller from "../controller.js"
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Runs valid asset file name.
|
|
8
|
+
* @param {?} assetFileName - Asset file name.
|
|
9
|
+
* @returns {boolean} - Whether asset file name is safe.
|
|
10
|
+
*/
|
|
11
|
+
function validAssetFileName(assetFileName) {
|
|
12
|
+
return typeof assetFileName === "string"
|
|
13
|
+
&& assetFileName.length > 0
|
|
14
|
+
&& !assetFileName.includes("/")
|
|
15
|
+
&& !assetFileName.includes("\\")
|
|
16
|
+
&& !assetFileName.includes("..")
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Runs normalize sql js asset file name.
|
|
21
|
+
* @param {string} assetFileName - Requested sql.js asset file name.
|
|
22
|
+
* @returns {string} - Normalized sql.js asset file name.
|
|
23
|
+
*/
|
|
24
|
+
function normalizeSqlJsAssetFileName(assetFileName) {
|
|
25
|
+
if (assetFileName === "sql-wasm-browser.wasm") {
|
|
26
|
+
return "sql-wasm.wasm"
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return assetFileName
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Serves sql.js assets from the backend for sqlite-web locateFile callbacks. */
|
|
33
|
+
export default class SqlJsWasmRouteController extends Controller {
|
|
34
|
+
/**
|
|
35
|
+
* Runs show.
|
|
36
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
37
|
+
*/
|
|
38
|
+
async show() {
|
|
39
|
+
const {sqlJsAssetFileName, sqlJsDistDirectory} = this.params()
|
|
40
|
+
|
|
41
|
+
if (!validAssetFileName(sqlJsAssetFileName)) {
|
|
42
|
+
throw new Error(`Invalid sql.js asset file name: ${String(sqlJsAssetFileName)}`)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (typeof sqlJsDistDirectory !== "string" || sqlJsDistDirectory.length < 1) {
|
|
46
|
+
throw new Error(`Expected sql.js dist directory path to be a string, got: ${String(sqlJsDistDirectory)}`)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const normalizedSqlJsAssetFileName = normalizeSqlJsAssetFileName(sqlJsAssetFileName)
|
|
50
|
+
const assetPath = path.join(sqlJsDistDirectory, normalizedSqlJsAssetFileName)
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
await fs.access(assetPath)
|
|
54
|
+
} catch (error) {
|
|
55
|
+
const ensuredError = /**
|
|
56
|
+
* Narrows the runtime value to the documented type.
|
|
57
|
+
@type {{code?: string}} */ (error)
|
|
58
|
+
|
|
59
|
+
if (ensuredError.code === "ENOENT") {
|
|
60
|
+
await this.render({json: {errorMessage: "Not found", status: "error"}, status: "not-found"})
|
|
61
|
+
return
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
throw error
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
this.response().setHeader("Cache-Control", "public, max-age=3600")
|
|
68
|
+
this.sendFile(assetPath)
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import {createRequire} from "node:module"
|
|
2
|
+
import path from "node:path"
|
|
3
|
+
import SqlJsWasmRouteController from "./sqljs-wasm-route-controller.js"
|
|
4
|
+
|
|
5
|
+
const require = createRequire(import.meta.url)
|
|
6
|
+
const sqlJsEntryPath = require.resolve("sql.js")
|
|
7
|
+
const sqlJsDistDirectory = path.dirname(sqlJsEntryPath)
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* InstallSqlJsWasmRouteArgs type.
|
|
11
|
+
* @typedef {object} InstallSqlJsWasmRouteArgs
|
|
12
|
+
* @property {import("../configuration.js").default} configuration - Velocious configuration instance.
|
|
13
|
+
* @property {string} [routePrefix] - Route prefix used for sql.js asset serving.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* SqlJsLocateFileFromBackendArgs type.
|
|
18
|
+
* @typedef {object} SqlJsLocateFileFromBackendArgs
|
|
19
|
+
* @property {string} backendBaseUrl - Backend base URL (for example `https://api.example.com`).
|
|
20
|
+
* @property {string} [routePrefix] - Route prefix used for sql.js asset serving.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Runs normalize route prefix.
|
|
25
|
+
* @param {string} routePrefix - Route prefix input.
|
|
26
|
+
* @returns {string} - Normalized route prefix.
|
|
27
|
+
*/
|
|
28
|
+
function normalizeRoutePrefix(routePrefix) {
|
|
29
|
+
if (!routePrefix.startsWith("/")) {
|
|
30
|
+
throw new Error(`Expected route prefix to start with '/', got: ${routePrefix}`)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (routePrefix.length > 1 && routePrefix.endsWith("/")) {
|
|
34
|
+
return routePrefix.slice(0, -1)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return routePrefix
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Installs a route-resolver hook that serves `sql.js/dist/*` files from the running Velocious backend.
|
|
42
|
+
* @param {InstallSqlJsWasmRouteArgs} args - Options object.
|
|
43
|
+
* @returns {void} - No return value.
|
|
44
|
+
*/
|
|
45
|
+
export default function installSqlJsWasmRoute(args) {
|
|
46
|
+
const {configuration, routePrefix = "/velocious/sqljs"} = args
|
|
47
|
+
|
|
48
|
+
if (!configuration) throw new Error("No configuration given")
|
|
49
|
+
|
|
50
|
+
const normalizedRoutePrefix = normalizeRoutePrefix(routePrefix)
|
|
51
|
+
|
|
52
|
+
configuration.routes((routes) => {
|
|
53
|
+
routes.get(`${normalizedRoutePrefix}/:sqlJsAssetFileName`, {
|
|
54
|
+
params: {sqlJsDistDirectory},
|
|
55
|
+
to: [SqlJsWasmRouteController, "show"]
|
|
56
|
+
})
|
|
57
|
+
})
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Creates a sqlite-web `locateFile(file)` callback pointing to a Velocious backend route.
|
|
62
|
+
* @param {SqlJsLocateFileFromBackendArgs} args - Options object.
|
|
63
|
+
* @returns {(file: string) => string} - sql.js locateFile callback.
|
|
64
|
+
*/
|
|
65
|
+
export function sqlJsLocateFileFromBackend(args) {
|
|
66
|
+
const {backendBaseUrl, routePrefix = "/velocious/sqljs"} = args
|
|
67
|
+
const normalizedRoutePrefix = normalizeRoutePrefix(routePrefix)
|
|
68
|
+
const baseUrl = backendBaseUrl.replace(/\/+$/, "")
|
|
69
|
+
|
|
70
|
+
return (file) => `${baseUrl}${normalizedRoutePrefix}/${encodeURIComponent(file)}`
|
|
71
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @typedef {{_associationCounts?: Map<string, number>, _computedAbilities?: Map<string, boolean>, _queryDataValues?: Map<string, ?>}} RecordPayloadValuesTarget
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Read an association count attached to a record/frontend-model payload.
|
|
9
|
+
* @param {RecordPayloadValuesTarget} target - Record-like object holding association count payload values.
|
|
10
|
+
* @param {string} attributeName - Association count attribute name.
|
|
11
|
+
* @returns {number} Attached count value, or 0 when it was not loaded.
|
|
12
|
+
*/
|
|
13
|
+
export function readPayloadAssociationCount(target, attributeName) {
|
|
14
|
+
if (!target._associationCounts) return 0
|
|
15
|
+
if (!target._associationCounts.has(attributeName)) return 0
|
|
16
|
+
|
|
17
|
+
return /** @type {number} */ (target._associationCounts.get(attributeName))
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Store an association count attached to a record/frontend-model payload.
|
|
22
|
+
* @param {RecordPayloadValuesTarget} target - Record-like object holding association count payload values.
|
|
23
|
+
* @param {string} attributeName - Association count attribute name.
|
|
24
|
+
* @param {number} value - Count value.
|
|
25
|
+
* @returns {void}
|
|
26
|
+
*/
|
|
27
|
+
export function setPayloadAssociationCount(target, attributeName, value) {
|
|
28
|
+
if (!target._associationCounts) target._associationCounts = new Map()
|
|
29
|
+
|
|
30
|
+
target._associationCounts.set(attributeName, value)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Read a computed ability attached to a record/frontend-model payload.
|
|
35
|
+
* @param {RecordPayloadValuesTarget} target - Record-like object holding ability payload values.
|
|
36
|
+
* @param {string} action - Ability action name.
|
|
37
|
+
* @returns {boolean} Attached ability value, or false when it was not loaded.
|
|
38
|
+
*/
|
|
39
|
+
export function readPayloadComputedAbility(target, action) {
|
|
40
|
+
if (!target._computedAbilities) return false
|
|
41
|
+
if (!target._computedAbilities.has(action)) return false
|
|
42
|
+
|
|
43
|
+
return Boolean(target._computedAbilities.get(action))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Store a computed ability attached to a record/frontend-model payload.
|
|
48
|
+
* @param {RecordPayloadValuesTarget} target - Record-like object holding ability payload values.
|
|
49
|
+
* @param {string} action - Ability action name.
|
|
50
|
+
* @param {boolean} value - Whether the current ability permits the action on this record.
|
|
51
|
+
* @returns {void}
|
|
52
|
+
*/
|
|
53
|
+
export function setPayloadComputedAbility(target, action, value) {
|
|
54
|
+
if (!target._computedAbilities) target._computedAbilities = new Map()
|
|
55
|
+
|
|
56
|
+
target._computedAbilities.set(action, Boolean(value))
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Read a queryData value attached to a record/frontend-model payload.
|
|
61
|
+
* @param {RecordPayloadValuesTarget} target - Record-like object holding queryData payload values.
|
|
62
|
+
* @param {string} name - queryData alias name.
|
|
63
|
+
* @returns {?} Attached queryData value, or null when it was not loaded.
|
|
64
|
+
*/
|
|
65
|
+
export function readPayloadQueryData(target, name) {
|
|
66
|
+
if (!target._queryDataValues) return null
|
|
67
|
+
if (!target._queryDataValues.has(name)) return null
|
|
68
|
+
|
|
69
|
+
return target._queryDataValues.get(name)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Store a queryData value attached to a record/frontend-model payload.
|
|
74
|
+
* @param {RecordPayloadValuesTarget} target - Record-like object holding queryData payload values.
|
|
75
|
+
* @param {string} name - queryData alias name.
|
|
76
|
+
* @param {?} value - Attached queryData value.
|
|
77
|
+
* @returns {void}
|
|
78
|
+
*/
|
|
79
|
+
export function setPayloadQueryData(target, name, value) {
|
|
80
|
+
if (!target._queryDataValues) target._queryDataValues = new Map()
|
|
81
|
+
|
|
82
|
+
target._queryDataValues.set(name, value)
|
|
83
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import {digg} from "diggerize"
|
|
4
|
+
|
|
5
|
+
export default class VelociousRoutesAppRoutes {
|
|
6
|
+
/**
|
|
7
|
+
* Runs get routes.
|
|
8
|
+
* @param {import("../configuration.js").default} configuration - Configuration instance.
|
|
9
|
+
* @returns {Promise<import("./index.js").default>} - Resolves with the routes.
|
|
10
|
+
*/
|
|
11
|
+
static async getRoutes(configuration) {
|
|
12
|
+
// Every client need to make their own routes because they probably can't be shared across different worker threads
|
|
13
|
+
const routesImport = await configuration.getEnvironmentHandler().importApplicationRoutes()
|
|
14
|
+
|
|
15
|
+
return digg(routesImport, "routes")
|
|
16
|
+
}
|
|
17
|
+
}
|