velocious 1.0.108 → 1.0.110
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/README.md +5 -5
- package/dist/bin/velocious.d.ts +3 -0
- package/dist/bin/velocious.d.ts.map +1 -0
- package/dist/bin/velocious.js +27 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/src/application.d.ts +67 -0
- package/dist/src/application.d.ts.map +1 -0
- package/dist/src/application.js +101 -0
- package/dist/src/cli/base-command.d.ts +32 -0
- package/dist/src/cli/base-command.d.ts.map +1 -0
- package/dist/src/cli/base-command.js +34 -0
- package/dist/src/cli/browser-cli.d.ts +22 -0
- package/dist/src/cli/browser-cli.d.ts.map +1 -0
- package/dist/src/cli/browser-cli.js +32 -0
- package/dist/src/cli/commands/db/create.d.ts +9 -0
- package/dist/src/cli/commands/db/create.d.ts.map +1 -0
- package/dist/src/cli/commands/db/create.js +62 -0
- package/dist/src/cli/commands/db/drop.d.ts +5 -0
- package/dist/src/cli/commands/db/drop.d.ts.map +1 -0
- package/dist/src/cli/commands/db/drop.js +14 -0
- package/dist/src/cli/commands/db/migrate.d.ts +5 -0
- package/dist/src/cli/commands/db/migrate.d.ts.map +1 -0
- package/dist/src/cli/commands/db/migrate.js +14 -0
- package/dist/src/cli/commands/db/reset.d.ts +5 -0
- package/dist/src/cli/commands/db/reset.d.ts.map +1 -0
- package/dist/src/cli/commands/db/reset.js +18 -0
- package/dist/src/cli/commands/db/rollback.d.ts +5 -0
- package/dist/src/cli/commands/db/rollback.d.ts.map +1 -0
- package/dist/src/cli/commands/db/rollback.js +13 -0
- package/dist/src/cli/commands/destroy/migration.d.ts +5 -0
- package/dist/src/cli/commands/destroy/migration.d.ts.map +1 -0
- package/dist/src/cli/commands/destroy/migration.js +6 -0
- package/dist/src/cli/commands/generate/base-models.d.ts +5 -0
- package/dist/src/cli/commands/generate/base-models.d.ts.map +1 -0
- package/dist/src/cli/commands/generate/base-models.js +6 -0
- package/dist/src/cli/commands/generate/migration.d.ts +5 -0
- package/dist/src/cli/commands/generate/migration.d.ts.map +1 -0
- package/dist/src/cli/commands/generate/migration.js +6 -0
- package/dist/src/cli/commands/generate/model.d.ts +5 -0
- package/dist/src/cli/commands/generate/model.d.ts.map +1 -0
- package/dist/src/cli/commands/generate/model.js +6 -0
- package/dist/src/cli/commands/init.d.ts +6 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -0
- package/dist/src/cli/commands/init.js +8 -0
- package/dist/src/cli/commands/server.d.ts +5 -0
- package/dist/src/cli/commands/server.d.ts.map +1 -0
- package/dist/src/cli/commands/server.js +6 -0
- package/dist/src/cli/commands/test.d.ts +5 -0
- package/dist/src/cli/commands/test.d.ts.map +1 -0
- package/dist/src/cli/commands/test.js +6 -0
- package/dist/src/cli/index.d.ts +12 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +34 -0
- package/dist/src/cli/use-browser-cli.d.ts +10 -0
- package/dist/src/cli/use-browser-cli.d.ts.map +1 -0
- package/dist/src/cli/use-browser-cli.js +21 -0
- package/dist/src/configuration-resolver.d.ts +7 -0
- package/dist/src/configuration-resolver.d.ts.map +1 -0
- package/dist/src/configuration-resolver.js +55 -0
- package/dist/src/configuration-types.d.ts +112 -0
- package/dist/src/configuration-types.d.ts.map +1 -0
- package/dist/src/configuration-types.js +54 -0
- package/dist/src/configuration.d.ts +193 -0
- package/dist/src/configuration.d.ts.map +1 -0
- package/dist/src/configuration.js +335 -0
- package/dist/src/controller.d.ts +73 -0
- package/dist/src/controller.d.ts.map +1 -0
- package/dist/src/controller.js +141 -0
- package/dist/src/database/drivers/base-column.d.ts +72 -0
- package/dist/src/database/drivers/base-column.d.ts.map +1 -0
- package/dist/src/database/drivers/base-column.js +120 -0
- package/dist/src/database/drivers/base-columns-index.d.ts +44 -0
- package/dist/src/database/drivers/base-columns-index.d.ts.map +1 -0
- package/dist/src/database/drivers/base-columns-index.js +62 -0
- package/dist/src/database/drivers/base-foreign-key.d.ts +52 -0
- package/dist/src/database/drivers/base-foreign-key.d.ts.map +1 -0
- package/dist/src/database/drivers/base-foreign-key.js +79 -0
- package/dist/src/database/drivers/base-table.d.ts +54 -0
- package/dist/src/database/drivers/base-table.d.ts.map +1 -0
- package/dist/src/database/drivers/base-table.js +106 -0
- package/dist/src/database/drivers/base.d.ts +365 -0
- package/dist/src/database/drivers/base.d.ts.map +1 -0
- package/dist/src/database/drivers/base.js +654 -0
- package/dist/src/database/drivers/mssql/column.d.ts +13 -0
- package/dist/src/database/drivers/mssql/column.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/column.js +61 -0
- package/dist/src/database/drivers/mssql/columns-index.d.ts +4 -0
- package/dist/src/database/drivers/mssql/columns-index.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/columns-index.js +4 -0
- package/dist/src/database/drivers/mssql/connect-connection.d.ts +2 -0
- package/dist/src/database/drivers/mssql/connect-connection.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/connect-connection.js +13 -0
- package/dist/src/database/drivers/mssql/foreign-key.d.ts +9 -0
- package/dist/src/database/drivers/mssql/foreign-key.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/foreign-key.js +10 -0
- package/dist/src/database/drivers/mssql/index.d.ts +33 -0
- package/dist/src/database/drivers/mssql/index.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/index.js +304 -0
- package/dist/src/database/drivers/mssql/options.d.ts +11 -0
- package/dist/src/database/drivers/mssql/options.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/options.js +65 -0
- package/dist/src/database/drivers/mssql/query-parser.d.ts +4 -0
- package/dist/src/database/drivers/mssql/query-parser.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/query-parser.js +4 -0
- package/dist/src/database/drivers/mssql/sql/alter-table.d.ts +4 -0
- package/dist/src/database/drivers/mssql/sql/alter-table.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/sql/alter-table.js +3 -0
- package/dist/src/database/drivers/mssql/sql/create-database.d.ts +4 -0
- package/dist/src/database/drivers/mssql/sql/create-database.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/sql/create-database.js +27 -0
- package/dist/src/database/drivers/mssql/sql/create-index.d.ts +4 -0
- package/dist/src/database/drivers/mssql/sql/create-index.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/sql/create-index.js +3 -0
- package/dist/src/database/drivers/mssql/sql/create-table.d.ts +4 -0
- package/dist/src/database/drivers/mssql/sql/create-table.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/sql/create-table.js +3 -0
- package/dist/src/database/drivers/mssql/sql/delete.d.ts +5 -0
- package/dist/src/database/drivers/mssql/sql/delete.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/sql/delete.js +16 -0
- package/dist/src/database/drivers/mssql/sql/drop-table.d.ts +4 -0
- package/dist/src/database/drivers/mssql/sql/drop-table.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/sql/drop-table.js +3 -0
- package/dist/src/database/drivers/mssql/sql/insert.d.ts +4 -0
- package/dist/src/database/drivers/mssql/sql/insert.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/sql/insert.js +3 -0
- package/dist/src/database/drivers/mssql/sql/update.d.ts +5 -0
- package/dist/src/database/drivers/mssql/sql/update.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/sql/update.js +26 -0
- package/dist/src/database/drivers/mssql/table.d.ts +15 -0
- package/dist/src/database/drivers/mssql/table.d.ts.map +1 -0
- package/dist/src/database/drivers/mssql/table.js +116 -0
- package/dist/src/database/drivers/mysql/column.d.ts +13 -0
- package/dist/src/database/drivers/mysql/column.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/column.js +87 -0
- package/dist/src/database/drivers/mysql/columns-index.d.ts +4 -0
- package/dist/src/database/drivers/mysql/columns-index.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/columns-index.js +4 -0
- package/dist/src/database/drivers/mysql/foreign-key.d.ts +9 -0
- package/dist/src/database/drivers/mysql/foreign-key.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/foreign-key.js +10 -0
- package/dist/src/database/drivers/mysql/index.d.ts +30 -0
- package/dist/src/database/drivers/mysql/index.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/index.js +234 -0
- package/dist/src/database/drivers/mysql/options.d.ts +11 -0
- package/dist/src/database/drivers/mysql/options.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/options.js +27 -0
- package/dist/src/database/drivers/mysql/query-parser.d.ts +4 -0
- package/dist/src/database/drivers/mysql/query-parser.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/query-parser.js +4 -0
- package/dist/src/database/drivers/mysql/query.d.ts +6 -0
- package/dist/src/database/drivers/mysql/query.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/query.js +27 -0
- package/dist/src/database/drivers/mysql/sql/alter-table.d.ts +4 -0
- package/dist/src/database/drivers/mysql/sql/alter-table.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/sql/alter-table.js +4 -0
- package/dist/src/database/drivers/mysql/sql/create-database.d.ts +4 -0
- package/dist/src/database/drivers/mysql/sql/create-database.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/sql/create-database.js +4 -0
- package/dist/src/database/drivers/mysql/sql/create-index.d.ts +4 -0
- package/dist/src/database/drivers/mysql/sql/create-index.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/sql/create-index.js +4 -0
- package/dist/src/database/drivers/mysql/sql/create-table.d.ts +4 -0
- package/dist/src/database/drivers/mysql/sql/create-table.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/sql/create-table.js +4 -0
- package/dist/src/database/drivers/mysql/sql/delete.d.ts +5 -0
- package/dist/src/database/drivers/mysql/sql/delete.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/sql/delete.js +17 -0
- package/dist/src/database/drivers/mysql/sql/drop-table.d.ts +4 -0
- package/dist/src/database/drivers/mysql/sql/drop-table.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/sql/drop-table.js +4 -0
- package/dist/src/database/drivers/mysql/sql/insert.d.ts +4 -0
- package/dist/src/database/drivers/mysql/sql/insert.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/sql/insert.js +4 -0
- package/dist/src/database/drivers/mysql/sql/update.d.ts +5 -0
- package/dist/src/database/drivers/mysql/sql/update.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/sql/update.js +27 -0
- package/dist/src/database/drivers/mysql/table.d.ts +15 -0
- package/dist/src/database/drivers/mysql/table.d.ts.map +1 -0
- package/dist/src/database/drivers/mysql/table.js +80 -0
- package/dist/src/database/drivers/pgsql/column.d.ts +13 -0
- package/dist/src/database/drivers/pgsql/column.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/column.js +66 -0
- package/dist/src/database/drivers/pgsql/columns-index.d.ts +4 -0
- package/dist/src/database/drivers/pgsql/columns-index.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/columns-index.js +4 -0
- package/dist/src/database/drivers/pgsql/foreign-key.d.ts +9 -0
- package/dist/src/database/drivers/pgsql/foreign-key.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/foreign-key.js +10 -0
- package/dist/src/database/drivers/pgsql/index.d.ts +21 -0
- package/dist/src/database/drivers/pgsql/index.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/index.js +211 -0
- package/dist/src/database/drivers/pgsql/options.d.ts +13 -0
- package/dist/src/database/drivers/pgsql/options.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/options.js +26 -0
- package/dist/src/database/drivers/pgsql/query-parser.d.ts +4 -0
- package/dist/src/database/drivers/pgsql/query-parser.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/query-parser.js +4 -0
- package/dist/src/database/drivers/pgsql/sql/alter-table.d.ts +4 -0
- package/dist/src/database/drivers/pgsql/sql/alter-table.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/sql/alter-table.js +4 -0
- package/dist/src/database/drivers/pgsql/sql/create-database.d.ts +4 -0
- package/dist/src/database/drivers/pgsql/sql/create-database.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/sql/create-database.js +33 -0
- package/dist/src/database/drivers/pgsql/sql/create-index.d.ts +4 -0
- package/dist/src/database/drivers/pgsql/sql/create-index.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/sql/create-index.js +4 -0
- package/dist/src/database/drivers/pgsql/sql/create-table.d.ts +4 -0
- package/dist/src/database/drivers/pgsql/sql/create-table.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/sql/create-table.js +4 -0
- package/dist/src/database/drivers/pgsql/sql/delete.d.ts +5 -0
- package/dist/src/database/drivers/pgsql/sql/delete.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/sql/delete.js +17 -0
- package/dist/src/database/drivers/pgsql/sql/drop-table.d.ts +4 -0
- package/dist/src/database/drivers/pgsql/sql/drop-table.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/sql/drop-table.js +4 -0
- package/dist/src/database/drivers/pgsql/sql/insert.d.ts +4 -0
- package/dist/src/database/drivers/pgsql/sql/insert.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/sql/insert.js +4 -0
- package/dist/src/database/drivers/pgsql/sql/update.d.ts +5 -0
- package/dist/src/database/drivers/pgsql/sql/update.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/sql/update.js +27 -0
- package/dist/src/database/drivers/pgsql/table.d.ts +15 -0
- package/dist/src/database/drivers/pgsql/table.d.ts.map +1 -0
- package/dist/src/database/drivers/pgsql/table.js +105 -0
- package/dist/src/database/drivers/sqlite/base.d.ts +41 -0
- package/dist/src/database/drivers/sqlite/base.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/base.js +253 -0
- package/dist/src/database/drivers/sqlite/column.d.ts +19 -0
- package/dist/src/database/drivers/sqlite/column.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/column.js +55 -0
- package/dist/src/database/drivers/sqlite/columns-index.d.ts +6 -0
- package/dist/src/database/drivers/sqlite/columns-index.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/columns-index.js +24 -0
- package/dist/src/database/drivers/sqlite/connection-remote.d.ts +9 -0
- package/dist/src/database/drivers/sqlite/connection-remote.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/connection-remote.js +11 -0
- package/dist/src/database/drivers/sqlite/connection-sql-js.d.ts +19 -0
- package/dist/src/database/drivers/sqlite/connection-sql-js.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/connection-sql-js.js +38 -0
- package/dist/src/database/drivers/sqlite/foreign-key.d.ts +17 -0
- package/dist/src/database/drivers/sqlite/foreign-key.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/foreign-key.js +19 -0
- package/dist/src/database/drivers/sqlite/index.d.ts +8 -0
- package/dist/src/database/drivers/sqlite/index.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/index.js +42 -0
- package/dist/src/database/drivers/sqlite/index.native.d.ts +9 -0
- package/dist/src/database/drivers/sqlite/index.native.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/index.native.js +57 -0
- package/dist/src/database/drivers/sqlite/index.web.d.ts +14 -0
- package/dist/src/database/drivers/sqlite/index.web.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/index.web.js +50 -0
- package/dist/src/database/drivers/sqlite/options.d.ts +13 -0
- package/dist/src/database/drivers/sqlite/options.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/options.js +26 -0
- package/dist/src/database/drivers/sqlite/query-parser.d.ts +4 -0
- package/dist/src/database/drivers/sqlite/query-parser.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/query-parser.js +4 -0
- package/dist/src/database/drivers/sqlite/query.d.ts +7 -0
- package/dist/src/database/drivers/sqlite/query.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/query.js +28 -0
- package/dist/src/database/drivers/sqlite/query.native.d.ts +2 -0
- package/dist/src/database/drivers/sqlite/query.native.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/query.native.js +20 -0
- package/dist/src/database/drivers/sqlite/query.web.d.ts +7 -0
- package/dist/src/database/drivers/sqlite/query.web.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/query.web.js +38 -0
- package/dist/src/database/drivers/sqlite/sql/alter-table.d.ts +6 -0
- package/dist/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/sql/alter-table.js +122 -0
- package/dist/src/database/drivers/sqlite/sql/create-index.d.ts +4 -0
- package/dist/src/database/drivers/sqlite/sql/create-index.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/sql/create-index.js +4 -0
- package/dist/src/database/drivers/sqlite/sql/create-table.d.ts +4 -0
- package/dist/src/database/drivers/sqlite/sql/create-table.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/sql/create-table.js +4 -0
- package/dist/src/database/drivers/sqlite/sql/delete.d.ts +5 -0
- package/dist/src/database/drivers/sqlite/sql/delete.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/sql/delete.js +20 -0
- package/dist/src/database/drivers/sqlite/sql/drop-table.d.ts +4 -0
- package/dist/src/database/drivers/sqlite/sql/drop-table.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/sql/drop-table.js +4 -0
- package/dist/src/database/drivers/sqlite/sql/insert.d.ts +4 -0
- package/dist/src/database/drivers/sqlite/sql/insert.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/sql/insert.js +4 -0
- package/dist/src/database/drivers/sqlite/sql/update.d.ts +5 -0
- package/dist/src/database/drivers/sqlite/sql/update.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/sql/update.js +27 -0
- package/dist/src/database/drivers/sqlite/table.d.ts +21 -0
- package/dist/src/database/drivers/sqlite/table.d.ts.map +1 -0
- package/dist/src/database/drivers/sqlite/table.js +76 -0
- package/dist/src/database/handler.d.ts +7 -0
- package/dist/src/database/handler.d.ts.map +1 -0
- package/dist/src/database/handler.js +10 -0
- package/dist/src/database/initializer-from-require-context.d.ts +26 -0
- package/dist/src/database/initializer-from-require-context.d.ts.map +1 -0
- package/dist/src/database/initializer-from-require-context.js +40 -0
- package/dist/src/database/migration/index.d.ts +152 -0
- package/dist/src/database/migration/index.d.ts.map +1 -0
- package/dist/src/database/migration/index.js +286 -0
- package/dist/src/database/migrator/files-finder.d.ts +15 -0
- package/dist/src/database/migrator/files-finder.d.ts.map +1 -0
- package/dist/src/database/migrator/files-finder.js +40 -0
- package/dist/src/database/migrator/types.d.ts +17 -0
- package/dist/src/database/migrator/types.d.ts.map +1 -0
- package/dist/src/database/migrator/types.js +2 -0
- package/dist/src/database/migrator.d.ts +79 -0
- package/dist/src/database/migrator.d.ts.map +1 -0
- package/dist/src/database/migrator.js +377 -0
- package/dist/src/database/pool/async-tracked-multi-connection.d.ts +11 -0
- package/dist/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -0
- package/dist/src/database/pool/async-tracked-multi-connection.js +80 -0
- package/dist/src/database/pool/base-methods-forward.d.ts +6 -0
- package/dist/src/database/pool/base-methods-forward.d.ts.map +1 -0
- package/dist/src/database/pool/base-methods-forward.js +37 -0
- package/dist/src/database/pool/base.d.ts +76 -0
- package/dist/src/database/pool/base.d.ts.map +1 -0
- package/dist/src/database/pool/base.js +111 -0
- package/dist/src/database/pool/single-multi-use.d.ts +5 -0
- package/dist/src/database/pool/single-multi-use.d.ts.map +1 -0
- package/dist/src/database/pool/single-multi-use.js +35 -0
- package/dist/src/database/query/alter-table-base.d.ts +15 -0
- package/dist/src/database/query/alter-table-base.d.ts.map +1 -0
- package/dist/src/database/query/alter-table-base.js +55 -0
- package/dist/src/database/query/base.d.ts +26 -0
- package/dist/src/database/query/base.d.ts.map +1 -0
- package/dist/src/database/query/base.js +38 -0
- package/dist/src/database/query/create-database-base.d.ts +19 -0
- package/dist/src/database/query/create-database-base.d.ts.map +1 -0
- package/dist/src/database/query/create-database-base.js +29 -0
- package/dist/src/database/query/create-index-base.d.ts +31 -0
- package/dist/src/database/query/create-index-base.d.ts.map +1 -0
- package/dist/src/database/query/create-index-base.js +94 -0
- package/dist/src/database/query/create-table-base.d.ts +25 -0
- package/dist/src/database/query/create-table-base.d.ts.map +1 -0
- package/dist/src/database/query/create-table-base.js +136 -0
- package/dist/src/database/query/delete-base.d.ts +17 -0
- package/dist/src/database/query/delete-base.d.ts.map +1 -0
- package/dist/src/database/query/delete-base.js +15 -0
- package/dist/src/database/query/drop-table-base.d.ts +20 -0
- package/dist/src/database/query/drop-table-base.d.ts.map +1 -0
- package/dist/src/database/query/drop-table-base.js +44 -0
- package/dist/src/database/query/from-base.d.ts +19 -0
- package/dist/src/database/query/from-base.d.ts.map +1 -0
- package/dist/src/database/query/from-base.js +27 -0
- package/dist/src/database/query/from-plain.d.ts +9 -0
- package/dist/src/database/query/from-plain.d.ts.map +1 -0
- package/dist/src/database/query/from-plain.js +12 -0
- package/dist/src/database/query/from-table.d.ts +9 -0
- package/dist/src/database/query/from-table.d.ts.map +1 -0
- package/dist/src/database/query/from-table.js +14 -0
- package/dist/src/database/query/index.d.ts +219 -0
- package/dist/src/database/query/index.d.ts.map +1 -0
- package/dist/src/database/query/index.js +437 -0
- package/dist/src/database/query/insert-base.d.ts +41 -0
- package/dist/src/database/query/insert-base.d.ts.map +1 -0
- package/dist/src/database/query/insert-base.js +135 -0
- package/dist/src/database/query/join-base.d.ts +22 -0
- package/dist/src/database/query/join-base.d.ts.map +1 -0
- package/dist/src/database/query/join-base.js +33 -0
- package/dist/src/database/query/join-object.d.ts +24 -0
- package/dist/src/database/query/join-object.d.ts.map +1 -0
- package/dist/src/database/query/join-object.js +58 -0
- package/dist/src/database/query/join-plain.d.ts +10 -0
- package/dist/src/database/query/join-plain.d.ts.map +1 -0
- package/dist/src/database/query/join-plain.js +14 -0
- package/dist/src/database/query/order-base.d.ts +19 -0
- package/dist/src/database/query/order-base.d.ts.map +1 -0
- package/dist/src/database/query/order-base.js +26 -0
- package/dist/src/database/query/order-plain.d.ts +13 -0
- package/dist/src/database/query/order-plain.d.ts.map +1 -0
- package/dist/src/database/query/order-plain.js +22 -0
- package/dist/src/database/query/preloader/belongs-to.d.ts +15 -0
- package/dist/src/database/query/preloader/belongs-to.d.ts.map +1 -0
- package/dist/src/database/query/preloader/belongs-to.js +48 -0
- package/dist/src/database/query/preloader/has-many.d.ts +15 -0
- package/dist/src/database/query/preloader/has-many.d.ts.map +1 -0
- package/dist/src/database/query/preloader/has-many.js +63 -0
- package/dist/src/database/query/preloader/has-one.d.ts +15 -0
- package/dist/src/database/query/preloader/has-one.d.ts.map +1 -0
- package/dist/src/database/query/preloader/has-one.js +55 -0
- package/dist/src/database/query/preloader.d.ts +18 -0
- package/dist/src/database/query/preloader.d.ts.map +1 -0
- package/dist/src/database/query/preloader.js +52 -0
- package/dist/src/database/query/select-base.d.ts +17 -0
- package/dist/src/database/query/select-base.d.ts.map +1 -0
- package/dist/src/database/query/select-base.js +24 -0
- package/dist/src/database/query/select-plain.d.ts +9 -0
- package/dist/src/database/query/select-plain.d.ts.map +1 -0
- package/dist/src/database/query/select-plain.js +14 -0
- package/dist/src/database/query/select-table-and-column.d.ts +13 -0
- package/dist/src/database/query/select-table-and-column.d.ts.map +1 -0
- package/dist/src/database/query/select-table-and-column.js +22 -0
- package/dist/src/database/query/update-base.d.ts +25 -0
- package/dist/src/database/query/update-base.d.ts.map +1 -0
- package/dist/src/database/query/update-base.js +25 -0
- package/dist/src/database/query/where-base.d.ts +21 -0
- package/dist/src/database/query/where-base.d.ts.map +1 -0
- package/dist/src/database/query/where-base.js +30 -0
- package/dist/src/database/query/where-hash.d.ts +22 -0
- package/dist/src/database/query/where-hash.d.ts.map +1 -0
- package/dist/src/database/query/where-hash.js +56 -0
- package/dist/src/database/query/where-plain.d.ts +10 -0
- package/dist/src/database/query/where-plain.d.ts.map +1 -0
- package/dist/src/database/query/where-plain.js +16 -0
- package/dist/src/database/query-parser/base-query-parser.d.ts +15 -0
- package/dist/src/database/query-parser/base-query-parser.d.ts.map +1 -0
- package/dist/src/database/query-parser/base-query-parser.js +33 -0
- package/dist/src/database/query-parser/from-parser.d.ts +16 -0
- package/dist/src/database/query-parser/from-parser.d.ts.map +1 -0
- package/dist/src/database/query-parser/from-parser.js +35 -0
- package/dist/src/database/query-parser/group-parser.d.ts +18 -0
- package/dist/src/database/query-parser/group-parser.d.ts.map +1 -0
- package/dist/src/database/query-parser/group-parser.js +44 -0
- package/dist/src/database/query-parser/joins-parser.d.ts +16 -0
- package/dist/src/database/query-parser/joins-parser.d.ts.map +1 -0
- package/dist/src/database/query-parser/joins-parser.js +30 -0
- package/dist/src/database/query-parser/limit-parser.d.ts +15 -0
- package/dist/src/database/query-parser/limit-parser.d.ts.map +1 -0
- package/dist/src/database/query-parser/limit-parser.js +56 -0
- package/dist/src/database/query-parser/options.d.ts +58 -0
- package/dist/src/database/query-parser/options.d.ts.map +1 -0
- package/dist/src/database/query-parser/options.js +78 -0
- package/dist/src/database/query-parser/order-parser.d.ts +15 -0
- package/dist/src/database/query-parser/order-parser.d.ts.map +1 -0
- package/dist/src/database/query-parser/order-parser.js +39 -0
- package/dist/src/database/query-parser/select-parser.d.ts +15 -0
- package/dist/src/database/query-parser/select-parser.d.ts.map +1 -0
- package/dist/src/database/query-parser/select-parser.js +49 -0
- package/dist/src/database/query-parser/where-parser.d.ts +15 -0
- package/dist/src/database/query-parser/where-parser.d.ts.map +1 -0
- package/dist/src/database/query-parser/where-parser.js +39 -0
- package/dist/src/database/record/index.d.ts +495 -0
- package/dist/src/database/record/index.d.ts.map +1 -0
- package/dist/src/database/record/index.js +1408 -0
- package/dist/src/database/record/instance-relationships/base.d.ts +74 -0
- package/dist/src/database/record/instance-relationships/base.d.ts.map +1 -0
- package/dist/src/database/record/instance-relationships/base.js +81 -0
- package/dist/src/database/record/instance-relationships/belongs-to.d.ts +4 -0
- package/dist/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -0
- package/dist/src/database/record/instance-relationships/belongs-to.js +28 -0
- package/dist/src/database/record/instance-relationships/has-many.d.ts +8 -0
- package/dist/src/database/record/instance-relationships/has-many.d.ts.map +1 -0
- package/dist/src/database/record/instance-relationships/has-many.js +103 -0
- package/dist/src/database/record/instance-relationships/has-one.d.ts +7 -0
- package/dist/src/database/record/instance-relationships/has-one.d.ts.map +1 -0
- package/dist/src/database/record/instance-relationships/has-one.js +50 -0
- package/dist/src/database/record/record-not-found-error.d.ts +3 -0
- package/dist/src/database/record/record-not-found-error.d.ts.map +1 -0
- package/dist/src/database/record/record-not-found-error.js +3 -0
- package/dist/src/database/record/relationships/base.d.ts +68 -0
- package/dist/src/database/record/relationships/base.d.ts.map +1 -0
- package/dist/src/database/record/relationships/base.js +79 -0
- package/dist/src/database/record/relationships/belongs-to.d.ts +5 -0
- package/dist/src/database/record/relationships/belongs-to.d.ts.map +1 -0
- package/dist/src/database/record/relationships/belongs-to.js +37 -0
- package/dist/src/database/record/relationships/has-many.d.ts +5 -0
- package/dist/src/database/record/relationships/has-many.d.ts.map +1 -0
- package/dist/src/database/record/relationships/has-many.js +30 -0
- package/dist/src/database/record/relationships/has-one.d.ts +5 -0
- package/dist/src/database/record/relationships/has-one.d.ts.map +1 -0
- package/dist/src/database/record/relationships/has-one.js +30 -0
- package/dist/src/database/record/user-module.d.ts +15 -0
- package/dist/src/database/record/user-module.d.ts.map +1 -0
- package/dist/src/database/record/user-module.js +34 -0
- package/dist/src/database/record/validators/base.d.ts +25 -0
- package/dist/src/database/record/validators/base.d.ts.map +1 -0
- package/dist/src/database/record/validators/base.js +22 -0
- package/dist/src/database/record/validators/presence.d.ts +4 -0
- package/dist/src/database/record/validators/presence.d.ts.map +1 -0
- package/dist/src/database/record/validators/presence.js +17 -0
- package/dist/src/database/record/validators/uniqueness.d.ts +4 -0
- package/dist/src/database/record/validators/uniqueness.d.ts.map +1 -0
- package/dist/src/database/record/validators/uniqueness.js +33 -0
- package/dist/src/database/table-data/index.d.ts +141 -0
- package/dist/src/database/table-data/index.d.ts.map +1 -0
- package/dist/src/database/table-data/index.js +167 -0
- package/dist/src/database/table-data/table-column.d.ts +153 -0
- package/dist/src/database/table-data/table-column.d.ts.map +1 -0
- package/dist/src/database/table-data/table-column.js +246 -0
- package/dist/src/database/table-data/table-foreign-key.d.ts +55 -0
- package/dist/src/database/table-data/table-foreign-key.d.ts.map +1 -0
- package/dist/src/database/table-data/table-foreign-key.js +51 -0
- package/dist/src/database/table-data/table-index.d.ts +31 -0
- package/dist/src/database/table-data/table-index.d.ts.map +1 -0
- package/dist/src/database/table-data/table-index.js +33 -0
- package/dist/src/database/table-data/table-reference.d.ts +10 -0
- package/dist/src/database/table-data/table-reference.d.ts.map +1 -0
- package/dist/src/database/table-data/table-reference.js +11 -0
- package/dist/src/database/use-database.d.ts +11 -0
- package/dist/src/database/use-database.d.ts.map +1 -0
- package/dist/src/database/use-database.js +39 -0
- package/dist/src/environment-handlers/base.d.ts +128 -0
- package/dist/src/environment-handlers/base.d.ts.map +1 -0
- package/dist/src/environment-handlers/base.js +136 -0
- package/dist/src/environment-handlers/browser.d.ts +65 -0
- package/dist/src/environment-handlers/browser.d.ts.map +1 -0
- package/dist/src/environment-handlers/browser.js +160 -0
- package/dist/src/environment-handlers/node/cli/commands/destroy/migration.d.ts +14 -0
- package/dist/src/environment-handlers/node/cli/commands/destroy/migration.d.ts.map +1 -0
- package/dist/src/environment-handlers/node/cli/commands/destroy/migration.js +34 -0
- package/dist/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +10 -0
- package/dist/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -0
- package/dist/src/environment-handlers/node/cli/commands/generate/base-models.js +221 -0
- package/dist/src/environment-handlers/node/cli/commands/generate/migration.d.ts +19 -0
- package/dist/src/environment-handlers/node/cli/commands/generate/migration.d.ts.map +1 -0
- package/dist/src/environment-handlers/node/cli/commands/generate/migration.js +36 -0
- package/dist/src/environment-handlers/node/cli/commands/generate/model.d.ts +18 -0
- package/dist/src/environment-handlers/node/cli/commands/generate/model.d.ts.map +1 -0
- package/dist/src/environment-handlers/node/cli/commands/generate/model.js +36 -0
- package/dist/src/environment-handlers/node/cli/commands/init.d.ts +18 -0
- package/dist/src/environment-handlers/node/cli/commands/init.d.ts.map +1 -0
- package/dist/src/environment-handlers/node/cli/commands/init.js +60 -0
- package/dist/src/environment-handlers/node/cli/commands/server.d.ts +11 -0
- package/dist/src/environment-handlers/node/cli/commands/server.d.ts.map +1 -0
- package/dist/src/environment-handlers/node/cli/commands/server.js +26 -0
- package/dist/src/environment-handlers/node/cli/commands/test.d.ts +5 -0
- package/dist/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -0
- package/dist/src/environment-handlers/node/cli/commands/test.js +41 -0
- package/dist/src/environment-handlers/node.d.ts +47 -0
- package/dist/src/environment-handlers/node.d.ts.map +1 -0
- package/dist/src/environment-handlers/node.js +188 -0
- package/dist/src/error-logger.d.ts +5 -0
- package/dist/src/error-logger.d.ts.map +1 -0
- package/dist/src/error-logger.js +32 -0
- package/dist/src/http-client/header.d.ts +13 -0
- package/dist/src/http-client/header.d.ts.map +1 -0
- package/dist/src/http-client/header.js +14 -0
- package/dist/src/http-client/index.d.ts +57 -0
- package/dist/src/http-client/index.d.ts.map +1 -0
- package/dist/src/http-client/index.js +118 -0
- package/dist/src/http-client/request.d.ts +39 -0
- package/dist/src/http-client/request.d.ts.map +1 -0
- package/dist/src/http-client/request.js +66 -0
- package/dist/src/http-client/response.d.ts +31 -0
- package/dist/src/http-client/response.d.ts.map +1 -0
- package/dist/src/http-client/response.js +119 -0
- package/dist/src/http-server/client/index.d.ts +37 -0
- package/dist/src/http-server/client/index.d.ts.map +1 -0
- package/dist/src/http-server/client/index.js +116 -0
- package/dist/src/http-server/client/params-to-object.d.ts +21 -0
- package/dist/src/http-server/client/params-to-object.d.ts.map +1 -0
- package/dist/src/http-server/client/params-to-object.js +80 -0
- package/dist/src/http-server/client/request-buffer/form-data-part.d.ts +21 -0
- package/dist/src/http-server/client/request-buffer/form-data-part.d.ts.map +1 -0
- package/dist/src/http-server/client/request-buffer/form-data-part.js +45 -0
- package/dist/src/http-server/client/request-buffer/header.d.ts +15 -0
- package/dist/src/http-server/client/request-buffer/header.d.ts.map +1 -0
- package/dist/src/http-server/client/request-buffer/header.js +16 -0
- package/dist/src/http-server/client/request-buffer/index.d.ts +95 -0
- package/dist/src/http-server/client/request-buffer/index.d.ts.map +1 -0
- package/dist/src/http-server/client/request-buffer/index.js +305 -0
- package/dist/src/http-server/client/request-parser.d.ts +52 -0
- package/dist/src/http-server/client/request-parser.d.ts.map +1 -0
- package/dist/src/http-server/client/request-parser.js +98 -0
- package/dist/src/http-server/client/request-runner.d.ts +24 -0
- package/dist/src/http-server/client/request-runner.d.ts.map +1 -0
- package/dist/src/http-server/client/request-runner.js +58 -0
- package/dist/src/http-server/client/request.d.ts +39 -0
- package/dist/src/http-server/client/request.d.ts.map +1 -0
- package/dist/src/http-server/client/request.js +54 -0
- package/dist/src/http-server/client/response.d.ts +56 -0
- package/dist/src/http-server/client/response.d.ts.map +1 -0
- package/dist/src/http-server/client/response.js +90 -0
- package/dist/src/http-server/index.d.ts +58 -0
- package/dist/src/http-server/index.d.ts.map +1 -0
- package/dist/src/http-server/index.js +147 -0
- package/dist/src/http-server/server-client.d.ts +43 -0
- package/dist/src/http-server/server-client.d.ts.map +1 -0
- package/dist/src/http-server/server-client.js +70 -0
- package/dist/src/http-server/worker-handler/index.d.ts +49 -0
- package/dist/src/http-server/worker-handler/index.d.ts.map +1 -0
- package/dist/src/http-server/worker-handler/index.js +104 -0
- package/dist/src/http-server/worker-handler/worker-script.d.ts +2 -0
- package/dist/src/http-server/worker-handler/worker-script.d.ts.map +1 -0
- package/dist/src/http-server/worker-handler/worker-script.js +4 -0
- package/dist/src/http-server/worker-handler/worker-thread.d.ts +47 -0
- package/dist/src/http-server/worker-handler/worker-thread.d.ts.map +1 -0
- package/dist/src/http-server/worker-handler/worker-thread.js +88 -0
- package/dist/src/initializer.d.ts +27 -0
- package/dist/src/initializer.d.ts.map +1 -0
- package/dist/src/initializer.js +29 -0
- package/dist/src/logger.d.ts +39 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +154 -0
- package/dist/src/routes/app-routes.d.ts +8 -0
- package/dist/src/routes/app-routes.d.ts.map +1 -0
- package/dist/src/routes/app-routes.js +13 -0
- package/dist/src/routes/base-route.d.ts +60 -0
- package/dist/src/routes/base-route.d.ts.map +1 -0
- package/dist/src/routes/base-route.js +67 -0
- package/dist/src/routes/basic-route.d.ts +10 -0
- package/dist/src/routes/basic-route.d.ts.map +1 -0
- package/dist/src/routes/basic-route.js +61 -0
- package/dist/src/routes/built-in/errors/controller.d.ts +5 -0
- package/dist/src/routes/built-in/errors/controller.d.ts.map +1 -0
- package/dist/src/routes/built-in/errors/controller.js +6 -0
- package/dist/src/routes/get-route.d.ts +14 -0
- package/dist/src/routes/get-route.d.ts.map +1 -0
- package/dist/src/routes/get-route.js +33 -0
- package/dist/src/routes/index.d.ts +10 -0
- package/dist/src/routes/index.d.ts.map +1 -0
- package/dist/src/routes/index.js +16 -0
- package/dist/src/routes/namespace-route.d.ts +14 -0
- package/dist/src/routes/namespace-route.d.ts.map +1 -0
- package/dist/src/routes/namespace-route.js +34 -0
- package/dist/src/routes/post-route.d.ts +14 -0
- package/dist/src/routes/post-route.d.ts.map +1 -0
- package/dist/src/routes/post-route.js +33 -0
- package/dist/src/routes/resolver.d.ts +27 -0
- package/dist/src/routes/resolver.d.ts.map +1 -0
- package/dist/src/routes/resolver.js +92 -0
- package/dist/src/routes/resource-route.d.ts +14 -0
- package/dist/src/routes/resource-route.d.ts.map +1 -0
- package/dist/src/routes/resource-route.js +51 -0
- package/dist/src/routes/root-route.d.ts +4 -0
- package/dist/src/routes/root-route.d.ts.map +1 -0
- package/dist/src/routes/root-route.js +4 -0
- package/dist/src/testing/request-client.d.ts +35 -0
- package/dist/src/testing/request-client.d.ts.map +1 -0
- package/dist/src/testing/request-client.js +61 -0
- package/dist/src/testing/test-files-finder.d.ts +64 -0
- package/dist/src/testing/test-files-finder.d.ts.map +1 -0
- package/dist/src/testing/test-files-finder.js +159 -0
- package/dist/src/testing/test-runner.d.ts +163 -0
- package/dist/src/testing/test-runner.d.ts.map +1 -0
- package/dist/src/testing/test-runner.js +257 -0
- package/dist/src/testing/test.d.ts +157 -0
- package/dist/src/testing/test.d.ts.map +1 -0
- package/dist/src/testing/test.js +408 -0
- package/dist/src/utils/backtrace-cleaner.d.ts +17 -0
- package/dist/src/utils/backtrace-cleaner.d.ts.map +1 -0
- package/dist/src/utils/backtrace-cleaner.js +23 -0
- package/dist/src/utils/ensure-error.d.ts +6 -0
- package/dist/src/utils/ensure-error.d.ts.map +1 -0
- package/dist/src/utils/ensure-error.js +13 -0
- package/dist/src/utils/file-exists.d.ts +6 -0
- package/dist/src/utils/file-exists.d.ts.map +1 -0
- package/dist/src/utils/file-exists.js +15 -0
- package/dist/src/utils/nest-callbacks.d.ts +2 -0
- package/dist/src/utils/nest-callbacks.d.ts.map +1 -0
- package/dist/src/utils/nest-callbacks.js +11 -0
- package/dist/src/utils/rest-args-error.d.ts +6 -0
- package/dist/src/utils/rest-args-error.d.ts.map +1 -0
- package/dist/src/utils/rest-args-error.js +11 -0
- package/dist/src/utils/with-tracked-stack-async-hooks.d.ts +10 -0
- package/dist/src/utils/with-tracked-stack-async-hooks.d.ts.map +1 -0
- package/dist/src/utils/with-tracked-stack-async-hooks.js +69 -0
- package/dist/src/utils/with-tracked-stack.d.ts +8 -0
- package/dist/src/utils/with-tracked-stack.d.ts.map +1 -0
- package/dist/src/utils/with-tracked-stack.js +26 -0
- package/package.json +10 -5
- package/.github/dependabot.yml +0 -9
- package/bin/velocious.js +0 -34
- package/eslint.config.js +0 -34
- package/index.js +0 -1
- package/peak_flow.yml +0 -89
- package/run-tests.sh +0 -4
- package/spec/cli/commands/db/create-spec.js +0 -58
- package/spec/cli/commands/db/migrate-spec.js +0 -160
- package/spec/cli/commands/db/rollback-spec.js +0 -179
- package/spec/cli/commands/destroy/migration-spec.js +0 -19
- package/spec/cli/commands/generate/migration-spec.js +0 -22
- package/spec/cli/commands/init-spec.js +0 -23
- package/spec/cli/commands/test/test-files-finder-spec.js +0 -15
- package/spec/database/connection/drivers/mysql/query-parser-spec.js +0 -41
- package/spec/database/drivers/columns-spec.js +0 -27
- package/spec/database/drivers/create-sql/create-index-sql-spec.js +0 -24
- package/spec/database/drivers/mysql/connection-spec.js +0 -22
- package/spec/database/migration/column-exists-spec.js +0 -28
- package/spec/database/record/create-spec.js +0 -140
- package/spec/database/record/destroy-spec.js +0 -35
- package/spec/database/record/find-or-create-spec.js +0 -59
- package/spec/database/record/find-spec.js +0 -32
- package/spec/database/record/instance-relationships/belongs-to-relationship-spec.js +0 -21
- package/spec/database/record/instance-relationships/has-many-relationship-spec.js +0 -24
- package/spec/database/record/instance-relationships/has-one-relationship-spec.js +0 -24
- package/spec/database/record/last-spec.js +0 -29
- package/spec/database/record/preloader/belongs-to-spec.js +0 -15
- package/spec/database/record/preloader/has-many-spec.js +0 -29
- package/spec/database/record/preloader/has-one-spec.js +0 -15
- package/spec/database/record/query-spec.js +0 -120
- package/spec/database/record/translation-fallbacks-spec.js +0 -24
- package/spec/database/record/translations-spec.js +0 -10
- package/spec/database/record/update-spec.js +0 -31
- package/spec/database/record/validations-spec.js +0 -42
- package/spec/database/transactions-spec.js +0 -47
- package/spec/dummy/db/.keep +0 -0
- package/spec/dummy/dummy-directory.js +0 -13
- package/spec/dummy/index.js +0 -83
- package/spec/dummy/src/config/configuration.example.js +0 -70
- package/spec/dummy/src/config/configuration.peakflow.mariadb.js +0 -65
- package/spec/dummy/src/config/configuration.peakflow.mssql.js +0 -71
- package/spec/dummy/src/config/configuration.peakflow.pgsql.js +0 -65
- package/spec/dummy/src/config/configuration.peakflow.sqlite.js +0 -62
- package/spec/dummy/src/config/routes.js +0 -19
- package/spec/dummy/src/config/testing.js +0 -34
- package/spec/dummy/src/database/migrations/20230728075328-create-projects.js +0 -10
- package/spec/dummy/src/database/migrations/20230728075329-create-tasks.js +0 -12
- package/spec/dummy/src/database/migrations/20250605133926-create-project-translations.js +0 -16
- package/spec/dummy/src/database/migrations/20250903112845-create-accounts.js +0 -18
- package/spec/dummy/src/database/migrations/20250912183605-create-users.js +0 -16
- package/spec/dummy/src/database/migrations/20250912183606-create-authentication-tokens.js +0 -15
- package/spec/dummy/src/database/migrations/20250915085450-change-authentication-tokens-user-id-nullable.js +0 -11
- package/spec/dummy/src/database/migrations/20250916111330-rename_authentication_tokens_token_to_user_token.js +0 -11
- package/spec/dummy/src/database/migrations/20250921121002-create-project-details.js +0 -17
- package/spec/dummy/src/model-bases/account.js +0 -67
- package/spec/dummy/src/model-bases/authentication-token.js +0 -108
- package/spec/dummy/src/model-bases/project-detail.js +0 -101
- package/spec/dummy/src/model-bases/project-translation.js +0 -124
- package/spec/dummy/src/model-bases/project.js +0 -196
- package/spec/dummy/src/model-bases/task.js +0 -117
- package/spec/dummy/src/model-bases/user.js +0 -170
- package/spec/dummy/src/models/account.js +0 -8
- package/spec/dummy/src/models/authentication-token.js +0 -8
- package/spec/dummy/src/models/project-detail.js +0 -8
- package/spec/dummy/src/models/project.js +0 -11
- package/spec/dummy/src/models/task.js +0 -9
- package/spec/dummy/src/models/user.js +0 -18
- package/spec/dummy/src/routes/_root/controller.js +0 -11
- package/spec/dummy/src/routes/api/controller.js +0 -9
- package/spec/dummy/src/routes/projects/controller.js +0 -33
- package/spec/dummy/src/routes/tasks/controller.js +0 -25
- package/spec/dummy/src/routes/tasks/index.ejs +0 -1
- package/spec/dummy/src/routes/tasks/show.ejs +0 -0
- package/spec/http-server/client-spec.js +0 -37
- package/spec/http-server/get-spec.js +0 -86
- package/spec/http-server/namespace-spec.js +0 -17
- package/spec/http-server/post-spec.js +0 -93
- package/spec/http-server/root-get-spec.js +0 -31
- package/src/application.js +0 -123
- package/src/cli/base-command.js +0 -40
- package/src/cli/browser-cli.js +0 -37
- package/src/cli/commands/db/create.js +0 -72
- package/src/cli/commands/db/drop.js +0 -18
- package/src/cli/commands/db/migrate.js +0 -17
- package/src/cli/commands/db/reset.js +0 -22
- package/src/cli/commands/db/rollback.js +0 -15
- package/src/cli/commands/destroy/migration.js +0 -7
- package/src/cli/commands/generate/base-models.js +0 -7
- package/src/cli/commands/generate/migration.js +0 -7
- package/src/cli/commands/generate/model.js +0 -7
- package/src/cli/commands/init.js +0 -11
- package/src/cli/commands/server.js +0 -7
- package/src/cli/commands/test.js +0 -7
- package/src/cli/index.js +0 -39
- package/src/cli/use-browser-cli.js +0 -27
- package/src/configuration-resolver.js +0 -61
- package/src/configuration-types.js +0 -61
- package/src/configuration.js +0 -395
- package/src/controller.js +0 -166
- package/src/database/drivers/base-column.js +0 -141
- package/src/database/drivers/base-columns-index.js +0 -72
- package/src/database/drivers/base-foreign-key.js +0 -91
- package/src/database/drivers/base-table.js +0 -129
- package/src/database/drivers/base.js +0 -751
- package/src/database/drivers/mssql/column.js +0 -72
- package/src/database/drivers/mssql/columns-index.js +0 -6
- package/src/database/drivers/mssql/connect-connection.js +0 -12
- package/src/database/drivers/mssql/foreign-key.js +0 -12
- package/src/database/drivers/mssql/index.js +0 -357
- package/src/database/drivers/mssql/options.js +0 -72
- package/src/database/drivers/mssql/query-parser.js +0 -6
- package/src/database/drivers/mssql/sql/alter-table.js +0 -4
- package/src/database/drivers/mssql/sql/create-database.js +0 -35
- package/src/database/drivers/mssql/sql/create-index.js +0 -4
- package/src/database/drivers/mssql/sql/create-table.js +0 -4
- package/src/database/drivers/mssql/sql/delete.js +0 -19
- package/src/database/drivers/mssql/sql/drop-table.js +0 -4
- package/src/database/drivers/mssql/sql/insert.js +0 -4
- package/src/database/drivers/mssql/sql/update.js +0 -31
- package/src/database/drivers/mssql/table.js +0 -132
- package/src/database/drivers/mysql/column.js +0 -105
- package/src/database/drivers/mysql/columns-index.js +0 -6
- package/src/database/drivers/mysql/foreign-key.js +0 -12
- package/src/database/drivers/mysql/index.js +0 -275
- package/src/database/drivers/mysql/options.js +0 -31
- package/src/database/drivers/mysql/query-parser.js +0 -6
- package/src/database/drivers/mysql/query.js +0 -31
- package/src/database/drivers/mysql/sql/alter-table.js +0 -6
- package/src/database/drivers/mysql/sql/create-database.js +0 -6
- package/src/database/drivers/mysql/sql/create-index.js +0 -6
- package/src/database/drivers/mysql/sql/create-table.js +0 -6
- package/src/database/drivers/mysql/sql/delete.js +0 -21
- package/src/database/drivers/mysql/sql/drop-table.js +0 -6
- package/src/database/drivers/mysql/sql/insert.js +0 -6
- package/src/database/drivers/mysql/sql/update.js +0 -33
- package/src/database/drivers/mysql/table.js +0 -96
- package/src/database/drivers/pgsql/column.js +0 -81
- package/src/database/drivers/pgsql/columns-index.js +0 -6
- package/src/database/drivers/pgsql/foreign-key.js +0 -12
- package/src/database/drivers/pgsql/index.js +0 -250
- package/src/database/drivers/pgsql/options.js +0 -30
- package/src/database/drivers/pgsql/query-parser.js +0 -6
- package/src/database/drivers/pgsql/sql/alter-table.js +0 -6
- package/src/database/drivers/pgsql/sql/create-database.js +0 -38
- package/src/database/drivers/pgsql/sql/create-index.js +0 -6
- package/src/database/drivers/pgsql/sql/create-table.js +0 -6
- package/src/database/drivers/pgsql/sql/delete.js +0 -21
- package/src/database/drivers/pgsql/sql/drop-table.js +0 -6
- package/src/database/drivers/pgsql/sql/insert.js +0 -6
- package/src/database/drivers/pgsql/sql/update.js +0 -33
- package/src/database/drivers/pgsql/table.js +0 -123
- package/src/database/drivers/sqlite/base.js +0 -303
- package/src/database/drivers/sqlite/column.js +0 -70
- package/src/database/drivers/sqlite/columns-index.js +0 -30
- package/src/database/drivers/sqlite/connection-remote.js +0 -12
- package/src/database/drivers/sqlite/connection-sql-js.js +0 -49
- package/src/database/drivers/sqlite/foreign-key.js +0 -22
- package/src/database/drivers/sqlite/index.js +0 -52
- package/src/database/drivers/sqlite/index.native.js +0 -68
- package/src/database/drivers/sqlite/index.web.js +0 -63
- package/src/database/drivers/sqlite/options.js +0 -30
- package/src/database/drivers/sqlite/query-parser.js +0 -6
- package/src/database/drivers/sqlite/query.js +0 -32
- package/src/database/drivers/sqlite/query.native.js +0 -25
- package/src/database/drivers/sqlite/query.web.js +0 -46
- package/src/database/drivers/sqlite/sql/alter-table.js +0 -153
- package/src/database/drivers/sqlite/sql/create-index.js +0 -6
- package/src/database/drivers/sqlite/sql/create-table.js +0 -6
- package/src/database/drivers/sqlite/sql/delete.js +0 -26
- package/src/database/drivers/sqlite/sql/drop-table.js +0 -6
- package/src/database/drivers/sqlite/sql/insert.js +0 -6
- package/src/database/drivers/sqlite/sql/update.js +0 -33
- package/src/database/drivers/sqlite/table.js +0 -97
- package/src/database/handler.js +0 -12
- package/src/database/initializer-from-require-context.js +0 -50
- package/src/database/migration/index.js +0 -345
- package/src/database/migrator/files-finder.js +0 -51
- package/src/database/migrator/types.js +0 -31
- package/src/database/migrator.js +0 -434
- package/src/database/pool/async-tracked-multi-connection.js +0 -103
- package/src/database/pool/base-methods-forward.js +0 -40
- package/src/database/pool/base.js +0 -133
- package/src/database/pool/single-multi-use.js +0 -43
- package/src/database/query/alter-table-base.js +0 -62
- package/src/database/query/base.js +0 -46
- package/src/database/query/create-database-base.js +0 -35
- package/src/database/query/create-index-base.js +0 -114
- package/src/database/query/create-table-base.js +0 -169
- package/src/database/query/delete-base.js +0 -17
- package/src/database/query/drop-table-base.js +0 -56
- package/src/database/query/from-base.js +0 -31
- package/src/database/query/from-plain.js +0 -15
- package/src/database/query/from-table.js +0 -17
- package/src/database/query/index.js +0 -530
- package/src/database/query/insert-base.js +0 -156
- package/src/database/query/join-base.js +0 -39
- package/src/database/query/join-object.js +0 -67
- package/src/database/query/join-plain.js +0 -17
- package/src/database/query/order-base.js +0 -30
- package/src/database/query/order-plain.js +0 -27
- package/src/database/query/preloader/belongs-to.js +0 -63
- package/src/database/query/preloader/has-many.js +0 -83
- package/src/database/query/preloader/has-one.js +0 -74
- package/src/database/query/preloader.js +0 -61
- package/src/database/query/select-base.js +0 -27
- package/src/database/query/select-plain.js +0 -17
- package/src/database/query/select-table-and-column.js +0 -27
- package/src/database/query/update-base.js +0 -28
- package/src/database/query/where-base.js +0 -34
- package/src/database/query/where-hash.js +0 -66
- package/src/database/query/where-plain.js +0 -19
- package/src/database/query-parser/base-query-parser.js +0 -39
- package/src/database/query-parser/from-parser.js +0 -45
- package/src/database/query-parser/group-parser.js +0 -53
- package/src/database/query-parser/joins-parser.js +0 -36
- package/src/database/query-parser/limit-parser.js +0 -61
- package/src/database/query-parser/options.js +0 -85
- package/src/database/query-parser/order-parser.js +0 -44
- package/src/database/query-parser/select-parser.js +0 -60
- package/src/database/query-parser/where-parser.js +0 -45
- package/src/database/record/index.js +0 -1682
- package/src/database/record/instance-relationships/base.js +0 -103
- package/src/database/record/instance-relationships/belongs-to.js +0 -37
- package/src/database/record/instance-relationships/has-many.js +0 -116
- package/src/database/record/instance-relationships/has-one.js +0 -66
- package/src/database/record/record-not-found-error.js +0 -3
- package/src/database/record/relationships/base.js +0 -91
- package/src/database/record/relationships/belongs-to.js +0 -46
- package/src/database/record/relationships/has-many.js +0 -39
- package/src/database/record/relationships/has-one.js +0 -39
- package/src/database/record/user-module.js +0 -41
- package/src/database/record/validators/base.js +0 -24
- package/src/database/record/validators/presence.js +0 -20
- package/src/database/record/validators/uniqueness.js +0 -42
- package/src/database/table-data/index.js +0 -199
- package/src/database/table-data/table-column.js +0 -283
- package/src/database/table-data/table-foreign-key.js +0 -61
- package/src/database/table-data/table-index.js +0 -41
- package/src/database/table-data/table-reference.js +0 -12
- package/src/database/use-database.js +0 -48
- package/src/environment-handlers/base.js +0 -158
- package/src/environment-handlers/browser.js +0 -193
- package/src/environment-handlers/node/cli/commands/destroy/migration.js +0 -42
- package/src/environment-handlers/node/cli/commands/generate/base-models.js +0 -258
- package/src/environment-handlers/node/cli/commands/generate/migration.js +0 -40
- package/src/environment-handlers/node/cli/commands/generate/model.js +0 -40
- package/src/environment-handlers/node/cli/commands/init.js +0 -66
- package/src/environment-handlers/node/cli/commands/server.js +0 -30
- package/src/environment-handlers/node/cli/commands/test.js +0 -47
- package/src/environment-handlers/node.js +0 -227
- package/src/error-logger.js +0 -32
- package/src/http-client/header.js +0 -16
- package/src/http-client/index.js +0 -135
- package/src/http-client/request.js +0 -83
- package/src/http-client/response.js +0 -136
- package/src/http-server/client/index.js +0 -137
- package/src/http-server/client/params-to-object.js +0 -88
- package/src/http-server/client/request-buffer/form-data-part.js +0 -53
- package/src/http-server/client/request-buffer/header.js +0 -18
- package/src/http-server/client/request-buffer/index.js +0 -345
- package/src/http-server/client/request-parser.js +0 -118
- package/src/http-server/client/request-runner.js +0 -68
- package/src/http-server/client/request.js +0 -63
- package/src/http-server/client/response.js +0 -100
- package/src/http-server/index.js +0 -180
- package/src/http-server/server-client.js +0 -81
- package/src/http-server/worker-handler/index.js +0 -120
- package/src/http-server/worker-handler/worker-script.js +0 -6
- package/src/http-server/worker-handler/worker-thread.js +0 -106
- package/src/initializer.js +0 -35
- package/src/logger.js +0 -174
- package/src/routes/app-routes.js +0 -16
- package/src/routes/base-route.js +0 -82
- package/src/routes/basic-route.js +0 -76
- package/src/routes/built-in/errors/controller.js +0 -7
- package/src/routes/built-in/errors/not-found.ejs +0 -1
- package/src/routes/get-route.js +0 -42
- package/src/routes/index.js +0 -19
- package/src/routes/namespace-route.js +0 -42
- package/src/routes/post-route.js +0 -41
- package/src/routes/resolver.js +0 -102
- package/src/routes/resource-route.js +0 -61
- package/src/routes/root-route.js +0 -6
- package/src/templates/configuration.js +0 -60
- package/src/templates/generate-migration.js +0 -11
- package/src/templates/generate-model.js +0 -6
- package/src/templates/routes.js +0 -11
- package/src/testing/request-client.js +0 -77
- package/src/testing/test-files-finder.js +0 -191
- package/src/testing/test-runner.js +0 -301
- package/src/testing/test.js +0 -462
- package/src/utils/backtrace-cleaner.js +0 -27
- package/src/utils/ensure-error.js +0 -13
- package/src/utils/file-exists.js +0 -17
- package/src/utils/nest-callbacks.js +0 -15
- package/src/utils/rest-args-error.js +0 -13
- package/src/utils/with-tracked-stack-async-hooks.js +0 -85
- package/src/utils/with-tracked-stack.js +0 -30
- package/tsconfig.json +0 -15
|
@@ -0,0 +1,1408 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/**
|
|
3
|
+
* @typedef {{type: string, message: string}} ValidationErrorObjectType
|
|
4
|
+
*/
|
|
5
|
+
import BelongsToInstanceRelationship from "./instance-relationships/belongs-to.js";
|
|
6
|
+
import BelongsToRelationship from "./relationships/belongs-to.js";
|
|
7
|
+
import Configuration from "../../configuration.js";
|
|
8
|
+
import FromTable from "../query/from-table.js";
|
|
9
|
+
import Handler from "../handler.js";
|
|
10
|
+
import HasManyInstanceRelationship from "./instance-relationships/has-many.js";
|
|
11
|
+
import HasManyRelationship from "./relationships/has-many.js";
|
|
12
|
+
import HasOneInstanceRelationship from "./instance-relationships/has-one.js";
|
|
13
|
+
import HasOneRelationship from "./relationships/has-one.js";
|
|
14
|
+
import * as inflection from "inflection";
|
|
15
|
+
import Query from "../query/index.js";
|
|
16
|
+
import restArgsError from "../../utils/rest-args-error.js";
|
|
17
|
+
import ValidatorsPresence from "./validators/presence.js";
|
|
18
|
+
import ValidatorsUniqueness from "./validators/uniqueness.js";
|
|
19
|
+
class ValidationError extends Error {
|
|
20
|
+
/**
|
|
21
|
+
* @returns {VelociousDatabaseRecord}
|
|
22
|
+
*/
|
|
23
|
+
getModel() {
|
|
24
|
+
if (!this._model)
|
|
25
|
+
throw new Error("Model hasn't been set");
|
|
26
|
+
return this._model;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* @param {VelociousDatabaseRecord} model
|
|
30
|
+
*/
|
|
31
|
+
setModel(model) {
|
|
32
|
+
this._model = model;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* @returns {Record<string, ValidationErrorObjectType[]>}
|
|
36
|
+
*/
|
|
37
|
+
getValidationErrors() {
|
|
38
|
+
if (!this._validationErrors)
|
|
39
|
+
throw new Error("Validation errors hasn't been set");
|
|
40
|
+
return this._validationErrors;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* @param {Record<string, ValidationErrorObjectType[]>} validationErrors
|
|
44
|
+
*/
|
|
45
|
+
setValidationErrors(validationErrors) {
|
|
46
|
+
this._validationErrors = validationErrors;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
class VelociousDatabaseRecord {
|
|
50
|
+
static getAttributeNameToColumnNameMap() {
|
|
51
|
+
if (!this._attributeNameToColumnName) {
|
|
52
|
+
/** @type {Record<string, string>} */
|
|
53
|
+
this._attributeNameToColumnName = {};
|
|
54
|
+
}
|
|
55
|
+
return this._attributeNameToColumnName;
|
|
56
|
+
}
|
|
57
|
+
static getColumnNameToAttributeNameMap() {
|
|
58
|
+
if (!this._columnNameToAttributeName) {
|
|
59
|
+
/** @type {Record<string, string>} */
|
|
60
|
+
this._columnNameToAttributeName = {};
|
|
61
|
+
}
|
|
62
|
+
return this._columnNameToAttributeName;
|
|
63
|
+
}
|
|
64
|
+
static getTranslationsMap() {
|
|
65
|
+
if (!this._translations) {
|
|
66
|
+
/** @type {Record<string, object>} */
|
|
67
|
+
this._translations = {};
|
|
68
|
+
}
|
|
69
|
+
return this._translations;
|
|
70
|
+
}
|
|
71
|
+
static getValidatorsMap() {
|
|
72
|
+
if (!this._validators) {
|
|
73
|
+
/** @type {Record<string, import("./validators/base.js").default[]>} */
|
|
74
|
+
this._validators = {};
|
|
75
|
+
}
|
|
76
|
+
return this._validators;
|
|
77
|
+
}
|
|
78
|
+
static getValidatorTypesMap() {
|
|
79
|
+
if (!this._validatorTypes) {
|
|
80
|
+
/** @type {Record<string, typeof import("./validators/base.js").default>} */
|
|
81
|
+
this._validatorTypes = {};
|
|
82
|
+
}
|
|
83
|
+
return this._validatorTypes;
|
|
84
|
+
}
|
|
85
|
+
/** @type {Record<string, any>} */
|
|
86
|
+
_attributes = {};
|
|
87
|
+
/** @type {Record<string, any>} */
|
|
88
|
+
_changes = {};
|
|
89
|
+
/** @type {Record<string, import("../drivers/base-column.js").default>} */
|
|
90
|
+
_columnsAsHash = {};
|
|
91
|
+
/** @type {import("../drivers/base.js").default | undefined} */
|
|
92
|
+
__connection = undefined;
|
|
93
|
+
/** @type {Record<string, import("./instance-relationships/base.js").default>} */
|
|
94
|
+
_instanceRelationships = {};
|
|
95
|
+
/** @type {string | undefined} */
|
|
96
|
+
__tableName = undefined;
|
|
97
|
+
/** @type {Record<string, ValidationErrorObjectType[]>} */
|
|
98
|
+
_validationErrors = {};
|
|
99
|
+
static validatorTypes() {
|
|
100
|
+
return this.getValidatorTypesMap();
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* @param {string} name
|
|
104
|
+
* @param {typeof import("./validators/base.js").default} validatorClass
|
|
105
|
+
*/
|
|
106
|
+
static registerValidatorType(name, validatorClass) {
|
|
107
|
+
this.validatorTypes()[name] = validatorClass;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* @param {string} validatorName
|
|
111
|
+
* @returns {typeof import("./validators/base.js").default}
|
|
112
|
+
*/
|
|
113
|
+
static getValidatorType(validatorName) {
|
|
114
|
+
if (!(validatorName in this.validatorTypes()))
|
|
115
|
+
throw new Error(`Validator type ${validatorName} not found`);
|
|
116
|
+
return this.validatorTypes()[validatorName];
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* @param {string} relationshipName
|
|
120
|
+
* @returns {boolean}
|
|
121
|
+
*/
|
|
122
|
+
static _relationshipExists(relationshipName) {
|
|
123
|
+
if (relationshipName in this.getRelationshipsMap()) {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* @typedef {object} RelationshipDataArgumentType
|
|
130
|
+
* @property {string} [className]
|
|
131
|
+
* @property {typeof VelociousDatabaseRecord} [klass]
|
|
132
|
+
* @property {string} [type]
|
|
133
|
+
*/
|
|
134
|
+
/**
|
|
135
|
+
* @param {string} relationshipName
|
|
136
|
+
* @param {RelationshipDataArgumentType} data
|
|
137
|
+
*/
|
|
138
|
+
static _defineRelationship(relationshipName, data) {
|
|
139
|
+
if (!relationshipName)
|
|
140
|
+
throw new Error(`Invalid relationship name given: ${relationshipName}`);
|
|
141
|
+
if (this._relationshipExists(relationshipName))
|
|
142
|
+
throw new Error(`Relationship ${relationshipName} already exists`);
|
|
143
|
+
const actualData = Object.assign({
|
|
144
|
+
modelClass: this,
|
|
145
|
+
relationshipName,
|
|
146
|
+
type: "hasMany"
|
|
147
|
+
}, data);
|
|
148
|
+
if (!actualData.className && !actualData.klass) {
|
|
149
|
+
actualData.className = inflection.camelize(inflection.singularize(relationshipName));
|
|
150
|
+
}
|
|
151
|
+
let relationship;
|
|
152
|
+
if (actualData.type == "belongsTo") {
|
|
153
|
+
relationship = new BelongsToRelationship(actualData);
|
|
154
|
+
this.prototype[relationshipName] = function () {
|
|
155
|
+
const relationship = this.getRelationshipByName(relationshipName);
|
|
156
|
+
return relationship.loaded();
|
|
157
|
+
};
|
|
158
|
+
this.prototype[`build${inflection.camelize(relationshipName)}`] = function (attributes) {
|
|
159
|
+
const instanceRelationship = this.getRelationshipByName(relationshipName);
|
|
160
|
+
const record = instanceRelationship.build(attributes);
|
|
161
|
+
const inverseOf = instanceRelationship.getRelationship().getInverseOf();
|
|
162
|
+
if (inverseOf) {
|
|
163
|
+
const inverseInstanceRelationship = record.getRelationshipByName(inverseOf);
|
|
164
|
+
inverseInstanceRelationship.setAutoSave(false);
|
|
165
|
+
if (inverseInstanceRelationship.getType() == "hasOne") {
|
|
166
|
+
inverseInstanceRelationship.setLoaded(this);
|
|
167
|
+
}
|
|
168
|
+
else if (inverseInstanceRelationship.getType() == "hasMany") {
|
|
169
|
+
inverseInstanceRelationship.addToLoaded(this);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
throw new Error(`Unknown relationship type: ${inverseInstanceRelationship.getType()}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return record;
|
|
176
|
+
};
|
|
177
|
+
this.prototype[`load${inflection.camelize(relationshipName)}`] = async function () {
|
|
178
|
+
await this.getRelationshipByName(relationshipName).load();
|
|
179
|
+
};
|
|
180
|
+
this.prototype[`set${inflection.camelize(relationshipName)}`] = function (model) {
|
|
181
|
+
const relationship = this.getRelationshipByName(relationshipName);
|
|
182
|
+
relationship.setLoaded(model);
|
|
183
|
+
relationship.setDirty(true);
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
else if (actualData.type == "hasMany") {
|
|
187
|
+
relationship = new HasManyRelationship(actualData);
|
|
188
|
+
this.prototype[relationshipName] = function () {
|
|
189
|
+
return /** @type {import("./instance-relationships/has-many.js").default} */ (this.getRelationshipByName(relationshipName));
|
|
190
|
+
};
|
|
191
|
+
this.prototype[`${relationshipName}Loaded`] = function () {
|
|
192
|
+
return this.getRelationshipByName(relationshipName).loaded();
|
|
193
|
+
};
|
|
194
|
+
this.prototype[`load${inflection.camelize(relationshipName)}`] = async function () {
|
|
195
|
+
await this.getRelationshipByName(relationshipName).load();
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
else if (actualData.type == "hasOne") {
|
|
199
|
+
relationship = new HasOneRelationship(actualData);
|
|
200
|
+
this.prototype[relationshipName] = function () {
|
|
201
|
+
return this.getRelationshipByName(relationshipName).loaded();
|
|
202
|
+
};
|
|
203
|
+
this.prototype[`build${inflection.camelize(relationshipName)}`] = function (attributes) {
|
|
204
|
+
const instanceRelationship = this.getRelationshipByName(relationshipName);
|
|
205
|
+
const record = instanceRelationship.build(attributes);
|
|
206
|
+
const inverseOf = instanceRelationship.getRelationship().getInverseOf();
|
|
207
|
+
if (inverseOf) {
|
|
208
|
+
const inverseInstanceRelationship = record.getRelationshipByName(inverseOf);
|
|
209
|
+
inverseInstanceRelationship.setAutoSave(false);
|
|
210
|
+
inverseInstanceRelationship.setLoaded(this);
|
|
211
|
+
}
|
|
212
|
+
return record;
|
|
213
|
+
};
|
|
214
|
+
this.prototype[`load${inflection.camelize(relationshipName)}`] = async function () {
|
|
215
|
+
await this.getRelationshipByName(relationshipName).load();
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
throw new Error(`Unknown relationship type: ${actualData.type}`);
|
|
220
|
+
}
|
|
221
|
+
this.getRelationshipsMap()[relationshipName] = relationship;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* @param {string} relationshipName
|
|
225
|
+
* @returns {import("./relationships/base.js").default}
|
|
226
|
+
*/
|
|
227
|
+
static getRelationshipByName(relationshipName) {
|
|
228
|
+
const relationship = this.getRelationshipsMap()[relationshipName];
|
|
229
|
+
if (!relationship)
|
|
230
|
+
throw new Error(`No relationship by that name: ${relationshipName}`);
|
|
231
|
+
return relationship;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* @returns {Array<import("./relationships/base.js").default>}
|
|
235
|
+
*/
|
|
236
|
+
static getRelationships() {
|
|
237
|
+
return Object.values(this.getRelationshipsMap());
|
|
238
|
+
}
|
|
239
|
+
static getRelationshipsMap() {
|
|
240
|
+
if (!this._relationships) {
|
|
241
|
+
/** @type {Record<string, import("./relationships/base.js").default>} */
|
|
242
|
+
this._relationships = {};
|
|
243
|
+
}
|
|
244
|
+
return this._relationships;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* @returns {Array<string>}
|
|
248
|
+
*/
|
|
249
|
+
static getRelationshipNames() {
|
|
250
|
+
return this.getRelationships().map((relationship) => relationship.getRelationshipName());
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* @param {string} relationshipName
|
|
254
|
+
* @returns {import("./instance-relationships/base.js").default}
|
|
255
|
+
*/
|
|
256
|
+
getRelationshipByName(relationshipName) {
|
|
257
|
+
if (!(relationshipName in this._instanceRelationships)) {
|
|
258
|
+
const modelClassRelationship = this.getModelClass().getRelationshipByName(relationshipName);
|
|
259
|
+
const relationshipType = modelClassRelationship.getType();
|
|
260
|
+
let instanceRelationship;
|
|
261
|
+
if (relationshipType == "belongsTo") {
|
|
262
|
+
instanceRelationship = new BelongsToInstanceRelationship({ model: this, relationship: modelClassRelationship });
|
|
263
|
+
}
|
|
264
|
+
else if (relationshipType == "hasMany") {
|
|
265
|
+
instanceRelationship = new HasManyInstanceRelationship({ model: this, relationship: modelClassRelationship });
|
|
266
|
+
}
|
|
267
|
+
else if (relationshipType == "hasOne") {
|
|
268
|
+
instanceRelationship = new HasOneInstanceRelationship({ model: this, relationship: modelClassRelationship });
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
throw new Error(`Unknown relationship type: ${relationshipType}`);
|
|
272
|
+
}
|
|
273
|
+
this._instanceRelationships[relationshipName] = instanceRelationship;
|
|
274
|
+
}
|
|
275
|
+
return this._instanceRelationships[relationshipName];
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Adds a belongs-to-relationship to the model.
|
|
279
|
+
* @param {string} relationshipName The name of the relationship.
|
|
280
|
+
* @param {object} [options] The options for the relationship.
|
|
281
|
+
*/
|
|
282
|
+
static belongsTo(relationshipName, options) {
|
|
283
|
+
this._defineRelationship(relationshipName, Object.assign({ type: "belongsTo" }, options));
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* @returns {import("../drivers/base.js").default}
|
|
287
|
+
*/
|
|
288
|
+
static connection() {
|
|
289
|
+
const databasePool = this._getConfiguration().getDatabasePool(this.getDatabaseIdentifier());
|
|
290
|
+
const connection = databasePool.getCurrentConnection();
|
|
291
|
+
if (!connection)
|
|
292
|
+
throw new Error("No connection?");
|
|
293
|
+
return connection;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* @param {Record<string, any>} [attributes]
|
|
297
|
+
* @returns {Promise<InstanceType<typeof this>>}
|
|
298
|
+
*/
|
|
299
|
+
static async create(attributes) {
|
|
300
|
+
const record = new this(attributes);
|
|
301
|
+
await record.save();
|
|
302
|
+
return record;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* @returns {import("../../configuration.js").default}
|
|
306
|
+
*/
|
|
307
|
+
static _getConfiguration() {
|
|
308
|
+
if (!this._configuration) {
|
|
309
|
+
this._configuration = Configuration.current();
|
|
310
|
+
if (!this._configuration) {
|
|
311
|
+
throw new Error("Configuration hasn't been set (model class probably hasn't been initialized)");
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return this._configuration;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* @returns {import("../../configuration.js").default}
|
|
318
|
+
*/
|
|
319
|
+
_getConfiguration() {
|
|
320
|
+
return this.getModelClass()._getConfiguration();
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Adds a has-many-relationship to the model class.
|
|
324
|
+
* @param {string} relationshipName The name of the relationship (e.g. "posts")
|
|
325
|
+
* @param {object} options The options for the relationship (e.g. {className: "Post"})
|
|
326
|
+
* @returns {void}
|
|
327
|
+
*/
|
|
328
|
+
static hasMany(relationshipName, options = {}) {
|
|
329
|
+
return this._defineRelationship(relationshipName, Object.assign({ type: "hasMany" }, options));
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Adds a has-one-relationship to the model class.
|
|
333
|
+
* @param {string} relationshipName The name of the relationship (e.g. "post")
|
|
334
|
+
* @param {object} options The options for the relationship (e.g. {className: "Post"})
|
|
335
|
+
* @returns {void}
|
|
336
|
+
*/
|
|
337
|
+
static hasOne(relationshipName, options = {}) {
|
|
338
|
+
return this._defineRelationship(relationshipName, Object.assign({ type: "hasOne" }, options));
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* @param {string} attributeName
|
|
342
|
+
* @returns {string}
|
|
343
|
+
*/
|
|
344
|
+
static humanAttributeName(attributeName) {
|
|
345
|
+
const modelNameKey = inflection.underscore(this.constructor.name);
|
|
346
|
+
return this._getConfiguration().getTranslator()(`velocious.database.record.attributes.${modelNameKey}.${attributeName}`, { defaultValue: inflection.camelize(attributeName) });
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* @returns {string}
|
|
350
|
+
*/
|
|
351
|
+
static getDatabaseType() {
|
|
352
|
+
if (!this._databaseType)
|
|
353
|
+
throw new Error("Database type hasn't been set");
|
|
354
|
+
return this._databaseType;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* @param {object} args
|
|
358
|
+
* @param {import("../../configuration.js").default} args.configuration
|
|
359
|
+
* @returns {Promise<void>}
|
|
360
|
+
*/
|
|
361
|
+
static async initializeRecord({ configuration, ...restArgs }) {
|
|
362
|
+
restArgsError(restArgs);
|
|
363
|
+
if (!configuration)
|
|
364
|
+
throw new Error(`No configuration given for ${this.name}`);
|
|
365
|
+
this._configuration = configuration;
|
|
366
|
+
this._configuration.registerModelClass(this);
|
|
367
|
+
this._databaseType = this.connection().getType();
|
|
368
|
+
this._table = await this.connection().getTableByName(this.tableName());
|
|
369
|
+
this._columns = await this._getTable().getColumns();
|
|
370
|
+
/** @type {Record<string, import("../drivers/base-column.js").default>} */
|
|
371
|
+
this._columnsAsHash = {};
|
|
372
|
+
const columnNameToAttributeName = this.getColumnNameToAttributeNameMap();
|
|
373
|
+
const attributeNameToColumnName = this.getAttributeNameToColumnNameMap();
|
|
374
|
+
for (const column of this._columns) {
|
|
375
|
+
this._columnsAsHash[column.getName()] = column;
|
|
376
|
+
const camelizedColumnName = inflection.camelize(column.getName(), true);
|
|
377
|
+
const camelizedColumnNameBigFirst = inflection.camelize(column.getName());
|
|
378
|
+
attributeNameToColumnName[camelizedColumnName] = column.getName();
|
|
379
|
+
columnNameToAttributeName[column.getName()] = camelizedColumnName;
|
|
380
|
+
this.prototype[camelizedColumnName] = function () {
|
|
381
|
+
return this.readAttribute(camelizedColumnName);
|
|
382
|
+
};
|
|
383
|
+
this.prototype[`set${camelizedColumnNameBigFirst}`] = function (newValue) {
|
|
384
|
+
return this._setColumnAttribute(camelizedColumnName, newValue);
|
|
385
|
+
};
|
|
386
|
+
this.prototype[`has${camelizedColumnNameBigFirst}`] = function () {
|
|
387
|
+
let value = this[camelizedColumnName]();
|
|
388
|
+
return this._hasAttribute(value);
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
await this._defineTranslationMethods();
|
|
392
|
+
this._initialized = true;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* @param {any} value
|
|
396
|
+
* @returns {boolean}
|
|
397
|
+
*/
|
|
398
|
+
_hasAttribute(value) {
|
|
399
|
+
if (typeof value == "string") {
|
|
400
|
+
value = value.trim();
|
|
401
|
+
}
|
|
402
|
+
if (value) {
|
|
403
|
+
return true;
|
|
404
|
+
}
|
|
405
|
+
return false;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* @returns {boolean}
|
|
409
|
+
*/
|
|
410
|
+
static isInitialized() {
|
|
411
|
+
if (this._initialized)
|
|
412
|
+
return true;
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
static async _defineTranslationMethods() {
|
|
416
|
+
if (this._translations) {
|
|
417
|
+
const locales = this._getConfiguration().getLocales();
|
|
418
|
+
if (!locales)
|
|
419
|
+
throw new Error("Locales hasn't been set in the configuration");
|
|
420
|
+
await this.getTranslationClass().initializeRecord({ configuration: this._getConfiguration() });
|
|
421
|
+
for (const name in this._translations) {
|
|
422
|
+
const nameCamelized = inflection.camelize(name);
|
|
423
|
+
const setterMethodName = `set${nameCamelized}`;
|
|
424
|
+
this.prototype[name] = function getTranslatedAttribute() {
|
|
425
|
+
const locale = this._getConfiguration().getLocale();
|
|
426
|
+
return this._getTranslatedAttributeWithFallback(name, locale);
|
|
427
|
+
};
|
|
428
|
+
this.prototype[`has${nameCamelized}`] = function hasTranslatedAttribute() {
|
|
429
|
+
const candidate = this[name];
|
|
430
|
+
if (typeof candidate == "function") {
|
|
431
|
+
const value = candidate.bind(this)();
|
|
432
|
+
return this._hasAttribute(value);
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
throw new Error(`Expected candidate to be a function but it was: ${typeof candidate}`);
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
this.prototype[setterMethodName] = function setTranslatedAttribute(newValue) {
|
|
439
|
+
const locale = this._getConfiguration().getLocale();
|
|
440
|
+
return this._setTranslatedAttribute(name, locale, newValue);
|
|
441
|
+
};
|
|
442
|
+
for (const locale of locales) {
|
|
443
|
+
const localeCamelized = inflection.camelize(locale);
|
|
444
|
+
const getterMethodNameLocalized = `${name}${localeCamelized}`;
|
|
445
|
+
const setterMethodNameLocalized = `${setterMethodName}${localeCamelized}`;
|
|
446
|
+
const hasMethodNameLocalized = `has${inflection.camelize(name)}${localeCamelized}`;
|
|
447
|
+
this.prototype[getterMethodNameLocalized] = function getTranslatedAttributeWithLocale() {
|
|
448
|
+
return this._getTranslatedAttribute(name, locale);
|
|
449
|
+
};
|
|
450
|
+
this.prototype[setterMethodNameLocalized] = function setTranslatedAttributeWithLocale(newValue) {
|
|
451
|
+
return this._setTranslatedAttribute(name, locale, newValue);
|
|
452
|
+
};
|
|
453
|
+
this.prototype[hasMethodNameLocalized] = function hasTranslatedAttribute() {
|
|
454
|
+
const candidate = this[getterMethodNameLocalized];
|
|
455
|
+
if (typeof candidate == "function") {
|
|
456
|
+
const value = candidate.bind(this)();
|
|
457
|
+
return this._hasAttribute(value);
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
throw new Error(`Expected candidate to be a function but it was: ${typeof candidate}`);
|
|
461
|
+
}
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* @returns {string}
|
|
469
|
+
*/
|
|
470
|
+
static getDatabaseIdentifier() {
|
|
471
|
+
return this._databaseIdentifier || "default";
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* @param {string} databaseIdentifier
|
|
475
|
+
* @returns {void}
|
|
476
|
+
*/
|
|
477
|
+
static setDatabaseIdentifier(databaseIdentifier) {
|
|
478
|
+
this._databaseIdentifier = databaseIdentifier;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* @param {string} name
|
|
482
|
+
* @returns {*}
|
|
483
|
+
*/
|
|
484
|
+
getAttribute(name) {
|
|
485
|
+
const columnName = inflection.underscore(name);
|
|
486
|
+
if (!this.isNewRecord() && !(columnName in this._attributes)) {
|
|
487
|
+
throw new Error(`${this.constructor.name}#${name} attribute hasn't been loaded yet in ${Object.keys(this._attributes).join(", ")}`);
|
|
488
|
+
}
|
|
489
|
+
return this._attributes[columnName];
|
|
490
|
+
}
|
|
491
|
+
/** @returns {typeof VelociousDatabaseRecord} */
|
|
492
|
+
getModelClass() {
|
|
493
|
+
const modelClass = /** @type {typeof VelociousDatabaseRecord} */ (this.constructor);
|
|
494
|
+
return modelClass;
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* @param {string} name
|
|
498
|
+
* @param {*} newValue
|
|
499
|
+
* @returns {void}
|
|
500
|
+
*/
|
|
501
|
+
setAttribute(name, newValue) {
|
|
502
|
+
const setterName = `set${inflection.camelize(name)}`;
|
|
503
|
+
if (!this.getModelClass().isInitialized())
|
|
504
|
+
throw new Error(`${this.constructor.name} model isn't initialized yet`);
|
|
505
|
+
if (!(setterName in this))
|
|
506
|
+
throw new Error(`No such setter method: ${this.constructor.name}#${setterName}`);
|
|
507
|
+
this[setterName](newValue);
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* @param {string} name
|
|
511
|
+
* @param {any} newValue
|
|
512
|
+
*/
|
|
513
|
+
_setColumnAttribute(name, newValue) {
|
|
514
|
+
if (!this.getModelClass()._attributeNameToColumnName)
|
|
515
|
+
throw new Error("No attribute-to-column mapping. Has record been initialized?");
|
|
516
|
+
const columnName = this.getModelClass().getAttributeNameToColumnNameMap()[name];
|
|
517
|
+
if (!columnName)
|
|
518
|
+
throw new Error(`Couldn't figure out column name for attribute: ${name}`);
|
|
519
|
+
if (this._attributes[columnName] != newValue) {
|
|
520
|
+
this._changes[columnName] = newValue;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* @returns {import("../drivers/base-column.js").default[]}
|
|
525
|
+
*/
|
|
526
|
+
static getColumns() {
|
|
527
|
+
if (!this._columns)
|
|
528
|
+
throw new Error(`${this.name} hasn't been initialized yet`);
|
|
529
|
+
return this._columns;
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* @returns {Array<string>}
|
|
533
|
+
*/
|
|
534
|
+
static getColumnNames() {
|
|
535
|
+
if (!this._columnNames) {
|
|
536
|
+
this._columnNames = this.getColumns().map((column) => column.getName());
|
|
537
|
+
}
|
|
538
|
+
return this._columnNames;
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* @returns {import("../drivers/base-table.js").default}
|
|
542
|
+
*/
|
|
543
|
+
static _getTable() {
|
|
544
|
+
if (!this._table)
|
|
545
|
+
throw new Error(`${this.name} hasn't been initialized yet`);
|
|
546
|
+
return this._table;
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* @param {Array<string>} columns
|
|
550
|
+
* @param {Array<Array<string>>} rows
|
|
551
|
+
* @returns {Promise<void>}
|
|
552
|
+
*/
|
|
553
|
+
static async insertMultiple(columns, rows) {
|
|
554
|
+
return await this.connection().insertMultiple(this.tableName(), columns, rows);
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* @returns {Promise<number>}
|
|
558
|
+
*/
|
|
559
|
+
static async nextPrimaryKey() {
|
|
560
|
+
const primaryKey = this.primaryKey();
|
|
561
|
+
const tableName = this.tableName();
|
|
562
|
+
const connection = this.connection();
|
|
563
|
+
const newestRecord = await this.order(`${connection.quoteTable(tableName)}.${connection.quoteColumn(primaryKey)}`).last();
|
|
564
|
+
if (newestRecord) {
|
|
565
|
+
const id = newestRecord.id();
|
|
566
|
+
if (typeof id == "number") {
|
|
567
|
+
return id + 1;
|
|
568
|
+
}
|
|
569
|
+
else {
|
|
570
|
+
throw new Error("ID from newest record wasn't a number");
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
else {
|
|
574
|
+
return 1;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* @param {string} primaryKey
|
|
579
|
+
* @returns {void}
|
|
580
|
+
*/
|
|
581
|
+
static setPrimaryKey(primaryKey) {
|
|
582
|
+
this._primaryKey = primaryKey;
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* @returns {string}
|
|
586
|
+
*/
|
|
587
|
+
static primaryKey() {
|
|
588
|
+
if (this._primaryKey)
|
|
589
|
+
return this._primaryKey;
|
|
590
|
+
return "id";
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* @returns {Promise<void>}
|
|
594
|
+
*/
|
|
595
|
+
async save() {
|
|
596
|
+
const isNewRecord = this.isNewRecord();
|
|
597
|
+
let result;
|
|
598
|
+
await this._getConfiguration().ensureConnections(async () => {
|
|
599
|
+
await this._runValidations();
|
|
600
|
+
await this.getModelClass().transaction(async () => {
|
|
601
|
+
// If any belongs-to-relationships was saved, then updated-at should still be set on this record.
|
|
602
|
+
const { savedCount } = await this._autoSaveBelongsToRelationships();
|
|
603
|
+
if (this.isPersisted()) {
|
|
604
|
+
// If any has-many-relationships will be saved, then updated-at should still be set on this record.
|
|
605
|
+
const autoSaveHasManyrelationships = this._autoSaveHasManyAndHasOneRelationshipsToSave();
|
|
606
|
+
if (this._hasChanges() || savedCount > 0 || autoSaveHasManyrelationships.length > 0) {
|
|
607
|
+
result = await this._updateRecordWithChanges();
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
else {
|
|
611
|
+
result = await this._createNewRecord();
|
|
612
|
+
}
|
|
613
|
+
await this._autoSaveHasManyAndHasOneRelationships({ isNewRecord });
|
|
614
|
+
});
|
|
615
|
+
});
|
|
616
|
+
return result;
|
|
617
|
+
}
|
|
618
|
+
async _autoSaveBelongsToRelationships() {
|
|
619
|
+
let savedCount = 0;
|
|
620
|
+
for (const relationshipName in this._instanceRelationships) {
|
|
621
|
+
const instanceRelationship = this._instanceRelationships[relationshipName];
|
|
622
|
+
if (instanceRelationship.getType() != "belongsTo") {
|
|
623
|
+
continue;
|
|
624
|
+
}
|
|
625
|
+
if (instanceRelationship.getAutoSave() === false) {
|
|
626
|
+
continue;
|
|
627
|
+
}
|
|
628
|
+
const model = instanceRelationship.loaded();
|
|
629
|
+
if (model) {
|
|
630
|
+
if (model instanceof VelociousDatabaseRecord) {
|
|
631
|
+
if (model.isChanged()) {
|
|
632
|
+
await model.save();
|
|
633
|
+
const foreignKey = instanceRelationship.getForeignKey();
|
|
634
|
+
this.setAttribute(foreignKey, model.id());
|
|
635
|
+
instanceRelationship.setPreloaded(true);
|
|
636
|
+
instanceRelationship.setDirty(false);
|
|
637
|
+
savedCount++;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
else {
|
|
641
|
+
throw new Error(`Expected a record but got: ${typeof model}`);
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
return { savedCount };
|
|
646
|
+
}
|
|
647
|
+
_autoSaveHasManyAndHasOneRelationshipsToSave() {
|
|
648
|
+
const relationships = [];
|
|
649
|
+
for (const relationshipName in this._instanceRelationships) {
|
|
650
|
+
const instanceRelationship = this._instanceRelationships[relationshipName];
|
|
651
|
+
if (instanceRelationship.getType() != "hasMany" && instanceRelationship.getType() != "hasOne") {
|
|
652
|
+
continue;
|
|
653
|
+
}
|
|
654
|
+
if (instanceRelationship.getAutoSave() === false) {
|
|
655
|
+
continue;
|
|
656
|
+
}
|
|
657
|
+
/** @type {VelociousDatabaseRecord[]} */
|
|
658
|
+
let loaded;
|
|
659
|
+
const hasManyOrOneLoaded = instanceRelationship.getLoadedOrUndefined();
|
|
660
|
+
if (hasManyOrOneLoaded) {
|
|
661
|
+
if (Array.isArray(hasManyOrOneLoaded)) {
|
|
662
|
+
loaded = hasManyOrOneLoaded;
|
|
663
|
+
}
|
|
664
|
+
else if (hasManyOrOneLoaded instanceof VelociousDatabaseRecord) {
|
|
665
|
+
loaded = [hasManyOrOneLoaded];
|
|
666
|
+
}
|
|
667
|
+
else {
|
|
668
|
+
throw new Error(`Expected hasOneLoaded to be a record but it wasn't: ${typeof hasManyOrOneLoaded}`);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
else {
|
|
672
|
+
continue;
|
|
673
|
+
}
|
|
674
|
+
let useRelationship = false;
|
|
675
|
+
if (loaded) {
|
|
676
|
+
for (const model of loaded) {
|
|
677
|
+
const foreignKey = instanceRelationship.getForeignKey();
|
|
678
|
+
model.setAttribute(foreignKey, this.id());
|
|
679
|
+
if (model.isChanged()) {
|
|
680
|
+
useRelationship = true;
|
|
681
|
+
continue;
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
if (useRelationship)
|
|
686
|
+
relationships.push(instanceRelationship);
|
|
687
|
+
}
|
|
688
|
+
return relationships;
|
|
689
|
+
}
|
|
690
|
+
/**
|
|
691
|
+
* @param {object} args
|
|
692
|
+
* @param {boolean} args.isNewRecord
|
|
693
|
+
*/
|
|
694
|
+
async _autoSaveHasManyAndHasOneRelationships({ isNewRecord }) {
|
|
695
|
+
for (const instanceRelationship of this._autoSaveHasManyAndHasOneRelationshipsToSave()) {
|
|
696
|
+
let hasManyOrOneLoaded = instanceRelationship.getLoadedOrUndefined();
|
|
697
|
+
/** @type {VelociousDatabaseRecord[]} */
|
|
698
|
+
let loaded;
|
|
699
|
+
if (hasManyOrOneLoaded === undefined) {
|
|
700
|
+
loaded = [];
|
|
701
|
+
}
|
|
702
|
+
else if (hasManyOrOneLoaded instanceof VelociousDatabaseRecord) {
|
|
703
|
+
loaded = [hasManyOrOneLoaded];
|
|
704
|
+
}
|
|
705
|
+
else if (Array.isArray(hasManyOrOneLoaded)) {
|
|
706
|
+
loaded = hasManyOrOneLoaded;
|
|
707
|
+
}
|
|
708
|
+
else {
|
|
709
|
+
throw new Error(`Unexpected type for hasManyOrOneLoaded: ${typeof hasManyOrOneLoaded}`);
|
|
710
|
+
}
|
|
711
|
+
for (const model of loaded) {
|
|
712
|
+
const foreignKey = instanceRelationship.getForeignKey();
|
|
713
|
+
model.setAttribute(foreignKey, this.id());
|
|
714
|
+
if (model.isChanged()) {
|
|
715
|
+
await model.save();
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
if (isNewRecord) {
|
|
719
|
+
instanceRelationship.setPreloaded(true);
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
/**
|
|
724
|
+
* @returns {string}
|
|
725
|
+
*/
|
|
726
|
+
static tableName() {
|
|
727
|
+
if (!this._tableName)
|
|
728
|
+
this._tableName = inflection.underscore(inflection.pluralize(this.name));
|
|
729
|
+
return this._tableName;
|
|
730
|
+
}
|
|
731
|
+
/**
|
|
732
|
+
* @param {string} tableName
|
|
733
|
+
* @returns {void}
|
|
734
|
+
*/
|
|
735
|
+
static setTableName(tableName) {
|
|
736
|
+
this._tableName = tableName;
|
|
737
|
+
}
|
|
738
|
+
/**
|
|
739
|
+
* @param {function() : Promise<void>} callback
|
|
740
|
+
* @returns {Promise<*>}
|
|
741
|
+
*/
|
|
742
|
+
static async transaction(callback) {
|
|
743
|
+
const useTransactions = this.connection().getArgs().record?.transactions;
|
|
744
|
+
if (useTransactions !== false) {
|
|
745
|
+
return await this.connection().transaction(callback);
|
|
746
|
+
}
|
|
747
|
+
else {
|
|
748
|
+
return await callback();
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
/**
|
|
752
|
+
* @param {...string} names
|
|
753
|
+
* @returns {void}
|
|
754
|
+
*/
|
|
755
|
+
static translates(...names) {
|
|
756
|
+
const translations = this.getTranslationsMap();
|
|
757
|
+
for (const name of names) {
|
|
758
|
+
if (name in translations)
|
|
759
|
+
throw new Error(`Translation already exists: ${name}`);
|
|
760
|
+
translations[name] = {};
|
|
761
|
+
if (!this._relationshipExists("translations")) {
|
|
762
|
+
this._defineRelationship("translations", { klass: this.getTranslationClass(), type: "hasMany" });
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
/**
|
|
767
|
+
* @returns {typeof VelociousDatabaseRecord}
|
|
768
|
+
*/
|
|
769
|
+
static getTranslationClass() {
|
|
770
|
+
if (this._translationClass)
|
|
771
|
+
return this._translationClass;
|
|
772
|
+
if (this.tableName().endsWith("_translations"))
|
|
773
|
+
throw new Error("Trying to define a translations class for a translation class");
|
|
774
|
+
const className = `${this.name}Translation`;
|
|
775
|
+
const TranslationClass = class Translation extends VelociousDatabaseRecord {
|
|
776
|
+
};
|
|
777
|
+
const belongsTo = `${inflection.camelize(inflection.singularize(this.tableName()), true)}`;
|
|
778
|
+
Object.defineProperty(TranslationClass, "name", { value: className });
|
|
779
|
+
TranslationClass.setTableName(this.getTranslationsTableName());
|
|
780
|
+
TranslationClass.belongsTo(belongsTo);
|
|
781
|
+
this._translationClass = TranslationClass;
|
|
782
|
+
return this._translationClass;
|
|
783
|
+
}
|
|
784
|
+
/**
|
|
785
|
+
* @returns {string}
|
|
786
|
+
*/
|
|
787
|
+
static getTranslationsTableName() {
|
|
788
|
+
const tableNameParts = this.tableName().split("_");
|
|
789
|
+
tableNameParts[tableNameParts.length - 1] = inflection.singularize(tableNameParts[tableNameParts.length - 1]);
|
|
790
|
+
return `${tableNameParts.join("_")}_translations`;
|
|
791
|
+
}
|
|
792
|
+
/**
|
|
793
|
+
* @returns {Promise<boolean>}
|
|
794
|
+
*/
|
|
795
|
+
static async hasTranslationsTable() {
|
|
796
|
+
try {
|
|
797
|
+
await this.connection().getTableByName(this.getTranslationsTableName());
|
|
798
|
+
return true;
|
|
799
|
+
}
|
|
800
|
+
catch {
|
|
801
|
+
return false;
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
/**
|
|
805
|
+
* Adds a validation to an attribute.
|
|
806
|
+
* @param {string} attributeName The name of the attribute to validate.
|
|
807
|
+
* @param {Record<string, boolean | Record<string, any>>} validators The validators to add. Key is the validator name, value is the validator arguments.
|
|
808
|
+
*/
|
|
809
|
+
static async validates(attributeName, validators) {
|
|
810
|
+
for (const validatorName in validators) {
|
|
811
|
+
/** @type {Record<string, any>} */
|
|
812
|
+
let validatorArgs;
|
|
813
|
+
/** @type {boolean} */
|
|
814
|
+
let useValidator = true;
|
|
815
|
+
const validatorArgsCandidate = validators[validatorName];
|
|
816
|
+
if (typeof validatorArgsCandidate == "boolean") {
|
|
817
|
+
validatorArgs = {};
|
|
818
|
+
useValidator;
|
|
819
|
+
if (!validatorArgsCandidate) {
|
|
820
|
+
useValidator = false;
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
else {
|
|
824
|
+
validatorArgs = validatorArgsCandidate;
|
|
825
|
+
}
|
|
826
|
+
if (!useValidator) {
|
|
827
|
+
continue;
|
|
828
|
+
}
|
|
829
|
+
const ValidatorClass = this.getValidatorType(validatorName);
|
|
830
|
+
const validator = new ValidatorClass({ attributeName, args: validatorArgs });
|
|
831
|
+
if (!this._validators)
|
|
832
|
+
this._validators = {};
|
|
833
|
+
if (!(attributeName in this._validators))
|
|
834
|
+
this._validators[attributeName] = [];
|
|
835
|
+
this._validators[attributeName].push(validator);
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
/**
|
|
839
|
+
* @abstract
|
|
840
|
+
* @returns {TranslationBase[]}
|
|
841
|
+
*/
|
|
842
|
+
translationsLoaded() {
|
|
843
|
+
throw new Error("'translationsLoaded' not implemented");
|
|
844
|
+
}
|
|
845
|
+
/**
|
|
846
|
+
* @param {string} name
|
|
847
|
+
* @param {string} locale
|
|
848
|
+
* @returns {*}
|
|
849
|
+
*/
|
|
850
|
+
_getTranslatedAttribute(name, locale) {
|
|
851
|
+
const translation = this.translationsLoaded().find((translation) => translation.locale() == locale);
|
|
852
|
+
if (translation) {
|
|
853
|
+
/** @type {Record<string, unknown>} */
|
|
854
|
+
// @ts-expect-error
|
|
855
|
+
const dict = translation;
|
|
856
|
+
const attributeMethod = /** @type {function() : any | undefined} */ (dict[name]);
|
|
857
|
+
if (typeof attributeMethod == "function") {
|
|
858
|
+
return attributeMethod.bind(translation)();
|
|
859
|
+
}
|
|
860
|
+
else {
|
|
861
|
+
throw new Error(`No such translated method: ${name} (${typeof attributeMethod})`);
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
/**
|
|
866
|
+
* @param {string} name
|
|
867
|
+
* @param {string} locale
|
|
868
|
+
* @returns {*}
|
|
869
|
+
*/
|
|
870
|
+
_getTranslatedAttributeWithFallback(name, locale) {
|
|
871
|
+
let localesInOrder;
|
|
872
|
+
const fallbacks = this._getConfiguration().getLocaleFallbacks();
|
|
873
|
+
if (fallbacks && locale in fallbacks) {
|
|
874
|
+
localesInOrder = fallbacks[locale];
|
|
875
|
+
}
|
|
876
|
+
else {
|
|
877
|
+
localesInOrder = [locale];
|
|
878
|
+
}
|
|
879
|
+
for (const fallbackLocale of localesInOrder) {
|
|
880
|
+
const result = this._getTranslatedAttribute(name, fallbackLocale);
|
|
881
|
+
if (result && result.trim() != "") {
|
|
882
|
+
return result;
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
/**
|
|
887
|
+
* @param {string} name
|
|
888
|
+
* @param {string} locale
|
|
889
|
+
* @param {*} newValue
|
|
890
|
+
* @returns {void}
|
|
891
|
+
*/
|
|
892
|
+
_setTranslatedAttribute(name, locale, newValue) {
|
|
893
|
+
/** @type {VelociousDatabaseRecord | TranslationBase | undefined} */
|
|
894
|
+
let translation;
|
|
895
|
+
translation = this.translationsLoaded()?.find((translation) => translation.locale() == locale);
|
|
896
|
+
if (!translation) {
|
|
897
|
+
const instanceRelationship = this.getRelationshipByName("translations");
|
|
898
|
+
translation = instanceRelationship.build({ locale });
|
|
899
|
+
}
|
|
900
|
+
/** @type {Record<string, any>} */
|
|
901
|
+
const assignments = {};
|
|
902
|
+
assignments[name] = newValue;
|
|
903
|
+
translation.assign(assignments);
|
|
904
|
+
}
|
|
905
|
+
/**
|
|
906
|
+
* @returns {Query}
|
|
907
|
+
*/
|
|
908
|
+
static _newQuery() {
|
|
909
|
+
const handler = new Handler();
|
|
910
|
+
const query = new Query({
|
|
911
|
+
driver: this.connection(),
|
|
912
|
+
handler,
|
|
913
|
+
modelClass: this
|
|
914
|
+
});
|
|
915
|
+
return query.from(new FromTable(this.tableName()));
|
|
916
|
+
}
|
|
917
|
+
/**
|
|
918
|
+
* @returns {string}
|
|
919
|
+
*/
|
|
920
|
+
static orderableColumn() {
|
|
921
|
+
// FIXME: Allow to change to 'created_at' if using UUID?
|
|
922
|
+
return this.primaryKey();
|
|
923
|
+
}
|
|
924
|
+
/**
|
|
925
|
+
* @returns {Query}
|
|
926
|
+
*/
|
|
927
|
+
static all() {
|
|
928
|
+
return this._newQuery();
|
|
929
|
+
}
|
|
930
|
+
/**
|
|
931
|
+
* @returns {Promise<number>}
|
|
932
|
+
*/
|
|
933
|
+
static async count() {
|
|
934
|
+
return await this._newQuery().count();
|
|
935
|
+
}
|
|
936
|
+
static async destroyAll() {
|
|
937
|
+
return await this._newQuery().destroyAll();
|
|
938
|
+
}
|
|
939
|
+
/**
|
|
940
|
+
* @param {number|string} recordId
|
|
941
|
+
* @returns {Promise<InstanceType<typeof this>>}
|
|
942
|
+
*/
|
|
943
|
+
static async find(recordId) {
|
|
944
|
+
return await this._newQuery().find(recordId);
|
|
945
|
+
}
|
|
946
|
+
/**
|
|
947
|
+
* @param {{[key: string]: any}} conditions
|
|
948
|
+
* @returns {Promise<InstanceType<typeof this> | null>}
|
|
949
|
+
*/
|
|
950
|
+
static async findBy(conditions) {
|
|
951
|
+
return await this._newQuery().findBy(conditions);
|
|
952
|
+
}
|
|
953
|
+
/**
|
|
954
|
+
* @param {{[key: string]: any}} conditions
|
|
955
|
+
* @returns {Promise<InstanceType<typeof this>>}
|
|
956
|
+
*/
|
|
957
|
+
static async findByOrFail(conditions) {
|
|
958
|
+
return await this._newQuery().findByOrFail(conditions);
|
|
959
|
+
}
|
|
960
|
+
/**
|
|
961
|
+
* @param {{[key: string]: any}} conditions
|
|
962
|
+
* @param {function() : void} callback
|
|
963
|
+
* @returns {Promise<InstanceType<typeof this>>}
|
|
964
|
+
*/
|
|
965
|
+
static async findOrCreateBy(conditions, callback) {
|
|
966
|
+
return await this._newQuery().findOrCreateBy(conditions, callback);
|
|
967
|
+
}
|
|
968
|
+
/**
|
|
969
|
+
* @param {object} conditions
|
|
970
|
+
* @param {function(import("../record/index.js").default) : void} callback
|
|
971
|
+
* @returns {Promise<InstanceType<typeof this>>}
|
|
972
|
+
*/
|
|
973
|
+
static async findOrInitializeBy(conditions, callback) {
|
|
974
|
+
return await this._newQuery().findOrInitializeBy(conditions, callback);
|
|
975
|
+
}
|
|
976
|
+
/**
|
|
977
|
+
* @returns {Promise<InstanceType<typeof this>>}
|
|
978
|
+
*/
|
|
979
|
+
static async first() {
|
|
980
|
+
return await this._newQuery().first();
|
|
981
|
+
}
|
|
982
|
+
/**
|
|
983
|
+
* @param {string|{[key: string]: any}} join
|
|
984
|
+
* @returns {Query}
|
|
985
|
+
*/
|
|
986
|
+
static joins(join) {
|
|
987
|
+
return this._newQuery().joins(join);
|
|
988
|
+
}
|
|
989
|
+
/**
|
|
990
|
+
* @returns {Promise<InstanceType<typeof this>>}
|
|
991
|
+
*/
|
|
992
|
+
static async last() {
|
|
993
|
+
return await this._newQuery().last();
|
|
994
|
+
}
|
|
995
|
+
/**
|
|
996
|
+
* @param {number} value
|
|
997
|
+
* @returns {Query}
|
|
998
|
+
*/
|
|
999
|
+
static limit(value) {
|
|
1000
|
+
return this._newQuery().limit(value);
|
|
1001
|
+
}
|
|
1002
|
+
/**
|
|
1003
|
+
* @param {string | number} order
|
|
1004
|
+
* @returns {Query}
|
|
1005
|
+
*/
|
|
1006
|
+
static order(order) {
|
|
1007
|
+
return this._newQuery().order(order);
|
|
1008
|
+
}
|
|
1009
|
+
/**
|
|
1010
|
+
* @param {import("../query/index.js").NestedPreloadRecord} preload
|
|
1011
|
+
* @returns {Query}
|
|
1012
|
+
*/
|
|
1013
|
+
static preload(preload) {
|
|
1014
|
+
return this._newQuery().preload(preload);
|
|
1015
|
+
}
|
|
1016
|
+
/**
|
|
1017
|
+
* @param {import("../query/index.js").SelectArgumentType} select
|
|
1018
|
+
* @returns {Query}
|
|
1019
|
+
*/
|
|
1020
|
+
static select(select) {
|
|
1021
|
+
return this._newQuery().select(select);
|
|
1022
|
+
}
|
|
1023
|
+
/**
|
|
1024
|
+
* @returns {Promise<VelociousDatabaseRecord[]>}
|
|
1025
|
+
*/
|
|
1026
|
+
static toArray() {
|
|
1027
|
+
return this._newQuery().toArray();
|
|
1028
|
+
}
|
|
1029
|
+
/**
|
|
1030
|
+
* @param {import("../query/index.js").WhereArgumentType} where
|
|
1031
|
+
* @returns {Query}
|
|
1032
|
+
*/
|
|
1033
|
+
static where(where) {
|
|
1034
|
+
return this._newQuery().where(where);
|
|
1035
|
+
}
|
|
1036
|
+
/**
|
|
1037
|
+
* @param {Record<string, any>} changes
|
|
1038
|
+
*/
|
|
1039
|
+
constructor(changes = {}) {
|
|
1040
|
+
this._attributes = {};
|
|
1041
|
+
this._changes = {};
|
|
1042
|
+
this._isNewRecord = true;
|
|
1043
|
+
for (const key in changes) {
|
|
1044
|
+
this.setAttribute(key, changes[key]);
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
/**
|
|
1048
|
+
* @param {object} attributes
|
|
1049
|
+
* @returns {void}
|
|
1050
|
+
*/
|
|
1051
|
+
loadExistingRecord(attributes) {
|
|
1052
|
+
this._attributes = attributes;
|
|
1053
|
+
this._isNewRecord = false;
|
|
1054
|
+
}
|
|
1055
|
+
/**
|
|
1056
|
+
* Assigns the given attributes to the record.
|
|
1057
|
+
* @param {Record<string, any>} attributesToAssign
|
|
1058
|
+
* @returns {void}
|
|
1059
|
+
*/
|
|
1060
|
+
assign(attributesToAssign) {
|
|
1061
|
+
for (const attributeToAssign in attributesToAssign) {
|
|
1062
|
+
this.setAttribute(attributeToAssign, attributesToAssign[attributeToAssign]);
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
/**
|
|
1066
|
+
* Returns a the current attributes of the record (original attributes from database plus changes)
|
|
1067
|
+
* @returns {Record<string, any>}
|
|
1068
|
+
*/
|
|
1069
|
+
attributes() {
|
|
1070
|
+
return Object.assign({}, this._attributes, this._changes);
|
|
1071
|
+
}
|
|
1072
|
+
/**
|
|
1073
|
+
* @returns {import("../drivers/base.js").default}
|
|
1074
|
+
*/
|
|
1075
|
+
_connection() {
|
|
1076
|
+
if (this.__connection)
|
|
1077
|
+
return this.__connection;
|
|
1078
|
+
return this.getModelClass().connection();
|
|
1079
|
+
}
|
|
1080
|
+
/**
|
|
1081
|
+
* Destroys the record in the database and all of its dependent records.
|
|
1082
|
+
* @returns {Promise<void>}
|
|
1083
|
+
*/
|
|
1084
|
+
async destroy() {
|
|
1085
|
+
for (const relationship of this.getModelClass().getRelationships()) {
|
|
1086
|
+
if (relationship.getDependent() != "destroy") {
|
|
1087
|
+
continue;
|
|
1088
|
+
}
|
|
1089
|
+
const instanceRelationship = this.getRelationshipByName(relationship.getRelationshipName());
|
|
1090
|
+
/** @type {VelociousDatabaseRecord[]} */
|
|
1091
|
+
let models;
|
|
1092
|
+
if (instanceRelationship.getType() == "belongsTo") {
|
|
1093
|
+
if (!instanceRelationship.isLoaded()) {
|
|
1094
|
+
await instanceRelationship.load();
|
|
1095
|
+
}
|
|
1096
|
+
const model = instanceRelationship.loaded();
|
|
1097
|
+
if (model instanceof VelociousDatabaseRecord) {
|
|
1098
|
+
models = [model];
|
|
1099
|
+
}
|
|
1100
|
+
else {
|
|
1101
|
+
throw new Error(`Unexpected loaded type: ${typeof model}`);
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
else if (instanceRelationship.getType() == "hasMany") {
|
|
1105
|
+
if (!instanceRelationship.isLoaded()) {
|
|
1106
|
+
await instanceRelationship.load();
|
|
1107
|
+
}
|
|
1108
|
+
const loadedModels = instanceRelationship.loaded();
|
|
1109
|
+
if (Array.isArray(loadedModels)) {
|
|
1110
|
+
models = loadedModels;
|
|
1111
|
+
}
|
|
1112
|
+
else {
|
|
1113
|
+
throw new Error(`Unexpected loaded type: ${typeof loadedModels}`);
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
else {
|
|
1117
|
+
throw new Error(`Unhandled relationship type: ${instanceRelationship.getType()}`);
|
|
1118
|
+
}
|
|
1119
|
+
for (const model of models) {
|
|
1120
|
+
if (model.isPersisted()) {
|
|
1121
|
+
await model.destroy();
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
/** @type {Record<string, any>} */
|
|
1126
|
+
const conditions = {};
|
|
1127
|
+
conditions[this.getModelClass().primaryKey()] = this.id();
|
|
1128
|
+
const sql = this._connection().deleteSql({
|
|
1129
|
+
conditions,
|
|
1130
|
+
tableName: this._tableName()
|
|
1131
|
+
});
|
|
1132
|
+
await this._connection().query(sql);
|
|
1133
|
+
}
|
|
1134
|
+
/** @returns {boolean} */
|
|
1135
|
+
_hasChanges() { return Object.keys(this._changes).length > 0; }
|
|
1136
|
+
/**
|
|
1137
|
+
* Returns true if the model has been changed since it was loaded from the database.
|
|
1138
|
+
* @returns {boolean}
|
|
1139
|
+
*/
|
|
1140
|
+
isChanged() {
|
|
1141
|
+
if (this.isNewRecord() || this._hasChanges()) {
|
|
1142
|
+
return true;
|
|
1143
|
+
}
|
|
1144
|
+
// Check if a loaded sub-model of a relationship is changed and should be saved along with this model.
|
|
1145
|
+
if (this._instanceRelationships) {
|
|
1146
|
+
for (const instanceRelationshipName in this._instanceRelationships) {
|
|
1147
|
+
const instanceRelationship = this._instanceRelationships[instanceRelationshipName];
|
|
1148
|
+
let loaded = instanceRelationship._loaded;
|
|
1149
|
+
if (instanceRelationship.getAutoSave() === false) {
|
|
1150
|
+
continue;
|
|
1151
|
+
}
|
|
1152
|
+
if (!loaded)
|
|
1153
|
+
continue;
|
|
1154
|
+
if (!Array.isArray(loaded))
|
|
1155
|
+
loaded = [loaded];
|
|
1156
|
+
for (const model of loaded) {
|
|
1157
|
+
if (model.isChanged()) {
|
|
1158
|
+
return true;
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
}
|
|
1163
|
+
return false;
|
|
1164
|
+
}
|
|
1165
|
+
/** Returns the changes that have been made to this record since it was loaded from the database. */
|
|
1166
|
+
changes() {
|
|
1167
|
+
/** @type {Record<string, any[]>} */
|
|
1168
|
+
const changes = {};
|
|
1169
|
+
for (const changeKey in this._changes) {
|
|
1170
|
+
const changeValue = this._changes[changeKey];
|
|
1171
|
+
changes[changeKey] = [this._attributes[changeKey], changeValue];
|
|
1172
|
+
}
|
|
1173
|
+
return changes;
|
|
1174
|
+
}
|
|
1175
|
+
/**
|
|
1176
|
+
* @returns {string}
|
|
1177
|
+
*/
|
|
1178
|
+
_tableName() {
|
|
1179
|
+
if (this.__tableName)
|
|
1180
|
+
return this.__tableName;
|
|
1181
|
+
return this.getModelClass().tableName();
|
|
1182
|
+
}
|
|
1183
|
+
/**
|
|
1184
|
+
* Reads an attribute value from the record.
|
|
1185
|
+
* @param {string} attributeName The name of the attribute to read. This is the attribute name, not the column name.
|
|
1186
|
+
* @returns {any}
|
|
1187
|
+
*/
|
|
1188
|
+
readAttribute(attributeName) {
|
|
1189
|
+
const columnName = this.getModelClass().getAttributeNameToColumnNameMap()[attributeName];
|
|
1190
|
+
if (!columnName)
|
|
1191
|
+
throw new Error(`Couldn't figure out column name for attribute: ${attributeName} from these mappings: ${Object.keys(this.getModelClass().getAttributeNameToColumnNameMap()).join(", ")}`);
|
|
1192
|
+
return this.readColumn(columnName);
|
|
1193
|
+
}
|
|
1194
|
+
/**
|
|
1195
|
+
* Reads a column value from the record.
|
|
1196
|
+
* @param {string} attributeName The name of the column to read. This is the column name, not the attribute name.
|
|
1197
|
+
*/
|
|
1198
|
+
readColumn(attributeName) {
|
|
1199
|
+
const column = this.getModelClass().getColumns().find((column) => column.getName() == attributeName);
|
|
1200
|
+
let result;
|
|
1201
|
+
if (attributeName in this._changes) {
|
|
1202
|
+
result = this._changes[attributeName];
|
|
1203
|
+
}
|
|
1204
|
+
else if (attributeName in this._attributes) {
|
|
1205
|
+
result = this._attributes[attributeName];
|
|
1206
|
+
}
|
|
1207
|
+
else if (this.isPersisted()) {
|
|
1208
|
+
throw new Error(`No such attribute or not selected ${this.constructor.name}#${attributeName}`);
|
|
1209
|
+
}
|
|
1210
|
+
if (column && this.getModelClass().getDatabaseType() == "sqlite") {
|
|
1211
|
+
if (result && (column.getType() == "date" || column.getType() == "datetime")) {
|
|
1212
|
+
result = new Date(Date.parse(result));
|
|
1213
|
+
}
|
|
1214
|
+
}
|
|
1215
|
+
return result;
|
|
1216
|
+
}
|
|
1217
|
+
_belongsToChanges() {
|
|
1218
|
+
/** @type {Record<string, any>} */
|
|
1219
|
+
const belongsToChanges = {};
|
|
1220
|
+
if (this._instanceRelationships) {
|
|
1221
|
+
for (const relationshipName in this._instanceRelationships) {
|
|
1222
|
+
const relationship = this._instanceRelationships[relationshipName];
|
|
1223
|
+
if (relationship.getType() == "belongsTo" && relationship.getDirty()) {
|
|
1224
|
+
const model = relationship.loaded();
|
|
1225
|
+
if (model) {
|
|
1226
|
+
if (model instanceof VelociousDatabaseRecord) {
|
|
1227
|
+
belongsToChanges[relationship.getForeignKey()] = model?.id();
|
|
1228
|
+
}
|
|
1229
|
+
else {
|
|
1230
|
+
throw new Error(`Unexpected model type: ${typeof model}`);
|
|
1231
|
+
}
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
return belongsToChanges;
|
|
1237
|
+
}
|
|
1238
|
+
/**
|
|
1239
|
+
* @returns {Promise<void>}
|
|
1240
|
+
*/
|
|
1241
|
+
async _createNewRecord() {
|
|
1242
|
+
if (!this.getModelClass().connection()["insertSql"]) {
|
|
1243
|
+
throw new Error(`No insertSql on ${this.getModelClass().connection().constructor.name}`);
|
|
1244
|
+
}
|
|
1245
|
+
const createdAtColumn = this.getModelClass().getColumns().find((column) => column.getName() == "created_at");
|
|
1246
|
+
const updatedAtColumn = this.getModelClass().getColumns().find((column) => column.getName() == "updated_at");
|
|
1247
|
+
const data = Object.assign({}, this._belongsToChanges(), this.attributes());
|
|
1248
|
+
const currentDate = new Date();
|
|
1249
|
+
if (createdAtColumn)
|
|
1250
|
+
data.created_at = currentDate;
|
|
1251
|
+
if (updatedAtColumn)
|
|
1252
|
+
data.updated_at = currentDate;
|
|
1253
|
+
const columnNames = this.getModelClass().getColumnNames();
|
|
1254
|
+
const sql = this._connection().insertSql({
|
|
1255
|
+
returnLastInsertedColumnNames: columnNames,
|
|
1256
|
+
tableName: this._tableName(),
|
|
1257
|
+
data
|
|
1258
|
+
});
|
|
1259
|
+
const insertResult = await this._connection().query(sql);
|
|
1260
|
+
const primaryKey = this.getModelClass().primaryKey();
|
|
1261
|
+
if (Array.isArray(insertResult) && insertResult[0] && insertResult[0][primaryKey]) {
|
|
1262
|
+
this._attributes = insertResult[0];
|
|
1263
|
+
this._changes = {};
|
|
1264
|
+
}
|
|
1265
|
+
else {
|
|
1266
|
+
const id = await this._connection().lastInsertID();
|
|
1267
|
+
await this._reloadWithId(id);
|
|
1268
|
+
}
|
|
1269
|
+
this.setIsNewRecord(false);
|
|
1270
|
+
// Mark all relationships as preloaded, since we don't expect anything to have magically appeared since we created the record.
|
|
1271
|
+
for (const relationship of this.getModelClass().getRelationships()) {
|
|
1272
|
+
const instanceRelationship = this.getRelationshipByName(relationship.getRelationshipName());
|
|
1273
|
+
if (instanceRelationship.getType() == "hasMany" && instanceRelationship.getLoadedOrUndefined() === null) {
|
|
1274
|
+
instanceRelationship.setLoaded([]);
|
|
1275
|
+
}
|
|
1276
|
+
instanceRelationship.setPreloaded(true);
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1279
|
+
/**
|
|
1280
|
+
* @returns {Promise<void>}
|
|
1281
|
+
*/
|
|
1282
|
+
async _updateRecordWithChanges() {
|
|
1283
|
+
/** @type {Record<string, any>} */
|
|
1284
|
+
const conditions = {};
|
|
1285
|
+
conditions[this.getModelClass().primaryKey()] = this.id();
|
|
1286
|
+
const changes = Object.assign({}, this._belongsToChanges(), this._changes);
|
|
1287
|
+
const updatedAtColumn = this.getModelClass().getColumns().find((column) => column.getName() == "updated_at");
|
|
1288
|
+
const currentDate = new Date();
|
|
1289
|
+
if (updatedAtColumn)
|
|
1290
|
+
changes.updated_at = currentDate;
|
|
1291
|
+
if (Object.keys(changes).length > 0) {
|
|
1292
|
+
const sql = this._connection().updateSql({
|
|
1293
|
+
tableName: this._tableName(),
|
|
1294
|
+
data: changes,
|
|
1295
|
+
conditions
|
|
1296
|
+
});
|
|
1297
|
+
await this._connection().query(sql);
|
|
1298
|
+
await this._reloadWithId(this.id());
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
/**
|
|
1302
|
+
* @returns {number|string}
|
|
1303
|
+
*/
|
|
1304
|
+
id() {
|
|
1305
|
+
if (!this.getModelClass()._columnNameToAttributeName) {
|
|
1306
|
+
throw new Error(`Column names mapping hasn't been set on ${this.constructor.name}. Has the model been initialized?`);
|
|
1307
|
+
}
|
|
1308
|
+
const primaryKey = this.getModelClass().primaryKey();
|
|
1309
|
+
const attributeName = this.getModelClass().getColumnNameToAttributeNameMap()[primaryKey];
|
|
1310
|
+
if (attributeName === undefined) {
|
|
1311
|
+
throw new Error(`Primary key ${primaryKey} doesn't exist in columns: ${Object.keys(this.getModelClass().getColumnNameToAttributeNameMap()).join(", ")}`);
|
|
1312
|
+
}
|
|
1313
|
+
return this.readAttribute(attributeName);
|
|
1314
|
+
}
|
|
1315
|
+
/**
|
|
1316
|
+
* @returns {boolean}
|
|
1317
|
+
*/
|
|
1318
|
+
isPersisted() { return !this._isNewRecord; }
|
|
1319
|
+
/**
|
|
1320
|
+
* @returns {boolean}
|
|
1321
|
+
*/
|
|
1322
|
+
isNewRecord() { return this._isNewRecord; }
|
|
1323
|
+
/**
|
|
1324
|
+
* @param {boolean} newIsNewRecord
|
|
1325
|
+
* @returns {void}
|
|
1326
|
+
*/
|
|
1327
|
+
setIsNewRecord(newIsNewRecord) {
|
|
1328
|
+
this._isNewRecord = newIsNewRecord;
|
|
1329
|
+
}
|
|
1330
|
+
/**
|
|
1331
|
+
* @param {string | number} id
|
|
1332
|
+
*/
|
|
1333
|
+
async _reloadWithId(id) {
|
|
1334
|
+
const primaryKey = this.getModelClass().primaryKey();
|
|
1335
|
+
/** @type {Record<string, any>} */
|
|
1336
|
+
const whereObject = {};
|
|
1337
|
+
whereObject[primaryKey] = id;
|
|
1338
|
+
const query = this.getModelClass().where(whereObject);
|
|
1339
|
+
const reloadedModel = await query.first();
|
|
1340
|
+
if (!reloadedModel)
|
|
1341
|
+
throw new Error(`${this.constructor.name}#${id} couldn't be reloaded - record didn't exist`);
|
|
1342
|
+
this._attributes = reloadedModel.attributes();
|
|
1343
|
+
this._changes = {};
|
|
1344
|
+
}
|
|
1345
|
+
/**
|
|
1346
|
+
* @returns {Promise<void>}
|
|
1347
|
+
*/
|
|
1348
|
+
async reload() {
|
|
1349
|
+
this._reloadWithId(this.readAttribute("id"));
|
|
1350
|
+
}
|
|
1351
|
+
async _runValidations() {
|
|
1352
|
+
/** @type {Record<string, {type: string, message: string}>} */
|
|
1353
|
+
this._validationErrors = {};
|
|
1354
|
+
const validators = this.getModelClass()._validators;
|
|
1355
|
+
if (validators) {
|
|
1356
|
+
for (const attributeName in validators) {
|
|
1357
|
+
const attributeValidators = validators[attributeName];
|
|
1358
|
+
for (const validator of attributeValidators) {
|
|
1359
|
+
await validator.validate({ model: this, attributeName });
|
|
1360
|
+
}
|
|
1361
|
+
}
|
|
1362
|
+
}
|
|
1363
|
+
if (Object.keys(this._validationErrors).length > 0) {
|
|
1364
|
+
const validationError = new ValidationError(this.fullErrorMessages().join(". "));
|
|
1365
|
+
validationError.setValidationErrors(this._validationErrors);
|
|
1366
|
+
validationError.setModel(this);
|
|
1367
|
+
throw validationError;
|
|
1368
|
+
}
|
|
1369
|
+
}
|
|
1370
|
+
/**
|
|
1371
|
+
* @returns {string[]}
|
|
1372
|
+
*/
|
|
1373
|
+
fullErrorMessages() {
|
|
1374
|
+
/** @type {string[]} */
|
|
1375
|
+
const validationErrorMessages = [];
|
|
1376
|
+
if (this._validationErrors) {
|
|
1377
|
+
for (const attributeName in this._validationErrors) {
|
|
1378
|
+
for (const validationError of this._validationErrors[attributeName]) {
|
|
1379
|
+
const message = `${this.getModelClass().humanAttributeName(attributeName)} ${validationError.message}`;
|
|
1380
|
+
validationErrorMessages.push(message);
|
|
1381
|
+
}
|
|
1382
|
+
}
|
|
1383
|
+
}
|
|
1384
|
+
return validationErrorMessages;
|
|
1385
|
+
}
|
|
1386
|
+
/**
|
|
1387
|
+
* Assigns the attributes to the record and saves it.
|
|
1388
|
+
* @param {object} attributesToAssign - The attributes to assign to the record.
|
|
1389
|
+
*/
|
|
1390
|
+
async update(attributesToAssign) {
|
|
1391
|
+
if (attributesToAssign)
|
|
1392
|
+
this.assign(attributesToAssign);
|
|
1393
|
+
await this.save();
|
|
1394
|
+
}
|
|
1395
|
+
}
|
|
1396
|
+
class TranslationBase extends VelociousDatabaseRecord {
|
|
1397
|
+
/**
|
|
1398
|
+
* @abstract
|
|
1399
|
+
* @returns {string}
|
|
1400
|
+
*/
|
|
1401
|
+
locale() {
|
|
1402
|
+
throw new Error("'locale' not implemented");
|
|
1403
|
+
}
|
|
1404
|
+
}
|
|
1405
|
+
VelociousDatabaseRecord.registerValidatorType("presence", ValidatorsPresence);
|
|
1406
|
+
VelociousDatabaseRecord.registerValidatorType("uniqueness", ValidatorsUniqueness);
|
|
1407
|
+
export { ValidationError };
|
|
1408
|
+
export default VelociousDatabaseRecord;
|