@fragno-dev/db 0.2.2 → 0.3.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/.turbo/turbo-build.log +202 -140
- package/CHANGELOG.md +35 -0
- package/README.md +30 -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 +27 -9
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.js +55 -16
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +129 -3
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +24 -5
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +6 -5
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +21 -10
- package/dist/adapters/generic-sql/migration/dialect/sqlite.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 +8 -8
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js +74 -51
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +6 -5
- 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/generic-sql-uow-operation-compiler.js +25 -17
- 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 +15 -12
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/where-builder.js +39 -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 +7 -3
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-encoder.js +28 -8
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
- package/dist/adapters/in-memory/condition-evaluator.js +131 -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 +176 -0
- package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
- package/dist/adapters/in-memory/in-memory-uow.js +648 -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 +28 -0
- package/dist/adapters/in-memory/options.d.ts.map +1 -0
- package/dist/adapters/in-memory/options.js +61 -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.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/db-fragment-definition-builder.d.ts +18 -7
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +116 -54
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/dispatchers/cloudflare-do/index.d.ts +26 -0
- package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
- package/dist/dispatchers/cloudflare-do/index.js +63 -0
- package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
- package/dist/dispatchers/node/index.d.ts +17 -0
- package/dist/dispatchers/node/index.d.ts.map +1 -0
- package/dist/dispatchers/node/index.js +59 -0
- package/dist/dispatchers/node/index.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +79 -2
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +150 -32
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/fragments/internal-fragment.routes.js +29 -0
- package/dist/fragments/internal-fragment.routes.js.map +1 -0
- package/dist/fragments/internal-fragment.schema.d.ts +9 -0
- package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
- package/dist/fragments/internal-fragment.schema.js +22 -0
- package/dist/fragments/internal-fragment.schema.js.map +1 -0
- package/dist/hooks/durable-hooks-processor.d.ts +14 -0
- package/dist/hooks/durable-hooks-processor.d.ts.map +1 -0
- package/dist/hooks/durable-hooks-processor.js +32 -0
- package/dist/hooks/durable-hooks-processor.js.map +1 -0
- package/dist/hooks/hooks.d.ts +42 -1
- package/dist/hooks/hooks.d.ts.map +1 -1
- package/dist/hooks/hooks.js +72 -6
- package/dist/hooks/hooks.js.map +1 -1
- package/dist/migration-engine/auto-from-schema.js +14 -11
- 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 +72 -33
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/migration-engine/shared.js.map +1 -1
- package/dist/mod.d.ts +15 -8
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +14 -8
- 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/node_modules/.pnpm/{rou3@0.7.10 → rou3@0.7.12}/node_modules/rou3/dist/index.js +8 -5
- package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.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 +52 -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/packages/fragno/dist/api/fragment-definition-builder.js +3 -2
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -1
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +164 -20
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
- package/dist/packages/fragno/dist/api/request-input-context.js +67 -0
- package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -1
- package/dist/packages/fragno/dist/api/route.js +14 -1
- package/dist/packages/fragno/dist/api/route.js.map +1 -1
- package/dist/packages/fragno/dist/internal/trace-context.js +12 -0
- package/dist/packages/fragno/dist/internal/trace-context.js.map +1 -0
- package/dist/query/column-defaults.js +20 -4
- package/dist/query/column-defaults.js.map +1 -1
- package/dist/query/cursor.d.ts +3 -1
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +45 -14
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/db-now.d.ts +8 -0
- package/dist/query/db-now.d.ts.map +1 -0
- package/dist/query/db-now.js +7 -0
- package/dist/query/db-now.js.map +1 -0
- package/dist/query/serialize/create-sql-serializer.js +3 -2
- 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 +55 -11
- 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 +6 -1
- package/dist/query/simple-query-interface.d.ts.map +1 -1
- 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 +11 -6
- 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 +50 -14
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.js +86 -5
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
- package/dist/query/value-decoding.js +9 -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 +38 -14
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +81 -42
- 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 +3 -2
- 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} +82 -56
- 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 +296 -0
- package/dist/schema-output/prisma.js.map +1 -0
- package/dist/util/default-database-adapter.js +61 -0
- package/dist/util/default-database-adapter.js.map +1 -0
- package/dist/with-database.d.ts +1 -1
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +12 -3
- package/dist/with-database.js.map +1 -1
- package/package.json +43 -28
- package/src/adapters/adapters.ts +30 -24
- package/src/adapters/drizzle/migrate-drizzle.test.ts +54 -33
- package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +599 -0
- package/src/adapters/drizzle/test-utils.ts +12 -8
- package/src/adapters/generic-sql/driver-config.ts +38 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -5
- package/src/adapters/generic-sql/generic-sql-adapter.ts +110 -24
- package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +54 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +231 -3
- package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +118 -0
- package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +26 -8
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +46 -8
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +25 -7
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +8 -4
- package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +47 -8
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +27 -12
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +128 -39
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +15 -8
- package/src/adapters/generic-sql/migration/sql-generator.ts +142 -65
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +9 -6
- package/src/adapters/generic-sql/query/cursor-utils.test.ts +271 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +41 -6
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +27 -27
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +38 -24
- package/src/adapters/generic-sql/query/select-builder.test.ts +15 -11
- package/src/adapters/generic-sql/query/select-builder.ts +6 -2
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +52 -2
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +50 -15
- package/src/adapters/generic-sql/query/where-builder.test.ts +91 -17
- package/src/adapters/generic-sql/query/where-builder.ts +90 -38
- package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +6 -6
- package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +806 -0
- package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +11 -11
- package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +10 -10
- package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +7 -7
- package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +6 -6
- package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +1 -1
- package/src/adapters/generic-sql/uow-decoder.ts +21 -3
- package/src/adapters/generic-sql/uow-encoder.test.ts +33 -2
- package/src/adapters/generic-sql/uow-encoder.ts +50 -11
- package/src/adapters/in-memory/condition-evaluator.test.ts +193 -0
- package/src/adapters/in-memory/condition-evaluator.ts +275 -0
- package/src/adapters/in-memory/errors.ts +20 -0
- package/src/adapters/in-memory/in-memory-adapter.ts +277 -0
- package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +296 -0
- package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +100 -0
- package/src/adapters/in-memory/in-memory-uow.ts +1348 -0
- package/src/adapters/in-memory/index.ts +3 -0
- package/src/adapters/in-memory/options.test.ts +41 -0
- package/src/adapters/in-memory/options.ts +87 -0
- package/src/adapters/in-memory/reference-resolution.test.ts +50 -0
- package/src/adapters/in-memory/reference-resolution.ts +67 -0
- package/src/adapters/in-memory/sorted-array-index.test.ts +123 -0
- package/src/adapters/in-memory/sorted-array-index.ts +228 -0
- package/src/adapters/in-memory/store.test.ts +68 -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 +57 -0
- package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1163 -0
- package/src/adapters/shared/from-unit-of-work-compiler.ts +3 -1
- package/src/adapters/shared/uow-operation-compiler.ts +26 -16
- package/src/adapters/sql/index.ts +12 -0
- package/src/db-fragment-definition-builder.test.ts +30 -12
- package/src/db-fragment-definition-builder.ts +142 -73
- package/src/db-fragment-instantiator.test.ts +105 -13
- package/src/db-fragment-integration.test.ts +9 -7
- package/src/dispatchers/cloudflare-do/index.test.ts +73 -0
- package/src/dispatchers/cloudflare-do/index.ts +104 -0
- package/src/dispatchers/node/index.test.ts +91 -0
- package/src/dispatchers/node/index.ts +87 -0
- package/src/fragments/internal-fragment.routes.ts +42 -0
- package/src/fragments/internal-fragment.schema.ts +51 -0
- package/src/fragments/internal-fragment.test.ts +458 -8
- package/src/fragments/internal-fragment.ts +322 -63
- package/src/hooks/durable-hooks-processor.test.ts +117 -0
- package/src/hooks/durable-hooks-processor.ts +67 -0
- package/src/hooks/hooks.test.ts +165 -5
- package/src/hooks/hooks.ts +197 -9
- package/src/migration-engine/auto-from-schema.test.ts +14 -14
- package/src/migration-engine/auto-from-schema.ts +5 -2
- package/src/migration-engine/create.test.ts +2 -2
- package/src/migration-engine/generation-engine.test.ts +229 -104
- package/src/migration-engine/generation-engine.ts +94 -64
- package/src/migration-engine/shared.ts +1 -0
- package/src/mod.ts +64 -26
- package/src/naming/sql-naming.ts +180 -0
- package/src/outbox/outbox-builder.ts +241 -0
- package/src/outbox/outbox.test.ts +253 -0
- package/src/outbox/outbox.ts +137 -0
- package/src/query/column-defaults.ts +41 -3
- package/src/query/condition-builder.test.ts +3 -3
- package/src/query/cursor.test.ts +116 -18
- package/src/query/cursor.ts +75 -26
- package/src/query/db-now.ts +6 -0
- package/src/query/query-type.test.ts +2 -2
- package/src/query/serialize/create-sql-serializer.ts +7 -2
- package/src/query/serialize/dialect/mysql-serializer.ts +12 -4
- package/src/query/serialize/dialect/postgres-serializer.ts +34 -4
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +51 -1
- package/src/query/serialize/dialect/sqlite-serializer.ts +92 -9
- package/src/query/serialize/sql-serializer.ts +4 -4
- package/src/query/simple-query-interface.ts +5 -0
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +25 -1
- package/src/query/unit-of-work/execute-unit-of-work.ts +25 -8
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +12 -12
- package/src/query/unit-of-work/unit-of-work-types.test.ts +1 -1
- package/src/query/unit-of-work/unit-of-work.test.ts +168 -37
- package/src/query/unit-of-work/unit-of-work.ts +203 -18
- package/src/query/value-decoding.test.ts +13 -2
- package/src/query/value-decoding.ts +17 -4
- package/src/query/value-encoding.test.ts +85 -2
- package/src/query/value-encoding.ts +56 -6
- package/src/schema/create.test.ts +129 -42
- package/src/schema/create.ts +185 -47
- package/src/schema/generate-id.test.ts +2 -2
- package/src/schema/generate-id.ts +2 -2
- package/src/schema/serialize.test.ts +14 -2
- package/src/schema/type-conversion/create-sql-type-mapper.ts +7 -2
- package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
- package/src/schema/type-conversion/type-mapping.test.ts +25 -1
- package/src/schema/validator.test.ts +197 -0
- package/src/schema/validator.ts +231 -0
- package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +179 -129
- package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +143 -93
- package/src/schema-output/prisma.test.ts +536 -0
- package/src/schema-output/prisma.ts +573 -0
- package/src/util/default-database-adapter.ts +106 -0
- package/src/with-database.ts +22 -3
- package/tsdown.config.ts +6 -4
- 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.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
package/README.md
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Optional, ORM-agnostic database layer for Fragno libraries.
|
|
4
4
|
|
|
5
|
-
Library authors define a type-safe schema; users plug in
|
|
6
|
-
data is written directly into their database.
|
|
5
|
+
Library authors define a type-safe schema; users plug in the SqlAdapter (configured with Kysely
|
|
6
|
+
dialects) so data is written directly into their database. Schema output can be generated for SQL
|
|
7
|
+
migrations, Drizzle, or Prisma workflows.
|
|
7
8
|
|
|
8
9
|
Full docs live at
|
|
9
10
|
[Database integration for library authors](https://fragno.dev/docs/fragno/for-library-authors/database-integration/overview).
|
|
@@ -39,7 +40,7 @@ pnpm add --dev @fragno-dev/cli
|
|
|
39
40
|
// schema.ts
|
|
40
41
|
import { schema, idColumn, column } from "@fragno-dev/db/schema";
|
|
41
42
|
|
|
42
|
-
export const commentSchema = schema((s) => {
|
|
43
|
+
export const commentSchema = schema("comment", (s) => {
|
|
43
44
|
return s
|
|
44
45
|
.addTable("comment", (t) => {
|
|
45
46
|
return t
|
|
@@ -91,22 +92,42 @@ export function createCommentLibrary(
|
|
|
91
92
|
}
|
|
92
93
|
```
|
|
93
94
|
|
|
94
|
-
Your users pass
|
|
95
|
+
Your users pass a SqlAdapter via `options`. If `better-sqlite3` is installed, `databaseAdapter` is
|
|
96
|
+
optional and defaults to a local SQLite file per fragment in `FRAGNO_DATA_DIR` (default:
|
|
97
|
+
`~/.fragno`).
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
// User's application code
|
|
101
|
+
import { SqlAdapter } from "@fragno-dev/db";
|
|
102
|
+
import { PostgresDialect } from "kysely";
|
|
103
|
+
import { Pool } from "pg";
|
|
104
|
+
|
|
105
|
+
const commentLib = createCommentLibrary(
|
|
106
|
+
{ maxCommentsPerPost: 10 },
|
|
107
|
+
{
|
|
108
|
+
databaseAdapter: new SqlAdapter({
|
|
109
|
+
dialect: new PostgresDialect({
|
|
110
|
+
pool: new Pool({
|
|
111
|
+
/* connection config */
|
|
112
|
+
}),
|
|
113
|
+
}),
|
|
114
|
+
}),
|
|
115
|
+
},
|
|
116
|
+
);
|
|
117
|
+
```
|
|
95
118
|
|
|
96
119
|
## Key features
|
|
97
120
|
|
|
98
121
|
- **Schema definition**: define tables, columns, indexes, and relations with a fluent, typed API.
|
|
99
122
|
- **Type-safe ORM**: full TypeScript inference for queries and results.
|
|
100
123
|
- **User-owned database**: your library never owns the database; users provide the adapter.
|
|
101
|
-
- **ORM agnostic**:
|
|
124
|
+
- **ORM agnostic**: SQL runtime with explicit schema output formats (SQL, Drizzle, Prisma).
|
|
102
125
|
- **Namespaced tables**: avoids conflicts with user tables.
|
|
103
126
|
|
|
104
127
|
## ORM and database support
|
|
105
128
|
|
|
106
|
-
`@fragno-dev/db` works with
|
|
107
|
-
|
|
108
|
-
- **Kysely**
|
|
109
|
-
- **Drizzle**
|
|
129
|
+
`@fragno-dev/db` works with Kysely dialects for runtime execution and supports SQL migrations plus
|
|
130
|
+
Drizzle or Prisma schema outputs.
|
|
110
131
|
|
|
111
132
|
Backed by Postgres and SQLite, including PGLite and Cloudflare Durable Objects.
|
|
112
133
|
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { AnySchema } from "../schema/create.js";
|
|
2
|
+
import { SqlNamingStrategy } from "../naming/sql-naming.js";
|
|
3
|
+
import { SQLiteStorageMode } from "./generic-sql/sqlite-storage.js";
|
|
2
4
|
import { IUnitOfWork } from "../query/unit-of-work/unit-of-work.js";
|
|
3
5
|
import { SimpleQueryInterface } from "../query/simple-query-interface.js";
|
|
4
|
-
import { SchemaGenerator } from "../schema-generator/schema-generator.js";
|
|
5
6
|
import { PreparedMigrations } from "./generic-sql/migration/prepared-migrations.js";
|
|
7
|
+
import { SQLProvider } from "../shared/providers.js";
|
|
6
8
|
import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
|
|
7
9
|
|
|
8
10
|
//#region src/adapters/adapters.d.ts
|
|
@@ -15,12 +17,11 @@ declare const fragnoDatabaseAdapterVersionFakeSymbol: "$fragno-database-adapter-
|
|
|
15
17
|
type DatabaseContextStorage = {
|
|
16
18
|
uow: IUnitOfWork;
|
|
17
19
|
};
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
toLogical(physicalName: string): string;
|
|
20
|
+
type SQLiteProfile = "default" | "prisma";
|
|
21
|
+
interface DatabaseAdapterMetadata {
|
|
22
|
+
databaseType?: SQLProvider;
|
|
23
|
+
sqliteProfile?: SQLiteProfile;
|
|
24
|
+
sqliteStorageMode?: SQLiteStorageMode;
|
|
24
25
|
}
|
|
25
26
|
interface DatabaseAdapter<TUOWConfig = void> {
|
|
26
27
|
[fragnoDatabaseAdapterNameFakeSymbol]: string;
|
|
@@ -30,30 +31,31 @@ interface DatabaseAdapter<TUOWConfig = void> {
|
|
|
30
31
|
* This allows multiple fragments to participate in the same Unit of Work.
|
|
31
32
|
*/
|
|
32
33
|
readonly contextStorage: RequestContextStorage<DatabaseContextStorage>;
|
|
34
|
+
/**
|
|
35
|
+
* Optional adapter override used for durable hook processing.
|
|
36
|
+
* Use this when the public adapter wraps another adapter (e.g. model checker).
|
|
37
|
+
*/
|
|
38
|
+
getHookProcessingAdapter?: () => DatabaseAdapter<TUOWConfig>;
|
|
33
39
|
/**
|
|
34
40
|
* Get current schema version, undefined if not initialized.
|
|
35
41
|
*/
|
|
36
42
|
getSchemaVersion(namespace: string): Promise<string | undefined>;
|
|
37
|
-
createQueryEngine: <const T extends AnySchema>(schema: T, namespace: string) => SimpleQueryInterface<T, TUOWConfig>;
|
|
38
|
-
prepareMigrations?: <const T extends AnySchema>(schema: T, namespace: string) => PreparedMigrations;
|
|
39
43
|
/**
|
|
40
|
-
*
|
|
41
|
-
|
|
44
|
+
* Optional metadata used by schema output tooling.
|
|
45
|
+
*/
|
|
46
|
+
readonly adapterMetadata?: DatabaseAdapterMetadata;
|
|
47
|
+
/**
|
|
48
|
+
* Naming strategy used for physical SQL identifiers.
|
|
42
49
|
*/
|
|
43
|
-
|
|
44
|
-
schema: AnySchema;
|
|
45
|
-
namespace: string;
|
|
46
|
-
}[], options?: {
|
|
47
|
-
path?: string;
|
|
48
|
-
}) => SchemaGenerator;
|
|
50
|
+
readonly namingStrategy: SqlNamingStrategy;
|
|
49
51
|
/**
|
|
50
|
-
*
|
|
51
|
-
* Used to convert between logical table names and physical table names.
|
|
52
|
+
* @deprecated Avoid using query engines directly in fragment code. Prefer handlerTx/serviceTx.
|
|
52
53
|
*/
|
|
53
|
-
|
|
54
|
+
createQueryEngine: <const T extends AnySchema>(schema: T, namespace: string | null) => SimpleQueryInterface<T, TUOWConfig>;
|
|
55
|
+
prepareMigrations?: <const T extends AnySchema>(schema: T, namespace: string | null) => PreparedMigrations;
|
|
54
56
|
isConnectionHealthy: () => Promise<boolean>;
|
|
55
57
|
close: () => Promise<void>;
|
|
56
58
|
}
|
|
57
59
|
//#endregion
|
|
58
|
-
export { DatabaseAdapter, DatabaseContextStorage,
|
|
60
|
+
export { DatabaseAdapter, DatabaseAdapterMetadata, DatabaseContextStorage, SQLiteProfile, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol };
|
|
59
61
|
//# sourceMappingURL=adapters.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;cASa;cACA;AADb;AACA;AAMA;AAIA;AAEiB,KANL,sBAAA,GAM4B;EACvB,GAAA,EANV,WAMU;CACC;AACI,KALV,aAAA,GAKU,SAAA,GAAA,QAAA;AAAiB,UAHtB,uBAAA,CAGsB;EAGtB,YAAA,CAAA,EALA,WAKe;EAC7B,aAAA,CAAA,EALe,aAKf;EACA,iBAAA,CAAA,EALmB,iBAKnB;;AAMwB,UARV,eAQU,CAAA,aAAA,IAAA,CAAA,CAAA;EAMwB,CAbhD,mCAAA,CAagD,EAAA,MAAA;EAAhB,CAZhC,sCAAA,CAYgC,EAAA,MAAA;EAKI;;;;EAgB3B,SAAA,cAAA,EA3Be,qBA2Bf,CA3BqC,sBA2BrC,CAAA;EAEgB;;;;EAGhB,wBAAA,CAAA,EAAA,GAAA,GA1BuB,eA0BvB,CA1BuC,UA0BvC,CAAA;EAEL;;;EAIe,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EA3BiB,OA2BjB,CAAA,MAAA,GAAA,SAAA,CAAA;;;;6BAtBO;;;;2BAKF;;;;sCAKW,mBAC1B,gCAEL,qBAAqB,GAAG;uCAEQ,mBAC3B,gCAEL;6BAEsB;eAEd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.js","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":["import type { SimpleQueryInterface } from \"../query/simple-query-interface\";\nimport type {
|
|
1
|
+
{"version":3,"file":"adapters.js","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":["import type { SimpleQueryInterface } from \"../query/simple-query-interface\";\nimport type { AnySchema } from \"../schema/create\";\nimport type { RequestContextStorage } from \"@fragno-dev/core/internal/request-context-storage\";\nimport type { IUnitOfWork } from \"../query/unit-of-work/unit-of-work\";\nimport type { PreparedMigrations } from \"./generic-sql/migration/prepared-migrations\";\nimport type { SQLProvider } from \"../shared/providers\";\nimport type { SQLiteStorageMode } from \"./generic-sql/sqlite-storage\";\nimport type { SqlNamingStrategy } from \"../naming/sql-naming\";\n\nexport const fragnoDatabaseAdapterNameFakeSymbol = \"$fragno-database-adapter-name\" as const;\nexport const fragnoDatabaseAdapterVersionFakeSymbol = \"$fragno-database-adapter-version\" as const;\n\n/**\n * Storage type for database context - stores the Unit of Work.\n * This is shared across all fragments using the same adapter.\n */\nexport type DatabaseContextStorage = {\n uow: IUnitOfWork;\n};\n\nexport type SQLiteProfile = \"default\" | \"prisma\";\n\nexport interface DatabaseAdapterMetadata {\n databaseType?: SQLProvider;\n sqliteProfile?: SQLiteProfile;\n sqliteStorageMode?: SQLiteStorageMode;\n}\n\nexport interface DatabaseAdapter<TUOWConfig = void> {\n [fragnoDatabaseAdapterNameFakeSymbol]: string;\n [fragnoDatabaseAdapterVersionFakeSymbol]: number;\n\n /**\n * Request context storage shared across all fragments using this adapter.\n * This allows multiple fragments to participate in the same Unit of Work.\n */\n readonly contextStorage: RequestContextStorage<DatabaseContextStorage>;\n\n /**\n * Optional adapter override used for durable hook processing.\n * Use this when the public adapter wraps another adapter (e.g. model checker).\n */\n getHookProcessingAdapter?: () => DatabaseAdapter<TUOWConfig>;\n\n /**\n * Get current schema version, undefined if not initialized.\n */\n getSchemaVersion(namespace: string): Promise<string | undefined>;\n\n /**\n * Optional metadata used by schema output tooling.\n */\n readonly adapterMetadata?: DatabaseAdapterMetadata;\n\n /**\n * Naming strategy used for physical SQL identifiers.\n */\n readonly namingStrategy: SqlNamingStrategy;\n\n /**\n * @deprecated Avoid using query engines directly in fragment code. Prefer handlerTx/serviceTx.\n */\n createQueryEngine: <const T extends AnySchema>(\n schema: T,\n namespace: string | null,\n ) => SimpleQueryInterface<T, TUOWConfig>;\n\n prepareMigrations?: <const T extends AnySchema>(\n schema: T,\n namespace: string | null,\n ) => PreparedMigrations;\n\n isConnectionHealthy: () => Promise<boolean>;\n\n close: () => Promise<void>;\n}\n"],"mappings":";AASA,MAAa,sCAAsC;AACnD,MAAa,yCAAyC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { SqlNamingStrategy } from "../../naming/sql-naming.js";
|
|
2
|
+
|
|
1
3
|
//#region src/adapters/generic-sql/driver-config.d.ts
|
|
2
4
|
declare const supportedDatabases: readonly ["sqlite", "postgresql", "mysql"];
|
|
3
5
|
type SupportedDatabase = (typeof supportedDatabases)[number];
|
|
@@ -8,12 +10,17 @@ declare abstract class DriverConfig<T extends SupportedDriverType = SupportedDri
|
|
|
8
10
|
abstract readonly databaseType: SupportedDatabase;
|
|
9
11
|
abstract readonly supportsReturning: boolean;
|
|
10
12
|
abstract readonly supportsJson: boolean;
|
|
13
|
+
abstract readonly outboxVersionstampStrategy: OutboxVersionstampStrategy;
|
|
11
14
|
/**
|
|
12
15
|
* Column name for internal ID in RETURNING results.
|
|
13
16
|
* Only defined if supportsReturning is true.
|
|
14
17
|
*/
|
|
15
18
|
abstract readonly internalIdColumn: string | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* SQLite storage selection is handled by adapters, not driver config.
|
|
21
|
+
*/
|
|
16
22
|
get supportsRowsAffected(): boolean;
|
|
23
|
+
get defaultNamingStrategy(): SqlNamingStrategy;
|
|
17
24
|
/**
|
|
18
25
|
* Extract the number of affected rows from a query result.
|
|
19
26
|
* Only implemented for drivers that support affected rows reporting.
|
|
@@ -24,12 +31,15 @@ declare abstract class DriverConfig<T extends SupportedDriverType = SupportedDri
|
|
|
24
31
|
*/
|
|
25
32
|
extractAffectedRows?(result: Record<string, unknown>): bigint;
|
|
26
33
|
}
|
|
34
|
+
declare const defaultNamingStrategyForDatabase: (databaseType: SupportedDatabase) => SqlNamingStrategy;
|
|
35
|
+
type OutboxVersionstampStrategy = "update-returning" | "insert-on-conflict-returning" | "insert-on-duplicate-last-insert-id";
|
|
27
36
|
declare class SQLocalDriverConfig extends DriverConfig<"sqlocal"> {
|
|
28
37
|
readonly driverType = "sqlocal";
|
|
29
38
|
readonly databaseType = "sqlite";
|
|
30
39
|
readonly supportsReturning = true;
|
|
31
40
|
readonly supportsJson = false;
|
|
32
41
|
readonly internalIdColumn = "_internalId";
|
|
42
|
+
readonly outboxVersionstampStrategy = "insert-on-conflict-returning";
|
|
33
43
|
}
|
|
34
44
|
declare class CloudflareDurableObjectsDriverConfig extends DriverConfig<"cloudflare_durable_objects"> {
|
|
35
45
|
readonly driverType = "cloudflare_durable_objects";
|
|
@@ -37,6 +47,7 @@ declare class CloudflareDurableObjectsDriverConfig extends DriverConfig<"cloudfl
|
|
|
37
47
|
readonly supportsReturning = true;
|
|
38
48
|
readonly supportsJson = false;
|
|
39
49
|
readonly internalIdColumn = "_internalId";
|
|
50
|
+
readonly outboxVersionstampStrategy = "insert-on-conflict-returning";
|
|
40
51
|
}
|
|
41
52
|
declare class BetterSQLite3DriverConfig extends DriverConfig<"better-sqlite3"> {
|
|
42
53
|
readonly driverType = "better-sqlite3";
|
|
@@ -44,6 +55,7 @@ declare class BetterSQLite3DriverConfig extends DriverConfig<"better-sqlite3"> {
|
|
|
44
55
|
readonly supportsReturning = true;
|
|
45
56
|
readonly supportsJson = false;
|
|
46
57
|
readonly internalIdColumn = "_internalId";
|
|
58
|
+
readonly outboxVersionstampStrategy = "insert-on-conflict-returning";
|
|
47
59
|
extractAffectedRows(result: Record<string, unknown>): bigint;
|
|
48
60
|
}
|
|
49
61
|
declare class NodePostgresDriverConfig extends DriverConfig<"pg"> {
|
|
@@ -52,6 +64,7 @@ declare class NodePostgresDriverConfig extends DriverConfig<"pg"> {
|
|
|
52
64
|
readonly supportsReturning = true;
|
|
53
65
|
readonly supportsJson = true;
|
|
54
66
|
readonly internalIdColumn = "_internalId";
|
|
67
|
+
readonly outboxVersionstampStrategy = "insert-on-conflict-returning";
|
|
55
68
|
extractAffectedRows(result: Record<string, unknown>): bigint;
|
|
56
69
|
}
|
|
57
70
|
declare class PGLiteDriverConfig extends DriverConfig<"pglite"> {
|
|
@@ -60,6 +73,7 @@ declare class PGLiteDriverConfig extends DriverConfig<"pglite"> {
|
|
|
60
73
|
readonly supportsReturning = true;
|
|
61
74
|
readonly supportsJson = true;
|
|
62
75
|
readonly internalIdColumn = "_internalId";
|
|
76
|
+
readonly outboxVersionstampStrategy = "insert-on-conflict-returning";
|
|
63
77
|
extractAffectedRows(result: Record<string, unknown>): bigint;
|
|
64
78
|
}
|
|
65
79
|
declare class MySQL2DriverConfig extends DriverConfig<"mysql2"> {
|
|
@@ -68,7 +82,8 @@ declare class MySQL2DriverConfig extends DriverConfig<"mysql2"> {
|
|
|
68
82
|
readonly supportsReturning = false;
|
|
69
83
|
readonly supportsJson = true;
|
|
70
84
|
readonly internalIdColumn: undefined;
|
|
85
|
+
readonly outboxVersionstampStrategy = "insert-on-duplicate-last-insert-id";
|
|
71
86
|
}
|
|
72
87
|
//#endregion
|
|
73
|
-
export { BetterSQLite3DriverConfig, CloudflareDurableObjectsDriverConfig, DriverConfig, MySQL2DriverConfig, NodePostgresDriverConfig, PGLiteDriverConfig, SQLocalDriverConfig, SupportedDatabase, SupportedDriverType, supportedDatabases, supportedDriverTypes };
|
|
88
|
+
export { BetterSQLite3DriverConfig, CloudflareDurableObjectsDriverConfig, DriverConfig, MySQL2DriverConfig, NodePostgresDriverConfig, OutboxVersionstampStrategy, PGLiteDriverConfig, SQLocalDriverConfig, SupportedDatabase, SupportedDriverType, defaultNamingStrategyForDatabase, supportedDatabases, supportedDriverTypes };
|
|
74
89
|
//# sourceMappingURL=driver-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver-config.d.ts","names":[],"sources":["../../../src/adapters/generic-sql/driver-config.ts"],"sourcesContent":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"driver-config.d.ts","names":[],"sources":["../../../src/adapters/generic-sql/driver-config.ts"],"sourcesContent":[],"mappings":";;;cAMa;KACD,iBAAA,WAA4B;AAD3B,cAGA,oBAH+D,EAAA,SAAA,CAAA,SAAA,EAAA,4BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,QAAA,EAAA,QAAA,CAAA;AAChE,KAWA,mBAAA,GAXiB,CAAA,OAWa,oBAXgB,CAAA,CAAA,MAAA,CAAA;AAE7C,uBAWS,YAJZ,CAAA,UAImC,mBAJnC,GAIyD,mBAJzD,CAAA,CAAA;EAEE,kBAAA,UAAmB,EAGC,CAHD;EAET,kBAAY,YAAA,EAEA,iBAFA;EAAW,kBAAA,iBAAA,EAAA,OAAA;EAAsB,kBAAA,YAAA,EAAA,OAAA;EACnC,kBAAA,0BAAA,EAKgB,0BALhB;EACE;;;;EA+BG,kBAAA,gBAAA,EAAA,MAAA,GAAA,SAAA;EAGxB;AAab;AAKA;EASa,IAAA,oBAAA,CAAA,CAAA,EAAA,OAAA;EASA,IAAA,qBAAA,CAAA,CAAA,EAnDkB,iBA2DQ;EAiB1B;AAiCb;AAwBA;;;;;;+BAzH+B;;cAGlB,iDACG,sBACb;KAWS,0BAAA;cAKC,mBAAA,SAA4B;;;;;;;;cAS5B,oCAAA,SAA6C;;;;;;;;cAS7C,yBAAA,SAAkC;;;;;;;8BAQR;;cAiB1B,wBAAA,SAAiC;;;;;;;8BAQP;;cAyB1B,kBAAA,SAA2B;;;;;;;8BAQD;;cAgB1B,kBAAA,SAA2B"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { schemaNamingStrategy, suffixNamingStrategy } from "../../naming/sql-naming.js";
|
|
2
|
+
|
|
1
3
|
//#region src/adapters/generic-sql/driver-config.ts
|
|
2
4
|
const supportedDatabases = [
|
|
3
5
|
"sqlite",
|
|
@@ -13,9 +15,23 @@ const supportedDriverTypes = [
|
|
|
13
15
|
"mysql2"
|
|
14
16
|
];
|
|
15
17
|
var DriverConfig = class {
|
|
18
|
+
/**
|
|
19
|
+
* SQLite storage selection is handled by adapters, not driver config.
|
|
20
|
+
*/
|
|
16
21
|
get supportsRowsAffected() {
|
|
17
22
|
return !!this.extractAffectedRows;
|
|
18
23
|
}
|
|
24
|
+
get defaultNamingStrategy() {
|
|
25
|
+
return defaultNamingStrategyForDatabase(this.databaseType);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const defaultNamingStrategyForDatabase = (databaseType) => {
|
|
29
|
+
switch (databaseType) {
|
|
30
|
+
case "postgresql": return schemaNamingStrategy;
|
|
31
|
+
case "sqlite":
|
|
32
|
+
case "mysql":
|
|
33
|
+
default: return suffixNamingStrategy;
|
|
34
|
+
}
|
|
19
35
|
};
|
|
20
36
|
var SQLocalDriverConfig = class extends DriverConfig {
|
|
21
37
|
driverType = "sqlocal";
|
|
@@ -23,6 +39,7 @@ var SQLocalDriverConfig = class extends DriverConfig {
|
|
|
23
39
|
supportsReturning = true;
|
|
24
40
|
supportsJson = false;
|
|
25
41
|
internalIdColumn = "_internalId";
|
|
42
|
+
outboxVersionstampStrategy = "insert-on-conflict-returning";
|
|
26
43
|
};
|
|
27
44
|
var CloudflareDurableObjectsDriverConfig = class extends DriverConfig {
|
|
28
45
|
driverType = "cloudflare_durable_objects";
|
|
@@ -30,6 +47,7 @@ var CloudflareDurableObjectsDriverConfig = class extends DriverConfig {
|
|
|
30
47
|
supportsReturning = true;
|
|
31
48
|
supportsJson = false;
|
|
32
49
|
internalIdColumn = "_internalId";
|
|
50
|
+
outboxVersionstampStrategy = "insert-on-conflict-returning";
|
|
33
51
|
};
|
|
34
52
|
var BetterSQLite3DriverConfig = class extends DriverConfig {
|
|
35
53
|
driverType = "better-sqlite3";
|
|
@@ -37,6 +55,7 @@ var BetterSQLite3DriverConfig = class extends DriverConfig {
|
|
|
37
55
|
supportsReturning = true;
|
|
38
56
|
supportsJson = false;
|
|
39
57
|
internalIdColumn = "_internalId";
|
|
58
|
+
outboxVersionstampStrategy = "insert-on-conflict-returning";
|
|
40
59
|
extractAffectedRows(result) {
|
|
41
60
|
if ("numAffectedRows" in result) {
|
|
42
61
|
const value = result["numAffectedRows"];
|
|
@@ -52,6 +71,7 @@ var NodePostgresDriverConfig = class extends DriverConfig {
|
|
|
52
71
|
supportsReturning = true;
|
|
53
72
|
supportsJson = true;
|
|
54
73
|
internalIdColumn = "_internalId";
|
|
74
|
+
outboxVersionstampStrategy = "insert-on-conflict-returning";
|
|
55
75
|
extractAffectedRows(result) {
|
|
56
76
|
if ("numAffectedRows" in result) {
|
|
57
77
|
const value = result["numAffectedRows"];
|
|
@@ -72,6 +92,7 @@ var PGLiteDriverConfig = class extends DriverConfig {
|
|
|
72
92
|
supportsReturning = true;
|
|
73
93
|
supportsJson = true;
|
|
74
94
|
internalIdColumn = "_internalId";
|
|
95
|
+
outboxVersionstampStrategy = "insert-on-conflict-returning";
|
|
75
96
|
extractAffectedRows(result) {
|
|
76
97
|
if ("affectedRows" in result) {
|
|
77
98
|
const value = result["affectedRows"];
|
|
@@ -87,8 +108,9 @@ var MySQL2DriverConfig = class extends DriverConfig {
|
|
|
87
108
|
supportsReturning = false;
|
|
88
109
|
supportsJson = true;
|
|
89
110
|
internalIdColumn = void 0;
|
|
111
|
+
outboxVersionstampStrategy = "insert-on-duplicate-last-insert-id";
|
|
90
112
|
};
|
|
91
113
|
|
|
92
114
|
//#endregion
|
|
93
|
-
export { BetterSQLite3DriverConfig, CloudflareDurableObjectsDriverConfig, DriverConfig, MySQL2DriverConfig, NodePostgresDriverConfig, PGLiteDriverConfig, SQLocalDriverConfig, supportedDatabases, supportedDriverTypes };
|
|
115
|
+
export { BetterSQLite3DriverConfig, CloudflareDurableObjectsDriverConfig, DriverConfig, MySQL2DriverConfig, NodePostgresDriverConfig, PGLiteDriverConfig, SQLocalDriverConfig, defaultNamingStrategyForDatabase, supportedDatabases, supportedDriverTypes };
|
|
94
116
|
//# sourceMappingURL=driver-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver-config.js","names":[],"sources":["../../../src/adapters/generic-sql/driver-config.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"driver-config.js","names":[],"sources":["../../../src/adapters/generic-sql/driver-config.ts"],"sourcesContent":["import {\n schemaNamingStrategy,\n suffixNamingStrategy,\n type SqlNamingStrategy,\n} from \"../../naming/sql-naming\";\n\nexport const supportedDatabases = [\"sqlite\", \"postgresql\", \"mysql\"] as const;\nexport type SupportedDatabase = (typeof supportedDatabases)[number];\n\nexport const supportedDriverTypes = [\n \"sqlocal\",\n \"cloudflare_durable_objects\",\n \"better-sqlite3\",\n \"pg\",\n \"pglite\",\n \"mysql2\",\n] as const;\n\nexport type SupportedDriverType = (typeof supportedDriverTypes)[number];\n\nexport abstract class DriverConfig<T extends SupportedDriverType = SupportedDriverType> {\n abstract readonly driverType: T;\n abstract readonly databaseType: SupportedDatabase;\n\n abstract readonly supportsReturning: boolean;\n abstract readonly supportsJson: boolean;\n abstract readonly outboxVersionstampStrategy: OutboxVersionstampStrategy;\n\n /**\n * Column name for internal ID in RETURNING results.\n * Only defined if supportsReturning is true.\n */\n abstract readonly internalIdColumn: string | undefined;\n\n /**\n * SQLite storage selection is handled by adapters, not driver config.\n */\n get supportsRowsAffected(): boolean {\n return !!this.extractAffectedRows;\n }\n\n get defaultNamingStrategy(): SqlNamingStrategy {\n return defaultNamingStrategyForDatabase(this.databaseType);\n }\n\n /**\n * Extract the number of affected rows from a query result.\n * Only implemented for drivers that support affected rows reporting.\n *\n * @param result - The query result from the SQL driver\n * @returns The number of affected rows as bigint\n * @throws Error if affected rows information is not found in the result\n */\n extractAffectedRows?(result: Record<string, unknown>): bigint;\n}\n\nexport const defaultNamingStrategyForDatabase = (\n databaseType: SupportedDatabase,\n): SqlNamingStrategy => {\n switch (databaseType) {\n case \"postgresql\":\n return schemaNamingStrategy;\n case \"sqlite\":\n case \"mysql\":\n default:\n return suffixNamingStrategy;\n }\n};\n\nexport type OutboxVersionstampStrategy =\n | \"update-returning\"\n | \"insert-on-conflict-returning\"\n | \"insert-on-duplicate-last-insert-id\";\n\nexport class SQLocalDriverConfig extends DriverConfig<\"sqlocal\"> {\n override readonly driverType = \"sqlocal\";\n override readonly databaseType = \"sqlite\";\n override readonly supportsReturning = true;\n override readonly supportsJson = false;\n override readonly internalIdColumn = \"_internalId\";\n override readonly outboxVersionstampStrategy = \"insert-on-conflict-returning\";\n}\n\nexport class CloudflareDurableObjectsDriverConfig extends DriverConfig<\"cloudflare_durable_objects\"> {\n override readonly driverType = \"cloudflare_durable_objects\";\n override readonly databaseType = \"sqlite\";\n override readonly supportsReturning = true;\n override readonly supportsJson = false;\n override readonly internalIdColumn = \"_internalId\";\n override readonly outboxVersionstampStrategy = \"insert-on-conflict-returning\";\n}\n\nexport class BetterSQLite3DriverConfig extends DriverConfig<\"better-sqlite3\"> {\n override readonly driverType = \"better-sqlite3\";\n override readonly databaseType = \"sqlite\";\n override readonly supportsReturning = true;\n override readonly supportsJson = false;\n override readonly internalIdColumn = \"_internalId\";\n override readonly outboxVersionstampStrategy = \"insert-on-conflict-returning\";\n\n override extractAffectedRows(result: Record<string, unknown>): bigint {\n if (\"numAffectedRows\" in result) {\n const value = result[\"numAffectedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n\n throw new Error(\n `No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`,\n );\n }\n}\n\nexport class NodePostgresDriverConfig extends DriverConfig<\"pg\"> {\n override readonly driverType = \"pg\";\n override readonly databaseType = \"postgresql\";\n override readonly supportsReturning = true;\n override readonly supportsJson = true;\n override readonly internalIdColumn = \"_internalId\";\n override readonly outboxVersionstampStrategy = \"insert-on-conflict-returning\";\n\n override extractAffectedRows(result: Record<string, unknown>): bigint {\n if (\"numAffectedRows\" in result) {\n const value = result[\"numAffectedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n if (\"numChangedRows\" in result) {\n const value = result[\"numChangedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n throw new Error(\n `No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`,\n );\n }\n}\n\nexport class PGLiteDriverConfig extends DriverConfig<\"pglite\"> {\n override readonly driverType = \"pglite\";\n override readonly databaseType = \"postgresql\";\n override readonly supportsReturning = true;\n override readonly supportsJson = true;\n override readonly internalIdColumn = \"_internalId\";\n override readonly outboxVersionstampStrategy = \"insert-on-conflict-returning\";\n\n override extractAffectedRows(result: Record<string, unknown>): bigint {\n if (\"affectedRows\" in result) {\n const value = result[\"affectedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n throw new Error(\n `No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`,\n );\n }\n}\n\nexport class MySQL2DriverConfig extends DriverConfig<\"mysql2\"> {\n override readonly driverType = \"mysql2\";\n override readonly databaseType = \"mysql\";\n override readonly supportsReturning = false;\n override readonly supportsJson = true;\n override readonly internalIdColumn = undefined;\n override readonly outboxVersionstampStrategy = \"insert-on-duplicate-last-insert-id\";\n}\n"],"mappings":";;;AAMA,MAAa,qBAAqB;CAAC;CAAU;CAAc;CAAQ;AAGnE,MAAa,uBAAuB;CAClC;CACA;CACA;CACA;CACA;CACA;CACD;AAID,IAAsB,eAAtB,MAAwF;;;;CAiBtF,IAAI,uBAAgC;AAClC,SAAO,CAAC,CAAC,KAAK;;CAGhB,IAAI,wBAA2C;AAC7C,SAAO,iCAAiC,KAAK,aAAa;;;AAc9D,MAAa,oCACX,iBACsB;AACtB,SAAQ,cAAR;EACE,KAAK,aACH,QAAO;EACT,KAAK;EACL,KAAK;EACL,QACE,QAAO;;;AASb,IAAa,sBAAb,cAAyC,aAAwB;CAC/D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CACrC,AAAkB,6BAA6B;;AAGjD,IAAa,uCAAb,cAA0D,aAA2C;CACnG,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CACrC,AAAkB,6BAA6B;;AAGjD,IAAa,4BAAb,cAA+C,aAA+B;CAC5E,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CACrC,AAAkB,6BAA6B;CAE/C,AAAS,oBAAoB,QAAyC;AACpE,MAAI,qBAAqB,QAAQ;GAC/B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAIxB,QAAM,IAAI,MACR,qCAAqC,KAAK,UAAU,OAAO,CAAC,WAAW,KAAK,WAAW,wCACxF;;;AAIL,IAAa,2BAAb,cAA8C,aAAmB;CAC/D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CACrC,AAAkB,6BAA6B;CAE/C,AAAS,oBAAoB,QAAyC;AACpE,MAAI,qBAAqB,QAAQ;GAC/B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAGxB,MAAI,oBAAoB,QAAQ;GAC9B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAGxB,QAAM,IAAI,MACR,qCAAqC,KAAK,UAAU,OAAO,CAAC,WAAW,KAAK,WAAW,wCACxF;;;AAIL,IAAa,qBAAb,cAAwC,aAAuB;CAC7D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CACrC,AAAkB,6BAA6B;CAE/C,AAAS,oBAAoB,QAAyC;AACpE,MAAI,kBAAkB,QAAQ;GAC5B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAGxB,QAAM,IAAI,MACR,qCAAqC,KAAK,UAAU,OAAO,CAAC,WAAW,KAAK,WAAW,wCACxF;;;AAIL,IAAa,qBAAb,cAAwC,aAAuB;CAC7D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CACrC,AAAkB,6BAA6B"}
|
|
@@ -1,43 +1,61 @@
|
|
|
1
1
|
import { AnySchema } from "../../schema/create.js";
|
|
2
|
+
import { SqlNamingStrategy } from "../../naming/sql-naming.js";
|
|
2
3
|
import { DriverConfig } from "./driver-config.js";
|
|
4
|
+
import { SQLiteStorageMode, sqliteStorageDefault, sqliteStoragePrisma } from "./sqlite-storage.js";
|
|
5
|
+
import { OutboxConfig } from "../../outbox/outbox.js";
|
|
6
|
+
import { UOWInstrumentation } from "../../query/unit-of-work/unit-of-work.js";
|
|
3
7
|
import { SimpleQueryInterface } from "../../query/simple-query-interface.js";
|
|
4
8
|
import { CompiledQuery, Dialect } from "../../sql-driver/sql-driver.js";
|
|
5
9
|
import { SqlDriverAdapter } from "../../sql-driver/sql-driver-adapter.js";
|
|
6
10
|
import { PreparedMigrations } from "./migration/prepared-migrations.js";
|
|
7
|
-
import { DatabaseAdapter, DatabaseContextStorage,
|
|
11
|
+
import { DatabaseAdapter, DatabaseAdapterMetadata, DatabaseContextStorage, SQLiteProfile, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
|
|
8
12
|
import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
|
|
9
13
|
|
|
10
14
|
//#region src/adapters/generic-sql/generic-sql-adapter.d.ts
|
|
11
15
|
interface UnitOfWorkConfig {
|
|
12
16
|
onQuery?: (query: CompiledQuery) => void;
|
|
13
17
|
dryRun?: boolean;
|
|
18
|
+
instrumentation?: UOWInstrumentation;
|
|
14
19
|
}
|
|
15
|
-
interface
|
|
20
|
+
interface SqlAdapterOptions {
|
|
16
21
|
dialect: Dialect;
|
|
17
22
|
driverConfig: DriverConfig;
|
|
18
23
|
uowConfig?: UnitOfWorkConfig;
|
|
24
|
+
outbox?: OutboxConfig;
|
|
25
|
+
sqliteProfile?: SQLiteProfile;
|
|
26
|
+
sqliteStorageMode?: SQLiteStorageMode;
|
|
27
|
+
namingStrategy?: SqlNamingStrategy;
|
|
19
28
|
}
|
|
20
|
-
declare
|
|
29
|
+
declare const sqliteProfiles: Record<SQLiteProfile, SQLiteStorageMode>;
|
|
30
|
+
declare class SqlAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
|
|
21
31
|
#private;
|
|
22
32
|
readonly dialect: Dialect;
|
|
23
33
|
readonly driverConfig: DriverConfig;
|
|
24
34
|
readonly uowConfig?: UnitOfWorkConfig;
|
|
35
|
+
readonly outbox?: OutboxConfig;
|
|
36
|
+
readonly sqliteStorageMode?: SQLiteStorageMode;
|
|
37
|
+
readonly sqliteProfile?: SQLiteProfile;
|
|
38
|
+
readonly adapterMetadata: DatabaseAdapterMetadata;
|
|
39
|
+
readonly namingStrategy: SqlNamingStrategy;
|
|
25
40
|
constructor({
|
|
26
41
|
dialect,
|
|
27
42
|
driverConfig,
|
|
28
|
-
uowConfig
|
|
29
|
-
|
|
43
|
+
uowConfig,
|
|
44
|
+
outbox,
|
|
45
|
+
sqliteProfile,
|
|
46
|
+
sqliteStorageMode,
|
|
47
|
+
namingStrategy
|
|
48
|
+
}: SqlAdapterOptions);
|
|
30
49
|
get driver(): SqlDriverAdapter;
|
|
31
50
|
get [fragnoDatabaseAdapterNameFakeSymbol](): string;
|
|
32
51
|
get [fragnoDatabaseAdapterVersionFakeSymbol](): number;
|
|
33
52
|
get contextStorage(): RequestContextStorage<DatabaseContextStorage>;
|
|
34
53
|
close(): Promise<void>;
|
|
35
54
|
isConnectionHealthy(): Promise<boolean>;
|
|
36
|
-
prepareMigrations<T extends AnySchema>(schema: T, namespace: string): PreparedMigrations;
|
|
37
|
-
createTableNameMapper(namespace: string): TableNameMapper;
|
|
55
|
+
prepareMigrations<T extends AnySchema>(schema: T, namespace: string | null): PreparedMigrations;
|
|
38
56
|
getSchemaVersion(namespace: string): Promise<string | undefined>;
|
|
39
|
-
createQueryEngine<T extends AnySchema>(schema: T, namespace: string): SimpleQueryInterface<T, UnitOfWorkConfig>;
|
|
57
|
+
createQueryEngine<T extends AnySchema>(schema: T, namespace: string | null): SimpleQueryInterface<T, UnitOfWorkConfig>;
|
|
40
58
|
}
|
|
41
59
|
//#endregion
|
|
42
|
-
export {
|
|
60
|
+
export { SqlAdapter, SqlAdapterOptions, UnitOfWorkConfig, sqliteProfiles };
|
|
43
61
|
//# sourceMappingURL=generic-sql-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generic-sql-adapter.d.ts","names":[],"sources":["../../../src/adapters/generic-sql/generic-sql-adapter.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generic-sql-adapter.d.ts","names":[],"sources":["../../../src/adapters/generic-sql/generic-sql-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;UAmCiB,gBAAA;oBACG;EADH,MAAA,CAAA,EAAA,OAAA;EAMA,eAAA,CAAA,EAHG,kBAGc;;AAElB,UAFC,iBAAA,CAED;EACF,OAAA,EAFH,OAEG;EACH,YAAA,EAFK,YAEL;EACO,SAAA,CAAA,EAFJ,gBAEI;EACI,MAAA,CAAA,EAFX,YAEW;EACH,aAAA,CAAA,EAFD,aAEC;EAAiB,iBAAA,CAAA,EADd,iBACc;EAGvB,cAAA,CAAA,EAHM,iBAMlB;;AAHkD,cAAtC,cAAsC,EAAtB,MAAsB,CAAf,aAAe,EAAA,iBAAA,CAAA;AAAtB,cAKhB,UAAA,YAAsB,eALN,CAKsB,gBALtB,CAAA,CAAA;EAAM,CAAA,OAAA;EAKtB,SAAA,OAAW,EACJ,OADI;EAA2B,SAAA,YAAA,EAE1B,YAF0B;EAC/B,SAAA,SAAA,CAAA,EAEG,gBAFH;EACK,SAAA,MAAA,CAAA,EAEL,YAFK;EACF,SAAA,iBAAA,CAAA,EAEQ,iBAFR;EACH,SAAA,aAAA,CAAA,EAEO,aAFP;EACW,SAAA,eAAA,EAEH,uBAFG;EACJ,SAAA,cAAA,EAEA,iBAFA;EACC,WAAA,CAAA;IAAA,OAAA;IAAA,YAAA;IAAA,SAAA;IAAA,MAAA;IAAA,aAAA;IAAA,iBAAA;IAAA;EAAA,CAAA,EAgBvB,iBAhBuB;EACD,IAAA,MAAA,CAAA,CAAA,EA8CX,gBA9CW;EAQvB,KA0CG,mCAAA,GA1CH,EAAA,MAAA;EACA,KA6CG,sCAAA,GA7CH,EAAA,MAAA;EACA,IAAA,cAAA,CAAA,CAAA,EAgDoB,qBAhDpB,CAgD0C,sBAhD1C,CAAA;EACA,KAAA,CAAA,CAAA,EAmDO,OAnDP,CAAA,IAAA,CAAA;EACA,mBAAA,CAAA,CAAA,EAsD2B,OAtD3B,CAAA,OAAA,CAAA;EACA,iBAAA,CAAA,UA2D0B,SA3D1B,CAAA,CAAA,MAAA,EA2D6C,CA3D7C,EAAA,SAAA,EAAA,MAAA,GAAA,IAAA,CAAA,EA2D2E,kBA3D3E;EACA,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAuEyC,OAvEzC,CAAA,MAAA,GAAA,SAAA,CAAA;EACC,iBAAA,CAAA,UAmGyB,SAnGzB,CAAA,CAAA,MAAA,EAoGO,CApGP,EAAA,SAAA,EAAA,MAAA,GAAA,IAAA,CAAA,EAsGA,oBAtGA,CAsGqB,CAtGrB,EAsGwB,gBAtGxB,CAAA"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { RequestContextStorage } from "../../packages/fragno/dist/api/request-context-storage.js";
|
|
2
2
|
import { fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
|
|
3
|
-
import { createTableNameMapper } from "../shared/table-name-mapper.js";
|
|
4
3
|
import { SqlDriverAdapter } from "../../sql-driver/sql-driver-adapter.js";
|
|
5
4
|
import { sql } from "../../sql-driver/sql.js";
|
|
5
|
+
import { sqliteStorageDefault, sqliteStoragePrisma } from "./sqlite-storage.js";
|
|
6
|
+
import { createSQLSerializer } from "../../query/serialize/create-sql-serializer.js";
|
|
7
|
+
import { createNamingResolver } from "../../naming/sql-naming.js";
|
|
6
8
|
import { createExecutor } from "./generic-sql-uow-executor.js";
|
|
7
9
|
import { UnitOfWorkDecoder } from "./uow-decoder.js";
|
|
8
10
|
import { createPreparedMigrations } from "./migration/prepared-migrations.js";
|
|
@@ -11,17 +13,37 @@ import { GenericSQLUOWOperationCompiler } from "./query/generic-sql-uow-operatio
|
|
|
11
13
|
import { fromUnitOfWorkCompiler } from "../shared/from-unit-of-work-compiler.js";
|
|
12
14
|
|
|
13
15
|
//#region src/adapters/generic-sql/generic-sql-adapter.ts
|
|
14
|
-
|
|
16
|
+
const sqliteProfiles = {
|
|
17
|
+
default: sqliteStorageDefault,
|
|
18
|
+
prisma: sqliteStoragePrisma
|
|
19
|
+
};
|
|
20
|
+
var SqlAdapter = class {
|
|
15
21
|
dialect;
|
|
16
22
|
driverConfig;
|
|
17
23
|
uowConfig;
|
|
24
|
+
outbox;
|
|
25
|
+
sqliteStorageMode;
|
|
26
|
+
sqliteProfile;
|
|
27
|
+
adapterMetadata;
|
|
28
|
+
namingStrategy;
|
|
18
29
|
#schemaNamespaceMap = /* @__PURE__ */ new WeakMap();
|
|
19
30
|
#contextStorage;
|
|
20
31
|
#driver;
|
|
21
|
-
constructor({ dialect, driverConfig, uowConfig }) {
|
|
32
|
+
constructor({ dialect, driverConfig, uowConfig, outbox, sqliteProfile, sqliteStorageMode, namingStrategy }) {
|
|
22
33
|
this.dialect = dialect;
|
|
23
34
|
this.driverConfig = driverConfig;
|
|
24
35
|
this.uowConfig = uowConfig;
|
|
36
|
+
this.outbox = outbox;
|
|
37
|
+
this.namingStrategy = namingStrategy ?? driverConfig.defaultNamingStrategy;
|
|
38
|
+
const resolvedProfile = sqliteProfile ?? "default";
|
|
39
|
+
if (sqliteStorageMode && sqliteProfile) throw new Error("sqliteStorageMode cannot be used together with sqliteProfile.");
|
|
40
|
+
this.sqliteStorageMode = driverConfig.databaseType === "sqlite" ? sqliteStorageMode ?? sqliteProfiles[resolvedProfile] : void 0;
|
|
41
|
+
this.sqliteProfile = driverConfig.databaseType === "sqlite" && !sqliteStorageMode ? resolvedProfile : void 0;
|
|
42
|
+
this.adapterMetadata = {
|
|
43
|
+
databaseType: driverConfig.databaseType,
|
|
44
|
+
sqliteProfile: this.sqliteProfile,
|
|
45
|
+
sqliteStorageMode: this.sqliteStorageMode
|
|
46
|
+
};
|
|
25
47
|
this.#schemaNamespaceMap = /* @__PURE__ */ new WeakMap();
|
|
26
48
|
this.#contextStorage = new RequestContextStorage();
|
|
27
49
|
this.#driver = new SqlDriverAdapter(dialect);
|
|
@@ -30,10 +52,10 @@ var GenericSQLAdapter = class {
|
|
|
30
52
|
return this.#driver;
|
|
31
53
|
}
|
|
32
54
|
get [fragnoDatabaseAdapterNameFakeSymbol]() {
|
|
33
|
-
return "
|
|
55
|
+
return "sql";
|
|
34
56
|
}
|
|
35
57
|
get [fragnoDatabaseAdapterVersionFakeSymbol]() {
|
|
36
|
-
return
|
|
58
|
+
return 1;
|
|
37
59
|
}
|
|
38
60
|
get contextStorage() {
|
|
39
61
|
return this.#contextStorage;
|
|
@@ -42,20 +64,21 @@ var GenericSQLAdapter = class {
|
|
|
42
64
|
return this.#driver.destroy();
|
|
43
65
|
}
|
|
44
66
|
async isConnectionHealthy() {
|
|
45
|
-
|
|
67
|
+
const healthyValue = (await this.#driver.executeQuery(sql`SELECT 1 as healthy`.compile(this.dialect))).rows[0]?.["healthy"];
|
|
68
|
+
return healthyValue === 1 || healthyValue === 1n || healthyValue === "1";
|
|
46
69
|
}
|
|
47
70
|
prepareMigrations(schema, namespace) {
|
|
71
|
+
const resolver = createNamingResolver(schema, namespace, this.namingStrategy);
|
|
48
72
|
return createPreparedMigrations({
|
|
49
73
|
schema,
|
|
50
|
-
namespace,
|
|
74
|
+
namespace: namespace ?? schema.name,
|
|
51
75
|
database: this.driverConfig.databaseType,
|
|
52
|
-
|
|
76
|
+
driverConfig: this.driverConfig,
|
|
77
|
+
sqliteStorageMode: this.sqliteStorageMode,
|
|
78
|
+
resolver,
|
|
53
79
|
driver: this.#driver
|
|
54
80
|
});
|
|
55
81
|
}
|
|
56
|
-
createTableNameMapper(namespace) {
|
|
57
|
-
return createTableNameMapper(namespace, false);
|
|
58
|
-
}
|
|
59
82
|
async getSchemaVersion(namespace) {
|
|
60
83
|
const query = sql`SELECT value FROM fragno_db_settings WHERE key = ${`${namespace}.schema_version`};`.compile(this.dialect);
|
|
61
84
|
let result;
|
|
@@ -72,16 +95,32 @@ var GenericSQLAdapter = class {
|
|
|
72
95
|
}
|
|
73
96
|
createQueryEngine(schema, namespace) {
|
|
74
97
|
this.#schemaNamespaceMap.set(schema, namespace);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
98
|
+
const resolver = createNamingResolver(schema, namespace, this.namingStrategy);
|
|
99
|
+
const queryEngine = fromUnitOfWorkCompiler(schema, {
|
|
100
|
+
compiler: createUOWCompilerFromOperationCompiler(new GenericSQLUOWOperationCompiler(this.driverConfig, this.sqliteStorageMode, (schemaForResolver, namespaceForResolver) => createNamingResolver(schemaForResolver, namespaceForResolver, this.namingStrategy))),
|
|
101
|
+
executor: createExecutor(this.#driver, this.driverConfig, {
|
|
102
|
+
dialect: this.dialect,
|
|
103
|
+
dryRun: false,
|
|
104
|
+
outbox: this.outbox,
|
|
105
|
+
namingStrategy: this.namingStrategy
|
|
106
|
+
}),
|
|
107
|
+
decoder: new UnitOfWorkDecoder(this.driverConfig, this.sqliteStorageMode, resolver),
|
|
79
108
|
uowConfig: this.uowConfig,
|
|
80
109
|
schemaNamespaceMap: this.#schemaNamespaceMap
|
|
81
110
|
});
|
|
111
|
+
const serializer = createSQLSerializer(this.driverConfig, this.sqliteStorageMode);
|
|
112
|
+
const timestampColumn = { type: "timestamp" };
|
|
113
|
+
return {
|
|
114
|
+
...queryEngine,
|
|
115
|
+
now: async () => {
|
|
116
|
+
const rawValue = (await this.#driver.executeQuery(sql`SELECT CURRENT_TIMESTAMP as now`.compile(this.dialect))).rows[0]?.["now"];
|
|
117
|
+
if (rawValue === void 0 || rawValue === null) throw new Error("Failed to fetch database time");
|
|
118
|
+
return serializer.deserialize(rawValue, timestampColumn);
|
|
119
|
+
}
|
|
120
|
+
};
|
|
82
121
|
}
|
|
83
122
|
};
|
|
84
123
|
|
|
85
124
|
//#endregion
|
|
86
|
-
export {
|
|
125
|
+
export { SqlAdapter, sqliteProfiles };
|
|
87
126
|
//# sourceMappingURL=generic-sql-adapter.js.map
|