@fragno-dev/db 0.2.2 → 0.4.1
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/.turbo/turbo-build.log +404 -175
- package/CHANGELOG.md +109 -0
- package/README.md +54 -9
- package/dist/adapters/adapters.d.ts +23 -21
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/generic-sql/driver-config.d.ts +16 -1
- package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -1
- package/dist/adapters/generic-sql/driver-config.js +23 -1
- package/dist/adapters/generic-sql/driver-config.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +24 -9
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.js +60 -22
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +169 -3
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +25 -6
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +7 -6
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +193 -16
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
- package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
- package/dist/adapters/generic-sql/migration/executor.js +30 -3
- package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
- package/dist/adapters/generic-sql/migration/prepared-migrations.js +9 -9
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js +75 -52
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +7 -6
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/cursor-utils.js +42 -4
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
- package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
- package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +32 -21
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/select-builder.js +5 -3
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +49 -18
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/where-builder.js +43 -29
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
- package/dist/adapters/generic-sql/sqlite-storage.d.ts +13 -0
- package/dist/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
- package/dist/adapters/generic-sql/sqlite-storage.js +15 -0
- package/dist/adapters/generic-sql/sqlite-storage.js.map +1 -0
- package/dist/adapters/generic-sql/uow-decoder.js +6 -2
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-encoder.js +27 -8
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
- package/dist/adapters/in-memory/condition-evaluator.js +135 -0
- package/dist/adapters/in-memory/condition-evaluator.js.map +1 -0
- package/dist/adapters/in-memory/errors.d.ts +13 -0
- package/dist/adapters/in-memory/errors.d.ts.map +1 -0
- package/dist/adapters/in-memory/errors.js +23 -0
- package/dist/adapters/in-memory/errors.js.map +1 -0
- package/dist/adapters/in-memory/in-memory-adapter.d.ts +27 -0
- package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -0
- package/dist/adapters/in-memory/in-memory-adapter.js +196 -0
- package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
- package/dist/adapters/in-memory/in-memory-uow.js +871 -0
- package/dist/adapters/in-memory/in-memory-uow.js.map +1 -0
- package/dist/adapters/in-memory/index.d.ts +4 -0
- package/dist/adapters/in-memory/index.js +4 -0
- package/dist/adapters/in-memory/options.d.ts +30 -0
- package/dist/adapters/in-memory/options.d.ts.map +1 -0
- package/dist/adapters/in-memory/options.js +62 -0
- package/dist/adapters/in-memory/options.js.map +1 -0
- package/dist/adapters/in-memory/reference-resolution.js +26 -0
- package/dist/adapters/in-memory/reference-resolution.js.map +1 -0
- package/dist/adapters/in-memory/sorted-array-index.js +129 -0
- package/dist/adapters/in-memory/sorted-array-index.js.map +1 -0
- package/dist/adapters/in-memory/store.js +71 -0
- package/dist/adapters/in-memory/store.js.map +1 -0
- package/dist/adapters/in-memory/value-comparison.js +28 -0
- package/dist/adapters/in-memory/value-comparison.js.map +1 -0
- package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
- package/dist/adapters/shared/uow-operation-compiler.js +11 -11
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
- package/dist/adapters/sql/index.d.ts +5 -0
- package/dist/adapters/sql/index.js +4 -0
- package/dist/browser/adapters/adapters.d.ts +61 -0
- package/dist/browser/adapters/adapters.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
- package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
- package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
- package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
- package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
- package/dist/browser/adapters/in-memory/index.d.ts +2 -0
- package/dist/browser/adapters/in-memory/options.d.ts +1 -0
- package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
- package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
- package/dist/browser/durable-hooks.d.ts +3 -0
- package/dist/browser/fragments/internal-fragment.d.ts +317 -0
- package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
- package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
- package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
- package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
- package/dist/browser/hooks/hooks.d.ts +146 -0
- package/dist/browser/hooks/hooks.d.ts.map +1 -0
- package/dist/browser/id.js +1 -0
- package/dist/browser/internal/adapter-registry.d.ts +4 -0
- package/dist/browser/internal/outbox-state.d.ts +2 -0
- package/dist/browser/mod.d.ts +15 -0
- package/dist/browser/mod.d.ts.map +1 -0
- package/dist/browser/mod.js +17 -0
- package/dist/browser/mod.js.map +1 -0
- package/dist/browser/mod2.d.ts +48 -0
- package/dist/browser/mod2.d.ts.map +1 -0
- package/dist/browser/naming/sql-naming.d.ts +19 -0
- package/dist/browser/naming/sql-naming.d.ts.map +1 -0
- package/dist/browser/outbox/outbox.d.ts +21 -0
- package/dist/browser/outbox/outbox.d.ts.map +1 -0
- package/dist/browser/query/column-defaults.js +1 -0
- package/dist/browser/query/condition-builder.d.ts +44 -0
- package/dist/browser/query/condition-builder.d.ts.map +1 -0
- package/dist/browser/query/condition-builder.js +97 -0
- package/dist/browser/query/condition-builder.js.map +1 -0
- package/dist/browser/query/cursor.d.ts +105 -0
- package/dist/browser/query/cursor.d.ts.map +1 -0
- package/dist/browser/query/cursor.js +150 -0
- package/dist/browser/query/cursor.js.map +1 -0
- package/dist/browser/query/db-now.d.ts +22 -0
- package/dist/browser/query/db-now.d.ts.map +1 -0
- package/dist/browser/query/db-now.js +33 -0
- package/dist/browser/query/db-now.js.map +1 -0
- package/dist/browser/query/orm/orm.d.ts +18 -0
- package/dist/browser/query/orm/orm.d.ts.map +1 -0
- package/dist/browser/query/simple-query-interface.d.ts +108 -0
- package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
- package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
- package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
- package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
- package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
- package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
- package/dist/browser/query/value-encoding.js +38 -0
- package/dist/browser/query/value-encoding.js.map +1 -0
- package/dist/browser/schema/create.d.ts +326 -0
- package/dist/browser/schema/create.d.ts.map +1 -0
- package/dist/browser/schema/create.js +89 -0
- package/dist/browser/schema/create.js.map +1 -0
- package/dist/browser/schema/generate-id.js +28 -0
- package/dist/browser/schema/generate-id.js.map +1 -0
- package/dist/browser/shared/providers.d.ts +6 -0
- package/dist/browser/shared/providers.d.ts.map +1 -0
- package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
- package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
- package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
- package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
- package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
- package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
- package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
- package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
- package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
- package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
- package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
- package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
- package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
- package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
- package/dist/browser/sync/commands.d.ts +15 -0
- package/dist/browser/sync/commands.d.ts.map +1 -0
- package/dist/browser/sync/commands.js +27 -0
- package/dist/browser/sync/commands.js.map +1 -0
- package/dist/browser/sync/types.d.ts +63 -0
- package/dist/browser/sync/types.d.ts.map +1 -0
- package/dist/browser/util/types.d.ts +8 -0
- package/dist/browser/util/types.d.ts.map +1 -0
- package/dist/browser/with-database.d.ts +29 -0
- package/dist/browser/with-database.d.ts.map +1 -0
- package/dist/client.d.ts +4 -0
- package/dist/client.js +5 -0
- package/dist/db-fragment-definition-builder.d.ts +101 -33
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +450 -60
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
- package/dist/dispatchers/cloudflare-do/index.d.ts +11 -0
- package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
- package/dist/dispatchers/cloudflare-do/index.js +31 -0
- package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
- package/dist/dispatchers/node/dispatcher.d.ts +14 -0
- package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
- package/dist/dispatchers/node/dispatcher.js +80 -0
- package/dist/dispatchers/node/dispatcher.js.map +1 -0
- package/dist/dispatchers/node/index.d.ts +12 -0
- package/dist/dispatchers/node/index.d.ts.map +1 -0
- package/dist/dispatchers/node/index.js +27 -0
- package/dist/dispatchers/node/index.js.map +1 -0
- package/dist/durable-hooks.d.ts +31 -0
- package/dist/durable-hooks.d.ts.map +1 -0
- package/dist/durable-hooks.js +23 -0
- package/dist/durable-hooks.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +186 -8
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +203 -38
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/fragments/internal-fragment.routes.js +164 -0
- package/dist/fragments/internal-fragment.routes.js.map +1 -0
- package/dist/fragments/internal-fragment.schema.d.ts +15 -0
- package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
- package/dist/fragments/internal-fragment.schema.js +39 -0
- package/dist/fragments/internal-fragment.schema.js.map +1 -0
- package/dist/hooks/durable-hooks-logger.d.ts +10 -0
- package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
- package/dist/hooks/durable-hooks-logger.js +75 -0
- package/dist/hooks/durable-hooks-logger.js.map +1 -0
- package/dist/hooks/durable-hooks-processor.d.ts +1 -0
- package/dist/hooks/durable-hooks-processor.js +80 -0
- package/dist/hooks/durable-hooks-processor.js.map +1 -0
- package/dist/hooks/durable-hooks-runtime.js +44 -0
- package/dist/hooks/durable-hooks-runtime.js.map +1 -0
- package/dist/hooks/hooks.d.ts +100 -1
- package/dist/hooks/hooks.d.ts.map +1 -1
- package/dist/hooks/hooks.js +254 -27
- package/dist/hooks/hooks.js.map +1 -1
- package/dist/id.d.ts +2 -2
- package/dist/id.js +2 -2
- package/dist/internal/adapter-registry.d.ts +11 -0
- package/dist/internal/adapter-registry.d.ts.map +1 -0
- package/dist/internal/adapter-registry.js +135 -0
- package/dist/internal/adapter-registry.js.map +1 -0
- package/dist/internal/outbox-state.d.ts +2 -0
- package/dist/internal/outbox-state.js +26 -0
- package/dist/internal/outbox-state.js.map +1 -0
- package/dist/migration-engine/auto-from-schema.d.ts +33 -0
- package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
- package/dist/migration-engine/auto-from-schema.js +223 -37
- package/dist/migration-engine/auto-from-schema.js.map +1 -1
- package/dist/migration-engine/generation-engine.d.ts +16 -10
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +86 -35
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/migration-engine/shared.d.ts +113 -0
- package/dist/migration-engine/shared.d.ts.map +1 -0
- package/dist/migration-engine/shared.js.map +1 -1
- package/dist/mod.d.ts +20 -12
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +18 -12
- package/dist/mod.js.map +1 -1
- package/dist/naming/sql-naming.d.ts +19 -0
- package/dist/naming/sql-naming.d.ts.map +1 -0
- package/dist/naming/sql-naming.js +116 -0
- package/dist/naming/sql-naming.js.map +1 -0
- package/dist/outbox/outbox-builder.js +156 -0
- package/dist/outbox/outbox-builder.js.map +1 -0
- package/dist/outbox/outbox.d.ts +54 -0
- package/dist/outbox/outbox.d.ts.map +1 -0
- package/dist/outbox/outbox.js +37 -0
- package/dist/outbox/outbox.js.map +1 -0
- package/dist/query/column-defaults.js +20 -4
- package/dist/query/column-defaults.js.map +1 -1
- package/dist/query/condition-builder.d.ts +7 -1
- package/dist/query/condition-builder.d.ts.map +1 -1
- package/dist/query/condition-builder.js +5 -1
- package/dist/query/condition-builder.js.map +1 -1
- package/dist/query/cursor-client.d.ts +105 -0
- package/dist/query/cursor-client.d.ts.map +1 -0
- package/dist/query/cursor-client.js +165 -0
- package/dist/query/cursor-client.js.map +1 -0
- package/dist/query/cursor.d.ts +3 -1
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +51 -14
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/db-now.d.ts +22 -0
- package/dist/query/db-now.d.ts.map +1 -0
- package/dist/query/db-now.js +35 -0
- package/dist/query/db-now.js.map +1 -0
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +5 -4
- package/dist/query/serialize/create-sql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/mysql-serializer.js +12 -6
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/postgres-serializer.js +25 -7
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/sqlite-serializer.js +60 -12
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
- package/dist/query/serialize/sql-serializer.js +2 -2
- package/dist/query/serialize/sql-serializer.js.map +1 -1
- package/dist/query/simple-query-interface.d.ts +13 -4
- package/dist/query/simple-query-interface.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.js +50 -24
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.d.ts +92 -30
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.js +136 -11
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
- package/dist/query/value-decoding.js +16 -6
- package/dist/query/value-decoding.js.map +1 -1
- package/dist/query/value-encoding.js +29 -9
- package/dist/query/value-encoding.js.map +1 -1
- package/dist/schema/create.d.ts +103 -35
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +172 -58
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/generate-id.js +2 -2
- package/dist/schema/generate-id.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +4 -3
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
- package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
- package/dist/schema/validator.d.ts +10 -0
- package/dist/schema/validator.d.ts.map +1 -0
- package/dist/schema/validator.js +123 -0
- package/dist/schema/validator.js.map +1 -0
- package/dist/schema-output/drizzle.d.ts +30 -0
- package/dist/schema-output/drizzle.d.ts.map +1 -0
- package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +88 -60
- package/dist/schema-output/drizzle.js.map +1 -0
- package/dist/schema-output/prisma.d.ts +17 -0
- package/dist/schema-output/prisma.d.ts.map +1 -0
- package/dist/schema-output/prisma.js +307 -0
- package/dist/schema-output/prisma.js.map +1 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
- package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
- package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
- package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
- package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
- package/dist/sql-driver/sql.js.map +1 -1
- package/dist/sync/commands.d.ts +15 -0
- package/dist/sync/commands.d.ts.map +1 -0
- package/dist/sync/commands.js +27 -0
- package/dist/sync/commands.js.map +1 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.js +4 -0
- package/dist/sync/read-tracking.d.ts +25 -0
- package/dist/sync/read-tracking.d.ts.map +1 -0
- package/dist/sync/read-tracking.js +148 -0
- package/dist/sync/read-tracking.js.map +1 -0
- package/dist/sync/submit.js +213 -0
- package/dist/sync/submit.js.map +1 -0
- package/dist/sync/types.d.ts +63 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/util/default-database-adapter.js +66 -0
- package/dist/util/default-database-adapter.js.map +1 -0
- package/dist/with-database.d.ts +3 -6
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +8 -7
- package/dist/with-database.js.map +1 -1
- package/package.json +62 -55
- package/src/adapters/adapters.ts +33 -26
- package/src/adapters/drizzle/migrate-drizzle.test.ts +99 -41
- package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +601 -0
- package/src/adapters/drizzle/test-utils.ts +13 -8
- package/src/adapters/generic-sql/driver-config.ts +38 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +10 -8
- package/src/adapters/generic-sql/generic-sql-adapter.ts +117 -34
- package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +55 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +297 -3
- package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +120 -0
- package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
- package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +27 -8
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +47 -8
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +28 -9
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +9 -4
- package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +839 -8
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +396 -53
- package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
- package/src/adapters/generic-sql/migration/executor.ts +47 -4
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +238 -46
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +21 -13
- package/src/adapters/generic-sql/migration/sql-generator.ts +145 -66
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +11 -8
- package/src/adapters/generic-sql/query/cursor-utils.test.ts +272 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +42 -7
- package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +171 -35
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +53 -40
- package/src/adapters/generic-sql/query/select-builder.test.ts +16 -11
- package/src/adapters/generic-sql/query/select-builder.ts +7 -3
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +75 -6
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +129 -24
- package/src/adapters/generic-sql/query/where-builder.test.ts +96 -20
- package/src/adapters/generic-sql/query/where-builder.ts +112 -41
- package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +11 -20
- package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +851 -0
- package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +18 -15
- package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +282 -14
- package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +129 -12
- package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +9 -7
- package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +5 -4
- package/src/adapters/generic-sql/uow-decoder.ts +23 -5
- package/src/adapters/generic-sql/uow-encoder.test.ts +36 -3
- package/src/adapters/generic-sql/uow-encoder.ts +48 -13
- package/src/adapters/in-memory/condition-evaluator.test.ts +194 -0
- package/src/adapters/in-memory/condition-evaluator.ts +280 -0
- package/src/adapters/in-memory/errors.ts +20 -0
- package/src/adapters/in-memory/in-memory-adapter.ts +388 -0
- package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +344 -0
- package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +255 -0
- package/src/adapters/in-memory/in-memory-uow.ts +1724 -0
- package/src/adapters/in-memory/index.ts +3 -0
- package/src/adapters/in-memory/options.test.ts +42 -0
- package/src/adapters/in-memory/options.ts +91 -0
- package/src/adapters/in-memory/outbox.test.ts +361 -0
- package/src/adapters/in-memory/reference-resolution.test.ts +51 -0
- package/src/adapters/in-memory/reference-resolution.ts +67 -0
- package/src/adapters/in-memory/sorted-array-index.test.ts +124 -0
- package/src/adapters/in-memory/sorted-array-index.ts +228 -0
- package/src/adapters/in-memory/store.test.ts +69 -0
- package/src/adapters/in-memory/store.ts +145 -0
- package/src/adapters/in-memory/value-comparison.ts +53 -0
- package/src/adapters/in-memory/value-normalization.test.ts +58 -0
- package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1207 -0
- package/src/adapters/shared/from-unit-of-work-compiler.ts +159 -47
- package/src/adapters/shared/uow-operation-compiler.ts +28 -18
- package/src/adapters/sql/index.ts +12 -0
- package/src/browser/mod.ts +64 -0
- package/src/client.ts +19 -0
- package/src/db-fragment-definition-builder.test.ts +845 -53
- package/src/db-fragment-definition-builder.ts +911 -95
- package/src/db-fragment-instantiator.test.ts +210 -94
- package/src/db-fragment-integration.test.ts +17 -12
- package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
- package/src/dispatchers/cloudflare-do/index.test.ts +206 -0
- package/src/dispatchers/cloudflare-do/index.ts +63 -0
- package/src/dispatchers/node/dispatcher.ts +112 -0
- package/src/dispatchers/node/index.test.ts +120 -0
- package/src/dispatchers/node/index.ts +50 -0
- package/src/durable-hooks.test.ts +80 -0
- package/src/durable-hooks.ts +67 -0
- package/src/fragments/internal-fragment.routes.test.ts +570 -0
- package/src/fragments/internal-fragment.routes.ts +334 -0
- package/src/fragments/internal-fragment.schema.ts +95 -0
- package/src/fragments/internal-fragment.test.ts +505 -83
- package/src/fragments/internal-fragment.ts +453 -70
- package/src/hooks/durable-hooks-logger.ts +126 -0
- package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
- package/src/hooks/durable-hooks-processor.test.ts +282 -0
- package/src/hooks/durable-hooks-processor.ts +173 -0
- package/src/hooks/durable-hooks-runtime.test.ts +65 -0
- package/src/hooks/durable-hooks-runtime.ts +81 -0
- package/src/hooks/hooks.test.ts +455 -34
- package/src/hooks/hooks.ts +501 -34
- package/src/id.test.ts +34 -0
- package/src/id.ts +1 -3
- package/src/internal/adapter-registry.test.ts +93 -0
- package/src/internal/adapter-registry.ts +239 -0
- package/src/internal/outbox-state.ts +43 -0
- package/src/migration-engine/auto-from-schema.test.ts +107 -14
- package/src/migration-engine/auto-from-schema.ts +365 -44
- package/src/migration-engine/create.test.ts +4 -3
- package/src/migration-engine/create.ts +1 -1
- package/src/migration-engine/generation-engine.test.ts +292 -110
- package/src/migration-engine/generation-engine.ts +117 -66
- package/src/migration-engine/shared.ts +14 -0
- package/src/mod.ts +95 -39
- package/src/naming/sql-naming.ts +181 -0
- package/src/outbox/outbox-builder.ts +241 -0
- package/src/outbox/outbox.test.ts +424 -0
- package/src/outbox/outbox.ts +139 -0
- package/src/query/column-defaults.ts +42 -4
- package/src/query/condition-builder.test.ts +18 -3
- package/src/query/condition-builder.ts +7 -0
- package/src/query/cursor-client.test.ts +70 -0
- package/src/query/cursor-client.ts +263 -0
- package/src/query/cursor.test.ts +119 -20
- package/src/query/cursor.ts +88 -27
- package/src/query/db-now.ts +73 -0
- package/src/query/orm/orm.ts +2 -2
- package/src/query/query-type.test.ts +4 -3
- package/src/query/serialize/create-sql-serializer.ts +10 -5
- package/src/query/serialize/dialect/mysql-serializer.ts +13 -5
- package/src/query/serialize/dialect/postgres-serializer.ts +35 -5
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +90 -3
- package/src/query/serialize/dialect/sqlite-serializer.ts +108 -12
- package/src/query/serialize/sql-serializer.ts +4 -4
- package/src/query/simple-query-interface.ts +15 -4
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +372 -10
- package/src/query/unit-of-work/execute-unit-of-work.ts +87 -27
- package/src/query/unit-of-work/retry-policy.test.ts +1 -0
- package/src/query/unit-of-work/tx-builder.test.ts +73 -1
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +17 -16
- package/src/query/unit-of-work/unit-of-work-types.test.ts +42 -12
- package/src/query/unit-of-work/unit-of-work.test.ts +196 -39
- package/src/query/unit-of-work/unit-of-work.ts +309 -38
- package/src/query/value-decoding.test.ts +63 -4
- package/src/query/value-decoding.ts +32 -6
- package/src/query/value-encoding.test.ts +86 -2
- package/src/query/value-encoding.ts +56 -6
- package/src/schema/create.test.ts +293 -47
- package/src/schema/create.ts +406 -70
- package/src/schema/generate-id.test.ts +3 -2
- package/src/schema/generate-id.ts +2 -2
- package/src/schema/serialize.test.ts +18 -5
- package/src/schema/type-conversion/create-sql-type-mapper.ts +8 -3
- package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
- package/src/schema/type-conversion/type-mapping.test.ts +26 -1
- package/src/schema/validator.test.ts +199 -0
- package/src/schema/validator.ts +232 -0
- package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +232 -129
- package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +155 -99
- package/src/schema-output/prisma.test.ts +694 -0
- package/src/schema-output/prisma.ts +593 -0
- package/src/sql-driver/better-sqlite3.test.ts +5 -3
- package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
- package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
- package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
- package/src/sql-driver/query-executor/query-executor.ts +1 -1
- package/src/sql-driver/sql-driver-adapter.ts +2 -2
- package/src/sql-driver/sql.ts +2 -1
- package/src/sql-driver/sqlocal.test.ts +4 -2
- package/src/sync/commands.test.ts +39 -0
- package/src/sync/commands.ts +51 -0
- package/src/sync/conflict-checker.test.ts +450 -0
- package/src/sync/conflict-checker.ts +248 -0
- package/src/sync/index.ts +14 -0
- package/src/sync/plan.ts +9 -0
- package/src/sync/read-tracking.test.ts +177 -0
- package/src/sync/read-tracking.ts +287 -0
- package/src/sync/submit.test.ts +205 -0
- package/src/sync/submit.ts +328 -0
- package/src/sync/types.ts +80 -0
- package/src/util/default-database-adapter.ts +119 -0
- package/src/with-database.ts +20 -31
- package/tsconfig.json +1 -1
- package/tsdown.config.ts +38 -24
- package/vitest.config.ts +1 -0
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
- package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
- package/dist/adapters/drizzle/generate.d.ts +0 -30
- package/dist/adapters/drizzle/generate.d.ts.map +0 -1
- package/dist/adapters/drizzle/generate.js.map +0 -1
- package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-adapter.js +0 -17
- package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
- package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
- package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
- package/dist/adapters/shared/table-name-mapper.js +0 -43
- package/dist/adapters/shared/table-name-mapper.js.map +0 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +0 -165
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +0 -1
- package/dist/packages/fragno/dist/api/bind-services.js +0 -20
- package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
- package/dist/packages/fragno/dist/api/error.js +0 -48
- package/dist/packages/fragno/dist/api/error.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -320
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -525
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
- package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
- package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
- package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
- package/dist/packages/fragno/dist/api/internal/route.js +0 -10
- package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
- package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
- package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
- package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-input-context.js +0 -118
- package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
- package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
- package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
- package/dist/packages/fragno/dist/api/route.js +0 -17
- package/dist/packages/fragno/dist/api/route.js.map +0 -1
- package/dist/packages/fragno/dist/internal/symbols.js +0 -10
- package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
- package/dist/schema-generator/schema-generator.d.ts +0 -15
- package/dist/schema-generator/schema-generator.d.ts.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
- package/src/adapters/kysely/kysely-adapter.ts +0 -27
- package/src/adapters/shared/table-name-mapper.ts +0 -50
- package/src/schema-generator/schema-generator.ts +0 -12
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { resolveFragnoIdValue } from "./value-encoding.js";
|
|
2
|
+
|
|
3
|
+
//#region src/query/cursor.ts
|
|
4
|
+
/**
|
|
5
|
+
* Cursor object containing all information needed for pagination
|
|
6
|
+
*/
|
|
7
|
+
var Cursor = class {
|
|
8
|
+
#indexName;
|
|
9
|
+
#orderDirection;
|
|
10
|
+
#pageSize;
|
|
11
|
+
#indexValues;
|
|
12
|
+
constructor(data) {
|
|
13
|
+
this.#indexName = data.indexName;
|
|
14
|
+
this.#orderDirection = data.orderDirection;
|
|
15
|
+
this.#pageSize = data.pageSize;
|
|
16
|
+
this.#indexValues = data.indexValues;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get the index name being used for pagination
|
|
20
|
+
*/
|
|
21
|
+
get indexName() {
|
|
22
|
+
return this.#indexName;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get the ordering direction
|
|
26
|
+
*/
|
|
27
|
+
get orderDirection() {
|
|
28
|
+
return this.#orderDirection;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the page size
|
|
32
|
+
*/
|
|
33
|
+
get pageSize() {
|
|
34
|
+
return this.#pageSize;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get the cursor position values
|
|
38
|
+
*/
|
|
39
|
+
get indexValues() {
|
|
40
|
+
return this.#indexValues;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Encode cursor to an opaque base64 string (safe to send to client)
|
|
44
|
+
*/
|
|
45
|
+
encode() {
|
|
46
|
+
assertSerializableIndexValues(this.#indexValues);
|
|
47
|
+
return encodeCursorData({
|
|
48
|
+
v: 1,
|
|
49
|
+
indexName: this.#indexName,
|
|
50
|
+
orderDirection: this.#orderDirection,
|
|
51
|
+
pageSize: this.#pageSize,
|
|
52
|
+
indexValues: this.#indexValues
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Encode cursor data to a base64 string (internal)
|
|
58
|
+
*/
|
|
59
|
+
function encodeCursorData(data) {
|
|
60
|
+
let json;
|
|
61
|
+
try {
|
|
62
|
+
json = JSON.stringify(data);
|
|
63
|
+
} catch (error) {
|
|
64
|
+
throw new Error(`Invalid cursor: ${error instanceof Error ? error.message : "malformed data"}`);
|
|
65
|
+
}
|
|
66
|
+
if (typeof Buffer !== "undefined") return Buffer.from(json, "utf-8").toString("base64");
|
|
67
|
+
return btoa(json);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Decode a base64 cursor string back to a Cursor object
|
|
71
|
+
*
|
|
72
|
+
* @param cursor - The base64-encoded cursor string
|
|
73
|
+
* @returns Decoded Cursor object
|
|
74
|
+
* @throws Error if cursor is invalid or malformed
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* const cursor = decodeCursor("eyJpbmRleFZhbHVlcyI6e30sImRpcmVjdGlvbiI6ImZvcndhcmQifQ==");
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
function decodeCursor(cursor) {
|
|
82
|
+
try {
|
|
83
|
+
let json;
|
|
84
|
+
if (typeof Buffer !== "undefined") json = Buffer.from(cursor, "base64").toString("utf-8");
|
|
85
|
+
else json = atob(cursor);
|
|
86
|
+
const data = JSON.parse(json);
|
|
87
|
+
const record = data;
|
|
88
|
+
if (!isPlainObject(data) || !isPlainObject(record["indexValues"]) || typeof record["indexName"] !== "string" || record["indexName"].length === 0 || typeof record["orderDirection"] !== "string" || record["orderDirection"] !== "asc" && record["orderDirection"] !== "desc" || typeof record["pageSize"] !== "number" || !Number.isFinite(record["pageSize"]) || !Number.isInteger(record["pageSize"]) || record["pageSize"] <= 0) throw new Error("Invalid cursor structure");
|
|
89
|
+
if (typeof record["v"] !== "number") throw new Error("Unsupported cursor version: missing. Only v1 is supported.");
|
|
90
|
+
const version = record["v"];
|
|
91
|
+
if (version !== 1) throw new Error(`Unsupported cursor version: ${version}. Only v1 is supported.`);
|
|
92
|
+
return new Cursor({
|
|
93
|
+
indexName: record["indexName"],
|
|
94
|
+
orderDirection: record["orderDirection"],
|
|
95
|
+
pageSize: record["pageSize"],
|
|
96
|
+
indexValues: record["indexValues"]
|
|
97
|
+
});
|
|
98
|
+
} catch (error) {
|
|
99
|
+
throw new Error(`Invalid cursor: ${error instanceof Error ? error.message : "malformed data"}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Create a cursor from a record and pagination metadata
|
|
104
|
+
*
|
|
105
|
+
* @param record - The database record
|
|
106
|
+
* @param indexColumns - The columns that make up the index
|
|
107
|
+
* @param metadata - Pagination metadata (index name, order direction, page size)
|
|
108
|
+
* @returns Cursor object
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```ts
|
|
112
|
+
* const cursor = createCursorFromRecord(
|
|
113
|
+
* { id: "abc", name: "Alice", createdAt: 123 },
|
|
114
|
+
* [table.columns.createdAt, table.columns.id],
|
|
115
|
+
* {
|
|
116
|
+
* indexName: "idx_created",
|
|
117
|
+
* orderDirection: "asc",
|
|
118
|
+
* pageSize: 10
|
|
119
|
+
* }
|
|
120
|
+
* );
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
function createCursorFromRecord(record, indexColumns, metadata) {
|
|
124
|
+
const indexValues = {};
|
|
125
|
+
for (const col of indexColumns) {
|
|
126
|
+
const value = record[col.name];
|
|
127
|
+
if (value === void 0) throw new Error(`Record is missing value for index column "${col.name}".`);
|
|
128
|
+
const resolved = resolveFragnoIdValue(value, col);
|
|
129
|
+
indexValues[col.name] = typeof resolved === "bigint" ? resolved.toString() : resolved;
|
|
130
|
+
}
|
|
131
|
+
return new Cursor({
|
|
132
|
+
indexName: metadata.indexName,
|
|
133
|
+
orderDirection: metadata.orderDirection,
|
|
134
|
+
pageSize: metadata.pageSize,
|
|
135
|
+
indexValues
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
139
|
+
const assertSerializableIndexValues = (values) => {
|
|
140
|
+
for (const [key, value] of Object.entries(values)) {
|
|
141
|
+
if (value === void 0) throw new Error(`Cursor index value "${key}" is undefined.`);
|
|
142
|
+
if (typeof value === "number" && !Number.isFinite(value)) throw new Error(`Cursor index value "${key}" must be a finite number.`);
|
|
143
|
+
if (typeof value === "bigint") throw new Error(`Cursor index value "${key}" must not be a BigInt.`);
|
|
144
|
+
if (typeof value === "function" || typeof value === "symbol") throw new Error(`Cursor index value "${key}" is not JSON-serializable.`);
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
//#endregion
|
|
149
|
+
export { Cursor, createCursorFromRecord, decodeCursor };
|
|
150
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","names":["#indexName","#orderDirection","#pageSize","#indexValues","json: string","indexValues: Record<string, unknown>"],"sources":["../../../src/query/cursor.ts"],"sourcesContent":["import type { DriverConfig } from \"../adapters/generic-sql/driver-config\";\nimport type { SQLiteStorageMode } from \"../adapters/generic-sql/sqlite-storage\";\nimport type { AnyColumn } from \"../schema/create\";\nimport { createSQLSerializer } from \"./serialize/create-sql-serializer\";\nimport { resolveFragnoIdValue } from \"./value-encoding\";\n\n/**\n * Cursor object containing all information needed for pagination\n */\nexport class Cursor {\n readonly #indexName: string;\n readonly #orderDirection: \"asc\" | \"desc\";\n readonly #pageSize: number;\n readonly #indexValues: Record<string, unknown>;\n\n constructor(data: {\n indexName: string;\n orderDirection: \"asc\" | \"desc\";\n pageSize: number;\n indexValues: Record<string, unknown>;\n }) {\n this.#indexName = data.indexName;\n this.#orderDirection = data.orderDirection;\n this.#pageSize = data.pageSize;\n this.#indexValues = data.indexValues;\n }\n\n /**\n * Get the index name being used for pagination\n */\n get indexName(): string {\n return this.#indexName;\n }\n\n /**\n * Get the ordering direction\n */\n get orderDirection(): \"asc\" | \"desc\" {\n return this.#orderDirection;\n }\n\n /**\n * Get the page size\n */\n get pageSize(): number {\n return this.#pageSize;\n }\n\n /**\n * Get the cursor position values\n */\n get indexValues(): Record<string, unknown> {\n return this.#indexValues;\n }\n\n /**\n * Encode cursor to an opaque base64 string (safe to send to client)\n */\n encode(): string {\n assertSerializableIndexValues(this.#indexValues);\n const data: CursorData = {\n v: 1,\n indexName: this.#indexName,\n orderDirection: this.#orderDirection,\n pageSize: this.#pageSize,\n indexValues: this.#indexValues,\n };\n return encodeCursorData(data);\n }\n}\n\n/**\n * Result of a cursor-based query containing items and pagination cursor\n */\nexport interface CursorResult<T> {\n /**\n * The query results\n */\n items: T[];\n /**\n * Cursor to fetch the next page (undefined if no more results)\n */\n cursor?: Cursor;\n /**\n * Whether there are more results available after this page\n */\n hasNextPage: boolean;\n}\n\n/**\n * Cursor data structure for serialization\n */\nexport interface CursorData {\n v: number; // version\n indexName: string;\n orderDirection: \"asc\" | \"desc\";\n pageSize: number;\n indexValues: Record<string, unknown>;\n}\n\n/**\n * Encode cursor data to a base64 string (internal)\n */\nfunction encodeCursorData(data: CursorData): string {\n let json: string;\n try {\n json = JSON.stringify(data);\n } catch (error) {\n throw new Error(`Invalid cursor: ${error instanceof Error ? error.message : \"malformed data\"}`);\n }\n // Use Buffer in Node.js or btoa in browsers\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(json, \"utf-8\").toString(\"base64\");\n }\n return btoa(json);\n}\n\n/**\n * Decode a base64 cursor string back to a Cursor object\n *\n * @param cursor - The base64-encoded cursor string\n * @returns Decoded Cursor object\n * @throws Error if cursor is invalid or malformed\n *\n * @example\n * ```ts\n * const cursor = decodeCursor(\"eyJpbmRleFZhbHVlcyI6e30sImRpcmVjdGlvbiI6ImZvcndhcmQifQ==\");\n * ```\n */\nexport function decodeCursor(cursor: string): Cursor {\n try {\n let json: string;\n if (typeof Buffer !== \"undefined\") {\n json = Buffer.from(cursor, \"base64\").toString(\"utf-8\");\n } else {\n json = atob(cursor);\n }\n const data = JSON.parse(json);\n const record = data as Record<string, unknown>;\n\n // Validate structure\n if (\n !isPlainObject(data) ||\n !isPlainObject(record[\"indexValues\"]) ||\n typeof record[\"indexName\"] !== \"string\" ||\n record[\"indexName\"].length === 0 ||\n typeof record[\"orderDirection\"] !== \"string\" ||\n (record[\"orderDirection\"] !== \"asc\" && record[\"orderDirection\"] !== \"desc\") ||\n typeof record[\"pageSize\"] !== \"number\" ||\n !Number.isFinite(record[\"pageSize\"]) ||\n !Number.isInteger(record[\"pageSize\"]) ||\n record[\"pageSize\"] <= 0\n ) {\n throw new Error(\"Invalid cursor structure\");\n }\n\n // Only support v1\n if (typeof record[\"v\"] !== \"number\") {\n throw new Error(\"Unsupported cursor version: missing. Only v1 is supported.\");\n }\n const version = record[\"v\"];\n if (version !== 1) {\n throw new Error(`Unsupported cursor version: ${version}. Only v1 is supported.`);\n }\n\n return new Cursor({\n indexName: record[\"indexName\"],\n orderDirection: record[\"orderDirection\"],\n pageSize: record[\"pageSize\"],\n indexValues: record[\"indexValues\"],\n });\n } catch (error) {\n throw new Error(`Invalid cursor: ${error instanceof Error ? error.message : \"malformed data\"}`);\n }\n}\n\n/**\n * Create a cursor from a record and pagination metadata\n *\n * @param record - The database record\n * @param indexColumns - The columns that make up the index\n * @param metadata - Pagination metadata (index name, order direction, page size)\n * @returns Cursor object\n *\n * @example\n * ```ts\n * const cursor = createCursorFromRecord(\n * { id: \"abc\", name: \"Alice\", createdAt: 123 },\n * [table.columns.createdAt, table.columns.id],\n * {\n * indexName: \"idx_created\",\n * orderDirection: \"asc\",\n * pageSize: 10\n * }\n * );\n * ```\n */\nexport function createCursorFromRecord(\n record: Record<string, unknown>,\n indexColumns: AnyColumn[],\n metadata: {\n indexName: string;\n orderDirection: \"asc\" | \"desc\";\n pageSize: number;\n },\n): Cursor {\n const indexValues: Record<string, unknown> = {};\n\n for (const col of indexColumns) {\n const value = record[col.name];\n if (value === undefined) {\n throw new Error(`Record is missing value for index column \"${col.name}\".`);\n }\n // Resolve FragnoId/FragnoReference to primitive values for cursor serialization.\n const resolved = resolveFragnoIdValue(value, col);\n // BigInt values are not JSON-serializable, so store them as strings.\n indexValues[col.name] = typeof resolved === \"bigint\" ? resolved.toString() : resolved;\n }\n\n return new Cursor({\n indexName: metadata.indexName,\n orderDirection: metadata.orderDirection,\n pageSize: metadata.pageSize,\n indexValues,\n });\n}\n\n/**\n * Serialize cursor values for database queries\n *\n * Converts cursor values (which are in JSON-compatible format after decode)\n * to database format using the column serialization rules.\n *\n * This function performs a two-step process:\n * 1. Deserialize from JSON format to application format (e.g., ISO string → Date)\n * 2. Serialize from application format to database format (e.g., Date → driver format)\n *\n * @param cursor - The cursor object\n * @param indexColumns - The columns that make up the index\n * @param driverConfig - The driver configuration\n * @param sqliteStorageMode - Optional SQLite storage mode override\n * @returns Serialized values ready for database queries\n *\n * @example\n * ```ts\n * const serialized = serializeCursorValues(\n * cursor,\n * [table.columns.createdAt],\n * driverConfig\n * );\n * ```\n */\nexport function serializeCursorValues(\n cursor: Cursor,\n indexColumns: AnyColumn[],\n driverConfig: DriverConfig,\n sqliteStorageMode?: SQLiteStorageMode,\n): Record<string, unknown> {\n const serializer = createSQLSerializer(driverConfig, sqliteStorageMode);\n const serialized: Record<string, unknown> = {};\n const missingColumns: string[] = [];\n\n for (const col of indexColumns) {\n const value = cursor.indexValues[col.name];\n if (value === undefined) {\n missingColumns.push(col.name);\n continue;\n }\n\n // If the cursor value is already a FragnoId/FragnoReference, resolve it directly\n // to avoid deserializing non-JSON objects.\n const resolvedDirect = resolveFragnoIdValue(value, col);\n if (resolvedDirect !== value) {\n serialized[col.name] = serializer.serialize(resolvedDirect, col);\n continue;\n }\n\n // First deserialize from JSON format to application format\n // (e.g., \"2025-11-07T09:36:57.959Z\" string → Date object)\n const deserialized = serializer.deserialize(value, col);\n // Resolve FragnoId/FragnoReference to primitive values (if present)\n const resolved = resolveFragnoIdValue(deserialized, col);\n // Then serialize to database format\n // (e.g., Date → database driver format)\n serialized[col.name] = serializer.serialize(resolved, col);\n }\n\n if (missingColumns.length > 0) {\n const suffix = cursor.indexName ? ` for index \"${cursor.indexName}\"` : \"\";\n const columns = missingColumns.map((name) => `\"${name}\"`).join(\", \");\n const plural = missingColumns.length === 1 ? \"\" : \"s\";\n throw new Error(`Cursor is missing values for index column${plural} ${columns}${suffix}.`);\n }\n\n return serialized;\n}\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst assertSerializableIndexValues = (values: Record<string, unknown>): void => {\n for (const [key, value] of Object.entries(values)) {\n if (value === undefined) {\n throw new Error(`Cursor index value \"${key}\" is undefined.`);\n }\n if (typeof value === \"number\" && !Number.isFinite(value)) {\n throw new Error(`Cursor index value \"${key}\" must be a finite number.`);\n }\n if (typeof value === \"bigint\") {\n throw new Error(`Cursor index value \"${key}\" must not be a BigInt.`);\n }\n if (typeof value === \"function\" || typeof value === \"symbol\") {\n throw new Error(`Cursor index value \"${key}\" is not JSON-serializable.`);\n }\n }\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//#region src/query/db-now.d.ts
|
|
2
|
+
type DbInterval = {
|
|
3
|
+
tag: "db-interval";
|
|
4
|
+
ms: number;
|
|
5
|
+
};
|
|
6
|
+
type DbIntervalInput = number | {
|
|
7
|
+
ms?: number;
|
|
8
|
+
seconds?: number;
|
|
9
|
+
minutes?: number;
|
|
10
|
+
hours?: number;
|
|
11
|
+
days?: number;
|
|
12
|
+
};
|
|
13
|
+
type DbNow = {
|
|
14
|
+
tag: "db-now";
|
|
15
|
+
offsetMs?: number;
|
|
16
|
+
plus: (interval: DbInterval | DbIntervalInput) => DbNow;
|
|
17
|
+
};
|
|
18
|
+
declare const dbNow: () => DbNow;
|
|
19
|
+
declare const dbInterval: (input: DbIntervalInput) => DbInterval;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { DbInterval, DbIntervalInput, DbNow, dbInterval, dbNow };
|
|
22
|
+
//# sourceMappingURL=db-now.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-now.d.ts","names":[],"sources":["../../../src/query/db-now.ts"],"sourcesContent":[],"mappings":";KAAY,UAAA;EAAA,GAAA,EAAA,aAAU;EAEV,EAAA,EAAA,MAAA;AAUZ,CAAA;AAGmB,KAbP,eAAA,GAaO,MAAA,GAAA;EAAa,EAAA,CAAA,EAAA,MAAA;EAAoB,OAAA,CAAA,EAAA,MAAA;EAAK,OAAA,CAAA,EAAA,MAAA;EA2C5C,KAAA,CAAA,EAAmC,MAAA;EAQnC,IAAA,CAAA,EAAA,MAGX;;KAzDU,KAAA;;;mBAGO,aAAa,oBAAoB;;cA2CvC,aAAY;cAQZ,oBAAqB,oBAAkB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
//#region src/query/db-now.ts
|
|
2
|
+
const toIntervalMs = (input) => {
|
|
3
|
+
if (typeof input === "number") {
|
|
4
|
+
if (!Number.isFinite(input)) throw new Error("DB_INTERVAL_INVALID");
|
|
5
|
+
return input;
|
|
6
|
+
}
|
|
7
|
+
if (typeof input === "object" && input !== null && "tag" in input) {
|
|
8
|
+
const tagged = input;
|
|
9
|
+
if (tagged.tag === "db-interval") {
|
|
10
|
+
if (!Number.isFinite(tagged.ms)) throw new Error("DB_INTERVAL_INVALID");
|
|
11
|
+
return tagged.ms;
|
|
12
|
+
}
|
|
13
|
+
throw new Error("DB_INTERVAL_INVALID");
|
|
14
|
+
}
|
|
15
|
+
const interval = input;
|
|
16
|
+
const totalMs = (interval.ms ?? 0) + (interval.seconds ?? 0) * 1e3 + (interval.minutes ?? 0) * 6e4 + (interval.hours ?? 0) * 36e5 + (interval.days ?? 0) * 864e5;
|
|
17
|
+
if (!Number.isFinite(totalMs)) throw new Error("DB_INTERVAL_INVALID");
|
|
18
|
+
return totalMs;
|
|
19
|
+
};
|
|
20
|
+
const createDbNow = (offsetMs = 0) => ({
|
|
21
|
+
tag: "db-now",
|
|
22
|
+
offsetMs,
|
|
23
|
+
plus: (interval) => createDbNow(offsetMs + toIntervalMs(interval))
|
|
24
|
+
});
|
|
25
|
+
const dbNow = () => createDbNow(0);
|
|
26
|
+
const dbInterval = (input) => ({
|
|
27
|
+
tag: "db-interval",
|
|
28
|
+
ms: toIntervalMs(input)
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
//#endregion
|
|
32
|
+
export { dbInterval, dbNow };
|
|
33
|
+
//# sourceMappingURL=db-now.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-now.js","names":[],"sources":["../../../src/query/db-now.ts"],"sourcesContent":["export type DbInterval = { tag: \"db-interval\"; ms: number };\n\nexport type DbIntervalInput =\n | number\n | {\n ms?: number;\n seconds?: number;\n minutes?: number;\n hours?: number;\n days?: number;\n };\n\nexport type DbNow = {\n tag: \"db-now\";\n offsetMs?: number;\n plus: (interval: DbInterval | DbIntervalInput) => DbNow;\n};\n\nconst toIntervalMs = (input: DbInterval | DbIntervalInput): number => {\n if (typeof input === \"number\") {\n if (!Number.isFinite(input)) {\n throw new Error(\"DB_INTERVAL_INVALID\");\n }\n return input;\n }\n\n if (typeof input === \"object\" && input !== null && \"tag\" in input) {\n const tagged = input as DbInterval;\n if (tagged.tag === \"db-interval\") {\n if (!Number.isFinite(tagged.ms)) {\n throw new Error(\"DB_INTERVAL_INVALID\");\n }\n return tagged.ms;\n }\n throw new Error(\"DB_INTERVAL_INVALID\");\n }\n\n const interval = input as Exclude<DbIntervalInput, number>;\n const totalMs =\n (interval.ms ?? 0) +\n (interval.seconds ?? 0) * 1000 +\n (interval.minutes ?? 0) * 60_000 +\n (interval.hours ?? 0) * 3_600_000 +\n (interval.days ?? 0) * 86_400_000;\n\n if (!Number.isFinite(totalMs)) {\n throw new Error(\"DB_INTERVAL_INVALID\");\n }\n\n return totalMs;\n};\n\nconst createDbNow = (offsetMs = 0): DbNow => ({\n tag: \"db-now\",\n offsetMs,\n plus: (interval) => createDbNow(offsetMs + toIntervalMs(interval)),\n});\n\nexport const dbNow = (): DbNow => createDbNow(0);\n\nexport const isDbNow = (value: unknown): value is DbNow =>\n typeof value === \"object\" && value !== null && (value as { tag?: string }).tag === \"db-now\";\n\nexport const getDbNowOffsetMs = (value: DbNow): number =>\n typeof value.offsetMs === \"number\" ? value.offsetMs : 0;\n\nexport const dbInterval = (input: DbIntervalInput): DbInterval => ({\n tag: \"db-interval\",\n ms: toIntervalMs(input),\n});\n\nexport const isDbInterval = (value: unknown): value is DbInterval =>\n typeof value === \"object\" && value !== null && (value as { tag?: string }).tag === \"db-interval\";\n"],"mappings":";AAkBA,MAAM,gBAAgB,UAAgD;AACpE,KAAI,OAAO,UAAU,UAAU;AAC7B,MAAI,CAAC,OAAO,SAAS,MAAM,CACzB,OAAM,IAAI,MAAM,sBAAsB;AAExC,SAAO;;AAGT,KAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,SAAS,OAAO;EACjE,MAAM,SAAS;AACf,MAAI,OAAO,QAAQ,eAAe;AAChC,OAAI,CAAC,OAAO,SAAS,OAAO,GAAG,CAC7B,OAAM,IAAI,MAAM,sBAAsB;AAExC,UAAO,OAAO;;AAEhB,QAAM,IAAI,MAAM,sBAAsB;;CAGxC,MAAM,WAAW;CACjB,MAAM,WACH,SAAS,MAAM,MACf,SAAS,WAAW,KAAK,OACzB,SAAS,WAAW,KAAK,OACzB,SAAS,SAAS,KAAK,QACvB,SAAS,QAAQ,KAAK;AAEzB,KAAI,CAAC,OAAO,SAAS,QAAQ,CAC3B,OAAM,IAAI,MAAM,sBAAsB;AAGxC,QAAO;;AAGT,MAAM,eAAe,WAAW,OAAc;CAC5C,KAAK;CACL;CACA,OAAO,aAAa,YAAY,WAAW,aAAa,SAAS,CAAC;CACnE;AAED,MAAa,cAAqB,YAAY,EAAE;AAQhD,MAAa,cAAc,WAAwC;CACjE,KAAK;CACL,IAAI,aAAa,MAAM;CACxB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AnyColumn, AnyRelation } from "../../schema/create.js";
|
|
2
|
+
import { Condition } from "../condition-builder.js";
|
|
3
|
+
import { AnySelectClause, FindManyOptions, OrderBy } from "../simple-query-interface.js";
|
|
4
|
+
|
|
5
|
+
//#region src/query/orm/orm.d.ts
|
|
6
|
+
interface CompiledJoin {
|
|
7
|
+
relation: AnyRelation;
|
|
8
|
+
options: SimplifyFindOptions<FindManyOptions> | false;
|
|
9
|
+
}
|
|
10
|
+
type SimplifyFindOptions<O> = Omit<O, "where" | "orderBy" | "select" | "join"> & {
|
|
11
|
+
select: AnySelectClause;
|
|
12
|
+
where?: Condition | undefined;
|
|
13
|
+
orderBy?: OrderBy<AnyColumn>[];
|
|
14
|
+
join?: CompiledJoin[];
|
|
15
|
+
};
|
|
16
|
+
//#endregion
|
|
17
|
+
export { CompiledJoin };
|
|
18
|
+
//# sourceMappingURL=orm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orm.d.ts","names":[],"sources":["../../../../src/query/orm/orm.ts"],"sourcesContent":[],"mappings":";;;;;UAUiB,YAAA;YACL;EADK,OAAA,EAEN,mBAFkB,CAEE,eAFF,CAAA,GAAA,KAAA;;AAElB,KA0EC,mBA1ED,CAAA,CAAA,CAAA,GA0E0B,IA1E1B,CA0E+B,CA1E/B,EAAA,OAAA,GAAA,SAAA,GAAA,QAAA,GAAA,MAAA,CAAA,GAAA;EAAmB,MAAA,EA2EpB,eA3EoB;EA0ElB,KAAA,CAAA,EAEF,SAFE,GAAA,SAAmB;EAAW,OAAA,CAAA,EAG9B,OAH8B,CAGtB,SAHsB,CAAA,EAAA;EAAL,IAAA,CAAA,EAI5B,YAJ4B,EAAA;CAC3B"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Prettify } from "../util/types.js";
|
|
2
|
+
import { AnySchema, AnyTable, FragnoId, IdColumn, Relation } from "../schema/create.js";
|
|
3
|
+
import { Condition, ConditionBuilder } from "./condition-builder.js";
|
|
4
|
+
import { CursorResult } from "./cursor.js";
|
|
5
|
+
import { DeleteBuilder, FindBuilder, IUnitOfWork, TypedUnitOfWork, UpdateBuilder, UpdateManyBuilder } from "./unit-of-work/unit-of-work.js";
|
|
6
|
+
|
|
7
|
+
//#region src/query/simple-query-interface.d.ts
|
|
8
|
+
type AnySelectClause = SelectClause<AnyTable>;
|
|
9
|
+
type SelectClause<T extends AnyTable> = true | readonly (keyof T["columns"])[];
|
|
10
|
+
type RawColumnValues<T extends AnyTable> = { [K in keyof T["columns"] as string extends K ? never : K]: T["columns"][K]["$out"] };
|
|
11
|
+
type TableToColumnValues<T extends AnyTable> = Prettify<RawColumnValues<T>>;
|
|
12
|
+
type PickNullable<T> = { [P in keyof T as null extends T[P] ? P : never]: T[P] };
|
|
13
|
+
type PickNotNullable<T> = { [P in keyof T as null extends T[P] ? never : P]: T[P] };
|
|
14
|
+
type RawInsertValues<T extends AnyTable> = { [K in keyof T["columns"] as string extends K ? never : K]: T["columns"][K]["$in"] };
|
|
15
|
+
type TableToInsertValues<T extends AnyTable> = Prettify<Partial<PickNullable<RawInsertValues<T>>> & PickNotNullable<RawInsertValues<T>>>;
|
|
16
|
+
type TableToUpdateValues<T extends AnyTable> = { [K in keyof T["columns"] as string extends K ? never : K]?: T["columns"][K] extends IdColumn ? never : T["columns"][K]["$in"] };
|
|
17
|
+
type MainSelectResult<S extends SelectClause<T>, T extends AnyTable> = S extends true ? TableToColumnValues<T> : S extends readonly (keyof T["columns"])[] ? Prettify<{ [K in S[number] as string extends K ? never : K]: K extends keyof T["columns"] ? T["columns"][K]["$out"] : never }> : never;
|
|
18
|
+
type SelectResult<T extends AnyTable, JoinOut, Select extends SelectClause<T>> = Prettify<MainSelectResult<Select, T> & JoinOut>;
|
|
19
|
+
interface MapRelationType<Type$1> {
|
|
20
|
+
one: Type$1 | null;
|
|
21
|
+
many: Type$1[];
|
|
22
|
+
}
|
|
23
|
+
type JoinBuilder<T extends AnyTable, Out = {}> = { [K in keyof T["relations"]]: T["relations"][K] extends Relation<infer Type, infer Target> ? <Select extends SelectClause<Target> = true, JoinOut = {}>(options?: FindManyOptions<Target, Select, JoinOut, false>) => JoinBuilder<T, Prettify<Out & { [$K in K]: MapRelationType<SelectResult<Target, JoinOut, Select>>[Type] }>> : never };
|
|
24
|
+
type OrderBy<Column = string> = [columnName: Column, "asc" | "desc"];
|
|
25
|
+
/**
|
|
26
|
+
* Extract Select type parameter from a FindBuilder type (handles Omit wrapper)
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
type ExtractSelect<T> = T extends FindBuilder<any, infer TSelect, any> ? TSelect : T extends Omit<FindBuilder<any, infer TSelect, any>, any> ? TSelect : true;
|
|
30
|
+
/**
|
|
31
|
+
* Extract JoinOut type parameter from a FindBuilder type (handles Omit wrapper)
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
type ExtractJoinOut<T> = T extends FindBuilder<any, any, infer TJoinOut> ? TJoinOut : T extends Omit<FindBuilder<any, any, infer TJoinOut>, any> ? TJoinOut : {};
|
|
35
|
+
type FindManyOptions<T extends AnyTable = AnyTable, Select extends SelectClause<T> = SelectClause<T>, _JoinOut = {}, IsRoot extends boolean = true> = {
|
|
36
|
+
select?: Select;
|
|
37
|
+
where?: (eb: ConditionBuilder<T["columns"]>) => Condition | boolean;
|
|
38
|
+
limit?: number;
|
|
39
|
+
orderBy?: OrderBy<keyof T["columns"]> | OrderBy<keyof T["columns"]>[];
|
|
40
|
+
join?: (jb: JoinBuilder<T>) => void;
|
|
41
|
+
} & (IsRoot extends true ? {
|
|
42
|
+
offset?: number;
|
|
43
|
+
} : {});
|
|
44
|
+
interface SimpleQueryInterface<TSchema extends AnySchema, TUOWConfig = void> {
|
|
45
|
+
/**
|
|
46
|
+
* Fetch the current database timestamp.
|
|
47
|
+
* Optional for adapters that cannot provide DB time.
|
|
48
|
+
*/
|
|
49
|
+
now?: () => Promise<Date>;
|
|
50
|
+
/**
|
|
51
|
+
* Find multiple records using a builder pattern
|
|
52
|
+
*/
|
|
53
|
+
find: {
|
|
54
|
+
<TableName extends keyof TSchema["tables"] & string, const TBuilderResult>(table: TableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TableName]>, "build">) => TBuilderResult): Promise<SelectResult<TSchema["tables"][TableName], ExtractJoinOut<TBuilderResult>, Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema["tables"][TableName]>>>[]>;
|
|
55
|
+
<TableName extends keyof TSchema["tables"] & string>(table: TableName): Promise<SelectResult<TSchema["tables"][TableName], {}, true>[]>;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Find multiple records with cursor pagination metadata
|
|
59
|
+
*/
|
|
60
|
+
findWithCursor: <TableName extends keyof TSchema["tables"] & string, const TBuilderResult>(table: TableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TableName]>, "build">) => TBuilderResult) => Promise<CursorResult<SelectResult<TSchema["tables"][TableName], ExtractJoinOut<TBuilderResult>, Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema["tables"][TableName]>>>>>;
|
|
61
|
+
/**
|
|
62
|
+
* Find the first record matching the criteria
|
|
63
|
+
* Implemented as a wrapper around find() with pageSize(1)
|
|
64
|
+
*/
|
|
65
|
+
findFirst: {
|
|
66
|
+
<TableName extends keyof TSchema["tables"] & string, const TBuilderResult>(table: TableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TableName]>, "build">) => TBuilderResult): Promise<SelectResult<TSchema["tables"][TableName], ExtractJoinOut<TBuilderResult>, Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema["tables"][TableName]>>> | null>;
|
|
67
|
+
<TableName extends keyof TSchema["tables"] & string>(table: TableName): Promise<SelectResult<TSchema["tables"][TableName], {}, true> | null>;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Create a single record
|
|
71
|
+
* @returns The ID of the created record
|
|
72
|
+
*/
|
|
73
|
+
create: <TableName extends keyof TSchema["tables"] & string>(table: TableName, values: TableToInsertValues<TSchema["tables"][TableName]>) => Promise<FragnoId>;
|
|
74
|
+
/**
|
|
75
|
+
* Create multiple records
|
|
76
|
+
* @returns Array of IDs of the created records
|
|
77
|
+
*/
|
|
78
|
+
createMany: <TableName extends keyof TSchema["tables"] & string>(table: TableName, values: TableToInsertValues<TSchema["tables"][TableName]>[]) => Promise<FragnoId[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Update a single record by ID
|
|
81
|
+
* Note: you cannot update the id of a row, some databases don't support that (including MongoDB).
|
|
82
|
+
*/
|
|
83
|
+
update: <TableName extends keyof TSchema["tables"] & string>(table: TableName, id: FragnoId | string, builderFn: (builder: Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build">) => Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build">) => Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Update multiple records matching a where clause
|
|
86
|
+
* Note: you cannot update the id of a row, some databases don't support that (including MongoDB).
|
|
87
|
+
*/
|
|
88
|
+
updateMany: <TableName extends keyof TSchema["tables"] & string>(table: TableName, builderFn: (builder: UpdateManyBuilder<TSchema["tables"][TableName]>) => void) => Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Delete a single record by ID
|
|
91
|
+
*/
|
|
92
|
+
delete: <TableName extends keyof TSchema["tables"] & string>(table: TableName, id: FragnoId | string, builderFn?: (builder: Omit<DeleteBuilder, "build">) => Omit<DeleteBuilder, "build">) => Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Delete multiple records matching a where clause
|
|
95
|
+
*/
|
|
96
|
+
deleteMany: <TableName extends keyof TSchema["tables"] & string>(table: TableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TableName]>, "build" | "check">) => void) => Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Create a Unit of Work bound to this query engine
|
|
99
|
+
*/
|
|
100
|
+
createUnitOfWork: (name?: string, config?: TUOWConfig) => TypedUnitOfWork<TSchema, [], unknown>;
|
|
101
|
+
/**
|
|
102
|
+
* Create a base Unit of Work for cross-schema operations.
|
|
103
|
+
*/
|
|
104
|
+
createBaseUnitOfWork: (name?: string, config?: TUOWConfig) => IUnitOfWork;
|
|
105
|
+
}
|
|
106
|
+
//#endregion
|
|
107
|
+
export { AnySelectClause, ExtractJoinOut, ExtractSelect, FindManyOptions, OrderBy, SelectClause, SelectResult, SimpleQueryInterface, TableToInsertValues, TableToUpdateValues };
|
|
108
|
+
//# sourceMappingURL=simple-query-interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-query-interface.d.ts","names":[],"sources":["../../../src/query/simple-query-interface.ts"],"sourcesContent":[],"mappings":"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"}
|