velocious 1.0.431 → 1.0.433
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/build/application.js +229 -0
- package/build/authorization/ability.js +329 -0
- package/build/authorization/base-resource.js +143 -0
- package/build/background-jobs/client.js +50 -0
- package/build/background-jobs/cron-expression.js +277 -0
- package/build/background-jobs/forked-runner-child.js +86 -0
- package/build/background-jobs/job-record.js +13 -0
- package/build/background-jobs/job-registry.js +92 -0
- package/build/background-jobs/job-runner.js +107 -0
- package/build/background-jobs/job.js +77 -0
- package/build/background-jobs/json-socket.js +78 -0
- package/build/background-jobs/main.js +926 -0
- package/build/background-jobs/normalize-error.js +26 -0
- package/build/background-jobs/scheduler.js +274 -0
- package/build/background-jobs/socket-request.js +68 -0
- package/build/background-jobs/status-reporter.js +101 -0
- package/build/background-jobs/store.js +994 -0
- package/build/background-jobs/types.js +70 -0
- package/build/background-jobs/web/authorization.js +89 -0
- package/build/background-jobs/web/controller.js +280 -0
- package/build/background-jobs/web/index.js +57 -0
- package/build/background-jobs/web/path-matcher.js +74 -0
- package/build/background-jobs/web/registry.js +49 -0
- package/build/background-jobs/worker.js +683 -0
- package/build/beacon/client.js +330 -0
- package/build/beacon/in-process-broker.js +71 -0
- package/build/beacon/in-process-client.js +139 -0
- package/build/beacon/server.js +148 -0
- package/build/beacon/types.js +55 -0
- package/build/cli/base-command.js +67 -0
- package/build/cli/browser-cli.js +45 -0
- package/build/cli/commands/background-jobs-main.js +7 -0
- package/build/cli/commands/background-jobs-runner.js +7 -0
- package/build/cli/commands/background-jobs-worker.js +7 -0
- package/build/cli/commands/beacon.js +7 -0
- package/build/cli/commands/console.js +12 -0
- package/build/cli/commands/db/base-command.js +82 -0
- package/build/cli/commands/db/create.js +64 -0
- package/build/cli/commands/db/drop.js +75 -0
- package/build/cli/commands/db/migrate.js +17 -0
- package/build/cli/commands/db/reset.js +22 -0
- package/build/cli/commands/db/rollback.js +15 -0
- package/build/cli/commands/db/schema/dump.js +12 -0
- package/build/cli/commands/db/schema/load.js +12 -0
- package/build/cli/commands/db/seed.js +12 -0
- package/build/cli/commands/db/tenants/check.js +38 -0
- package/build/cli/commands/db/tenants/create.js +33 -0
- package/build/cli/commands/db/tenants/migrate.js +49 -0
- package/build/cli/commands/destroy/migration.js +7 -0
- package/build/cli/commands/generate/base-models.js +7 -0
- package/build/cli/commands/generate/frontend-models.js +12 -0
- package/build/cli/commands/generate/migration.js +7 -0
- package/build/cli/commands/generate/model.js +7 -0
- package/build/cli/commands/init.js +11 -0
- package/build/cli/commands/routes.js +7 -0
- package/build/cli/commands/run-script.js +12 -0
- package/build/cli/commands/runner.js +12 -0
- package/build/cli/commands/server.js +7 -0
- package/build/cli/commands/test.js +9 -0
- package/build/cli/index.js +152 -0
- package/build/cli/tenant-database-command-helper.js +198 -0
- package/build/cli/use-browser-cli.js +30 -0
- package/build/configuration-resolver.js +65 -0
- package/build/configuration-types.js +429 -0
- package/build/configuration.js +2590 -0
- package/build/controller.js +421 -0
- package/build/current-configuration.js +31 -0
- package/build/current.js +80 -0
- package/build/database/annotations-async-hooks.js +47 -0
- package/build/database/annotations.js +40 -0
- package/build/database/drivers/base-column.js +182 -0
- package/build/database/drivers/base-columns-index.js +81 -0
- package/build/database/drivers/base-foreign-key.js +104 -0
- package/build/database/drivers/base-table.js +156 -0
- package/build/database/drivers/base.js +1609 -0
- package/build/database/drivers/mssql/column.js +74 -0
- package/build/database/drivers/mssql/columns-index.js +6 -0
- package/build/database/drivers/mssql/connect-connection.js +16 -0
- package/build/database/drivers/mssql/foreign-key.js +12 -0
- package/build/database/drivers/mssql/index.js +590 -0
- package/build/database/drivers/mssql/options.js +79 -0
- package/build/database/drivers/mssql/query-parser.js +6 -0
- package/build/database/drivers/mssql/sql/alter-table.js +4 -0
- package/build/database/drivers/mssql/sql/create-database.js +36 -0
- package/build/database/drivers/mssql/sql/create-index.js +4 -0
- package/build/database/drivers/mssql/sql/create-table.js +4 -0
- package/build/database/drivers/mssql/sql/delete.js +19 -0
- package/build/database/drivers/mssql/sql/drop-database.js +36 -0
- package/build/database/drivers/mssql/sql/drop-table.js +4 -0
- package/build/database/drivers/mssql/sql/insert.js +4 -0
- package/build/database/drivers/mssql/sql/update.js +31 -0
- package/build/database/drivers/mssql/sql/upsert.js +23 -0
- package/build/database/drivers/mssql/structure-sql.js +120 -0
- package/build/database/drivers/mssql/table.js +145 -0
- package/build/database/drivers/mysql/column.js +112 -0
- package/build/database/drivers/mysql/columns-index.js +22 -0
- package/build/database/drivers/mysql/foreign-key.js +12 -0
- package/build/database/drivers/mysql/index.js +473 -0
- package/build/database/drivers/mysql/options.js +34 -0
- package/build/database/drivers/mysql/query-parser.js +6 -0
- package/build/database/drivers/mysql/query.js +37 -0
- package/build/database/drivers/mysql/sql/alter-table.js +6 -0
- package/build/database/drivers/mysql/sql/create-database.js +39 -0
- package/build/database/drivers/mysql/sql/create-index.js +6 -0
- package/build/database/drivers/mysql/sql/create-table.js +6 -0
- package/build/database/drivers/mysql/sql/delete.js +21 -0
- package/build/database/drivers/mysql/sql/drop-database.js +6 -0
- package/build/database/drivers/mysql/sql/drop-table.js +6 -0
- package/build/database/drivers/mysql/sql/insert.js +6 -0
- package/build/database/drivers/mysql/sql/update.js +33 -0
- package/build/database/drivers/mysql/sql/upsert.js +13 -0
- package/build/database/drivers/mysql/structure-sql.js +93 -0
- package/build/database/drivers/mysql/table.js +121 -0
- package/build/database/drivers/pgsql/column.js +90 -0
- package/build/database/drivers/pgsql/columns-index.js +6 -0
- package/build/database/drivers/pgsql/foreign-key.js +12 -0
- package/build/database/drivers/pgsql/index.js +441 -0
- package/build/database/drivers/pgsql/options.js +32 -0
- package/build/database/drivers/pgsql/query-parser.js +6 -0
- package/build/database/drivers/pgsql/sql/alter-table.js +6 -0
- package/build/database/drivers/pgsql/sql/create-database.js +38 -0
- package/build/database/drivers/pgsql/sql/create-index.js +6 -0
- package/build/database/drivers/pgsql/sql/create-table.js +6 -0
- package/build/database/drivers/pgsql/sql/delete.js +21 -0
- package/build/database/drivers/pgsql/sql/drop-database.js +6 -0
- package/build/database/drivers/pgsql/sql/drop-table.js +6 -0
- package/build/database/drivers/pgsql/sql/insert.js +6 -0
- package/build/database/drivers/pgsql/sql/update.js +33 -0
- package/build/database/drivers/pgsql/sql/upsert.js +14 -0
- package/build/database/drivers/pgsql/structure-sql.js +126 -0
- package/build/database/drivers/pgsql/table.js +135 -0
- package/build/database/drivers/sqlite/base.js +509 -0
- package/build/database/drivers/sqlite/column.js +75 -0
- package/build/database/drivers/sqlite/columns-index.js +30 -0
- package/build/database/drivers/sqlite/connection-sql-js.js +46 -0
- package/build/database/drivers/sqlite/foreign-key.js +24 -0
- package/build/database/drivers/sqlite/index.js +394 -0
- package/build/database/drivers/sqlite/index.native.js +72 -0
- package/build/database/drivers/sqlite/index.web.js +99 -0
- package/build/database/drivers/sqlite/options.js +32 -0
- package/build/database/drivers/sqlite/query-parser.js +6 -0
- package/build/database/drivers/sqlite/query.js +35 -0
- package/build/database/drivers/sqlite/query.native.js +35 -0
- package/build/database/drivers/sqlite/query.web.js +49 -0
- package/build/database/drivers/sqlite/sql/alter-table.js +187 -0
- package/build/database/drivers/sqlite/sql/create-index.js +6 -0
- package/build/database/drivers/sqlite/sql/create-table.js +6 -0
- package/build/database/drivers/sqlite/sql/delete.js +26 -0
- package/build/database/drivers/sqlite/sql/drop-table.js +6 -0
- package/build/database/drivers/sqlite/sql/insert.js +6 -0
- package/build/database/drivers/sqlite/sql/update.js +33 -0
- package/build/database/drivers/sqlite/sql/upsert.js +14 -0
- package/build/database/drivers/sqlite/structure-sql.js +56 -0
- package/build/database/drivers/sqlite/table-rebuilder.js +96 -0
- package/build/database/drivers/sqlite/table.js +131 -0
- package/build/database/drivers/structure-sql/utils.js +35 -0
- package/build/database/handler.js +13 -0
- package/build/database/initializer-from-require-context.js +101 -0
- package/build/database/migration/index.js +438 -0
- package/build/database/migrator/files-finder.js +55 -0
- package/build/database/migrator/types.js +31 -0
- package/build/database/migrator.js +557 -0
- package/build/database/pool/async-tracked-multi-connection.js +1164 -0
- package/build/database/pool/base-methods-forward.js +52 -0
- package/build/database/pool/base.js +380 -0
- package/build/database/pool/single-multi-use.js +118 -0
- package/build/database/query/alter-table-base.js +104 -0
- package/build/database/query/base.js +49 -0
- package/build/database/query/create-database-base.js +42 -0
- package/build/database/query/create-index-base.js +117 -0
- package/build/database/query/create-table-base.js +205 -0
- package/build/database/query/delete-base.js +19 -0
- package/build/database/query/drop-database-base.js +38 -0
- package/build/database/query/drop-table-base.js +58 -0
- package/build/database/query/from-base.js +36 -0
- package/build/database/query/from-plain.js +16 -0
- package/build/database/query/from-table.js +18 -0
- package/build/database/query/index.js +533 -0
- package/build/database/query/insert-base.js +172 -0
- package/build/database/query/join-base.js +43 -0
- package/build/database/query/join-object.js +167 -0
- package/build/database/query/join-plain.js +18 -0
- package/build/database/query/join-tracker.js +93 -0
- package/build/database/query/model-class-query.js +1577 -0
- package/build/database/query/order-base.js +33 -0
- package/build/database/query/order-column.js +77 -0
- package/build/database/query/order-plain.js +28 -0
- package/build/database/query/preloader/belongs-to.js +267 -0
- package/build/database/query/preloader/ensure-model-class-initialized.js +18 -0
- package/build/database/query/preloader/has-many.js +316 -0
- package/build/database/query/preloader/has-one.js +123 -0
- package/build/database/query/preloader/selection.js +152 -0
- package/build/database/query/preloader.js +201 -0
- package/build/database/query/query-data.js +305 -0
- package/build/database/query/select-base.js +30 -0
- package/build/database/query/select-plain.js +18 -0
- package/build/database/query/select-table-and-column.js +28 -0
- package/build/database/query/update-base.js +41 -0
- package/build/database/query/upsert-base.js +103 -0
- package/build/database/query/where-base.js +38 -0
- package/build/database/query/where-combinator.js +31 -0
- package/build/database/query/where-hash.js +77 -0
- package/build/database/query/where-model-class-hash.js +505 -0
- package/build/database/query/where-not.js +23 -0
- package/build/database/query/where-plain.js +20 -0
- package/build/database/query/with-count.js +219 -0
- package/build/database/query-parser/base-query-parser.js +40 -0
- package/build/database/query-parser/from-parser.js +49 -0
- package/build/database/query-parser/group-parser.js +55 -0
- package/build/database/query-parser/joins-parser.js +37 -0
- package/build/database/query-parser/limit-parser.js +77 -0
- package/build/database/query-parser/options.js +94 -0
- package/build/database/query-parser/order-parser.js +45 -0
- package/build/database/query-parser/select-parser.js +67 -0
- package/build/database/query-parser/where-parser.js +46 -0
- package/build/database/record/acts-as-list.js +374 -0
- package/build/database/record/attachments/download.js +49 -0
- package/build/database/record/attachments/handle.js +188 -0
- package/build/database/record/attachments/normalize-input.js +213 -0
- package/build/database/record/attachments/storage-drivers/filesystem.js +114 -0
- package/build/database/record/attachments/storage-drivers/native.js +146 -0
- package/build/database/record/attachments/storage-drivers/s3.js +245 -0
- package/build/database/record/attachments/store.js +591 -0
- package/build/database/record/index.js +4119 -0
- package/build/database/record/instance-relationships/base.js +289 -0
- package/build/database/record/instance-relationships/belongs-to.js +84 -0
- package/build/database/record/instance-relationships/has-many.js +284 -0
- package/build/database/record/instance-relationships/has-one.js +117 -0
- package/build/database/record/record-not-found-error.js +3 -0
- package/build/database/record/relationships/base.js +195 -0
- package/build/database/record/relationships/belongs-to.js +57 -0
- package/build/database/record/relationships/has-many.js +46 -0
- package/build/database/record/relationships/has-one.js +46 -0
- package/build/database/record/state-machine.js +278 -0
- package/build/database/record/user-module.js +43 -0
- package/build/database/record/validators/base.js +27 -0
- package/build/database/record/validators/format.js +50 -0
- package/build/database/record/validators/presence.js +24 -0
- package/build/database/record/validators/uniqueness.js +124 -0
- package/build/database/table-data/index.js +241 -0
- package/build/database/table-data/table-column.js +416 -0
- package/build/database/table-data/table-foreign-key.js +69 -0
- package/build/database/table-data/table-index.js +46 -0
- package/build/database/table-data/table-reference.js +13 -0
- package/build/database/use-database.js +48 -0
- package/build/environment-handlers/base.js +561 -0
- package/build/environment-handlers/browser.js +338 -0
- package/build/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
- package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
- package/build/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
- package/build/environment-handlers/node/cli/commands/beacon.js +21 -0
- package/build/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
- package/build/environment-handlers/node/cli/commands/console.js +149 -0
- package/build/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
- package/build/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
- package/build/environment-handlers/node/cli/commands/db/seed.js +79 -0
- package/build/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
- package/build/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
- package/build/environment-handlers/node/cli/commands/generate/migration.js +45 -0
- package/build/environment-handlers/node/cli/commands/generate/model.js +45 -0
- package/build/environment-handlers/node/cli/commands/init.js +68 -0
- package/build/environment-handlers/node/cli/commands/routes.js +63 -0
- package/build/environment-handlers/node/cli/commands/run-script.js +85 -0
- package/build/environment-handlers/node/cli/commands/runner.js +84 -0
- package/build/environment-handlers/node/cli/commands/server.js +151 -0
- package/build/environment-handlers/node/cli/commands/test.js +118 -0
- package/build/environment-handlers/node.js +887 -0
- package/build/error-logger.js +30 -0
- package/build/frontend-model-controller.js +3491 -0
- package/build/frontend-model-resource/base-resource.js +939 -0
- package/build/frontend-models/base.js +4004 -0
- package/build/frontend-models/clear-pending-debounced-callback.js +16 -0
- package/build/frontend-models/event-hook-models.js +49 -0
- package/build/frontend-models/model-registry.js +28 -0
- package/build/frontend-models/outgoing-event-buffer.js +51 -0
- package/build/frontend-models/preloader.js +169 -0
- package/build/frontend-models/query.js +2245 -0
- package/build/frontend-models/resource-config-validation.js +56 -0
- package/build/frontend-models/resource-definition.js +399 -0
- package/build/frontend-models/transport-serialization.js +369 -0
- package/build/frontend-models/use-created-event.js +21 -0
- package/build/frontend-models/use-destroyed-event.js +148 -0
- package/build/frontend-models/use-model-class-event.js +164 -0
- package/build/frontend-models/use-updated-event.js +152 -0
- package/build/frontend-models/websocket-channel.js +494 -0
- package/build/frontend-models/websocket-publishers.js +224 -0
- package/build/http-client/header.js +17 -0
- package/build/http-client/index.js +139 -0
- package/build/http-client/request.js +94 -0
- package/build/http-client/response.js +151 -0
- package/build/http-client/websocket-client.js +27 -0
- package/build/http-server/client/index.js +507 -0
- package/build/http-server/client/params-to-object.js +152 -0
- package/build/http-server/client/request-buffer/form-data-part.js +139 -0
- package/build/http-server/client/request-buffer/header.js +19 -0
- package/build/http-server/client/request-buffer/index.js +535 -0
- package/build/http-server/client/request-parser.js +195 -0
- package/build/http-server/client/request-runner.js +321 -0
- package/build/http-server/client/request-timing.js +171 -0
- package/build/http-server/client/request.js +114 -0
- package/build/http-server/client/response.js +251 -0
- package/build/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
- package/build/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
- package/build/http-server/client/uploaded-file/uploaded-file.js +36 -0
- package/build/http-server/client/websocket-request.js +147 -0
- package/build/http-server/client/websocket-session.js +1755 -0
- package/build/http-server/cookie.js +245 -0
- package/build/http-server/development-reloader.js +240 -0
- package/build/http-server/index.js +561 -0
- package/build/http-server/remote-address.js +77 -0
- package/build/http-server/server-client.js +222 -0
- package/build/http-server/server-lock.js +178 -0
- package/build/http-server/websocket-channel-subscribers.js +110 -0
- package/build/http-server/websocket-channel.js +137 -0
- package/build/http-server/websocket-connection.js +118 -0
- package/build/http-server/websocket-event-log-store.js +433 -0
- package/build/http-server/websocket-events-host.js +170 -0
- package/build/http-server/websocket-events.js +50 -0
- package/build/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
- package/build/http-server/worker-handler/in-process.js +155 -0
- package/build/http-server/worker-handler/index.js +370 -0
- package/build/http-server/worker-handler/worker-script.js +6 -0
- package/build/http-server/worker-handler/worker-thread.js +286 -0
- package/build/initializer.js +39 -0
- package/build/jobs/mail-delivery.js +22 -0
- package/build/logger/base-logger.js +34 -0
- package/build/logger/console-logger.js +28 -0
- package/build/logger/file-logger.js +36 -0
- package/build/logger/outputs/array-output.js +50 -0
- package/build/logger/outputs/console-output.js +32 -0
- package/build/logger/outputs/file-output.js +55 -0
- package/build/logger/outputs/stdout-output.js +64 -0
- package/build/logger.js +507 -0
- package/build/mailer/backends/smtp.js +197 -0
- package/build/mailer/base.js +337 -0
- package/build/mailer/delivery.js +70 -0
- package/build/mailer/index.js +24 -0
- package/build/mailer.js +15 -0
- package/build/plugins/sqljs-wasm-route-controller.js +70 -0
- package/build/plugins/sqljs-wasm-route.js +71 -0
- package/build/record-payload-values.js +83 -0
- package/build/routes/app-routes.js +17 -0
- package/build/routes/base-route.js +133 -0
- package/build/routes/basic-route.js +109 -0
- package/build/routes/built-in/debug/controller.js +12 -0
- package/build/routes/built-in/errors/controller.js +7 -0
- package/build/routes/get-route.js +75 -0
- package/build/routes/hooks/frontend-model-command-route-hook.js +100 -0
- package/build/routes/index.js +50 -0
- package/build/routes/namespace-route.js +51 -0
- package/build/routes/plugin-routes.js +141 -0
- package/build/routes/post-route.js +74 -0
- package/build/routes/resolver.js +535 -0
- package/build/routes/resource-route.js +154 -0
- package/build/routes/root-route.js +11 -0
- package/build/src/application.js +187 -214
- package/build/src/authorization/ability.js +250 -297
- package/build/src/authorization/base-resource.js +120 -136
- package/build/src/background-jobs/client.js +43 -47
- package/build/src/background-jobs/cron-expression.js +127 -166
- package/build/src/background-jobs/forked-runner-child.js +37 -47
- package/build/src/background-jobs/job-record.js +8 -10
- package/build/src/background-jobs/job-registry.js +72 -84
- package/build/src/background-jobs/job-runner.js +74 -81
- package/build/src/background-jobs/job.js +62 -72
- package/build/src/background-jobs/json-socket.js +65 -70
- package/build/src/background-jobs/main.js +841 -900
- package/build/src/background-jobs/normalize-error.js +12 -11
- package/build/src/background-jobs/scheduler.js +205 -247
- package/build/src/background-jobs/socket-request.js +60 -65
- package/build/src/background-jobs/status-reporter.js +86 -96
- package/build/src/background-jobs/store.js +862 -980
- package/build/src/background-jobs/types.js +2 -3
- package/build/src/background-jobs/web/authorization.js +38 -50
- package/build/src/background-jobs/web/controller.js +232 -268
- package/build/src/background-jobs/web/index.js +36 -40
- package/build/src/background-jobs/web/path-matcher.js +45 -48
- package/build/src/background-jobs/web/registry.js +9 -14
- package/build/src/background-jobs/worker.js +585 -639
- package/build/src/beacon/client.js +264 -293
- package/build/src/beacon/in-process-broker.js +20 -25
- package/build/src/beacon/in-process-client.js +104 -116
- package/build/src/beacon/server.js +110 -126
- package/build/src/beacon/types.js +2 -8
- package/build/src/cli/base-command.js +49 -57
- package/build/src/cli/browser-cli.js +37 -42
- 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 +71 -76
- package/build/src/cli/commands/db/create.js +53 -61
- package/build/src/cli/commands/db/drop.js +62 -71
- package/build/src/cli/commands/db/migrate.js +13 -15
- package/build/src/cli/commands/db/reset.js +16 -19
- package/build/src/cli/commands/db/rollback.js +12 -13
- 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 +32 -35
- package/build/src/cli/commands/db/tenants/create.js +26 -29
- package/build/src/cli/commands/db/tenants/migrate.js +40 -44
- 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 +7 -9
- 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 +6 -7
- package/build/src/cli/index.js +127 -141
- package/build/src/cli/tenant-database-command-helper.js +154 -185
- package/build/src/cli/use-browser-cli.js +15 -20
- package/build/src/configuration-resolver.js +47 -54
- package/build/src/configuration-types.d.ts +5 -3
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +3 -54
- package/build/src/configuration.js +2240 -2547
- package/build/src/controller.js +363 -407
- package/build/src/current-configuration.js +9 -12
- package/build/src/current.js +70 -75
- package/build/src/database/annotations-async-hooks.js +16 -22
- package/build/src/database/annotations.js +12 -18
- package/build/src/database/drivers/base-column.js +155 -179
- package/build/src/database/drivers/base-columns-index.js +69 -78
- package/build/src/database/drivers/base-foreign-key.js +89 -101
- package/build/src/database/drivers/base-table.js +124 -149
- package/build/src/database/drivers/base.js +1306 -1489
- package/build/src/database/drivers/mssql/column.js +39 -50
- package/build/src/database/drivers/mssql/columns-index.js +2 -3
- package/build/src/database/drivers/mssql/connect-connection.js +11 -9
- package/build/src/database/drivers/mssql/foreign-key.js +8 -9
- package/build/src/database/drivers/mssql/index.js +507 -587
- package/build/src/database/drivers/mssql/options.js +68 -75
- package/build/src/database/drivers/mssql/query-parser.js +2 -3
- package/build/src/database/drivers/mssql/sql/alter-table.js +2 -2
- package/build/src/database/drivers/mssql/sql/create-database.js +24 -31
- 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 +14 -16
- package/build/src/database/drivers/mssql/sql/drop-database.js +24 -31
- 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 +24 -28
- package/build/src/database/drivers/mssql/sql/upsert.js +18 -20
- package/build/src/database/drivers/mssql/structure-sql.js +102 -114
- package/build/src/database/drivers/mssql/table.js +81 -96
- package/build/src/database/drivers/mysql/column.js +75 -92
- package/build/src/database/drivers/mysql/columns-index.js +16 -19
- package/build/src/database/drivers/mysql/foreign-key.js +8 -9
- package/build/src/database/drivers/mysql/index.js +396 -457
- package/build/src/database/drivers/mysql/options.js +26 -30
- package/build/src/database/drivers/mysql/query-parser.js +2 -3
- package/build/src/database/drivers/mysql/query.js +26 -29
- package/build/src/database/drivers/mysql/sql/alter-table.js +2 -3
- package/build/src/database/drivers/mysql/sql/create-database.js +23 -28
- package/build/src/database/drivers/mysql/sql/create-index.js +2 -3
- package/build/src/database/drivers/mysql/sql/create-table.js +2 -3
- package/build/src/database/drivers/mysql/sql/delete.js +14 -17
- package/build/src/database/drivers/mysql/sql/drop-database.js +2 -3
- package/build/src/database/drivers/mysql/sql/drop-table.js +2 -3
- package/build/src/database/drivers/mysql/sql/insert.js +2 -3
- package/build/src/database/drivers/mysql/sql/update.js +24 -29
- package/build/src/database/drivers/mysql/sql/upsert.js +8 -10
- package/build/src/database/drivers/mysql/structure-sql.js +79 -88
- package/build/src/database/drivers/mysql/table.js +83 -98
- package/build/src/database/drivers/pgsql/column.js +56 -72
- package/build/src/database/drivers/pgsql/columns-index.js +2 -3
- package/build/src/database/drivers/pgsql/foreign-key.js +8 -9
- package/build/src/database/drivers/pgsql/index.js +377 -438
- package/build/src/database/drivers/pgsql/options.js +25 -28
- package/build/src/database/drivers/pgsql/query-parser.js +2 -3
- package/build/src/database/drivers/pgsql/sql/alter-table.js +2 -3
- package/build/src/database/drivers/pgsql/sql/create-database.js +19 -23
- package/build/src/database/drivers/pgsql/sql/create-index.js +2 -3
- package/build/src/database/drivers/pgsql/sql/create-table.js +2 -3
- package/build/src/database/drivers/pgsql/sql/delete.js +14 -17
- package/build/src/database/drivers/pgsql/sql/drop-database.js +2 -3
- package/build/src/database/drivers/pgsql/sql/drop-table.js +2 -3
- package/build/src/database/drivers/pgsql/sql/insert.js +2 -3
- package/build/src/database/drivers/pgsql/sql/update.js +24 -29
- package/build/src/database/drivers/pgsql/sql/upsert.js +9 -11
- package/build/src/database/drivers/pgsql/structure-sql.js +108 -120
- package/build/src/database/drivers/pgsql/table.js +60 -77
- package/build/src/database/drivers/sqlite/base.js +405 -478
- package/build/src/database/drivers/sqlite/column.js +54 -69
- package/build/src/database/drivers/sqlite/columns-index.js +22 -27
- package/build/src/database/drivers/sqlite/connection-sql-js.js +35 -42
- package/build/src/database/drivers/sqlite/foreign-key.js +18 -21
- package/build/src/database/drivers/sqlite/index.js +330 -373
- package/build/src/database/drivers/sqlite/index.native.js +55 -64
- package/build/src/database/drivers/sqlite/index.web.js +69 -87
- package/build/src/database/drivers/sqlite/options.js +25 -28
- package/build/src/database/drivers/sqlite/query-parser.js +2 -3
- package/build/src/database/drivers/sqlite/query.js +21 -24
- package/build/src/database/drivers/sqlite/query.native.js +20 -25
- package/build/src/database/drivers/sqlite/query.web.js +30 -37
- package/build/src/database/drivers/sqlite/sql/alter-table.js +159 -179
- package/build/src/database/drivers/sqlite/sql/create-index.js +2 -3
- package/build/src/database/drivers/sqlite/sql/create-table.js +2 -3
- package/build/src/database/drivers/sqlite/sql/delete.js +17 -22
- package/build/src/database/drivers/sqlite/sql/drop-table.js +2 -3
- package/build/src/database/drivers/sqlite/sql/insert.js +2 -3
- package/build/src/database/drivers/sqlite/sql/update.js +24 -29
- package/build/src/database/drivers/sqlite/sql/upsert.js +9 -11
- package/build/src/database/drivers/sqlite/structure-sql.js +49 -52
- package/build/src/database/drivers/sqlite/table-rebuilder.js +62 -75
- package/build/src/database/drivers/sqlite/table.js +102 -125
- package/build/src/database/drivers/structure-sql/utils.js +14 -17
- package/build/src/database/handler.js +9 -10
- package/build/src/database/initializer-from-require-context.js +76 -87
- package/build/src/database/migration/index.js +332 -395
- package/build/src/database/migrator/files-finder.js +40 -50
- package/build/src/database/migrator/types.js +2 -30
- package/build/src/database/migrator.js +454 -526
- package/build/src/database/pool/async-tracked-multi-connection.js +997 -1147
- package/build/src/database/pool/base-methods-forward.js +40 -43
- package/build/src/database/pool/base.js +298 -343
- package/build/src/database/pool/single-multi-use.js +93 -110
- package/build/src/database/query/alter-table-base.js +84 -99
- package/build/src/database/query/base.js +39 -46
- package/build/src/database/query/create-database-base.js +25 -30
- package/build/src/database/query/create-index-base.js +75 -94
- package/build/src/database/query/create-table-base.js +151 -193
- package/build/src/database/query/delete-base.js +14 -16
- package/build/src/database/query/drop-database-base.js +23 -28
- package/build/src/database/query/drop-table-base.js +42 -53
- package/build/src/database/query/from-base.js +30 -33
- package/build/src/database/query/from-plain.js +11 -13
- package/build/src/database/query/from-table.js +13 -15
- package/build/src/database/query/index.js +410 -472
- package/build/src/database/query/insert-base.js +143 -164
- package/build/src/database/query/join-base.js +35 -40
- package/build/src/database/query/join-object.js +128 -153
- package/build/src/database/query/join-plain.js +13 -15
- package/build/src/database/query/join-tracker.js +76 -90
- package/build/src/database/query/model-class-query.js +1134 -1370
- package/build/src/database/query/order-base.js +27 -30
- package/build/src/database/query/order-column.js +44 -53
- package/build/src/database/query/order-plain.js +20 -24
- package/build/src/database/query/preloader/belongs-to.js +210 -258
- package/build/src/database/query/preloader/ensure-model-class-initialized.js +8 -9
- package/build/src/database/query/preloader/has-many.js +240 -301
- package/build/src/database/query/preloader/has-one.js +91 -117
- package/build/src/database/query/preloader/selection.js +117 -129
- package/build/src/database/query/preloader.js +160 -185
- package/build/src/database/query/query-data.js +157 -201
- package/build/src/database/query/select-base.js +25 -27
- package/build/src/database/query/select-plain.js +13 -15
- package/build/src/database/query/select-table-and-column.js +21 -25
- package/build/src/database/query/update-base.js +35 -38
- package/build/src/database/query/upsert-base.js +93 -100
- package/build/src/database/query/where-base.js +32 -35
- package/build/src/database/query/where-combinator.js +25 -28
- package/build/src/database/query/where-hash.js +61 -68
- package/build/src/database/query/where-model-class-hash.js +414 -469
- package/build/src/database/query/where-not.js +18 -20
- package/build/src/database/query/where-plain.js +15 -17
- package/build/src/database/query/with-count.js +125 -159
- package/build/src/database/query-parser/base-query-parser.js +32 -37
- package/build/src/database/query-parser/from-parser.js +36 -45
- package/build/src/database/query-parser/group-parser.js +42 -50
- package/build/src/database/query-parser/joins-parser.js +28 -33
- package/build/src/database/query-parser/limit-parser.js +67 -70
- package/build/src/database/query-parser/options.js +75 -82
- package/build/src/database/query-parser/order-parser.js +36 -40
- package/build/src/database/query-parser/select-parser.js +49 -60
- package/build/src/database/query-parser/where-parser.js +36 -41
- package/build/src/database/record/acts-as-list.js +235 -273
- package/build/src/database/record/attachments/download.js +44 -45
- package/build/src/database/record/attachments/handle.js +141 -161
- package/build/src/database/record/attachments/normalize-input.js +128 -138
- package/build/src/database/record/attachments/storage-drivers/filesystem.js +77 -91
- package/build/src/database/record/attachments/storage-drivers/native.js +112 -121
- package/build/src/database/record/attachments/storage-drivers/s3.js +177 -208
- package/build/src/database/record/attachments/store.js +467 -539
- package/build/src/database/record/index.d.ts +109 -25
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +3502 -3898
- package/build/src/database/record/instance-relationships/base.js +234 -268
- package/build/src/database/record/instance-relationships/belongs-to.js +58 -73
- package/build/src/database/record/instance-relationships/has-many.js +225 -264
- package/build/src/database/record/instance-relationships/has-one.js +85 -105
- package/build/src/database/record/record-not-found-error.js +3 -2
- package/build/src/database/record/relationships/base.js +144 -166
- package/build/src/database/record/relationships/belongs-to.js +44 -51
- package/build/src/database/record/relationships/has-many.js +32 -40
- package/build/src/database/record/relationships/has-one.js +32 -40
- package/build/src/database/record/state-machine.js +156 -208
- package/build/src/database/record/user-module.js +32 -38
- package/build/src/database/record/validators/base.js +22 -24
- package/build/src/database/record/validators/format.js +36 -46
- package/build/src/database/record/validators/presence.js +18 -20
- package/build/src/database/record/validators/uniqueness.js +99 -117
- package/build/src/database/table-data/index.js +199 -231
- package/build/src/database/table-data/table-column.js +338 -382
- package/build/src/database/table-data/table-foreign-key.js +57 -66
- package/build/src/database/table-data/table-index.js +29 -36
- package/build/src/database/table-data/table-reference.js +10 -10
- package/build/src/database/use-database.js +32 -40
- package/build/src/environment-handlers/base.js +484 -544
- package/build/src/environment-handlers/browser.js +241 -294
- package/build/src/environment-handlers/node/cli/commands/background-jobs-main.js +16 -19
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +18 -21
- package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.js +22 -29
- package/build/src/environment-handlers/node/cli/commands/beacon.js +16 -19
- package/build/src/environment-handlers/node/cli/commands/cli-command-context.js +14 -15
- package/build/src/environment-handlers/node/cli/commands/console.js +99 -120
- package/build/src/environment-handlers/node/cli/commands/db/schema/dump.js +34 -39
- package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +57 -63
- package/build/src/environment-handlers/node/cli/commands/db/seed.js +51 -63
- package/build/src/environment-handlers/node/cli/commands/destroy/migration.js +32 -40
- package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +4 -2
- 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 +326 -358
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +10 -10
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +729 -844
- package/build/src/environment-handlers/node/cli/commands/generate/migration.js +34 -38
- package/build/src/environment-handlers/node/cli/commands/generate/model.js +34 -38
- package/build/src/environment-handlers/node/cli/commands/init.js +56 -61
- package/build/src/environment-handlers/node/cli/commands/routes.js +51 -59
- package/build/src/environment-handlers/node/cli/commands/run-script.js +54 -68
- package/build/src/environment-handlers/node/cli/commands/runner.js +56 -74
- package/build/src/environment-handlers/node/cli/commands/server.js +93 -106
- package/build/src/environment-handlers/node/cli/commands/test.js +97 -113
- package/build/src/environment-handlers/node.js +753 -874
- package/build/src/error-logger.js +22 -21
- package/build/src/frontend-model-controller.js +2791 -3291
- package/build/src/frontend-model-resource/base-resource.d.ts +8 -3
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +770 -865
- package/build/src/frontend-models/base.js +3136 -3593
- package/build/src/frontend-models/clear-pending-debounced-callback.js +7 -8
- package/build/src/frontend-models/event-hook-models.js +16 -21
- package/build/src/frontend-models/model-registry.js +9 -11
- package/build/src/frontend-models/outgoing-event-buffer.js +10 -17
- package/build/src/frontend-models/preloader.js +131 -149
- package/build/src/frontend-models/query.js +1557 -1855
- package/build/src/frontend-models/resource-config-validation.js +27 -37
- package/build/src/frontend-models/resource-definition.d.ts +6 -7
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +237 -291
- package/build/src/frontend-models/transport-serialization.js +203 -266
- package/build/src/frontend-models/use-created-event.js +5 -7
- package/build/src/frontend-models/use-destroyed-event.js +80 -93
- package/build/src/frontend-models/use-model-class-event.js +79 -91
- package/build/src/frontend-models/use-updated-event.js +84 -97
- package/build/src/frontend-models/websocket-channel.js +381 -441
- package/build/src/frontend-models/websocket-publishers.js +142 -175
- package/build/src/http-client/header.js +13 -14
- package/build/src/http-client/index.js +116 -132
- package/build/src/http-client/request.js +71 -87
- package/build/src/http-client/response.js +122 -140
- package/build/src/http-client/websocket-client.js +15 -17
- package/build/src/http-server/client/index.js +409 -465
- package/build/src/http-server/client/params-to-object.js +124 -135
- package/build/src/http-server/client/request-buffer/form-data-part.js +111 -132
- package/build/src/http-server/client/request-buffer/header.js +15 -16
- package/build/src/http-server/client/request-buffer/index.js +446 -506
- package/build/src/http-server/client/request-parser.js +163 -186
- package/build/src/http-server/client/request-runner.js +226 -259
- package/build/src/http-server/client/request-timing.js +132 -151
- package/build/src/http-server/client/request.js +96 -108
- package/build/src/http-server/client/response.js +213 -235
- package/build/src/http-server/client/uploaded-file/memory-uploaded-file.js +25 -29
- package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.js +25 -29
- package/build/src/http-server/client/uploaded-file/uploaded-file.js +33 -33
- package/build/src/http-server/client/websocket-request.js +114 -137
- package/build/src/http-server/client/websocket-session.js +1452 -1657
- package/build/src/http-server/cookie.js +216 -236
- package/build/src/http-server/development-reloader.js +190 -221
- package/build/src/http-server/index.js +451 -525
- package/build/src/http-server/remote-address.js +38 -50
- package/build/src/http-server/server-client.js +181 -208
- package/build/src/http-server/server-lock.js +153 -167
- package/build/src/http-server/websocket-channel-subscribers.js +81 -93
- package/build/src/http-server/websocket-channel.js +104 -117
- package/build/src/http-server/websocket-connection.js +96 -104
- package/build/src/http-server/websocket-event-log-store.js +350 -404
- package/build/src/http-server/websocket-events-host.js +145 -164
- package/build/src/http-server/websocket-events.js +47 -47
- package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +13 -14
- package/build/src/http-server/worker-handler/in-process.js +123 -141
- package/build/src/http-server/worker-handler/index.js +313 -349
- package/build/src/http-server/worker-handler/worker-script.js +4 -5
- package/build/src/http-server/worker-handler/worker-thread.js +240 -269
- package/build/src/initializer.js +31 -36
- package/build/src/jobs/mail-delivery.js +13 -15
- package/build/src/logger/base-logger.js +24 -26
- package/build/src/logger/console-logger.js +21 -23
- package/build/src/logger/file-logger.js +29 -31
- package/build/src/logger/outputs/array-output.js +37 -42
- package/build/src/logger/outputs/console-output.js +20 -24
- package/build/src/logger/outputs/file-output.js +43 -48
- package/build/src/logger/outputs/stdout-output.js +39 -48
- package/build/src/logger.js +338 -394
- package/build/src/mailer/backends/smtp.js +134 -163
- package/build/src/mailer/base.js +211 -251
- package/build/src/mailer/delivery.js +56 -64
- package/build/src/mailer/index.js +4 -22
- package/build/src/mailer.js +4 -13
- package/build/src/plugins/sqljs-wasm-route-controller.js +42 -52
- package/build/src/plugins/sqljs-wasm-route.js +28 -38
- package/build/src/record-payload-values.js +25 -28
- package/build/src/routes/app-routes.js +12 -14
- package/build/src/routes/base-route.js +112 -130
- package/build/src/routes/basic-route.js +83 -102
- 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 +50 -63
- package/build/src/routes/hooks/frontend-model-command-route-hook.js +66 -80
- package/build/src/routes/index.js +36 -43
- package/build/src/routes/namespace-route.js +38 -47
- package/build/src/routes/plugin-routes.js +107 -124
- package/build/src/routes/post-route.js +51 -62
- package/build/src/routes/resolver.js +422 -494
- package/build/src/routes/resource-route.js +124 -143
- package/build/src/routes/root-route.js +7 -8
- package/build/src/testing/base-expect.js +13 -14
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +329 -405
- package/build/src/testing/browser-test-app.js +23 -29
- package/build/src/testing/expect-to-change.js +41 -50
- package/build/src/testing/expect-utils.js +139 -184
- package/build/src/testing/expect.js +638 -731
- package/build/src/testing/request-client.js +70 -85
- package/build/src/testing/test-files-finder.js +285 -339
- package/build/src/testing/test-filter-parser.js +124 -155
- package/build/src/testing/test-runner.js +883 -1020
- package/build/src/testing/test-suite-splitter.js +114 -142
- package/build/src/testing/test.js +216 -256
- package/build/src/utils/backtrace-cleaner-node.js +62 -69
- package/build/src/utils/backtrace-cleaner.js +188 -216
- package/build/src/utils/ensure-error.js +7 -7
- package/build/src/utils/event-emitter.js +4 -6
- package/build/src/utils/file-exists.js +9 -10
- package/build/src/utils/format-value.js +67 -76
- package/build/src/utils/model-scope.js +27 -31
- package/build/src/utils/nest-callbacks.js +10 -13
- package/build/src/utils/plain-object.js +5 -6
- package/build/src/utils/ransack.js +448 -563
- package/build/src/utils/rest-args-error.js +5 -6
- package/build/src/utils/singularize-model-name.js +9 -11
- package/build/src/utils/split-sql-statements.js +68 -79
- package/build/src/utils/to-import-specifier.js +24 -30
- package/build/src/utils/with-tracked-stack-async-hooks.js +60 -74
- package/build/src/utils/with-tracked-stack.js +14 -18
- package/build/src/velocious-error.js +27 -30
- package/build/templates/configuration.js +61 -0
- package/build/templates/generate-migration.js +11 -0
- package/build/templates/generate-model.js +6 -0
- package/build/templates/routes.js +11 -0
- package/build/testing/base-expect.js +17 -0
- package/build/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
- package/build/testing/browser-test-app.js +32 -0
- package/build/testing/expect-to-change.js +55 -0
- package/build/testing/expect-utils.js +269 -0
- package/build/testing/expect.js +763 -0
- package/build/testing/request-client.js +90 -0
- package/build/testing/test-files-finder.js +364 -0
- package/build/testing/test-filter-parser.js +198 -0
- package/build/testing/test-runner.js +1168 -0
- package/build/testing/test-suite-splitter.js +177 -0
- package/build/testing/test.js +370 -0
- package/build/utils/backtrace-cleaner-node.js +87 -0
- package/build/utils/backtrace-cleaner.js +266 -0
- package/build/utils/ensure-error.js +15 -0
- package/build/utils/event-emitter.js +8 -0
- package/build/utils/file-exists.js +18 -0
- package/build/utils/format-value.js +101 -0
- package/build/utils/model-scope.js +56 -0
- package/build/utils/nest-callbacks.js +22 -0
- package/build/utils/plain-object.js +14 -0
- package/build/utils/ransack.js +859 -0
- package/build/utils/rest-args-error.js +14 -0
- package/build/utils/singularize-model-name.js +18 -0
- package/build/utils/split-sql-statements.js +88 -0
- package/build/utils/to-import-specifier.js +53 -0
- package/build/utils/with-tracked-stack-async-hooks.js +103 -0
- package/build/utils/with-tracked-stack.js +38 -0
- package/build/velocious-error.js +34 -0
- package/package.json +3 -3
- package/src/configuration-types.js +1 -1
- package/src/database/record/index.js +174 -25
- package/src/environment-handlers/node/cli/commands/generate/base-models.js +50 -21
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +5 -5
- package/src/frontend-model-resource/base-resource.js +6 -2
- package/src/frontend-models/resource-definition.js +3 -3
- package/src/frontend-models/websocket-publishers.js +6 -6
|
@@ -0,0 +1,859 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import * as inflection from "inflection"
|
|
4
|
+
import {isPlainObject} from "is-plain-object"
|
|
5
|
+
import {resolveFrontendModelClass} from "../frontend-models/model-registry.js"
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* RansackPredicate type.
|
|
9
|
+
* @typedef {"cont" | "end" | "eq" | "gt" | "gteq" | "in" | "lt" | "lteq" | "not_eq" | "not_in" | "null" | "start"} RansackPredicate
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* RansackCombinator type.
|
|
14
|
+
* @typedef {"and" | "or"} RansackCombinator
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* RansackModelClass type.
|
|
19
|
+
* @typedef {typeof import("../database/record/index.js").default | typeof import("../frontend-models/base.js").default} RansackModelClass
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* RansackAttribute type.
|
|
24
|
+
* @typedef {object} RansackAttribute
|
|
25
|
+
* @property {string} attributeName - Resolved attribute name.
|
|
26
|
+
* @property {string[]} path - Resolved relationship path.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* RansackCondition type.
|
|
31
|
+
* @typedef {object} RansackCondition
|
|
32
|
+
* @property {RansackAttribute[]} attributes - Resolved attributes to test.
|
|
33
|
+
* @property {RansackCombinator} combinator - How multiple attributes are combined.
|
|
34
|
+
* @property {RansackPredicate} predicate - Parsed Ransack predicate.
|
|
35
|
+
* @property {?} value - Normalized value.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* RansackGroup type.
|
|
40
|
+
* @typedef {object} RansackGroup
|
|
41
|
+
* @property {RansackCombinator} combinator - How entries inside this group are combined.
|
|
42
|
+
* @property {RansackCondition[]} conditions - Conditions in this group.
|
|
43
|
+
* @property {RansackGroup[]} groupings - Nested groups.
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
const supportedPredicates = [
|
|
47
|
+
"not_in",
|
|
48
|
+
"not_eq",
|
|
49
|
+
"gteq",
|
|
50
|
+
"lteq",
|
|
51
|
+
"start",
|
|
52
|
+
"cont",
|
|
53
|
+
"null",
|
|
54
|
+
"end",
|
|
55
|
+
"eq",
|
|
56
|
+
"gt",
|
|
57
|
+
"lt",
|
|
58
|
+
"in"
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Runs the normalizeRansackParams helper.
|
|
63
|
+
* @param {RansackModelClass} modelClass - Model class.
|
|
64
|
+
* @param {Record<string, ?>} params - Ransack-style params hash.
|
|
65
|
+
* @returns {RansackCondition[]} - Normalized conditions.
|
|
66
|
+
*/
|
|
67
|
+
export function normalizeRansackParams(modelClass, params) {
|
|
68
|
+
return normalizeRansackGroup(modelClass, params).conditions
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Runs the normalizeRansackGroup helper.
|
|
73
|
+
* @param {RansackModelClass} modelClass - Model class.
|
|
74
|
+
* @param {Record<string, ?>} params - Ransack-style params hash.
|
|
75
|
+
* @returns {RansackGroup} - Normalized group.
|
|
76
|
+
*/
|
|
77
|
+
export function normalizeRansackGroup(modelClass, params) {
|
|
78
|
+
if (!isPlainObject(params)) {
|
|
79
|
+
throw new Error(`ransack params must be a plain object, got: ${typeof params}`)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Normalized.
|
|
84
|
+
@type {RansackGroup} */
|
|
85
|
+
const normalized = {
|
|
86
|
+
combinator: normalizeRansackCombinator(params.m, "and"),
|
|
87
|
+
conditions: [],
|
|
88
|
+
groupings: []
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
for (const [key, rawValue] of Object.entries(params)) {
|
|
92
|
+
if (key === "m") {
|
|
93
|
+
continue
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (key === "c") {
|
|
97
|
+
normalized.conditions.push(...normalizeAdvancedRansackConditions({modelClass, value: rawValue}))
|
|
98
|
+
continue
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (key === "g") {
|
|
102
|
+
normalized.groupings.push(...normalizeAdvancedRansackGroups({modelClass, value: rawValue}))
|
|
103
|
+
continue
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const condition = normalizeSimpleRansackCondition({key, modelClass, rawValue})
|
|
107
|
+
if (condition) normalized.conditions.push(condition)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return normalized
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const SKIP_RANSACK_CONDITION = Symbol("skip-ransack-condition")
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Runs normalize simple ransack condition.
|
|
117
|
+
* @param {object} args - Options.
|
|
118
|
+
* @param {string} args.key - Simple Ransack key.
|
|
119
|
+
* @param {RansackModelClass} args.modelClass - Model class.
|
|
120
|
+
* @param {?} args.rawValue - Raw condition value.
|
|
121
|
+
* @returns {RansackCondition | null} - Normalized condition, or null when skipped.
|
|
122
|
+
*/
|
|
123
|
+
function normalizeSimpleRansackCondition({key, modelClass, rawValue}) {
|
|
124
|
+
const parsedKey = parseRansackKey(key)
|
|
125
|
+
|
|
126
|
+
if (!parsedKey) {
|
|
127
|
+
throw new Error(`Unsupported ransack predicate in key: ${key}`)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const value = normalizeRansackValue({
|
|
131
|
+
predicate: parsedKey.predicate,
|
|
132
|
+
value: rawValue
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
if (value === SKIP_RANSACK_CONDITION) return null
|
|
136
|
+
|
|
137
|
+
const attributes = resolveRansackAttributes({modelClass, value: parsedKey.pathValue})
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
attributes,
|
|
141
|
+
combinator: attributes.length > 1 ? "or" : "and",
|
|
142
|
+
predicate: parsedKey.predicate,
|
|
143
|
+
value
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Runs normalize advanced ransack conditions.
|
|
149
|
+
* @param {object} args - Options.
|
|
150
|
+
* @param {RansackModelClass} args.modelClass - Model class.
|
|
151
|
+
* @param {?} args.value - Advanced conditions collection.
|
|
152
|
+
* @returns {RansackCondition[]} - Normalized conditions.
|
|
153
|
+
*/
|
|
154
|
+
function normalizeAdvancedRansackConditions({modelClass, value}) {
|
|
155
|
+
/**
|
|
156
|
+
* Conditions.
|
|
157
|
+
@type {RansackCondition[]} */
|
|
158
|
+
const conditions = []
|
|
159
|
+
|
|
160
|
+
for (const entry of normalizeRansackCollection(value, "conditions")) {
|
|
161
|
+
if (!isPlainObject(entry)) {
|
|
162
|
+
throw new Error(`Ransack condition entries must be plain objects, got: ${typeof entry}`)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const predicateValue = entry.p
|
|
166
|
+
|
|
167
|
+
if (typeof predicateValue !== "string") {
|
|
168
|
+
throw new Error("Ransack condition predicate must be a string")
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (!supportedPredicates.includes(predicateValue)) {
|
|
172
|
+
throw new Error(`Unsupported ransack predicate in condition: ${predicateValue}`)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const predicate = /**
|
|
176
|
+
* Narrows the runtime value to the documented type.
|
|
177
|
+
@type {RansackPredicate} */ (predicateValue)
|
|
178
|
+
const rawValue = advancedRansackConditionValue({predicate, value: entry.v})
|
|
179
|
+
const normalizedValue = normalizeRansackValue({predicate, value: rawValue})
|
|
180
|
+
|
|
181
|
+
if (normalizedValue === SKIP_RANSACK_CONDITION) continue
|
|
182
|
+
|
|
183
|
+
const attributes = resolveRansackAttributesFromAdvancedValue({modelClass, value: entry.a})
|
|
184
|
+
|
|
185
|
+
conditions.push({
|
|
186
|
+
attributes,
|
|
187
|
+
combinator: normalizeRansackCombinator(entry.m, attributes.length > 1 ? "or" : "and"),
|
|
188
|
+
predicate,
|
|
189
|
+
value: normalizedValue
|
|
190
|
+
})
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return conditions
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Runs normalize advanced ransack groups.
|
|
198
|
+
* @param {object} args - Options.
|
|
199
|
+
* @param {RansackModelClass} args.modelClass - Model class.
|
|
200
|
+
* @param {?} args.value - Advanced groups collection.
|
|
201
|
+
* @returns {RansackGroup[]} - Normalized groups.
|
|
202
|
+
*/
|
|
203
|
+
function normalizeAdvancedRansackGroups({modelClass, value}) {
|
|
204
|
+
/**
|
|
205
|
+
* Groupings.
|
|
206
|
+
@type {RansackGroup[]} */
|
|
207
|
+
const groupings = []
|
|
208
|
+
|
|
209
|
+
for (const entry of normalizeRansackCollection(value, "groupings")) {
|
|
210
|
+
if (!isPlainObject(entry)) {
|
|
211
|
+
throw new Error(`Ransack grouping entries must be plain objects, got: ${typeof entry}`)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
groupings.push(normalizeRansackGroup(modelClass, entry))
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return groupings
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Runs normalize ransack combinator.
|
|
222
|
+
* @param {?} value - Candidate combinator.
|
|
223
|
+
* @param {RansackCombinator} defaultValue - Default combinator.
|
|
224
|
+
* @returns {RansackCombinator} - Normalized combinator.
|
|
225
|
+
*/
|
|
226
|
+
function normalizeRansackCombinator(value, defaultValue) {
|
|
227
|
+
if (value === undefined || value === null || value === "") return defaultValue
|
|
228
|
+
if (value === "and" || value === "or") return value
|
|
229
|
+
|
|
230
|
+
throw new Error(`Invalid ransack combinator: ${String(value)}`)
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Runs normalize ransack collection.
|
|
235
|
+
* @param {?} value - Candidate collection.
|
|
236
|
+
* @param {string} name - Collection name for errors.
|
|
237
|
+
* @returns {Array<?>} - Collection values in stable order.
|
|
238
|
+
*/
|
|
239
|
+
function normalizeRansackCollection(value, name) {
|
|
240
|
+
if (value === undefined || value === null || value === "") return []
|
|
241
|
+
if (Array.isArray(value)) return value
|
|
242
|
+
|
|
243
|
+
if (isPlainObject(value)) {
|
|
244
|
+
return Object.keys(value)
|
|
245
|
+
.sort((left, right) => {
|
|
246
|
+
const leftNumber = Number(left)
|
|
247
|
+
const rightNumber = Number(right)
|
|
248
|
+
|
|
249
|
+
if (Number.isFinite(leftNumber) && Number.isFinite(rightNumber)) {
|
|
250
|
+
return leftNumber - rightNumber
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return left.localeCompare(right)
|
|
254
|
+
})
|
|
255
|
+
.map((key) => value[key])
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
throw new Error(`Ransack ${name} must be an array or object, got: ${typeof value}`)
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Runs advanced ransack condition value.
|
|
263
|
+
* @param {object} args - Options.
|
|
264
|
+
* @param {RansackPredicate} args.predicate - Parsed predicate.
|
|
265
|
+
* @param {?} args.value - Advanced condition value.
|
|
266
|
+
* @returns {?} - Value passed to predicate normalization.
|
|
267
|
+
*/
|
|
268
|
+
function advancedRansackConditionValue({predicate, value}) {
|
|
269
|
+
if (predicate === "in" || predicate === "not_in") return value
|
|
270
|
+
|
|
271
|
+
if (Array.isArray(value)) {
|
|
272
|
+
return value.find((entry) => entry !== undefined && entry !== null && entry !== "")
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return value
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Runs resolve ransack attributes from advanced value.
|
|
280
|
+
* @param {object} args - Options.
|
|
281
|
+
* @param {RansackModelClass} args.modelClass - Model class.
|
|
282
|
+
* @param {?} args.value - Advanced attribute value.
|
|
283
|
+
* @returns {RansackAttribute[]} - Resolved attributes.
|
|
284
|
+
*/
|
|
285
|
+
function resolveRansackAttributesFromAdvancedValue({modelClass, value}) {
|
|
286
|
+
const values = normalizeAdvancedAttributeValues(value)
|
|
287
|
+
/**
|
|
288
|
+
* Attributes.
|
|
289
|
+
@type {RansackAttribute[]} */
|
|
290
|
+
const attributes = []
|
|
291
|
+
|
|
292
|
+
for (const attributeValue of values) {
|
|
293
|
+
attributes.push(...resolveRansackAttributes({modelClass, value: attributeValue}))
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (attributes.length < 1) {
|
|
297
|
+
throw new Error("Ransack condition must include at least one attribute")
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
return attributes
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Runs normalize advanced attribute values.
|
|
305
|
+
* @param {?} value - Advanced attribute value.
|
|
306
|
+
* @returns {string[]} - Attribute path strings.
|
|
307
|
+
*/
|
|
308
|
+
function normalizeAdvancedAttributeValues(value) {
|
|
309
|
+
if (typeof value === "string") return [value]
|
|
310
|
+
|
|
311
|
+
if (Array.isArray(value)) {
|
|
312
|
+
return value.map((entry) => normalizeAdvancedAttributeValue(entry))
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
if (isPlainObject(value)) {
|
|
316
|
+
return normalizeRansackCollection(value, "attributes").map((entry) => normalizeAdvancedAttributeValue(entry))
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
throw new Error(`Ransack condition attributes must be strings, arrays, or objects, got: ${typeof value}`)
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Runs normalize advanced attribute value.
|
|
324
|
+
* @param {?} value - Advanced attribute entry.
|
|
325
|
+
* @returns {string} - Attribute path string.
|
|
326
|
+
*/
|
|
327
|
+
function normalizeAdvancedAttributeValue(value) {
|
|
328
|
+
if (typeof value === "string") return value
|
|
329
|
+
|
|
330
|
+
if (isPlainObject(value) && typeof value.name === "string") {
|
|
331
|
+
return value.name
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
throw new Error(`Ransack condition attribute entries must be strings or {name}, got: ${typeof value}`)
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Runs resolve ransack attributes.
|
|
339
|
+
* @param {object} args - Options.
|
|
340
|
+
* @param {RansackModelClass} args.modelClass - Model class.
|
|
341
|
+
* @param {string} args.value - Attribute path value.
|
|
342
|
+
* @returns {RansackAttribute[]} - Resolved attributes.
|
|
343
|
+
*/
|
|
344
|
+
function resolveRansackAttributes({modelClass, value}) {
|
|
345
|
+
return value.split("_or_").map((attributeValue) => {
|
|
346
|
+
const resolvedPath = resolveRansackPath({modelClass, value: attributeValue})
|
|
347
|
+
const targetModelClass = modelClassAtPath({modelClass, path: resolvedPath.path})
|
|
348
|
+
const attributeName = resolveAttributeName({modelClass: targetModelClass, value: resolvedPath.attributeValue})
|
|
349
|
+
|
|
350
|
+
if (!attributeName) {
|
|
351
|
+
throw new Error(`Unknown ransack attribute "${resolvedPath.attributeValue}" for ${targetModelClass.name}`)
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
return {
|
|
355
|
+
attributeName,
|
|
356
|
+
path: resolvedPath.path
|
|
357
|
+
}
|
|
358
|
+
})
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Runs model class at path.
|
|
363
|
+
* @param {object} args - Options.
|
|
364
|
+
* @param {RansackModelClass} args.modelClass - Root model class.
|
|
365
|
+
* @param {string[]} args.path - Relationship path.
|
|
366
|
+
* @returns {RansackModelClass} - Target model class.
|
|
367
|
+
*/
|
|
368
|
+
function modelClassAtPath({modelClass, path}) {
|
|
369
|
+
let currentModelClass = modelClass
|
|
370
|
+
|
|
371
|
+
for (const relationshipName of path) {
|
|
372
|
+
const relationship = relationshipEntries(currentModelClass)[relationshipName]
|
|
373
|
+
|
|
374
|
+
if (!relationship) {
|
|
375
|
+
throw new Error(`Unknown ransack relationship "${relationshipName}" for ${currentModelClass.name}`)
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
currentModelClass = relationship.targetModelClass
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
return currentModelClass
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Runs resolve ransack path.
|
|
386
|
+
* @param {object} args - Options.
|
|
387
|
+
* @param {RansackModelClass} args.modelClass - Current model class.
|
|
388
|
+
* @param {string} args.value - Remaining path value.
|
|
389
|
+
* @returns {{attributeValue: string, path: string[]}} - Resolved relationship path and remaining attribute value.
|
|
390
|
+
*/
|
|
391
|
+
function resolveRansackPath({modelClass, value}) {
|
|
392
|
+
/**
|
|
393
|
+
* Path.
|
|
394
|
+
@type {string[]} */
|
|
395
|
+
const path = []
|
|
396
|
+
let currentModelClass = modelClass
|
|
397
|
+
let remainingValue = value
|
|
398
|
+
|
|
399
|
+
while (true) {
|
|
400
|
+
if (resolveAttributeName({modelClass: currentModelClass, value: remainingValue})) {
|
|
401
|
+
break
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
const match = findRelationshipPrefix({
|
|
405
|
+
modelClass: currentModelClass,
|
|
406
|
+
value: remainingValue
|
|
407
|
+
})
|
|
408
|
+
|
|
409
|
+
if (!match) break
|
|
410
|
+
|
|
411
|
+
path.push(match.relationshipName)
|
|
412
|
+
currentModelClass = match.targetModelClass
|
|
413
|
+
remainingValue = match.remainingValue
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (remainingValue.length < 1) {
|
|
417
|
+
throw new Error(`Invalid ransack key path: ${value}`)
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
return {
|
|
421
|
+
attributeValue: remainingValue,
|
|
422
|
+
path
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* Runs find relationship prefix.
|
|
428
|
+
* @param {object} args - Options.
|
|
429
|
+
* @param {RansackModelClass} args.modelClass - Current model class.
|
|
430
|
+
* @param {string} args.value - Remaining value to match.
|
|
431
|
+
* @returns {{relationshipName: string, remainingValue: string, targetModelClass: RansackModelClass} | null} - Matching relationship prefix.
|
|
432
|
+
*/
|
|
433
|
+
function findRelationshipPrefix({modelClass, value}) {
|
|
434
|
+
let bestMatch = null
|
|
435
|
+
|
|
436
|
+
for (const relationshipName of Object.keys(relationshipEntries(modelClass))) {
|
|
437
|
+
const relationship = relationshipEntries(modelClass)[relationshipName]
|
|
438
|
+
|
|
439
|
+
for (const candidate of relationshipCandidates(relationshipName)) {
|
|
440
|
+
const remainingValue = stripRelationshipCandidate(value, candidate)
|
|
441
|
+
|
|
442
|
+
if (remainingValue === null) continue
|
|
443
|
+
if (remainingValue.length < 1) continue
|
|
444
|
+
if (bestMatch && candidate.length <= bestMatch.candidateLength) continue
|
|
445
|
+
|
|
446
|
+
bestMatch = {
|
|
447
|
+
candidateLength: candidate.length,
|
|
448
|
+
relationshipName,
|
|
449
|
+
remainingValue,
|
|
450
|
+
targetModelClass: relationship.targetModelClass
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
if (!bestMatch) return null
|
|
456
|
+
|
|
457
|
+
return {
|
|
458
|
+
relationshipName: bestMatch.relationshipName,
|
|
459
|
+
remainingValue: bestMatch.remainingValue,
|
|
460
|
+
targetModelClass: bestMatch.targetModelClass
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* Returns the portion of `value` after `candidate` when `candidate`
|
|
466
|
+
* sits at a relationship-path boundary, or null when there's no
|
|
467
|
+
* boundary match. Two boundary forms are accepted:
|
|
468
|
+
* - snake: `<candidate>_` followed by the rest of the path (e.g.
|
|
469
|
+
* `task_project_id` against candidate `task` returns `project_id`).
|
|
470
|
+
* - camel: `<candidate>` immediately followed by an uppercase letter,
|
|
471
|
+
* which marks a new word in camelCase (e.g. `taskProjectId` against
|
|
472
|
+
* candidate `task` returns `projectId` with the leading `P`
|
|
473
|
+
* lowercased so the remainder stays in caller-form for the next
|
|
474
|
+
* attribute / relationship match).
|
|
475
|
+
* @param {string} value - Remaining ransack path.
|
|
476
|
+
* @param {string} candidate - Relationship name candidate.
|
|
477
|
+
* @returns {string | null} - Remainder after the candidate, or null.
|
|
478
|
+
*/
|
|
479
|
+
function stripRelationshipCandidate(value, candidate) {
|
|
480
|
+
if (value.startsWith(`${candidate}_`)) {
|
|
481
|
+
return value.slice(candidate.length + 1)
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
if (value.length <= candidate.length) return null
|
|
485
|
+
if (!value.startsWith(candidate)) return null
|
|
486
|
+
|
|
487
|
+
const nextChar = value.charAt(candidate.length)
|
|
488
|
+
|
|
489
|
+
if (nextChar < "A" || nextChar > "Z") return null
|
|
490
|
+
|
|
491
|
+
return nextChar.toLowerCase() + value.slice(candidate.length + 1)
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* Runs relationship candidates.
|
|
496
|
+
* @param {string} relationshipName - Relationship name.
|
|
497
|
+
* @returns {string[]} - Candidate tokens for matching.
|
|
498
|
+
*/
|
|
499
|
+
function relationshipCandidates(relationshipName) {
|
|
500
|
+
return uniqunize([relationshipName, inflection.underscore(relationshipName)])
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* Runs resolve attribute name.
|
|
505
|
+
* @param {object} args - Options.
|
|
506
|
+
* @param {RansackModelClass} args.modelClass - Model class.
|
|
507
|
+
* @param {string} args.value - Attribute candidate.
|
|
508
|
+
* @returns {string | undefined} - Resolved attribute name.
|
|
509
|
+
*/
|
|
510
|
+
function resolveAttributeName({modelClass, value}) {
|
|
511
|
+
for (const [attributeName, columnName] of Object.entries(attributeEntries(modelClass))) {
|
|
512
|
+
if (matchesAttributeValue({attributeName, columnName, value})) {
|
|
513
|
+
return attributeName
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
return undefined
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/**
|
|
521
|
+
* Runs relationship entries.
|
|
522
|
+
* @param {RansackModelClass} modelClass - Model class.
|
|
523
|
+
* @returns {Record<string, {targetModelClass: RansackModelClass}>} - Relationship entries keyed by name.
|
|
524
|
+
*/
|
|
525
|
+
function relationshipEntries(modelClass) {
|
|
526
|
+
if (typeof /**
|
|
527
|
+
* Narrows the runtime value to the documented type.
|
|
528
|
+
@type {?} */ (modelClass).getRelationshipsMap === "function") {
|
|
529
|
+
return backendRelationshipEntries(modelClass)
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
if (typeof /**
|
|
533
|
+
* Narrows the runtime value to the documented type.
|
|
534
|
+
@type {?} */ (modelClass).relationshipDefinitions === "function" &&
|
|
535
|
+
typeof /**
|
|
536
|
+
* Narrows the runtime value to the documented type.
|
|
537
|
+
@type {?} */ (modelClass).relationshipModelClasses === "function") {
|
|
538
|
+
return frontendRelationshipEntries(modelClass)
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
return {}
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* Runs backend relationship entries.
|
|
546
|
+
* @param {RansackModelClass} modelClass - Backend model class.
|
|
547
|
+
* @returns {Record<string, {targetModelClass: RansackModelClass}>} - Relationship entries keyed by name.
|
|
548
|
+
*/
|
|
549
|
+
function backendRelationshipEntries(modelClass) {
|
|
550
|
+
/**
|
|
551
|
+
* Entries.
|
|
552
|
+
@type {Record<string, {targetModelClass: RansackModelClass}>} */
|
|
553
|
+
const entries = {}
|
|
554
|
+
const relationshipsMap = /**
|
|
555
|
+
* Narrows the runtime value to the documented type.
|
|
556
|
+
@type {?} */ (modelClass).getRelationshipsMap()
|
|
557
|
+
|
|
558
|
+
for (const relationshipName of Object.keys(relationshipsMap)) {
|
|
559
|
+
const relationship = relationshipsMap[relationshipName]
|
|
560
|
+
|
|
561
|
+
if (typeof relationship.isPolymorphic === "function" && relationship.isPolymorphic()) continue
|
|
562
|
+
|
|
563
|
+
const targetModelClass = relationship.getTargetModelClass()
|
|
564
|
+
|
|
565
|
+
if (!targetModelClass) continue
|
|
566
|
+
|
|
567
|
+
entries[relationshipName] = {targetModelClass}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
return entries
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* Runs frontend relationship entries.
|
|
575
|
+
* @param {RansackModelClass} modelClass - Frontend model class.
|
|
576
|
+
* @returns {Record<string, {targetModelClass: RansackModelClass}>} - Relationship entries keyed by name.
|
|
577
|
+
*/
|
|
578
|
+
function frontendRelationshipEntries(modelClass) {
|
|
579
|
+
/**
|
|
580
|
+
* Entries.
|
|
581
|
+
@type {Record<string, {targetModelClass: RansackModelClass}>} */
|
|
582
|
+
const entries = {}
|
|
583
|
+
const definitions = /**
|
|
584
|
+
* Narrows the runtime value to the documented type.
|
|
585
|
+
@type {?} */ (modelClass).relationshipDefinitions()
|
|
586
|
+
const relationshipModelClasses = /**
|
|
587
|
+
* Narrows the runtime value to the documented type.
|
|
588
|
+
@type {?} */ (modelClass).relationshipModelClasses()
|
|
589
|
+
|
|
590
|
+
for (const relationshipName of Object.keys(definitions)) {
|
|
591
|
+
const targetModelClass = resolveFrontendModelClass(relationshipModelClasses[relationshipName])
|
|
592
|
+
|
|
593
|
+
if (!targetModelClass) continue
|
|
594
|
+
|
|
595
|
+
entries[relationshipName] = {targetModelClass}
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
return entries
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/**
|
|
602
|
+
* Runs attribute entries.
|
|
603
|
+
* @param {RansackModelClass} modelClass - Model class.
|
|
604
|
+
* @returns {Record<string, string>} - Attribute-to-column entries keyed by attribute name.
|
|
605
|
+
*/
|
|
606
|
+
function attributeEntries(modelClass) {
|
|
607
|
+
if (typeof /**
|
|
608
|
+
* Narrows the runtime value to the documented type.
|
|
609
|
+
@type {?} */ (modelClass).getAttributeNameToColumnNameMap === "function") {
|
|
610
|
+
return /** Narrows the runtime value to the documented type. @type {Record<string, string>} */ ((/**
|
|
611
|
+
* Narrows the runtime value to the documented type.
|
|
612
|
+
@type {?} */ (modelClass).getAttributeNameToColumnNameMap()))
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
const resourceConfig = typeof /**
|
|
616
|
+
* Narrows the runtime value to the documented type.
|
|
617
|
+
@type {?} */ (modelClass).resourceConfig === "function"
|
|
618
|
+
? /**
|
|
619
|
+
* Narrows the runtime value to the documented type.
|
|
620
|
+
@type {?} */ (modelClass).resourceConfig()
|
|
621
|
+
: {}
|
|
622
|
+
const attributes = resourceConfig.attributes
|
|
623
|
+
/**
|
|
624
|
+
* Entries.
|
|
625
|
+
@type {Record<string, string>} */
|
|
626
|
+
const entries = {}
|
|
627
|
+
|
|
628
|
+
if (Array.isArray(attributes)) {
|
|
629
|
+
for (const attributeName of attributes) {
|
|
630
|
+
if (typeof attributeName !== "string") continue
|
|
631
|
+
|
|
632
|
+
entries[attributeName] = attributeName
|
|
633
|
+
}
|
|
634
|
+
} else if (isPlainObject(attributes)) {
|
|
635
|
+
for (const attributeName of Object.keys(attributes)) {
|
|
636
|
+
entries[attributeName] = attributeName
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
return entries
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/**
|
|
644
|
+
* Runs matches attribute value.
|
|
645
|
+
* @param {object} args - Options.
|
|
646
|
+
* @param {string} args.attributeName - Attribute name.
|
|
647
|
+
* @param {string} args.columnName - Column name.
|
|
648
|
+
* @param {string} args.value - Candidate value.
|
|
649
|
+
* @returns {boolean} - Whether the candidate resolves to the attribute.
|
|
650
|
+
*/
|
|
651
|
+
function matchesAttributeValue({attributeName, columnName, value}) {
|
|
652
|
+
return uniqunize([
|
|
653
|
+
attributeName,
|
|
654
|
+
columnName,
|
|
655
|
+
inflection.underscore(attributeName),
|
|
656
|
+
inflection.underscore(columnName)
|
|
657
|
+
]).includes(value)
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
/**
|
|
661
|
+
* Runs parse ransack key.
|
|
662
|
+
* @param {string} key - Ransack key.
|
|
663
|
+
* @returns {{pathValue: string, predicate: RansackPredicate} | null} - Parsed key.
|
|
664
|
+
*/
|
|
665
|
+
function parseRansackKey(key) {
|
|
666
|
+
for (const predicate of supportedPredicates) {
|
|
667
|
+
const suffix = `_${predicate}`
|
|
668
|
+
if (!key.endsWith(suffix)) continue
|
|
669
|
+
|
|
670
|
+
const pathValue = key.slice(0, key.length - suffix.length)
|
|
671
|
+
|
|
672
|
+
if (pathValue.length < 1) {
|
|
673
|
+
throw new Error(`Invalid ransack key: ${key}`)
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
return {
|
|
677
|
+
pathValue,
|
|
678
|
+
predicate: /**
|
|
679
|
+
* Narrows the runtime value to the documented type.
|
|
680
|
+
@type {RansackPredicate} */ (predicate)
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
for (const predicate of supportedPredicates) {
|
|
685
|
+
const camelSuffix = snakeToCamelSuffix(predicate)
|
|
686
|
+
|
|
687
|
+
if (!key.endsWith(camelSuffix)) continue
|
|
688
|
+
|
|
689
|
+
const pathValue = key.slice(0, key.length - camelSuffix.length)
|
|
690
|
+
|
|
691
|
+
if (pathValue.length < 1) {
|
|
692
|
+
throw new Error(`Invalid ransack key: ${key}`)
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
return {
|
|
696
|
+
pathValue,
|
|
697
|
+
predicate: /**
|
|
698
|
+
* Narrows the runtime value to the documented type.
|
|
699
|
+
@type {RansackPredicate} */ (predicate)
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
return null
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
/**
|
|
707
|
+
* Runs snake to camel suffix.
|
|
708
|
+
* @param {string} value - Snake-case predicate.
|
|
709
|
+
* @returns {string} - CamelCase predicate suffix used in ransack keys.
|
|
710
|
+
*/
|
|
711
|
+
function snakeToCamelSuffix(value) {
|
|
712
|
+
const segments = value.split("_")
|
|
713
|
+
|
|
714
|
+
return segments.map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)).join("")
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
/**
|
|
718
|
+
* Runs normalize ransack value.
|
|
719
|
+
* @param {object} args - Options.
|
|
720
|
+
* @param {RansackPredicate} args.predicate - Parsed predicate.
|
|
721
|
+
* @param {?} args.value - Raw value.
|
|
722
|
+
* @returns {?} - Normalized value.
|
|
723
|
+
*/
|
|
724
|
+
function normalizeRansackValue({predicate, value}) {
|
|
725
|
+
if (predicate === "null") {
|
|
726
|
+
return normalizeRansackNullValue(value)
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
if (predicate === "in" || predicate === "not_in") {
|
|
730
|
+
return normalizeRansackListValue(value)
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
if (ransackValueIsBlank(value)) return SKIP_RANSACK_CONDITION
|
|
734
|
+
|
|
735
|
+
return value
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
/**
|
|
739
|
+
* Runs normalize ransack null value.
|
|
740
|
+
* @param {?} value - Candidate null predicate value.
|
|
741
|
+
* @returns {boolean | typeof SKIP_RANSACK_CONDITION} - Normalized value.
|
|
742
|
+
*/
|
|
743
|
+
function normalizeRansackNullValue(value) {
|
|
744
|
+
const booleanValue = normalizeRansackBoolean(value)
|
|
745
|
+
|
|
746
|
+
return booleanValue === null ? SKIP_RANSACK_CONDITION : booleanValue
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/**
|
|
750
|
+
* Runs normalize ransack list value.
|
|
751
|
+
* @param {?} value - Candidate list predicate value.
|
|
752
|
+
* @returns {Array<?> | typeof SKIP_RANSACK_CONDITION} - Normalized value.
|
|
753
|
+
*/
|
|
754
|
+
function normalizeRansackListValue(value) {
|
|
755
|
+
const normalizedArray = normalizeRansackArray(value)
|
|
756
|
+
|
|
757
|
+
return normalizedArray.length < 1 ? SKIP_RANSACK_CONDITION : normalizedArray
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
/**
|
|
761
|
+
* Ransack true values.
|
|
762
|
+
@type {Set<?>} */
|
|
763
|
+
const ransackTrueValues = new Set([true, 1, "1", "true"])
|
|
764
|
+
/**
|
|
765
|
+
* Ransack false values.
|
|
766
|
+
@type {Set<?>} */
|
|
767
|
+
const ransackFalseValues = new Set([false, 0, "0", "false"])
|
|
768
|
+
|
|
769
|
+
/**
|
|
770
|
+
* Runs normalize ransack boolean.
|
|
771
|
+
* @param {?} value - Candidate boolean.
|
|
772
|
+
* @returns {boolean | null} - Normalized boolean or null when blank.
|
|
773
|
+
*/
|
|
774
|
+
function normalizeRansackBoolean(value) {
|
|
775
|
+
if (ransackTrueValues.has(value)) return true
|
|
776
|
+
if (ransackFalseValues.has(value)) return false
|
|
777
|
+
if (ransackValueIsBlank(value)) return null
|
|
778
|
+
|
|
779
|
+
throw new Error(`Invalid ransack boolean value: ${String(value)}`)
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
/**
|
|
783
|
+
* Runs ransack value is blank.
|
|
784
|
+
* @param {?} value - Candidate value.
|
|
785
|
+
* @returns {boolean} - Whether value should be ignored as blank.
|
|
786
|
+
*/
|
|
787
|
+
function ransackValueIsBlank(value) {
|
|
788
|
+
return value === undefined || value === null || value === ""
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
/**
|
|
792
|
+
* Runs normalize ransack array.
|
|
793
|
+
* @param {?} value - Candidate array-ish value.
|
|
794
|
+
* @returns {Array<?>} - Normalized array values.
|
|
795
|
+
*/
|
|
796
|
+
function normalizeRansackArray(value) {
|
|
797
|
+
if (Array.isArray(value)) {
|
|
798
|
+
return value.filter((entry) => entry !== undefined && entry !== null && entry !== "")
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
if (typeof value === "string") {
|
|
802
|
+
return value.split(",").map((entry) => entry.trim()).filter((entry) => entry.length > 0)
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
if (value === undefined || value === null || value === "") return []
|
|
806
|
+
|
|
807
|
+
return [value]
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
/**
|
|
811
|
+
* RansackSort type.
|
|
812
|
+
* @typedef {object} RansackSort
|
|
813
|
+
* @property {string} attribute - Resolved attribute name.
|
|
814
|
+
* @property {"asc" | "desc"} direction - Sort direction.
|
|
815
|
+
*/
|
|
816
|
+
|
|
817
|
+
/**
|
|
818
|
+
* Parses and validates a ransack `s` sort string against model attributes.
|
|
819
|
+
* @param {RansackModelClass} modelClass - Model class for attribute validation.
|
|
820
|
+
* @param {string} sortString - Ransack sort string (e.g., "name asc" or "name asc, createdAt desc").
|
|
821
|
+
* @returns {RansackSort[]} - Validated sort definitions.
|
|
822
|
+
*/
|
|
823
|
+
export function parseRansackSort(modelClass, sortString) {
|
|
824
|
+
const segments = sortString.split(",").map((segment) => segment.trim()).filter((segment) => segment.length > 0)
|
|
825
|
+
|
|
826
|
+
/**
|
|
827
|
+
* Sorts.
|
|
828
|
+
@type {RansackSort[]} */
|
|
829
|
+
const sorts = []
|
|
830
|
+
|
|
831
|
+
for (const segment of segments) {
|
|
832
|
+
const parts = segment.split(/\s+/)
|
|
833
|
+
const columnCandidate = parts[0]
|
|
834
|
+
const directionCandidate = parts.length > 1 ? parts[1].toLowerCase() : "asc"
|
|
835
|
+
|
|
836
|
+
if (directionCandidate !== "asc" && directionCandidate !== "desc") {
|
|
837
|
+
throw new Error(`Invalid ransack sort direction "${directionCandidate}" in: ${segment}`)
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
const resolvedAttribute = resolveAttributeName({modelClass, value: columnCandidate})
|
|
841
|
+
|
|
842
|
+
if (!resolvedAttribute) {
|
|
843
|
+
throw new Error(`Unknown ransack sort attribute "${columnCandidate}" for ${modelClass.name}`)
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
sorts.push({attribute: resolvedAttribute, direction: directionCandidate})
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
return sorts
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
/**
|
|
853
|
+
* Runs uniqunize.
|
|
854
|
+
* @param {string[]} values - Input values.
|
|
855
|
+
* @returns {string[]} - Unique values in original order.
|
|
856
|
+
*/
|
|
857
|
+
function uniqunize(values) {
|
|
858
|
+
return Array.from(new Set(values))
|
|
859
|
+
}
|