velocious 1.0.485 → 1.0.486

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.
@@ -1 +1 @@
1
- {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current-configuration.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/record-payload-values.js","../src/time-zone.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/cron-expression.js","../src/background-jobs/forked-runner-child.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/normalize-error.js","../src/background-jobs/scheduler.js","../src/background-jobs/socket-request.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/beacon.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/base-command.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/drop.js","../src/cli/commands/db/tenants/migrate.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/cli/commands/lint/relationships.js","../src/database/annotations-async-hooks.js","../src/database/annotations.js","../src/database/datetime-storage.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/migrations-ledger.js","../src/database/migrator.js","../src/database/use-database.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-database.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/remove-index.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mssql/sql/upsert.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-database.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/remove-index.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/mysql/sql/upsert.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-database.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/remove-index.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/pgsql/sql/upsert.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table-rebuilder.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/web-persistence.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/remove-index.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/sqlite/sql/upsert.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-database-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.js","../src/database/query/remove-index-base.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/upsert-base.js","../src/database/query/where-base.js","../src/database/query/where-combinator.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query/preloader/selection.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/acts-as-list.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/attachments/attachment-record.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/format.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/database/tenants/data-copier.js","../src/database/tenants/schema-cloner.js","../src/database/tenants/tenant-table-plan.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/beacon.js","../src/environment-handlers/node/cli/commands/cli-command-context.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/generated-file-banner.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/environment-handlers/node/cli/commands/lint/relationships.js","../src/error-reporting/request-details.js","../src/frontend-model-resource/base-resource.js","../src/frontend-model-resource/velocious-attachment-resource.js","../src/frontend-models/base.js","../src/frontend-models/built-in-resources.js","../src/frontend-models/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.js","../src/frontend-models/preloader.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/server-lock.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request-timing.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/channel-subscriber-dispatch.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/debug/controller.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/sync/conflict-strategy.js","../src/sync/device-identity.js","../src/sync/local-mutation-log.js","../src/sync/offline-grant.js","../src/sync/peer-mutation-bundle.js","../src/sync/server-change-feed.js","../src/sync/sync-envelope-replay-service.js","../src/tenants/tenant-iterator.js","../src/tenants/tenant.js","../src/testing/base-expect.js","../src/testing/browser-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner-node.js","../src/utils/backtrace-cleaner.js","../src/utils/deburr-column-name.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/is-date.js","../src/utils/model-scope.js","../src/utils/nest-callbacks.js","../src/utils/plain-object.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.3"}
1
+ {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current-configuration.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/record-payload-values.js","../src/time-zone.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/cron-expression.js","../src/background-jobs/forked-runner-child.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/normalize-error.js","../src/background-jobs/scheduler.js","../src/background-jobs/socket-request.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/beacon.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/base-command.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/drop.js","../src/cli/commands/db/tenants/migrate.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/cli/commands/lint/relationships.js","../src/database/annotations-async-hooks.js","../src/database/annotations.js","../src/database/datetime-storage.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/migrations-ledger.js","../src/database/migrator.js","../src/database/use-database.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-database.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/remove-index.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mssql/sql/upsert.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-database.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/remove-index.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/mysql/sql/upsert.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-database.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/remove-index.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/pgsql/sql/upsert.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table-rebuilder.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/web-persistence.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/remove-index.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/sqlite/sql/upsert.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-database-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.js","../src/database/query/remove-index-base.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/upsert-base.js","../src/database/query/where-base.js","../src/database/query/where-combinator.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query/preloader/selection.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/acts-as-list.js","../src/database/record/auditing.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/attachments/attachment-record.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/format.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/database/tenants/data-copier.js","../src/database/tenants/schema-cloner.js","../src/database/tenants/tenant-table-plan.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/beacon.js","../src/environment-handlers/node/cli/commands/cli-command-context.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/generated-file-banner.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/environment-handlers/node/cli/commands/lint/relationships.js","../src/error-reporting/request-details.js","../src/frontend-model-resource/base-resource.js","../src/frontend-model-resource/velocious-attachment-resource.js","../src/frontend-models/base.js","../src/frontend-models/built-in-resources.js","../src/frontend-models/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.js","../src/frontend-models/preloader.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/server-lock.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request-timing.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/channel-subscriber-dispatch.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/debug/controller.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/sync/conflict-strategy.js","../src/sync/device-identity.js","../src/sync/local-mutation-log.js","../src/sync/offline-grant.js","../src/sync/peer-mutation-bundle.js","../src/sync/server-change-feed.js","../src/sync/sync-envelope-replay-service.js","../src/tenants/tenant-iterator.js","../src/tenants/tenant.js","../src/testing/base-expect.js","../src/testing/browser-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner-node.js","../src/utils/backtrace-cleaner.js","../src/utils/deburr-column-name.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/is-date.js","../src/utils/model-scope.js","../src/utils/nest-callbacks.js","../src/utils/plain-object.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.3"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.485",
6
+ "version": "1.0.486",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -32,7 +32,7 @@ export default class VelociousDatabaseQueryCreateIndexBase extends QueryBase {
32
32
  let indexName = `index_on_`
33
33
  let columnCount = 0
34
34
 
35
- if (databaseType == "sqlite") indexName += `${this.tableName}_`
35
+ if (databaseType == "sqlite" || databaseType == "pgsql") indexName += `${this.tableName}_`
36
36
 
37
37
  for (const column of this.columns) {
38
38
  columnCount++
@@ -111,7 +111,7 @@ export default class VelociousDatabaseQueryCreateTableBase extends QueryBase {
111
111
 
112
112
  let indexName = `index_on_`
113
113
 
114
- if (databaseType == "sqlite") sql += `${tableData.getName()}_`
114
+ if (databaseType == "sqlite" || databaseType == "pgsql") indexName += `${tableData.getName()}_`
115
115
 
116
116
  indexName += column.getName()
117
117
 
@@ -181,7 +181,7 @@ export default class VelociousDatabaseQueryCreateTableBase extends QueryBase {
181
181
 
182
182
  let indexName = `index_on_`
183
183
 
184
- if (databaseType == "sqlite") indexName += `${tableData.getName()}_`
184
+ if (databaseType == "sqlite" || databaseType == "pgsql") indexName += `${tableData.getName()}_`
185
185
 
186
186
  indexName += column.getName()
187
187
 
@@ -0,0 +1,407 @@
1
+ // @ts-check
2
+
3
+ import UUID from "pure-uuid"
4
+
5
+ /**
6
+ * AuditChanges type.
7
+ * @typedef {Record<string, ?>} AuditChanges
8
+ */
9
+
10
+ /**
11
+ * AuditEventPayload type.
12
+ * @typedef {object} AuditEventPayload
13
+ * @property {string} action - Audit action name.
14
+ * @property {number | string} auditId - Created audit row id.
15
+ * @property {AuditChanges | null} auditedChanges - Changes captured for the audit.
16
+ * @property {Record<string, ?> | null} params - Optional caller-supplied audit params.
17
+ * @property {import("./index.js").default} record - Audited record.
18
+ */
19
+
20
+ /**
21
+ * AuditCallback type.
22
+ * @typedef {(payload: AuditEventPayload) => void | Promise<void>} AuditCallback
23
+ */
24
+
25
+ /**
26
+ * CreateAuditArgs type.
27
+ * @typedef {object} CreateAuditArgs
28
+ * @property {string} action - Audit action name.
29
+ * @property {AuditChanges | null} [auditedChanges] - Explicit changes to persist.
30
+ * @property {Record<string, ?> | null} [params] - Optional metadata to store with the audit.
31
+ */
32
+
33
+ /**
34
+ * AuditedModelClass type.
35
+ * @typedef {typeof import("./index.js").default & {
36
+ * _auditCallbacks?: Record<string, AuditCallback[]>,
37
+ * _auditLifecycleCallbacksRegistered?: boolean
38
+ * }} AuditedModelClass
39
+ */
40
+
41
+ /**
42
+ * Adds automatic create/update/destroy auditing callbacks to a model class.
43
+ * @param {AuditedModelClass} modelClass - Model class to audit.
44
+ * @returns {void}
45
+ */
46
+ function registerAuditing(modelClass) {
47
+ if (Object.prototype.hasOwnProperty.call(modelClass, "_auditLifecycleCallbacksRegistered") && modelClass._auditLifecycleCallbacksRegistered) {
48
+ return
49
+ }
50
+
51
+ modelClass._auditLifecycleCallbacksRegistered = true
52
+ modelClass.beforeCreate("captureCreateAuditChanges")
53
+ modelClass.afterCreate("createCreateAudit")
54
+ modelClass.beforeUpdate("captureUpdateAuditChanges")
55
+ modelClass.afterUpdate("createUpdateAudit")
56
+ modelClass.afterDestroy("createDestroyAudit")
57
+ }
58
+
59
+ /**
60
+ * Registers an audit event callback for a model/action pair.
61
+ * @param {AuditedModelClass} modelClass - Model class to observe.
62
+ * @param {string} action - Audit action name.
63
+ * @param {AuditCallback} callback - Callback invoked after matching audit rows are created.
64
+ * @returns {() => void} Unsubscribe function.
65
+ */
66
+ function registerAuditCallback(modelClass, action, callback) {
67
+ const normalizedAction = normalizeAction(action)
68
+ const callbacks = auditCallbacksForModelClass(modelClass)
69
+
70
+ if (!callbacks[normalizedAction]) {
71
+ callbacks[normalizedAction] = []
72
+ }
73
+
74
+ callbacks[normalizedAction].push(callback)
75
+
76
+ return () => {
77
+ const actionCallbacks = callbacks[normalizedAction]
78
+ const index = actionCallbacks.indexOf(callback)
79
+
80
+ if (index >= 0) {
81
+ actionCallbacks.splice(index, 1)
82
+ }
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Captures the new values for fields changed on a record.
88
+ * @param {import("./index.js").default} record - Record whose pending changes should be captured.
89
+ * @returns {AuditChanges} New values keyed by attribute name.
90
+ */
91
+ function auditChangesForCurrentChanges(record) {
92
+ const changes = record.changes()
93
+ /** @type {AuditChanges} */
94
+ const auditedChanges = {}
95
+ const columnNameToAttributeName = record.getModelClass().getColumnNameToAttributeNameMap()
96
+
97
+ for (const [attributeName, change] of Object.entries(changes)) {
98
+ auditedChanges[columnNameToAttributeName[attributeName] || attributeName] = change[1]
99
+ }
100
+
101
+ return auditedChanges
102
+ }
103
+
104
+ /**
105
+ * Captures the current attributes for a destroy audit.
106
+ * @param {import("./index.js").default} record - Record being destroyed.
107
+ * @returns {AuditChanges} Current attributes keyed by attribute name.
108
+ */
109
+ function auditChangesForDestroy(record) {
110
+ return {...record.attributes()}
111
+ }
112
+
113
+ /**
114
+ * Creates an audit row for a record.
115
+ * @param {import("./index.js").default} record - Record to audit.
116
+ * @param {CreateAuditArgs} args - Audit row options.
117
+ * @returns {Promise<number | string>} Created audit row id.
118
+ */
119
+ async function createAudit(record, args) {
120
+ const modelClass = /** @type {AuditedModelClass} */ (record.getModelClass())
121
+
122
+ return await modelClass._getConfiguration().ensureConnections({name: `${modelClass.getModelName()} audit`}, async () => {
123
+ return await createAuditWithCurrentConnection(record, args, modelClass)
124
+ })
125
+ }
126
+
127
+ /**
128
+ * Creates an audit row using the current model database connection.
129
+ * @param {import("./index.js").default} record - Record to audit.
130
+ * @param {CreateAuditArgs} args - Audit row options.
131
+ * @param {AuditedModelClass} modelClass - Audited model class.
132
+ * @returns {Promise<number | string>} Created audit row id.
133
+ */
134
+ async function createAuditWithCurrentConnection(record, args, modelClass) {
135
+ if (!record.isPersisted()) throw new Error(`Cannot audit unpersisted ${modelClass.getModelName()} record`)
136
+
137
+ const action = normalizeAction(args.action)
138
+ const auditedChanges = args.auditedChanges === undefined ? null : args.auditedChanges
139
+ const params = args.params === undefined ? null : args.params
140
+ const db = modelClass.connection()
141
+ const currentDate = new Date()
142
+ const auditActionId = await findOrCreateLookupId({
143
+ columnName: "action",
144
+ db,
145
+ tableName: "audit_actions",
146
+ value: action,
147
+ currentDate
148
+ })
149
+ const auditAuditableTypeId = await findOrCreateLookupId({
150
+ columnName: "name",
151
+ db,
152
+ tableName: "audit_auditable_types",
153
+ value: modelClass.getModelName(),
154
+ currentDate
155
+ })
156
+ const auditId = new UUID(4).format()
157
+
158
+ const insertResult = await db.query(db.insertSql({
159
+ returnLastInsertedColumnNames: ["id"],
160
+ tableName: "audits",
161
+ data: {
162
+ id: auditId,
163
+ audit_action_id: auditActionId,
164
+ audit_auditable_type_id: auditAuditableTypeId,
165
+ auditable_id: record.id(),
166
+ auditable_type: modelClass.getModelName(),
167
+ audited_changes: auditedChanges,
168
+ params,
169
+ created_at: currentDate,
170
+ updated_at: currentDate
171
+ }
172
+ }))
173
+ const insertedAuditId = auditIdFromInsertResult(insertResult) ?? auditId
174
+
175
+ await emitAuditEvent(modelClass, action, {
176
+ action,
177
+ auditId: insertedAuditId,
178
+ auditedChanges,
179
+ params,
180
+ record
181
+ })
182
+
183
+ return insertedAuditId
184
+ }
185
+
186
+ /**
187
+ * Reads an audit id returned by INSERT ... RETURNING / OUTPUT.
188
+ * @param {Array<Record<string, ?>> | null | undefined} insertResult - Insert query result.
189
+ * @returns {number | string | null} Created audit id when the driver returned it.
190
+ */
191
+ function auditIdFromInsertResult(insertResult) {
192
+ if (!Array.isArray(insertResult)) return null
193
+
194
+ const row = insertResult[0]
195
+
196
+ if (!row) return null
197
+
198
+ const id = row.id
199
+
200
+ if (typeof id == "number" || typeof id == "string") return id
201
+
202
+ return null
203
+ }
204
+
205
+ /**
206
+ * Captures create changes on a model instance.
207
+ * @param {import("./index.js").default & {_pendingCreateAuditChanges?: AuditChanges}} record - Record to capture.
208
+ * @returns {void}
209
+ */
210
+ function captureCreateAuditChanges(record) {
211
+ record._pendingCreateAuditChanges = auditChangesForCurrentChanges(record)
212
+ }
213
+
214
+ /**
215
+ * Creates the create audit row for a model instance.
216
+ * @param {import("./index.js").default & {_pendingCreateAuditChanges?: AuditChanges}} record - Record to audit.
217
+ * @returns {Promise<void>}
218
+ */
219
+ async function createCreateAudit(record) {
220
+ await createAudit(record, {
221
+ action: "create",
222
+ auditedChanges: record._pendingCreateAuditChanges || null
223
+ })
224
+
225
+ record._pendingCreateAuditChanges = undefined
226
+ }
227
+
228
+ /**
229
+ * Captures update changes on a model instance.
230
+ * @param {import("./index.js").default & {_pendingUpdateAuditChanges?: AuditChanges}} record - Record to capture.
231
+ * @returns {void}
232
+ */
233
+ function captureUpdateAuditChanges(record) {
234
+ record._pendingUpdateAuditChanges = auditChangesForCurrentChanges(record)
235
+ }
236
+
237
+ /**
238
+ * Creates the update audit row for a model instance.
239
+ * @param {import("./index.js").default & {_pendingUpdateAuditChanges?: AuditChanges}} record - Record to audit.
240
+ * @returns {Promise<void>}
241
+ */
242
+ async function createUpdateAudit(record) {
243
+ const auditedChanges = record._pendingUpdateAuditChanges || null
244
+
245
+ record._pendingUpdateAuditChanges = undefined
246
+
247
+ if (!auditedChanges || Object.keys(auditedChanges).length <= 0) return
248
+
249
+ await createAudit(record, {
250
+ action: "update",
251
+ auditedChanges
252
+ })
253
+ }
254
+
255
+ /**
256
+ * Creates the destroy audit row for a model instance.
257
+ * @param {import("./index.js").default} record - Record to audit.
258
+ * @returns {Promise<void>}
259
+ */
260
+ async function createDestroyAudit(record) {
261
+ await createAudit(record, {
262
+ action: "destroy",
263
+ auditedChanges: auditChangesForDestroy(record)
264
+ })
265
+ }
266
+
267
+ /**
268
+ * Returns records without an audit row for the given action.
269
+ * @template {AuditedModelClass} MC
270
+ * @param {MC} modelClass - Model class to scope.
271
+ * @param {string} action - Audit action to exclude.
272
+ * @returns {import("../query/model-class-query.js").default<MC>} Query scoped to records without that audit action.
273
+ */
274
+ function withoutAudit(modelClass, action) {
275
+ const db = modelClass.connection()
276
+ const modelTableSql = db.quoteTable(modelClass.tableName())
277
+ const auditsTableSql = db.quoteTable("audits")
278
+ const auditActionsTableSql = db.quoteTable("audit_actions")
279
+ const modelPrimaryKeySql = `${modelTableSql}.${db.quoteColumn(modelClass.primaryKey())}`
280
+ const auditAuditableIdSql = `${auditsTableSql}.${db.quoteColumn("auditable_id")}`
281
+ const auditAuditableTypeSql = `${auditsTableSql}.${db.quoteColumn("auditable_type")}`
282
+ const auditActionIdSql = `${auditsTableSql}.${db.quoteColumn("audit_action_id")}`
283
+ const auditActionsIdSql = `${auditActionsTableSql}.${db.quoteColumn("id")}`
284
+ const auditActionsActionSql = `${auditActionsTableSql}.${db.quoteColumn("action")}`
285
+
286
+ return modelClass
287
+ .all()
288
+ .where(`
289
+ NOT EXISTS (
290
+ SELECT 1
291
+ FROM ${auditsTableSql}
292
+ INNER JOIN ${auditActionsTableSql}
293
+ ON ${auditActionsIdSql} = ${auditActionIdSql}
294
+ WHERE ${auditAuditableTypeSql} = ${db.quote(modelClass.getModelName())}
295
+ AND ${auditAuditableIdSql} = ${modelPrimaryKeySql}
296
+ AND ${auditActionsActionSql} = ${db.quote(normalizeAction(action))}
297
+ )
298
+ `)
299
+ }
300
+
301
+ /**
302
+ * Finds or creates a lookup row and returns its id.
303
+ * @param {object} args - Options object.
304
+ * @param {string} args.columnName - Lookup value column.
305
+ * @param {Date} args.currentDate - Timestamp to write when inserting.
306
+ * @param {import("../drivers/base.js").default} args.db - Database driver.
307
+ * @param {string} args.tableName - Lookup table.
308
+ * @param {string} args.value - Lookup value.
309
+ * @returns {Promise<number | string>} Lookup row id.
310
+ */
311
+ async function findOrCreateLookupId({columnName, currentDate, db, tableName, value}) {
312
+ await db.upsert({
313
+ tableName,
314
+ conflictColumns: [columnName],
315
+ updateColumns: [columnName],
316
+ data: {
317
+ id: new UUID(4).format(),
318
+ [columnName]: value,
319
+ created_at: currentDate,
320
+ updated_at: currentDate
321
+ }
322
+ })
323
+
324
+ const id = await findLookupId({columnName, db, tableName, value})
325
+
326
+ if (id === null) throw new Error(`Couldn't find ${tableName}.${columnName} after upsert`)
327
+
328
+ return id
329
+ }
330
+
331
+ /**
332
+ * Finds a lookup id by value.
333
+ * @param {object} args - Options object.
334
+ * @param {string} args.columnName - Lookup value column.
335
+ * @param {import("../drivers/base.js").default} args.db - Database driver.
336
+ * @param {string} args.tableName - Lookup table.
337
+ * @param {string} args.value - Lookup value.
338
+ * @returns {Promise<number | string | null>} Lookup row id or null.
339
+ */
340
+ async function findLookupId({columnName, db, tableName, value}) {
341
+ const rows = /** @type {Array<{id: number | string}>} */ (await db.query(`
342
+ SELECT ${db.quoteColumn("id")} AS id
343
+ FROM ${db.quoteTable(tableName)}
344
+ WHERE ${db.quoteColumn(columnName)} = ${db.quote(value)}
345
+ `))
346
+
347
+ if (rows[0]) return rows[0].id
348
+
349
+ return null
350
+ }
351
+
352
+ /**
353
+ * Normalizes an audit action.
354
+ * @param {string} action - Action name.
355
+ * @returns {string} Normalized action.
356
+ */
357
+ function normalizeAction(action) {
358
+ const normalizedAction = action.trim()
359
+
360
+ if (!normalizedAction) throw new Error("Audit action must be present")
361
+
362
+ return normalizedAction
363
+ }
364
+
365
+ /**
366
+ * Returns the callback map owned by a model class.
367
+ * @param {AuditedModelClass} modelClass - Model class.
368
+ * @returns {Record<string, AuditCallback[]>} Callback map.
369
+ */
370
+ function auditCallbacksForModelClass(modelClass) {
371
+ if (!Object.prototype.hasOwnProperty.call(modelClass, "_auditCallbacks")) {
372
+ modelClass._auditCallbacks = {}
373
+ }
374
+
375
+ const callbacks = modelClass._auditCallbacks
376
+
377
+ if (!callbacks) throw new Error(`Audit callbacks weren't initialized for ${modelClass.getModelName()}`)
378
+
379
+ return callbacks
380
+ }
381
+
382
+ /**
383
+ * Emits audit callbacks for a model/action pair.
384
+ * @param {AuditedModelClass} modelClass - Model class.
385
+ * @param {string} action - Audit action.
386
+ * @param {AuditEventPayload} payload - Event payload.
387
+ * @returns {Promise<void>}
388
+ */
389
+ async function emitAuditEvent(modelClass, action, payload) {
390
+ const callbacks = auditCallbacksForModelClass(modelClass)[action] || []
391
+
392
+ for (const callback of [...callbacks]) {
393
+ await callback(payload)
394
+ }
395
+ }
396
+
397
+ export {
398
+ captureCreateAuditChanges,
399
+ captureUpdateAuditChanges,
400
+ createAudit,
401
+ createCreateAudit,
402
+ createDestroyAudit,
403
+ createUpdateAudit,
404
+ registerAuditCallback,
405
+ registerAuditing,
406
+ withoutAudit
407
+ }