uql-orm 0.1.0
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/CHANGELOG.md +521 -0
- package/LICENSE.md +22 -0
- package/README.md +560 -0
- package/dist/browser/cc-BEf4wTUm.js +535 -0
- package/dist/browser/cc-BEf4wTUm.js.map +1 -0
- package/dist/browser/http/bus.d.ts +4 -0
- package/dist/browser/http/bus.d.ts.map +1 -0
- package/dist/browser/http/bus.js +14 -0
- package/dist/browser/http/bus.js.map +1 -0
- package/dist/browser/http/http.d.ts +7 -0
- package/dist/browser/http/http.d.ts.map +1 -0
- package/dist/browser/http/http.js +45 -0
- package/dist/browser/http/http.js.map +1 -0
- package/dist/browser/http/index.d.ts +3 -0
- package/dist/browser/http/index.d.ts.map +1 -0
- package/dist/browser/http/index.js +3 -0
- package/dist/browser/http/index.js.map +1 -0
- package/dist/browser/index.d.ts +5 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +5 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/options.d.ts +5 -0
- package/dist/browser/options.d.ts.map +1 -0
- package/dist/browser/options.js +14 -0
- package/dist/browser/options.js.map +1 -0
- package/dist/browser/querier/httpQuerier.d.ts +20 -0
- package/dist/browser/querier/httpQuerier.d.ts.map +1 -0
- package/dist/browser/querier/httpQuerier.js +68 -0
- package/dist/browser/querier/httpQuerier.js.map +1 -0
- package/dist/browser/querier/index.d.ts +3 -0
- package/dist/browser/querier/index.d.ts.map +1 -0
- package/dist/browser/querier/index.js +3 -0
- package/dist/browser/querier/index.js.map +1 -0
- package/dist/browser/querier/querier.util.d.ts +3 -0
- package/dist/browser/querier/querier.util.d.ts.map +1 -0
- package/dist/browser/querier/querier.util.js +17 -0
- package/dist/browser/querier/querier.util.js.map +1 -0
- package/dist/browser/type/clientQuerier.d.ts +24 -0
- package/dist/browser/type/clientQuerier.d.ts.map +1 -0
- package/dist/browser/type/clientQuerier.js +2 -0
- package/dist/browser/type/clientQuerier.js.map +1 -0
- package/dist/browser/type/clientQuerierPool.d.ts +5 -0
- package/dist/browser/type/clientQuerierPool.d.ts.map +1 -0
- package/dist/browser/type/clientQuerierPool.js +2 -0
- package/dist/browser/type/clientQuerierPool.js.map +1 -0
- package/dist/browser/type/index.d.ts +4 -0
- package/dist/browser/type/index.d.ts.map +1 -0
- package/dist/browser/type/index.js +4 -0
- package/dist/browser/type/index.js.map +1 -0
- package/dist/browser/type/request.d.ts +29 -0
- package/dist/browser/type/request.d.ts.map +1 -0
- package/dist/browser/type/request.js +2 -0
- package/dist/browser/type/request.js.map +1 -0
- package/dist/browser/uql-browser.min.js +4818 -0
- package/dist/browser/uql-browser.min.js.map +1 -0
- package/dist/d1/d1Querier.d.ts +45 -0
- package/dist/d1/d1Querier.d.ts.map +1 -0
- package/dist/d1/d1Querier.js +31 -0
- package/dist/d1/d1Querier.js.map +1 -0
- package/dist/d1/d1QuerierPool.d.ts +10 -0
- package/dist/d1/d1QuerierPool.d.ts.map +1 -0
- package/dist/d1/d1QuerierPool.js +16 -0
- package/dist/d1/d1QuerierPool.js.map +1 -0
- package/dist/d1/index.d.ts +3 -0
- package/dist/d1/index.d.ts.map +1 -0
- package/dist/d1/index.js +3 -0
- package/dist/d1/index.js.map +1 -0
- package/dist/dialect/abstractDialect.d.ts +22 -0
- package/dist/dialect/abstractDialect.d.ts.map +1 -0
- package/dist/dialect/abstractDialect.js +37 -0
- package/dist/dialect/abstractDialect.js.map +1 -0
- package/dist/dialect/abstractSqlDialect.d.ts +140 -0
- package/dist/dialect/abstractSqlDialect.d.ts.map +1 -0
- package/dist/dialect/abstractSqlDialect.js +957 -0
- package/dist/dialect/abstractSqlDialect.js.map +1 -0
- package/dist/dialect/dialectConfig.d.ts +23 -0
- package/dist/dialect/dialectConfig.d.ts.map +1 -0
- package/dist/dialect/dialectConfig.js +96 -0
- package/dist/dialect/dialectConfig.js.map +1 -0
- package/dist/dialect/index.d.ts +5 -0
- package/dist/dialect/index.d.ts.map +1 -0
- package/dist/dialect/index.js +5 -0
- package/dist/dialect/index.js.map +1 -0
- package/dist/dialect/queryContext.d.ts +49 -0
- package/dist/dialect/queryContext.d.ts.map +1 -0
- package/dist/dialect/queryContext.js +65 -0
- package/dist/dialect/queryContext.js.map +1 -0
- package/dist/entity/decorator/definition.d.ts +11 -0
- package/dist/entity/decorator/definition.d.ts.map +1 -0
- package/dist/entity/decorator/definition.js +247 -0
- package/dist/entity/decorator/definition.js.map +1 -0
- package/dist/entity/decorator/entity.d.ts +3 -0
- package/dist/entity/decorator/entity.d.ts.map +1 -0
- package/dist/entity/decorator/entity.js +7 -0
- package/dist/entity/decorator/entity.js.map +1 -0
- package/dist/entity/decorator/field.d.ts +3 -0
- package/dist/entity/decorator/field.d.ts.map +1 -0
- package/dist/entity/decorator/field.js +8 -0
- package/dist/entity/decorator/field.js.map +1 -0
- package/dist/entity/decorator/hook.d.ts +8 -0
- package/dist/entity/decorator/hook.d.ts.map +1 -0
- package/dist/entity/decorator/hook.js +15 -0
- package/dist/entity/decorator/hook.js.map +1 -0
- package/dist/entity/decorator/id.d.ts +3 -0
- package/dist/entity/decorator/id.d.ts.map +1 -0
- package/dist/entity/decorator/id.js +8 -0
- package/dist/entity/decorator/id.js.map +1 -0
- package/dist/entity/decorator/index-decorator.d.ts +36 -0
- package/dist/entity/decorator/index-decorator.d.ts.map +1 -0
- package/dist/entity/decorator/index-decorator.js +52 -0
- package/dist/entity/decorator/index-decorator.js.map +1 -0
- package/dist/entity/decorator/index.d.ts +8 -0
- package/dist/entity/decorator/index.d.ts.map +1 -0
- package/dist/entity/decorator/index.js +8 -0
- package/dist/entity/decorator/index.js.map +1 -0
- package/dist/entity/decorator/relation.d.ts +9 -0
- package/dist/entity/decorator/relation.d.ts.map +1 -0
- package/dist/entity/decorator/relation.js +20 -0
- package/dist/entity/decorator/relation.js.map +1 -0
- package/dist/entity/index.d.ts +2 -0
- package/dist/entity/index.d.ts.map +1 -0
- package/dist/entity/index.js +2 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/express/index.d.ts +3 -0
- package/dist/express/index.d.ts.map +1 -0
- package/dist/express/index.js +3 -0
- package/dist/express/index.js.map +1 -0
- package/dist/express/querierMiddleware.d.ts +26 -0
- package/dist/express/querierMiddleware.d.ts.map +1 -0
- package/dist/express/querierMiddleware.js +149 -0
- package/dist/express/querierMiddleware.js.map +1 -0
- package/dist/express/query.util.d.ts +7 -0
- package/dist/express/query.util.d.ts.map +1 -0
- package/dist/express/query.util.js +28 -0
- package/dist/express/query.util.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/libsql/index.d.ts +3 -0
- package/dist/libsql/index.d.ts.map +1 -0
- package/dist/libsql/index.js +3 -0
- package/dist/libsql/index.js.map +1 -0
- package/dist/libsql/libsqlQuerier.d.ts +17 -0
- package/dist/libsql/libsqlQuerier.d.ts.map +1 -0
- package/dist/libsql/libsqlQuerier.js +71 -0
- package/dist/libsql/libsqlQuerier.js.map +1 -0
- package/dist/libsql/libsqlQuerierPool.d.ts +12 -0
- package/dist/libsql/libsqlQuerierPool.d.ts.map +1 -0
- package/dist/libsql/libsqlQuerierPool.js +19 -0
- package/dist/libsql/libsqlQuerierPool.js.map +1 -0
- package/dist/maria/index.d.ts +4 -0
- package/dist/maria/index.d.ts.map +1 -0
- package/dist/maria/index.js +4 -0
- package/dist/maria/index.js.map +1 -0
- package/dist/maria/mariaDialect.d.ts +10 -0
- package/dist/maria/mariaDialect.d.ts.map +1 -0
- package/dist/maria/mariaDialect.js +41 -0
- package/dist/maria/mariaDialect.js.map +1 -0
- package/dist/maria/mariadbQuerier.d.ts +10 -0
- package/dist/maria/mariadbQuerier.d.ts.map +1 -0
- package/dist/maria/mariadbQuerier.js +20 -0
- package/dist/maria/mariadbQuerier.js.map +1 -0
- package/dist/maria/mariadbQuerierPool.d.ts +11 -0
- package/dist/maria/mariadbQuerierPool.d.ts.map +1 -0
- package/dist/maria/mariadbQuerierPool.js +17 -0
- package/dist/maria/mariadbQuerierPool.js.map +1 -0
- package/dist/migrate/bin.d.ts +3 -0
- package/dist/migrate/bin.d.ts.map +1 -0
- package/dist/migrate/bin.js +7 -0
- package/dist/migrate/bin.js.map +1 -0
- package/dist/migrate/builder/columnBuilder.d.ts +79 -0
- package/dist/migrate/builder/columnBuilder.d.ts.map +1 -0
- package/dist/migrate/builder/columnBuilder.js +159 -0
- package/dist/migrate/builder/columnBuilder.js.map +1 -0
- package/dist/migrate/builder/expressions.d.ts +87 -0
- package/dist/migrate/builder/expressions.d.ts.map +1 -0
- package/dist/migrate/builder/expressions.js +150 -0
- package/dist/migrate/builder/expressions.js.map +1 -0
- package/dist/migrate/builder/index.d.ts +6 -0
- package/dist/migrate/builder/index.d.ts.map +1 -0
- package/dist/migrate/builder/index.js +6 -0
- package/dist/migrate/builder/index.js.map +1 -0
- package/dist/migrate/builder/migrationBuilder.d.ts +109 -0
- package/dist/migrate/builder/migrationBuilder.d.ts.map +1 -0
- package/dist/migrate/builder/migrationBuilder.js +463 -0
- package/dist/migrate/builder/migrationBuilder.js.map +1 -0
- package/dist/migrate/builder/tableBuilder.d.ts +51 -0
- package/dist/migrate/builder/tableBuilder.d.ts.map +1 -0
- package/dist/migrate/builder/tableBuilder.js +291 -0
- package/dist/migrate/builder/tableBuilder.js.map +1 -0
- package/dist/migrate/builder/types.d.ts +466 -0
- package/dist/migrate/builder/types.d.ts.map +1 -0
- package/dist/migrate/builder/types.js +8 -0
- package/dist/migrate/builder/types.js.map +1 -0
- package/dist/migrate/cli-config.d.ts +3 -0
- package/dist/migrate/cli-config.d.ts.map +1 -0
- package/dist/migrate/cli-config.js +35 -0
- package/dist/migrate/cli-config.js.map +1 -0
- package/dist/migrate/cli.d.ts +16 -0
- package/dist/migrate/cli.d.ts.map +1 -0
- package/dist/migrate/cli.js +394 -0
- package/dist/migrate/cli.js.map +1 -0
- package/dist/migrate/codegen/entityCodeGenerator.d.ts +137 -0
- package/dist/migrate/codegen/entityCodeGenerator.d.ts.map +1 -0
- package/dist/migrate/codegen/entityCodeGenerator.js +405 -0
- package/dist/migrate/codegen/entityCodeGenerator.js.map +1 -0
- package/dist/migrate/codegen/entityMerger.d.ts +115 -0
- package/dist/migrate/codegen/entityMerger.d.ts.map +1 -0
- package/dist/migrate/codegen/entityMerger.js +294 -0
- package/dist/migrate/codegen/entityMerger.js.map +1 -0
- package/dist/migrate/codegen/index.d.ts +10 -0
- package/dist/migrate/codegen/index.d.ts.map +1 -0
- package/dist/migrate/codegen/index.js +14 -0
- package/dist/migrate/codegen/index.js.map +1 -0
- package/dist/migrate/codegen/migrationCodeGenerator.d.ts +62 -0
- package/dist/migrate/codegen/migrationCodeGenerator.d.ts.map +1 -0
- package/dist/migrate/codegen/migrationCodeGenerator.js +356 -0
- package/dist/migrate/codegen/migrationCodeGenerator.js.map +1 -0
- package/dist/migrate/codegen/smartRelationDetector.d.ts +48 -0
- package/dist/migrate/codegen/smartRelationDetector.d.ts.map +1 -0
- package/dist/migrate/codegen/smartRelationDetector.js +135 -0
- package/dist/migrate/codegen/smartRelationDetector.js.map +1 -0
- package/dist/migrate/drift/driftDetector.d.ts +81 -0
- package/dist/migrate/drift/driftDetector.d.ts.map +1 -0
- package/dist/migrate/drift/driftDetector.js +248 -0
- package/dist/migrate/drift/driftDetector.js.map +1 -0
- package/dist/migrate/drift/index.d.ts +7 -0
- package/dist/migrate/drift/index.d.ts.map +1 -0
- package/dist/migrate/drift/index.js +7 -0
- package/dist/migrate/drift/index.js.map +1 -0
- package/dist/migrate/generator/index.d.ts +3 -0
- package/dist/migrate/generator/index.d.ts.map +1 -0
- package/dist/migrate/generator/index.js +3 -0
- package/dist/migrate/generator/index.js.map +1 -0
- package/dist/migrate/generator/mongoSchemaGenerator.d.ts +39 -0
- package/dist/migrate/generator/mongoSchemaGenerator.d.ts.map +1 -0
- package/dist/migrate/generator/mongoSchemaGenerator.js +183 -0
- package/dist/migrate/generator/mongoSchemaGenerator.js.map +1 -0
- package/dist/migrate/index.d.ts +13 -0
- package/dist/migrate/index.d.ts.map +1 -0
- package/dist/migrate/index.js +20 -0
- package/dist/migrate/index.js.map +1 -0
- package/dist/migrate/introspection/abstractSqlSchemaIntrospector.d.ts +77 -0
- package/dist/migrate/introspection/abstractSqlSchemaIntrospector.d.ts.map +1 -0
- package/dist/migrate/introspection/abstractSqlSchemaIntrospector.js +156 -0
- package/dist/migrate/introspection/abstractSqlSchemaIntrospector.js.map +1 -0
- package/dist/migrate/introspection/baseSqlIntrospector.d.ts +28 -0
- package/dist/migrate/introspection/baseSqlIntrospector.d.ts.map +1 -0
- package/dist/migrate/introspection/baseSqlIntrospector.js +135 -0
- package/dist/migrate/introspection/baseSqlIntrospector.js.map +1 -0
- package/dist/migrate/introspection/index.d.ts +6 -0
- package/dist/migrate/introspection/index.d.ts.map +1 -0
- package/dist/migrate/introspection/index.js +6 -0
- package/dist/migrate/introspection/index.js.map +1 -0
- package/dist/migrate/introspection/mongoIntrospector.d.ts +15 -0
- package/dist/migrate/introspection/mongoIntrospector.d.ts.map +1 -0
- package/dist/migrate/introspection/mongoIntrospector.js +100 -0
- package/dist/migrate/introspection/mongoIntrospector.js.map +1 -0
- package/dist/migrate/introspection/mysqlIntrospector.d.ts +59 -0
- package/dist/migrate/introspection/mysqlIntrospector.d.ts.map +1 -0
- package/dist/migrate/introspection/mysqlIntrospector.js +175 -0
- package/dist/migrate/introspection/mysqlIntrospector.js.map +1 -0
- package/dist/migrate/introspection/postgresIntrospector.d.ts +55 -0
- package/dist/migrate/introspection/postgresIntrospector.d.ts.map +1 -0
- package/dist/migrate/introspection/postgresIntrospector.js +226 -0
- package/dist/migrate/introspection/postgresIntrospector.js.map +1 -0
- package/dist/migrate/introspection/sqliteIntrospector.d.ts +60 -0
- package/dist/migrate/introspection/sqliteIntrospector.d.ts.map +1 -0
- package/dist/migrate/introspection/sqliteIntrospector.js +180 -0
- package/dist/migrate/introspection/sqliteIntrospector.js.map +1 -0
- package/dist/migrate/migrator.d.ts +176 -0
- package/dist/migrate/migrator.d.ts.map +1 -0
- package/dist/migrate/migrator.js +624 -0
- package/dist/migrate/migrator.js.map +1 -0
- package/dist/migrate/schemaGenerator.d.ts +132 -0
- package/dist/migrate/schemaGenerator.d.ts.map +1 -0
- package/dist/migrate/schemaGenerator.js +628 -0
- package/dist/migrate/schemaGenerator.js.map +1 -0
- package/dist/migrate/storage/databaseStorage.d.ts +25 -0
- package/dist/migrate/storage/databaseStorage.d.ts.map +1 -0
- package/dist/migrate/storage/databaseStorage.js +77 -0
- package/dist/migrate/storage/databaseStorage.js.map +1 -0
- package/dist/migrate/storage/index.d.ts +3 -0
- package/dist/migrate/storage/index.d.ts.map +1 -0
- package/dist/migrate/storage/index.js +3 -0
- package/dist/migrate/storage/index.js.map +1 -0
- package/dist/migrate/storage/jsonStorage.d.ts +16 -0
- package/dist/migrate/storage/jsonStorage.d.ts.map +1 -0
- package/dist/migrate/storage/jsonStorage.js +43 -0
- package/dist/migrate/storage/jsonStorage.js.map +1 -0
- package/dist/migrate/sync/index.d.ts +7 -0
- package/dist/migrate/sync/index.d.ts.map +1 -0
- package/dist/migrate/sync/index.js +7 -0
- package/dist/migrate/sync/index.js.map +1 -0
- package/dist/migrate/sync/schemaSync.d.ts +132 -0
- package/dist/migrate/sync/schemaSync.d.ts.map +1 -0
- package/dist/migrate/sync/schemaSync.js +260 -0
- package/dist/migrate/sync/schemaSync.js.map +1 -0
- package/dist/mongo/index.d.ts +4 -0
- package/dist/mongo/index.d.ts.map +1 -0
- package/dist/mongo/index.js +4 -0
- package/dist/mongo/index.js.map +1 -0
- package/dist/mongo/mongoDialect.d.ts +47 -0
- package/dist/mongo/mongoDialect.d.ts.map +1 -0
- package/dist/mongo/mongoDialect.js +299 -0
- package/dist/mongo/mongoDialect.js.map +1 -0
- package/dist/mongo/mongodbQuerier.d.ts +32 -0
- package/dist/mongo/mongodbQuerier.d.ts.map +1 -0
- package/dist/mongo/mongodbQuerier.js +267 -0
- package/dist/mongo/mongodbQuerier.js.map +1 -0
- package/dist/mongo/mongodbQuerierPool.d.ts +11 -0
- package/dist/mongo/mongodbQuerierPool.d.ts.map +1 -0
- package/dist/mongo/mongodbQuerierPool.js +20 -0
- package/dist/mongo/mongodbQuerierPool.js.map +1 -0
- package/dist/mysql/index.d.ts +4 -0
- package/dist/mysql/index.d.ts.map +1 -0
- package/dist/mysql/index.js +4 -0
- package/dist/mysql/index.js.map +1 -0
- package/dist/mysql/mysql2Querier.d.ts +14 -0
- package/dist/mysql/mysql2Querier.d.ts.map +1 -0
- package/dist/mysql/mysql2Querier.js +25 -0
- package/dist/mysql/mysql2Querier.js.map +1 -0
- package/dist/mysql/mysql2QuerierPool.d.ts +11 -0
- package/dist/mysql/mysql2QuerierPool.d.ts.map +1 -0
- package/dist/mysql/mysql2QuerierPool.js +17 -0
- package/dist/mysql/mysql2QuerierPool.js.map +1 -0
- package/dist/mysql/mysqlDialect.d.ts +19 -0
- package/dist/mysql/mysqlDialect.d.ts.map +1 -0
- package/dist/mysql/mysqlDialect.js +97 -0
- package/dist/mysql/mysqlDialect.js.map +1 -0
- package/dist/namingStrategy/defaultNamingStrategy.d.ts +10 -0
- package/dist/namingStrategy/defaultNamingStrategy.d.ts.map +1 -0
- package/dist/namingStrategy/defaultNamingStrategy.js +15 -0
- package/dist/namingStrategy/defaultNamingStrategy.js.map +1 -0
- package/dist/namingStrategy/index.d.ts +3 -0
- package/dist/namingStrategy/index.d.ts.map +1 -0
- package/dist/namingStrategy/index.js +3 -0
- package/dist/namingStrategy/index.js.map +1 -0
- package/dist/namingStrategy/snakeCaseNamingStrategy.d.ts +9 -0
- package/dist/namingStrategy/snakeCaseNamingStrategy.d.ts.map +1 -0
- package/dist/namingStrategy/snakeCaseNamingStrategy.js +14 -0
- package/dist/namingStrategy/snakeCaseNamingStrategy.js.map +1 -0
- package/dist/neon/index.d.ts +3 -0
- package/dist/neon/index.d.ts.map +1 -0
- package/dist/neon/index.js +3 -0
- package/dist/neon/index.js.map +1 -0
- package/dist/neon/neonQuerier.d.ts +10 -0
- package/dist/neon/neonQuerier.d.ts.map +1 -0
- package/dist/neon/neonQuerier.js +20 -0
- package/dist/neon/neonQuerier.js.map +1 -0
- package/dist/neon/neonQuerierPool.d.ts +11 -0
- package/dist/neon/neonQuerierPool.d.ts.map +1 -0
- package/dist/neon/neonQuerierPool.js +17 -0
- package/dist/neon/neonQuerierPool.js.map +1 -0
- package/dist/options.d.ts +5 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +14 -0
- package/dist/options.js.map +1 -0
- package/dist/postgres/index.d.ts +4 -0
- package/dist/postgres/index.d.ts.map +1 -0
- package/dist/postgres/index.js +4 -0
- package/dist/postgres/index.js.map +1 -0
- package/dist/postgres/pgQuerier.d.ts +10 -0
- package/dist/postgres/pgQuerier.d.ts.map +1 -0
- package/dist/postgres/pgQuerier.js +20 -0
- package/dist/postgres/pgQuerier.js.map +1 -0
- package/dist/postgres/pgQuerierPool.d.ts +11 -0
- package/dist/postgres/pgQuerierPool.d.ts.map +1 -0
- package/dist/postgres/pgQuerierPool.js +17 -0
- package/dist/postgres/pgQuerierPool.js.map +1 -0
- package/dist/postgres/postgresDialect.d.ts +36 -0
- package/dist/postgres/postgresDialect.d.ts.map +1 -0
- package/dist/postgres/postgresDialect.js +201 -0
- package/dist/postgres/postgresDialect.js.map +1 -0
- package/dist/querier/abstractPoolQuerier.d.ts +13 -0
- package/dist/querier/abstractPoolQuerier.d.ts.map +1 -0
- package/dist/querier/abstractPoolQuerier.js +25 -0
- package/dist/querier/abstractPoolQuerier.js.map +1 -0
- package/dist/querier/abstractQuerier.d.ts +109 -0
- package/dist/querier/abstractQuerier.d.ts.map +1 -0
- package/dist/querier/abstractQuerier.js +378 -0
- package/dist/querier/abstractQuerier.js.map +1 -0
- package/dist/querier/abstractQuerierPool.d.ts +23 -0
- package/dist/querier/abstractQuerierPool.d.ts.map +1 -0
- package/dist/querier/abstractQuerierPool.js +28 -0
- package/dist/querier/abstractQuerierPool.js.map +1 -0
- package/dist/querier/abstractSqlQuerier.d.ts +38 -0
- package/dist/querier/abstractSqlQuerier.d.ts.map +1 -0
- package/dist/querier/abstractSqlQuerier.js +169 -0
- package/dist/querier/abstractSqlQuerier.js.map +1 -0
- package/dist/querier/decorator/index.d.ts +5 -0
- package/dist/querier/decorator/index.d.ts.map +1 -0
- package/dist/querier/decorator/index.js +5 -0
- package/dist/querier/decorator/index.js.map +1 -0
- package/dist/querier/decorator/injectQuerier.d.ts +4 -0
- package/dist/querier/decorator/injectQuerier.d.ts.map +1 -0
- package/dist/querier/decorator/injectQuerier.js +33 -0
- package/dist/querier/decorator/injectQuerier.js.map +1 -0
- package/dist/querier/decorator/log.d.ts +7 -0
- package/dist/querier/decorator/log.d.ts.map +1 -0
- package/dist/querier/decorator/log.js +27 -0
- package/dist/querier/decorator/log.js.map +1 -0
- package/dist/querier/decorator/serialized.d.ts +7 -0
- package/dist/querier/decorator/serialized.d.ts.map +1 -0
- package/dist/querier/decorator/serialized.js +14 -0
- package/dist/querier/decorator/serialized.js.map +1 -0
- package/dist/querier/decorator/transactional.d.ts +6 -0
- package/dist/querier/decorator/transactional.d.ts.map +1 -0
- package/dist/querier/decorator/transactional.js +48 -0
- package/dist/querier/decorator/transactional.js.map +1 -0
- package/dist/querier/index.d.ts +5 -0
- package/dist/querier/index.d.ts.map +1 -0
- package/dist/querier/index.js +5 -0
- package/dist/querier/index.js.map +1 -0
- package/dist/schema/canonicalType.d.ts +42 -0
- package/dist/schema/canonicalType.d.ts.map +1 -0
- package/dist/schema/canonicalType.js +524 -0
- package/dist/schema/canonicalType.js.map +1 -0
- package/dist/schema/index.d.ts +28 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +29 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/schemaAST.d.ts +155 -0
- package/dist/schema/schemaAST.d.ts.map +1 -0
- package/dist/schema/schemaAST.js +496 -0
- package/dist/schema/schemaAST.js.map +1 -0
- package/dist/schema/schemaASTBuilder.d.ts +58 -0
- package/dist/schema/schemaASTBuilder.d.ts.map +1 -0
- package/dist/schema/schemaASTBuilder.js +224 -0
- package/dist/schema/schemaASTBuilder.js.map +1 -0
- package/dist/schema/schemaASTDiffer.d.ts +84 -0
- package/dist/schema/schemaASTDiffer.d.ts.map +1 -0
- package/dist/schema/schemaASTDiffer.js +431 -0
- package/dist/schema/schemaASTDiffer.js.map +1 -0
- package/dist/schema/types.d.ts +347 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +11 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/sqlite/abstractSqliteQuerier.d.ts +6 -0
- package/dist/sqlite/abstractSqliteQuerier.d.ts.map +1 -0
- package/dist/sqlite/abstractSqliteQuerier.js +13 -0
- package/dist/sqlite/abstractSqliteQuerier.js.map +1 -0
- package/dist/sqlite/index.d.ts +4 -0
- package/dist/sqlite/index.d.ts.map +1 -0
- package/dist/sqlite/index.js +4 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/sqlite/sqliteDialect.d.ts +42 -0
- package/dist/sqlite/sqliteDialect.d.ts.map +1 -0
- package/dist/sqlite/sqliteDialect.js +129 -0
- package/dist/sqlite/sqliteDialect.js.map +1 -0
- package/dist/sqlite/sqliteQuerier.d.ts +12 -0
- package/dist/sqlite/sqliteQuerier.d.ts.map +1 -0
- package/dist/sqlite/sqliteQuerier.js +25 -0
- package/dist/sqlite/sqliteQuerier.js.map +1 -0
- package/dist/sqlite/sqliteQuerierPool.d.ts +13 -0
- package/dist/sqlite/sqliteQuerierPool.d.ts.map +1 -0
- package/dist/sqlite/sqliteQuerierPool.js +34 -0
- package/dist/sqlite/sqliteQuerierPool.js.map +1 -0
- package/dist/type/config.d.ts +46 -0
- package/dist/type/config.d.ts.map +1 -0
- package/dist/type/config.js +2 -0
- package/dist/type/config.js.map +1 -0
- package/dist/type/entity.d.ts +289 -0
- package/dist/type/entity.d.ts.map +1 -0
- package/dist/type/entity.js +5 -0
- package/dist/type/entity.js.map +1 -0
- package/dist/type/index.d.ts +11 -0
- package/dist/type/index.d.ts.map +1 -0
- package/dist/type/index.js +11 -0
- package/dist/type/index.js.map +1 -0
- package/dist/type/logger.d.ts +61 -0
- package/dist/type/logger.d.ts.map +1 -0
- package/dist/type/logger.js +2 -0
- package/dist/type/logger.js.map +1 -0
- package/dist/type/migration.d.ts +268 -0
- package/dist/type/migration.d.ts.map +1 -0
- package/dist/type/migration.js +2 -0
- package/dist/type/migration.js.map +1 -0
- package/dist/type/namingStrategy.d.ts +18 -0
- package/dist/type/namingStrategy.d.ts.map +1 -0
- package/dist/type/namingStrategy.js +2 -0
- package/dist/type/namingStrategy.js.map +1 -0
- package/dist/type/querier.d.ts +154 -0
- package/dist/type/querier.d.ts.map +1 -0
- package/dist/type/querier.js +11 -0
- package/dist/type/querier.js.map +1 -0
- package/dist/type/querierPool.d.ts +31 -0
- package/dist/type/querierPool.d.ts.map +1 -0
- package/dist/type/querierPool.js +2 -0
- package/dist/type/querierPool.js.map +1 -0
- package/dist/type/query.d.ts +475 -0
- package/dist/type/query.d.ts.map +1 -0
- package/dist/type/query.js +11 -0
- package/dist/type/query.js.map +1 -0
- package/dist/type/universalQuerier.d.ts +120 -0
- package/dist/type/universalQuerier.d.ts.map +1 -0
- package/dist/type/universalQuerier.js +2 -0
- package/dist/type/universalQuerier.js.map +1 -0
- package/dist/type/utility.d.ts +33 -0
- package/dist/type/utility.d.ts.map +1 -0
- package/dist/type/utility.js +2 -0
- package/dist/type/utility.js.map +1 -0
- package/dist/util/dialect.util.d.ts +13 -0
- package/dist/util/dialect.util.d.ts.map +1 -0
- package/dist/util/dialect.util.js +82 -0
- package/dist/util/dialect.util.js.map +1 -0
- package/dist/util/field.util.d.ts +14 -0
- package/dist/util/field.util.d.ts.map +1 -0
- package/dist/util/field.util.js +57 -0
- package/dist/util/field.util.js.map +1 -0
- package/dist/util/hook.util.d.ts +15 -0
- package/dist/util/hook.util.d.ts.map +1 -0
- package/dist/util/hook.util.js +20 -0
- package/dist/util/hook.util.js.map +1 -0
- package/dist/util/index.d.ts +9 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +9 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/logger.d.ts +34 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +129 -0
- package/dist/util/logger.js.map +1 -0
- package/dist/util/object.util.d.ts +8 -0
- package/dist/util/object.util.d.ts.map +1 -0
- package/dist/util/object.util.js +19 -0
- package/dist/util/object.util.js.map +1 -0
- package/dist/util/raw.d.ts +9 -0
- package/dist/util/raw.d.ts.map +1 -0
- package/dist/util/raw.js +11 -0
- package/dist/util/raw.js.map +1 -0
- package/dist/util/sql.util.d.ts +22 -0
- package/dist/util/sql.util.d.ts.map +1 -0
- package/dist/util/sql.util.js +88 -0
- package/dist/util/sql.util.js.map +1 -0
- package/dist/util/string.util.d.ts +29 -0
- package/dist/util/string.util.d.ts.map +1 -0
- package/dist/util/string.util.js +91 -0
- package/dist/util/string.util.js.map +1 -0
- package/package.json +146 -0
package/README.md
ADDED
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
<!--  -->
|
|
2
|
+
|
|
3
|
+
[](https://uql-orm.dev)
|
|
4
|
+
|
|
5
|
+
[](https://github.com/rogerpadilla/uql) [](https://coveralls.io/github/rogerpadilla/uql?branch=main) [](https://github.com/rogerpadilla/uql/blob/main/LICENSE) [](https://www.npmjs.com/package/uql-orm)
|
|
6
|
+
|
|
7
|
+
**[UQL](https://uql-orm.dev)** is the [smartest ORM](https://medium.com/@rogerpadillac/in-search-of-the-perfect-orm-e01fcc9bce3d) for TypeScript. It is engineered to be **fast**, **safe**, and **universally compatible**.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
const users = await querier.findMany(User, {
|
|
12
|
+
$select: { email: true, profile: { $select: { picture: true } } },
|
|
13
|
+
$where: { email: { $endsWith: '@domain.com' } },
|
|
14
|
+
$sort: { createdAt: 'desc' },
|
|
15
|
+
$limit: 100,
|
|
16
|
+
});
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## Features
|
|
22
|
+
|
|
23
|
+
| Feature | Description |
|
|
24
|
+
| :----------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------ |
|
|
25
|
+
| **[Context-Aware Queries](https://uql-orm.dev/querying/relations)** | Deep type-safety for operators and [relations](https://uql-orm.dev/querying/relations) at any depth. |
|
|
26
|
+
| **Serializable JSON** | 100% valid JSON queries for easy transport over HTTP/Websockets. |
|
|
27
|
+
| **Unified Dialects** | Write once, run anywhere: PostgreSQL, MySQL, SQLite, MongoDB, and more. |
|
|
28
|
+
| **[Naming Strategies](https://uql-orm.dev/naming-strategy)** | Pluggable system to translate between TypeScript `camelCase` and database `snake_case`. |
|
|
29
|
+
| **Smart SQL Engine** | Optimized sub-queries, placeholders ($1, $2), and minimal SQL generation via `QueryContext`. |
|
|
30
|
+
| **Thread-Safe by Design** | Centralized task queue and `@Serialized()` decorator prevent race conditions. |
|
|
31
|
+
| **[Declarative Transactions](https://uql-orm.dev/transactions)** | Standard `@Transactional()` and `@InjectQuerier()` decorators for NestJS/DI. |
|
|
32
|
+
| **[Lifecycle Hooks](https://uql-orm.dev/entities/lifecycle-hooks)**| `@BeforeInsert`, `@AfterLoad` and 5 more decorators for validation, timestamps, and computed fields. |
|
|
33
|
+
| **[Modern & Versatile](https://uql-orm.dev/entities/virtual-fields)** | **Pure ESM**, high-res timing, [Soft-delete](https://uql-orm.dev/entities/soft-delete), and **Vector/JSONB/JSON** support. |
|
|
34
|
+
| **[Database Migrations](https://www.uql-orm.dev/migrations)** | Built-in [Entity-First synchronization](https://uql-orm.dev/migrations#3-entity-first-synchronization-development) and a robust CLI for version-controlled schema evolution. |
|
|
35
|
+
| **[Logging & Monitoring](https://www.uql-orm.dev/logging)** | Professional-grade monitoring with slow-query detection and colored output. |
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
## 1. Install
|
|
40
|
+
|
|
41
|
+
Install the core package and the driver for your database:
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
# Core
|
|
45
|
+
npm install uql-orm # or bun add / pnpm add
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Supported Drivers (pick according to your database)
|
|
49
|
+
|
|
50
|
+
| Database | Command |
|
|
51
|
+
| :----------------------------------------------------- | :----------------------------- |
|
|
52
|
+
| **PostgreSQL** (incl. Neon, Cockroach, Yugabyte) | `npm install pg` |
|
|
53
|
+
| **MySQL** (incl. TiDB, Aurora) | `npm install mysql2` |
|
|
54
|
+
| **MariaDB** | `npm install mariadb` |
|
|
55
|
+
| **SQLite** | `npm install better-sqlite3` |
|
|
56
|
+
| **LibSQL** (incl. Turso) | `npm install @libsql/client` |
|
|
57
|
+
| **MongoDB** | `npm install mongodb` |
|
|
58
|
+
| **Cloudflare D1** | _Native (no driver needed)_ |
|
|
59
|
+
|
|
60
|
+
### TypeScript Configuration
|
|
61
|
+
|
|
62
|
+
Ensure your `tsconfig.json` is configured to support decorators and metadata:
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"compilerOptions": {
|
|
67
|
+
"experimentalDecorators": true,
|
|
68
|
+
"emitDecoratorMetadata": true,
|
|
69
|
+
"module": "NodeNext",
|
|
70
|
+
"target": "ESNext"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Note:** `ES2020+` will work for `target` as well.
|
|
76
|
+
|
|
77
|
+
## 2. Define the Entities
|
|
78
|
+
|
|
79
|
+
Annotate your classes with decorators. UQL's engine uses this metadata for both type-safe querying and precise DDL generation.
|
|
80
|
+
|
|
81
|
+
### Core Decorators
|
|
82
|
+
|
|
83
|
+
| Decorator | Purpose |
|
|
84
|
+
| :-------------- | :----------------------------------------------------------------------------- |
|
|
85
|
+
| `@Entity()` | Marks a class as a database table/collection. |
|
|
86
|
+
| `@Id()` | Defines the Primary Key with support for `onInsert` generators (UUIDs, etc). |
|
|
87
|
+
| `@Field()` | Standard column. Use `{ reference: ... }` for Foreign Keys. |
|
|
88
|
+
| `@Index()` | Defines a composite or custom index on one or more columns. |
|
|
89
|
+
| `@OneToOne` | Defines a one-to-one relationship. |
|
|
90
|
+
| `@OneToMany` | Defines a one-to-many relationship. |
|
|
91
|
+
| `@ManyToOne` | Defines a many-to-one relationship. |
|
|
92
|
+
| `@ManyToMany` | Defines a many-to-many relationship. |
|
|
93
|
+
| `@Virtual()` | Defines a read-only field calculated via SQL (see Advanced). |
|
|
94
|
+
| `@BeforeInsert` / `@AfterInsert` | Lifecycle hooks fired around `insert` operations. |
|
|
95
|
+
| `@BeforeUpdate` / `@AfterUpdate` | Lifecycle hooks fired around `update` operations. |
|
|
96
|
+
| `@BeforeDelete` / `@AfterDelete` | Lifecycle hooks fired around `delete` operations. |
|
|
97
|
+
| `@AfterLoad` | Lifecycle hook fired after loading entities from the database. |
|
|
98
|
+
|
|
99
|
+
### Type Abstraction: Logical vs. Physical
|
|
100
|
+
|
|
101
|
+
UQL separates the **intent** of your data from its **storage**. Both properties are **optional**; if omitted, UQL performs a *best-effort inference* using the TypeScript types from your class (provided `emitDecoratorMetadata` is enabled).
|
|
102
|
+
|
|
103
|
+
| Property | Purpose | Values |
|
|
104
|
+
| :--- | :--- | :--- |
|
|
105
|
+
| **`type`** | **Logical Type** (Abstraction). Used for runtime behavior and automatic SQL mapping. | `String`, `Number`, `Boolean`, `Date`, `BigInt`, or semantic strings: `'uuid'`, `'json'`, `'vector'`. |
|
|
106
|
+
| **`columnType`** | **Physical Type** (Implementation). **Highest Priority**. Bypasses UQL's inference for exact SQL control. | Raw SQL types: `'varchar(100)'`, `'decimal(10,2)'`, `'smallint'`, etc. |
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
// Automatic inference from TypeScript types
|
|
110
|
+
@Field() name?: string; // → TEXT (Postgres), VARCHAR(255) (MySQL)
|
|
111
|
+
@Field() age?: number; // → INTEGER
|
|
112
|
+
@Field() isActive?: boolean; // → BOOLEAN
|
|
113
|
+
@Field() createdAt?: Date; // → TIMESTAMP
|
|
114
|
+
|
|
115
|
+
// Semantic types - portable across all databases
|
|
116
|
+
@Field({ type: 'uuid' }) // → UUID (Postgres), CHAR(36) (MySQL), TEXT (SQLite)
|
|
117
|
+
externalId?: string;
|
|
118
|
+
|
|
119
|
+
@Field({ type: 'json' }) // → JSONB (Postgres), JSON (MySQL), TEXT (SQLite)
|
|
120
|
+
metadata?: Json<{ theme?: string }>;
|
|
121
|
+
|
|
122
|
+
// Logical types with constraints - portable with control
|
|
123
|
+
@Field({ type: 'varchar', length: 500 })
|
|
124
|
+
bio?: string;
|
|
125
|
+
|
|
126
|
+
@Field({ type: 'decimal', precision: 10, scale: 2 })
|
|
127
|
+
price?: number;
|
|
128
|
+
|
|
129
|
+
// Exact SQL type - when you need dialect-specific control
|
|
130
|
+
@Field({ columnType: 'smallint' })
|
|
131
|
+
statusCode?: number;
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
import { v7 as uuidv7 } from 'uuid';
|
|
139
|
+
import { Entity, Id, Field, OneToOne, OneToMany, ManyToOne, ManyToMany, type Relation, type Json } from 'uql-orm';
|
|
140
|
+
|
|
141
|
+
@Entity()
|
|
142
|
+
export class User {
|
|
143
|
+
@Id({ type: 'uuid', onInsert: () => uuidv7() })
|
|
144
|
+
id?: string;
|
|
145
|
+
|
|
146
|
+
@Field({
|
|
147
|
+
index: true,
|
|
148
|
+
})
|
|
149
|
+
name?: string;
|
|
150
|
+
|
|
151
|
+
@Field({
|
|
152
|
+
unique: true,
|
|
153
|
+
comment: 'User login email',
|
|
154
|
+
})
|
|
155
|
+
email?: string;
|
|
156
|
+
|
|
157
|
+
@OneToOne({
|
|
158
|
+
entity: () => Profile,
|
|
159
|
+
mappedBy: (profile) => profile.user,
|
|
160
|
+
cascade: true,
|
|
161
|
+
})
|
|
162
|
+
profile?: Relation<Profile>;
|
|
163
|
+
|
|
164
|
+
@OneToMany({
|
|
165
|
+
entity: () => Post,
|
|
166
|
+
mappedBy: (post) => post.author,
|
|
167
|
+
})
|
|
168
|
+
posts?: Relation<Post>[];
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
@Entity()
|
|
172
|
+
export class Profile {
|
|
173
|
+
@Id({ type: 'uuid', onInsert: () => uuidv7() })
|
|
174
|
+
id?: string;
|
|
175
|
+
|
|
176
|
+
@Field()
|
|
177
|
+
bio?: string;
|
|
178
|
+
|
|
179
|
+
@Field({ reference: () => User, foreignKey: 'fk_profile_user' })
|
|
180
|
+
userId?: string;
|
|
181
|
+
|
|
182
|
+
@OneToOne({ entity: () => User })
|
|
183
|
+
user?: User;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
@Entity()
|
|
187
|
+
export class Post {
|
|
188
|
+
@Id()
|
|
189
|
+
id?: number;
|
|
190
|
+
|
|
191
|
+
@Field()
|
|
192
|
+
title?: string;
|
|
193
|
+
|
|
194
|
+
@Field({ reference: () => User })
|
|
195
|
+
authorId?: string;
|
|
196
|
+
|
|
197
|
+
@ManyToOne({ entity: () => User })
|
|
198
|
+
author?: User;
|
|
199
|
+
|
|
200
|
+
@ManyToMany({
|
|
201
|
+
entity: () => Tag,
|
|
202
|
+
through: () => PostTag,
|
|
203
|
+
})
|
|
204
|
+
tags?: Tag[];
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
@Entity()
|
|
208
|
+
export class Tag {
|
|
209
|
+
@Id({ type: 'uuid', onInsert: () => uuidv7() })
|
|
210
|
+
id?: string;
|
|
211
|
+
|
|
212
|
+
@Field()
|
|
213
|
+
name?: string;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
@Entity()
|
|
217
|
+
export class PostTag {
|
|
218
|
+
@Id({ type: 'uuid', onInsert: () => uuidv7() })
|
|
219
|
+
id?: string;
|
|
220
|
+
|
|
221
|
+
@Field({ reference: () => Post })
|
|
222
|
+
postId?: number;
|
|
223
|
+
|
|
224
|
+
@Field({ reference: () => Tag })
|
|
225
|
+
tagId?: string;
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
> **Pro Tip**: Use the `Relation<T>` utility type for relationship properties. It prevents TypeScript circular dependency errors while maintaining full type-safety.
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
## 3. Set up a pool
|
|
234
|
+
|
|
235
|
+
A pool manages connections (queriers). Initialize it once at application bootstrap (e.g., in `server.ts`).
|
|
236
|
+
|
|
237
|
+
```ts
|
|
238
|
+
import { SnakeCaseNamingStrategy, type Config } from 'uql-orm';
|
|
239
|
+
import { PgQuerierPool } from 'uql-orm/postgres'; // or mysql2, sqlite, etc.
|
|
240
|
+
import { User, Profile, Post } from './entities';
|
|
241
|
+
|
|
242
|
+
export const pool = new PgQuerierPool(
|
|
243
|
+
{ host: 'localhost', database: 'uql_app', max: 10 },
|
|
244
|
+
{
|
|
245
|
+
logger: ['error', 'warn', 'migration'],
|
|
246
|
+
namingStrategy: new SnakeCaseNamingStrategy()
|
|
247
|
+
slowQuery: { threshold: 1000 },
|
|
248
|
+
}
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
export default {
|
|
252
|
+
pool,
|
|
253
|
+
entities: [User, Profile, Post],
|
|
254
|
+
migrationsPath: './migrations',
|
|
255
|
+
} satisfies Config;
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
> **Pro Tip**: Reusing the same connection pool for both your application and migrations is recommended. It reduces connection overhead and ensures consistent query settings (like naming strategies).
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
## 4. Manipulate the Data
|
|
265
|
+
|
|
266
|
+
UQL provides a straightforward API to interact with your data. **Always ensure queriers are released back to the pool.**
|
|
267
|
+
|
|
268
|
+
```ts
|
|
269
|
+
const querier = await pool.getQuerier();
|
|
270
|
+
try {
|
|
271
|
+
const users = await querier.findMany(User, {
|
|
272
|
+
$select: {
|
|
273
|
+
name: true,
|
|
274
|
+
profile: { $select: { bio: true }, $required: true } // INNER JOIN
|
|
275
|
+
},
|
|
276
|
+
$where: {
|
|
277
|
+
status: 'active',
|
|
278
|
+
name: { $istartsWith: 'a' } // Case-insensitive search
|
|
279
|
+
},
|
|
280
|
+
$limit: 10,
|
|
281
|
+
$skip: 0
|
|
282
|
+
});
|
|
283
|
+
} finally {
|
|
284
|
+
await querier.release(); // Essential for pool health
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**Generated SQL (PostgreSQL):**
|
|
289
|
+
|
|
290
|
+
```sql
|
|
291
|
+
SELECT "User"."name", "profile"."id" AS "profile_id", "profile"."bio" AS "profile_bio"
|
|
292
|
+
FROM "User"
|
|
293
|
+
INNER JOIN "Profile" AS "profile" ON "profile"."userId" = "User"."id"
|
|
294
|
+
WHERE "User"."status" = 'active' AND "User"."name" ILIKE 'a%'
|
|
295
|
+
LIMIT 10 OFFSET 0
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
### Advanced: Virtual Fields & Raw SQL
|
|
301
|
+
|
|
302
|
+
Define complex logic directly in your entities using `raw` functions. These are resolved during SQL generation for peak efficiency.
|
|
303
|
+
|
|
304
|
+
```ts
|
|
305
|
+
@Entity()
|
|
306
|
+
export class Item {
|
|
307
|
+
@Field({
|
|
308
|
+
virtual: raw(({ ctx, dialect, escapedPrefix }) => {
|
|
309
|
+
ctx.append('(');
|
|
310
|
+
dialect.count(ctx, ItemTag, {
|
|
311
|
+
$where: { itemId: raw(({ ctx }) => ctx.append(`${escapedPrefix}.id`)) }
|
|
312
|
+
}, { autoPrefix: true });
|
|
313
|
+
ctx.append(')');
|
|
314
|
+
})
|
|
315
|
+
})
|
|
316
|
+
tagsCount?: number;
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
### JSONB Operators & Relation Filtering
|
|
323
|
+
|
|
324
|
+
Query nested JSON fields using **type-safe dot-notation** with full operator support. Wrap fields with `Json<T>` to get IDE autocompletion for valid paths. UQL generates the correct SQL for each dialect.
|
|
325
|
+
|
|
326
|
+
```ts
|
|
327
|
+
// Filter by nested JSONB field paths
|
|
328
|
+
const items = await querier.findMany(Company, {
|
|
329
|
+
$where: {
|
|
330
|
+
'settings.isArchived': { $ne: true },
|
|
331
|
+
'settings.priority': { $gte: 5 },
|
|
332
|
+
},
|
|
333
|
+
});
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
**PostgreSQL:** `WHERE ("settings"->>'isArchived') IS DISTINCT FROM $1 AND (("settings"->>'priority'))::numeric >= $2`
|
|
337
|
+
**SQLite:** `WHERE json_extract("settings", '$.isArchived') IS NOT ? AND CAST(json_extract("settings", '$.priority') AS REAL) >= ?`
|
|
338
|
+
|
|
339
|
+
Filter parent entities by their **ManyToMany** or **OneToMany** relations using automatic EXISTS subqueries:
|
|
340
|
+
|
|
341
|
+
```ts
|
|
342
|
+
// Find posts that have a tag named 'typescript'
|
|
343
|
+
const posts = await querier.findMany(Post, {
|
|
344
|
+
$where: { tags: { name: 'typescript' } },
|
|
345
|
+
});
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
**PostgreSQL:** `WHERE EXISTS (SELECT 1 FROM "PostTag" WHERE "PostTag"."postId" = "Post"."id" AND "PostTag"."tagId" IN (SELECT "Tag"."id" FROM "Tag" WHERE "Tag"."name" = $1))`
|
|
349
|
+
|
|
350
|
+
> **Pro Tip**: Wrap JSONB field types with `Json<T>` (e.g., `settings?: Json<{ isArchived?: boolean }>`) to get IDE autocompletion for dot-notation paths.
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
### Thread-Safe Transactions
|
|
355
|
+
|
|
356
|
+
UQL is one of the few ORMs with a **centralized serialization engine**. Transactions are guaranteed to be race-condition free.
|
|
357
|
+
|
|
358
|
+
#### Option A: Manual (Functional)
|
|
359
|
+
|
|
360
|
+
```ts
|
|
361
|
+
const result = await pool.transaction(async (querier) => {
|
|
362
|
+
const user = await querier.findOne(User, { $where: { email: '...' } });
|
|
363
|
+
await querier.insertOne(Profile, { userId: user.id, bio: '...' });
|
|
364
|
+
});
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
#### Option B: Declarative (Decorators)
|
|
368
|
+
|
|
369
|
+
Perfect for **NestJS** and other Dependency Injection frameworks. Use `@Transactional()` to wrap a method and `@InjectQuerier()` to access the managed connection.
|
|
370
|
+
|
|
371
|
+
```ts
|
|
372
|
+
import { Transactional, InjectQuerier, type Querier } from 'uql-orm';
|
|
373
|
+
|
|
374
|
+
export class UserService {
|
|
375
|
+
@Transactional()
|
|
376
|
+
async register({picture, ...user}: UserProfile, @InjectQuerier() querier?: Querier) {
|
|
377
|
+
const userId = await querier.insertOne(User, user);
|
|
378
|
+
await querier.insertOne(Profile, { userId, picture });
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
#### Option C: Imperative
|
|
384
|
+
|
|
385
|
+
For granular control over the transaction lifecycle, manage `begin`, `commit`, `rollback`, and `release` yourself.
|
|
386
|
+
|
|
387
|
+
```ts
|
|
388
|
+
const querier = await pool.getQuerier();
|
|
389
|
+
try {
|
|
390
|
+
await querier.beginTransaction();
|
|
391
|
+
|
|
392
|
+
const userId = await querier.insertOne(User, { name: '...' });
|
|
393
|
+
await querier.insertOne(Profile, { userId, picture: '...' });
|
|
394
|
+
|
|
395
|
+
await querier.commitTransaction();
|
|
396
|
+
} catch (error) {
|
|
397
|
+
await querier.rollbackTransaction();
|
|
398
|
+
throw error;
|
|
399
|
+
} finally {
|
|
400
|
+
await querier.release();
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
## 5. Migrations & Synchronization
|
|
407
|
+
|
|
408
|
+
### 1. Unified Configuration
|
|
409
|
+
|
|
410
|
+
Ideally, use the same `uql.config.ts` for your application bootstrap and the CLI:
|
|
411
|
+
|
|
412
|
+
```ts
|
|
413
|
+
// uql.config.ts
|
|
414
|
+
import type { Config } from 'uql-orm';
|
|
415
|
+
|
|
416
|
+
export default {
|
|
417
|
+
pool: new PgQuerierPool({ /* ... */ }),
|
|
418
|
+
entities: [User, Profile, Post],
|
|
419
|
+
migrationsPath: './migrations',
|
|
420
|
+
} satisfies Config;
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
**Why?** Using a single config for both your app and the CLI is recommended for consistency. It prevents bugs where your runtime uses one naming strategy (e.g. `camelCase`) but your migrations use another (e.g. `snake_case`), or where the CLI isn't aware of all your entities. It enforces a Single Source of Truth for your database connection and schema.
|
|
424
|
+
|
|
425
|
+
### 2. Manage via CLI
|
|
426
|
+
|
|
427
|
+
Use the CLI to manage your database schema evolution.
|
|
428
|
+
|
|
429
|
+
| Command | Description |
|
|
430
|
+
| :--- | :--- |
|
|
431
|
+
| `generate:from-db` | **Scaffolds Entities** from an existing database. Includes **Smart Relation Detection**. |
|
|
432
|
+
| `generate <name>` | Creates an empty timestamped file for **manual** SQL migrations (e.g., data backfills). |
|
|
433
|
+
| `generate:entities <name>` | **Auto-generates** a migration by diffing your entities against the current DB schema. |
|
|
434
|
+
| `drift:check` | **Drift Detection**: Compares your defined entities against the actual database schema and reports discrepancies. |
|
|
435
|
+
| `up` | Applies all pending migrations. |
|
|
436
|
+
| `down` | Rolls back the last applied migration batch. |
|
|
437
|
+
| `status` | Shows which migrations have been executed and which are pending. |
|
|
438
|
+
|
|
439
|
+
#### Usage Examples
|
|
440
|
+
|
|
441
|
+
```bash
|
|
442
|
+
# 1. Create a manual migration
|
|
443
|
+
npx uql-migrate generate seed_default_roles
|
|
444
|
+
|
|
445
|
+
# 2. Auto-generate schema changes from your code
|
|
446
|
+
npx uql-migrate generate:entities add_profile_table
|
|
447
|
+
|
|
448
|
+
# 3. Apply changes
|
|
449
|
+
npx uql-migrate up
|
|
450
|
+
|
|
451
|
+
# 4. Check for schema drift (Production Safety)
|
|
452
|
+
npx uql-migrate drift:check
|
|
453
|
+
|
|
454
|
+
# 5. Scaffold entities from an existing DB (Legacy Adoption)
|
|
455
|
+
npx uql-migrate generate:from-db --output ./src/entities
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
> **Bun Users**: If your `uql.config.ts` uses TypeScript path aliases (e.g., `~app/...`), run migrations with the `--bun` flag to ensure proper resolution:
|
|
459
|
+
> ```bash
|
|
460
|
+
> bun run --bun uql-migrate status
|
|
461
|
+
> ```
|
|
462
|
+
> Or add a script to your `package.json`: `"uql": "bun run --bun uql-migrate"`, then run commands like, e.g., `bun run uql status`.
|
|
463
|
+
|
|
464
|
+
### 3. AutoSync (Development)
|
|
465
|
+
|
|
466
|
+
Keep your schema in sync without manual migrations. It is **Safe by Default**: In safe mode (default), it strictly **adds** new tables and columns but **blocks** any destructive operations (column drops or type alterations) to prevent data loss. It provides **Transparent Feedback** by logging detailed warnings for any blocked changes, so you know exactly what remains to be migrated manually.
|
|
467
|
+
|
|
468
|
+
**New Capabilities (v3.8+):**
|
|
469
|
+
|
|
470
|
+
* **Schema AST Engine**: Uses a graph-based representation of your schema for 100% accurate diffing, handling circular dependencies and correct topological sort orders for table creation/dropping.
|
|
471
|
+
* **Smart Relation Detection**: When generating entities from an existing DB, UQL automatically detects relationships (OneToOne, ManyToMany) via foreign key structures and naming conventions (`user_id` -> `User`).
|
|
472
|
+
* **Bidirectional Index Sync**: Indexes defined in `@Field({ index: true })` or `@Index()` are synced to the DB, and indexes found in the DB are reflected in generated entities.
|
|
473
|
+
|
|
474
|
+
> **Important**: For `autoSync` to detect your entities, they must be **loaded** (imported) before calling `autoSync`.
|
|
475
|
+
|
|
476
|
+
**Using Your Config (Recommended)**
|
|
477
|
+
|
|
478
|
+
If you follow the [unified configuration](#1-unified-configuration) pattern, your entities are already imported. Simply reuse it:
|
|
479
|
+
|
|
480
|
+
```ts
|
|
481
|
+
import { Migrator } from 'uql-orm/migrate';
|
|
482
|
+
import config from './uql.config.js';
|
|
483
|
+
|
|
484
|
+
const migrator = new Migrator(config.pool, {
|
|
485
|
+
entities: config.entities,
|
|
486
|
+
});
|
|
487
|
+
await migrator.autoSync({ logging: true });
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
**Explicit Entities**
|
|
491
|
+
|
|
492
|
+
Alternatively, pass entities directly if you want to be explicit about which entities to sync:
|
|
493
|
+
|
|
494
|
+
```ts
|
|
495
|
+
import { Migrator } from 'uql-orm/migrate';
|
|
496
|
+
import { User, Profile, Post } from './entities/index.js';
|
|
497
|
+
|
|
498
|
+
const migrator = new Migrator(pool, {
|
|
499
|
+
entities: [User, Profile, Post],
|
|
500
|
+
});
|
|
501
|
+
await migrator.autoSync({ logging: true });
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
## 6. Logging & Monitoring
|
|
507
|
+
|
|
508
|
+
UQL features a professional-grade, structured logging system designed for high visibility and sub-millisecond performance monitoring.
|
|
509
|
+
|
|
510
|
+
### Log Levels
|
|
511
|
+
|
|
512
|
+
| Level | Description |
|
|
513
|
+
| :-------------------- | :-------------------------------------------------------------------------------------- |
|
|
514
|
+
| `query` | **Standard Queries**: Beautifully formatted SQL/Command logs with execution time. |
|
|
515
|
+
| `slowQuery` | **Bottleneck Alerts**: Dedicated logging for queries exceeding your threshold. Use `logParams: false` to omit sensitive data. |
|
|
516
|
+
| `error` / `warn` | **System Health**: Detailed error traces and potential issue warnings. |
|
|
517
|
+
| `migration` | **Audit Trail**: Step-by-step history of schema changes. |
|
|
518
|
+
| `skippedMigration` | **Safety**: Logs blocked unsafe schema changes during autoSync. |
|
|
519
|
+
| `schema` / `info` | **Lifecycle**: Informative logs about ORM initialization and sync events. |
|
|
520
|
+
|
|
521
|
+
### Visual Feedback
|
|
522
|
+
|
|
523
|
+
The `DefaultLogger` provides high-contrast, colored output out of the box:
|
|
524
|
+
|
|
525
|
+
```text
|
|
526
|
+
query: SELECT * FROM "user" WHERE "id" = $1 -- [123] [2ms]
|
|
527
|
+
slow query: UPDATE "post" SET "title" = $1 -- ["New Title"] [1250ms]
|
|
528
|
+
error: Failed to connect to database: Connection timeout
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
> **Pro Tip**: Even if you disable general query logging in production (`logger: ['error', 'warn', 'slowQuery']`), UQL stays silent *until* a query exceeds your threshold.
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
Learn more about UQL at [uql-orm.dev](https://uql-orm.dev) for details on:
|
|
536
|
+
|
|
537
|
+
- [Complex Logical Operators](https://uql-orm.dev/querying/logical-operators)
|
|
538
|
+
- [Relationship Mapping (1-1, 1-M, M-M)](https://uql-orm.dev/querying/relations)
|
|
539
|
+
- [Lifecycle Hooks](https://uql-orm.dev/entities/lifecycle-hooks)
|
|
540
|
+
- [Soft Deletes & Auditing](https://uql-orm.dev/entities/soft-delete)
|
|
541
|
+
- [Database Migration & Syncing](https://uql-orm.dev/migrations)
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
## 🛠 Deep Dive: Tests & Technical Resources
|
|
546
|
+
|
|
547
|
+
For those who want to see the "engine under the hood," check out these resources in the source code:
|
|
548
|
+
|
|
549
|
+
- **Entity Mocks**: See how complex entities and virtual fields are defined in [entityMock.ts](https://github.com/rogerpadilla/uql/blob/main/packages/uql-orm/src/test/entityMock.ts).
|
|
550
|
+
- **Core Dialect Logic**: The foundation of our context-aware SQL generation in [abstractSqlDialect.ts](https://github.com/rogerpadilla/uql/blob/main/packages/uql-orm/src/dialect/abstractSqlDialect.ts).
|
|
551
|
+
- **Comprehensive Test Suite**:
|
|
552
|
+
- [Abstract SQL Spec](https://github.com/rogerpadilla/uql/blob/main/packages/uql-orm/src/dialect/abstractSqlDialect-spec.ts): Base test suite for all dialects.
|
|
553
|
+
- [PostgreSQL](https://github.com/rogerpadilla/uql/blob/main/packages/uql-orm/src/postgres/postgresDialect.spec.ts) \| [MySQL](https://github.com/rogerpadilla/uql/blob/main/packages/uql-orm/src/mysql/mysqlDialect.spec.ts) \| [SQLite](https://github.com/rogerpadilla/uql/blob/main/packages/uql-orm/src/sqlite/sqliteDialect.spec.ts) specs.
|
|
554
|
+
- [Querier Integration Tests](https://github.com/rogerpadilla/uql/blob/main/packages/uql-orm/src/querier/abstractSqlQuerier-spec.ts): SQL generation & connection management tests.
|
|
555
|
+
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
## Built with ❤️ and supported by
|
|
559
|
+
|
|
560
|
+
UQL is an open-source project proudly sponsored by **[Variability.ai](https://variability.ai)**.
|