@fragno-dev/db 0.2.1 → 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 +206 -140
- package/CHANGELOG.md +67 -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 +38 -28
- 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 +45 -96
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +121 -99
- 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 +172 -9
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +193 -74
- 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 +47 -4
- package/dist/hooks/hooks.d.ts.map +1 -1
- package/dist/hooks/hooks.js +106 -39
- 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 +17 -10
- 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 +351 -100
- 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 +440 -267
- 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 +67 -22
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.js +110 -13
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
- package/dist/query/value-decoding.js +8 -5
- 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 +40 -14
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +82 -42
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/generate-id.d.ts +20 -0
- package/dist/schema/generate-id.d.ts.map +1 -0
- package/dist/schema/generate-id.js +28 -0
- package/dist/schema/generate-id.js.map +1 -0
- 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} +49 -35
- package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +48 -32
- 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 +88 -54
- package/src/db-fragment-definition-builder.ts +201 -322
- package/src/db-fragment-instantiator.test.ts +169 -101
- package/src/db-fragment-integration.test.ts +301 -149
- 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 +730 -274
- package/src/fragments/internal-fragment.ts +447 -154
- 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 +411 -259
- package/src/hooks/hooks.ts +265 -66
- 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 +78 -30
- 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 +1512 -1458
- package/src/query/unit-of-work/execute-unit-of-work.ts +1708 -596
- package/src/query/unit-of-work/tx-builder.test.ts +1041 -0
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +32 -32
- 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 +231 -36
- package/src/query/unit-of-work/unit-of-work.ts +229 -31
- 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 +187 -47
- package/src/schema/generate-id.test.ts +57 -0
- package/src/schema/generate-id.ts +38 -0
- 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/src/shared/config.ts +0 -10
- package/src/shared/connection-pool.ts +0 -24
- package/src/shared/prisma.ts +0 -45
package/src/with-database.ts
CHANGED
|
@@ -14,7 +14,17 @@ import {
|
|
|
14
14
|
type DatabaseRequestStorage,
|
|
15
15
|
} from "./db-fragment-definition-builder";
|
|
16
16
|
import { internalFragmentDef, type InternalFragmentInstance } from "./fragments/internal-fragment";
|
|
17
|
+
import { internalFragmentRoutes } from "./fragments/internal-fragment.routes";
|
|
17
18
|
import type { HooksMap } from "./hooks/hooks";
|
|
19
|
+
import { resolveDatabaseAdapter } from "./util/default-database-adapter";
|
|
20
|
+
|
|
21
|
+
function shouldExposeOutboxRoutes(
|
|
22
|
+
options: FragnoPublicConfigWithDatabase,
|
|
23
|
+
schema: AnySchema,
|
|
24
|
+
): boolean {
|
|
25
|
+
const adapter = resolveDatabaseAdapter(options, schema) as { outbox?: { enabled?: boolean } };
|
|
26
|
+
return adapter.outbox?.enabled ?? false;
|
|
27
|
+
}
|
|
18
28
|
|
|
19
29
|
/**
|
|
20
30
|
* Helper to add database support to a fragment builder.
|
|
@@ -36,7 +46,6 @@ import type { HooksMap } from "./hooks/hooks";
|
|
|
36
46
|
*/
|
|
37
47
|
export function withDatabase<TSchema extends AnySchema>(
|
|
38
48
|
schema: TSchema,
|
|
39
|
-
namespace?: string,
|
|
40
49
|
): <
|
|
41
50
|
TConfig,
|
|
42
51
|
TDeps,
|
|
@@ -104,11 +113,22 @@ export function withDatabase<TSchema extends AnySchema>(
|
|
|
104
113
|
const builderWithInternal = builder.withLinkedFragment(
|
|
105
114
|
"_fragno_internal",
|
|
106
115
|
({ config, options }) => {
|
|
116
|
+
const internalRoutes = shouldExposeOutboxRoutes(
|
|
117
|
+
options as FragnoPublicConfigWithDatabase,
|
|
118
|
+
schema,
|
|
119
|
+
)
|
|
120
|
+
? [internalFragmentRoutes]
|
|
121
|
+
: [];
|
|
122
|
+
|
|
107
123
|
// Cast is safe: by the time this callback is invoked during fragment instantiation,
|
|
108
124
|
// the options will be FragnoPublicConfigWithDatabase (enforced by DatabaseFragmentDefinitionBuilder)
|
|
109
125
|
return instantiate(internalFragmentDef)
|
|
110
126
|
.withConfig(config as {})
|
|
111
|
-
.withOptions(
|
|
127
|
+
.withOptions({
|
|
128
|
+
...(options as FragnoPublicConfigWithDatabase),
|
|
129
|
+
databaseNamespace: null,
|
|
130
|
+
})
|
|
131
|
+
.withRoutes(internalRoutes)
|
|
112
132
|
.build();
|
|
113
133
|
},
|
|
114
134
|
);
|
|
@@ -146,7 +166,6 @@ export function withDatabase<TSchema extends AnySchema>(
|
|
|
146
166
|
TLinkedFragments & { _fragno_internal: InternalFragmentInstance }
|
|
147
167
|
>,
|
|
148
168
|
schema,
|
|
149
|
-
namespace,
|
|
150
169
|
);
|
|
151
170
|
};
|
|
152
171
|
}
|
package/tsdown.config.ts
CHANGED
|
@@ -7,11 +7,11 @@ export default defineConfig({
|
|
|
7
7
|
"./src/schema/create.ts",
|
|
8
8
|
"./src/query/simple-query-interface.ts",
|
|
9
9
|
"./src/adapters/adapters.ts",
|
|
10
|
-
"./src/adapters/
|
|
11
|
-
"./src/adapters/
|
|
12
|
-
"./src/adapters/drizzle/generate.ts",
|
|
13
|
-
"./src/adapters/generic-sql/generic-sql-adapter.ts",
|
|
10
|
+
"./src/adapters/in-memory/index.ts",
|
|
11
|
+
"./src/adapters/sql/index.ts",
|
|
14
12
|
"./src/adapters/generic-sql/driver-config.ts",
|
|
13
|
+
"./src/schema-output/drizzle.ts",
|
|
14
|
+
"./src/schema-output/prisma.ts",
|
|
15
15
|
"./src/sql-driver/sql-driver.ts",
|
|
16
16
|
"./src/sql-driver/dialects/dialects.ts",
|
|
17
17
|
"./src/sql-driver/dialects/durable-object-dialect.ts",
|
|
@@ -19,6 +19,8 @@ export default defineConfig({
|
|
|
19
19
|
"./src/query/cursor.ts",
|
|
20
20
|
"./src/fragment.ts",
|
|
21
21
|
"./src/db-fragment-definition-builder.ts",
|
|
22
|
+
"./src/dispatchers/node/index.ts",
|
|
23
|
+
"./src/dispatchers/cloudflare-do/index.ts",
|
|
22
24
|
"./src/migration-engine/generation-engine.ts",
|
|
23
25
|
],
|
|
24
26
|
dts: true,
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { AnySchema } from "../../schema/create.js";
|
|
2
|
-
import { SchemaGenerator } from "../../schema-generator/schema-generator.js";
|
|
3
|
-
import { TableNameMapper } from "../shared/table-name-mapper.js";
|
|
4
|
-
import { DatabaseAdapter } from "../adapters.js";
|
|
5
|
-
import { GenericSQLAdapter, GenericSQLOptions, UnitOfWorkConfig } from "../generic-sql/generic-sql-adapter.js";
|
|
6
|
-
|
|
7
|
-
//#region src/adapters/drizzle/drizzle-adapter.d.ts
|
|
8
|
-
declare class DrizzleAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
|
|
9
|
-
constructor(options: GenericSQLOptions);
|
|
10
|
-
createTableNameMapper(namespace: string): TableNameMapper;
|
|
11
|
-
createSchemaGenerator(fragments: {
|
|
12
|
-
schema: AnySchema;
|
|
13
|
-
namespace: string;
|
|
14
|
-
}[], options?: {
|
|
15
|
-
path?: string;
|
|
16
|
-
}): SchemaGenerator;
|
|
17
|
-
}
|
|
18
|
-
//#endregion
|
|
19
|
-
export { DrizzleAdapter };
|
|
20
|
-
//# sourceMappingURL=drizzle-adapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"drizzle-adapter.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;cAYa,cAAA,SAAuB,iBAAA,YAA6B,gBAAgB;uBAC1D;4CAAiB;EAD3B,qBAAe,CAAA,SAAA,EAAA;IAAqD,MAAA,EAUxD,SAVwD;IAC1D,SAAA,EAAA,MAAA;EAAiB,CAAA,EAAA,EAAA,OAWnC,CAXmC,EAAA;IASf,IAAA,CAAA,EAAA,MAAA;EAEpB,CAAA,CAAA,EAAA,eAAA"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import "../../schema/create.js";
|
|
2
|
-
import { createTableNameMapper } from "../shared/table-name-mapper.js";
|
|
3
|
-
import { generateSchema } from "./generate.js";
|
|
4
|
-
import { GenericSQLAdapter } from "../generic-sql/generic-sql-adapter.js";
|
|
5
|
-
|
|
6
|
-
//#region src/adapters/drizzle/drizzle-adapter.ts
|
|
7
|
-
var DrizzleAdapter = class extends GenericSQLAdapter {
|
|
8
|
-
constructor(options) {
|
|
9
|
-
super(options);
|
|
10
|
-
}
|
|
11
|
-
createTableNameMapper(namespace) {
|
|
12
|
-
return createTableNameMapper(namespace, false);
|
|
13
|
-
}
|
|
14
|
-
createSchemaGenerator(fragments, options) {
|
|
15
|
-
return { generateSchema: (genOptions) => {
|
|
16
|
-
const path = genOptions?.path ?? options?.path ?? "fragno-schema.ts";
|
|
17
|
-
return {
|
|
18
|
-
schema: generateSchema(fragments, this.driverConfig.databaseType, { mapperFactory: (ns) => ns ? this.createTableNameMapper(ns) : void 0 }),
|
|
19
|
-
path
|
|
20
|
-
};
|
|
21
|
-
} };
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
//#endregion
|
|
26
|
-
export { DrizzleAdapter };
|
|
27
|
-
//# sourceMappingURL=drizzle-adapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"drizzle-adapter.js","names":[],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":["import type { DatabaseAdapter } from \"../adapters\";\nimport { type AnySchema } from \"../../schema/create\";\nimport type { SchemaGenerator } from \"../../schema-generator/schema-generator\";\nimport { generateSchema } from \"./generate\";\nimport { createTableNameMapper } from \"../shared/table-name-mapper\";\n\nimport {\n GenericSQLAdapter,\n type GenericSQLOptions,\n type UnitOfWorkConfig,\n} from \"../generic-sql/generic-sql-adapter\";\n\nexport class DrizzleAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {\n constructor(options: GenericSQLOptions) {\n super(options);\n }\n\n override createTableNameMapper(namespace: string) {\n return createTableNameMapper(namespace, false);\n }\n\n createSchemaGenerator(\n fragments: { schema: AnySchema; namespace: string }[],\n options?: { path?: string },\n ): SchemaGenerator {\n return {\n generateSchema: (genOptions) => {\n const path = genOptions?.path ?? options?.path ?? \"fragno-schema.ts\";\n\n return {\n schema: generateSchema(fragments, this.driverConfig.databaseType, {\n mapperFactory: (ns) => (ns ? this.createTableNameMapper(ns) : undefined),\n }),\n path,\n };\n },\n };\n }\n}\n"],"mappings":";;;;;;AAYA,IAAa,iBAAb,cAAoC,kBAA+D;CACjG,YAAY,SAA4B;AACtC,QAAM,QAAQ;;CAGhB,AAAS,sBAAsB,WAAmB;AAChD,SAAO,sBAAsB,WAAW,MAAM;;CAGhD,sBACE,WACA,SACiB;AACjB,SAAO,EACL,iBAAiB,eAAe;GAC9B,MAAM,OAAO,YAAY,QAAQ,SAAS,QAAQ;AAElD,UAAO;IACL,QAAQ,eAAe,WAAW,KAAK,aAAa,cAAc,EAChE,gBAAgB,OAAQ,KAAK,KAAK,sBAAsB,GAAG,GAAG,QAC/D,CAAC;IACF;IACD;KAEJ"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { AnySchema } from "../../schema/create.js";
|
|
2
|
-
import { TableNameMapper } from "../shared/table-name-mapper.js";
|
|
3
|
-
import { SQLProvider } from "../../shared/providers.js";
|
|
4
|
-
|
|
5
|
-
//#region src/adapters/drizzle/generate.d.ts
|
|
6
|
-
type SupportedProvider = Exclude<SQLProvider, "cockroachdb" | "mssql">;
|
|
7
|
-
interface GenerateSchemaOptions {
|
|
8
|
-
/** Custom ID generator import configuration */
|
|
9
|
-
idGeneratorImport?: {
|
|
10
|
-
/** Function name to import */
|
|
11
|
-
name: string;
|
|
12
|
-
/** Module to import from */
|
|
13
|
-
from: string;
|
|
14
|
-
};
|
|
15
|
-
/** Optional mapper factory for creating table name mappers with custom sanitization */
|
|
16
|
-
mapperFactory?: (namespace: string | undefined) => TableNameMapper | undefined;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Generate a settings table for storing fragment versions
|
|
20
|
-
*/
|
|
21
|
-
/**
|
|
22
|
-
* Generate a schema file from one or more fragments with automatic de-duplication
|
|
23
|
-
*/
|
|
24
|
-
declare function generateSchema(fragments: {
|
|
25
|
-
namespace: string;
|
|
26
|
-
schema: AnySchema;
|
|
27
|
-
}[], provider: SupportedProvider, options?: GenerateSchemaOptions): string;
|
|
28
|
-
//#endregion
|
|
29
|
-
export { GenerateSchemaOptions, SupportedProvider, generateSchema };
|
|
30
|
-
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","names":[],"sources":["../../../src/adapters/drizzle/generate.ts"],"sourcesContent":[],"mappings":";;;;;KAkCY,iBAAA,GAAoB,QAAQ;UAulBvB,qBAAA;EAvlBL;EAulBK,iBAAA,CAAA,EAAA;IAkBD;IAC0B,IAAA,EAAA,MAAA;IAC9B;IACA,IAAA,EAAA,MAAA;EAAqB,CAAA;;qDAZoB;;;;;;;;iBASrC,cAAA;;UAC0B;eAC9B,6BACA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","names":["parts: string[]","params: string[]","value: string","keys: string[]","columns: string[]","foreignColumns: string[]","indexes: string[]","args: string[]","relations: string[]","options: string[]","fields: string[]","references: string[]","drizzleEntries: string[]","customTypes: string[]","sections: string[]","fragmentTables: string[]"],"sources":["../../../src/adapters/drizzle/generate.ts"],"sourcesContent":["import { importGenerator } from \"../../util/import-generator\";\nimport { ident, parseVarchar } from \"../../util/parse\";\nimport {\n type AnyColumn,\n type AnySchema,\n type AnyTable,\n type Relation,\n InternalIdColumn,\n} from \"../../schema/create\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport {\n createTableNameMapper,\n sanitizeNamespace,\n type TableNameMapper,\n} from \"../shared/table-name-mapper\";\nimport { type DatabaseTypeLiteral } from \"../../schema/type-conversion/type-mapping\";\nimport { createSQLTypeMapper } from \"../../schema/type-conversion/create-sql-type-mapper\";\n\n// ============================================================================\n// PROVIDER CONFIGURATION\n// ============================================================================\n\nconst PROVIDER_IMPORTS = {\n mysql: \"drizzle-orm/mysql-core\",\n postgresql: \"drizzle-orm/pg-core\",\n sqlite: \"drizzle-orm/sqlite-core\",\n} as const;\n\nconst PROVIDER_TABLE_FUNCTIONS = {\n mysql: \"mysqlTable\",\n postgresql: \"pgTable\",\n sqlite: \"sqliteTable\",\n} as const;\n\nexport type SupportedProvider = Exclude<SQLProvider, \"cockroachdb\" | \"mssql\">;\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\ninterface GeneratorContext {\n provider: SupportedProvider;\n imports: ReturnType<typeof importGenerator>;\n importSource: string;\n generatedCustomTypes: Set<string>;\n idGeneratorImport?: { name: string; from: string };\n}\n\nfunction createContext(\n provider: SupportedProvider,\n idGeneratorImport?: { name: string; from: string },\n): GeneratorContext {\n return {\n provider,\n imports: importGenerator(),\n importSource: PROVIDER_IMPORTS[provider],\n generatedCustomTypes: new Set<string>(),\n idGeneratorImport,\n };\n}\n\n// ============================================================================\n// CUSTOM TYPE GENERATION\n// ============================================================================\n\ninterface CustomTypeOptions {\n dataType: string;\n driverDataType: string;\n databaseDataType: string;\n fromDriverCode: string;\n toDriverCode: string;\n}\n\nfunction generateCustomType(\n ctx: GeneratorContext,\n name: string,\n options: CustomTypeOptions,\n): string | undefined {\n if (ctx.generatedCustomTypes.has(name)) {\n return undefined;\n }\n\n ctx.imports.addImport(\"customType\", ctx.importSource);\n ctx.generatedCustomTypes.add(name);\n\n return `const ${name} = customType<\n {\n data: ${options.dataType};\n driverData: ${options.driverDataType};\n }\n>({\n dataType() {\n return \"${options.databaseDataType}\";\n },\n fromDriver(value) {\n ${options.fromDriverCode}\n },\n toDriver(value) {\n ${options.toDriverCode}\n }\n});`;\n}\n\nfunction generateBinaryCustomType(ctx: GeneratorContext, customTypes: string[]): string {\n const name = \"customBinary\";\n const typeMapper = createSQLTypeMapper(ctx.provider);\n const code = generateCustomType(ctx, name, {\n dataType: \"Uint8Array\",\n driverDataType: \"Buffer\",\n databaseDataType: typeMapper.getDatabaseType({ type: \"binary\" }),\n fromDriverCode: \"return new Uint8Array(value.buffer, value.byteOffset, value.byteLength)\",\n toDriverCode: `return value instanceof Buffer? value : Buffer.from(value)`,\n });\n\n if (code) {\n customTypes.push(code);\n }\n return name;\n}\n\n// ============================================================================\n// COLUMN TYPE MAPPING\n// ============================================================================\n\ninterface ColumnTypeFunction {\n name: string;\n isCustomType?: boolean;\n params?: string[];\n}\n\n/**\n * Maps SQL database types to Drizzle function names and parameters.\n * Uses SQLTypeMapper as the source of truth for type conversion.\n */\nfunction getColumnTypeFunction(\n ctx: GeneratorContext,\n column: AnyColumn,\n customTypes: string[],\n): ColumnTypeFunction {\n // Get the canonical database type from type mapper\n const typeMapper = createSQLTypeMapper(ctx.provider);\n const dbType = typeMapper.getDatabaseType(column);\n\n // Map database types to Drizzle function names\n return mapDBTypeToDrizzleFunction(ctx, dbType, column, customTypes);\n}\n\n/**\n * Maps a database type string to a Drizzle function name and parameters.\n */\nfunction mapDBTypeToDrizzleFunction(\n ctx: GeneratorContext,\n dbType: DatabaseTypeLiteral,\n column: AnyColumn,\n customTypes: string[],\n): ColumnTypeFunction {\n // Handle provider-specific types\n if (ctx.provider === \"postgresql\") {\n switch (dbType) {\n case \"bigserial\":\n // bigserial requires a mode parameter in Drizzle\n return { name: \"bigserial\", params: [`{ mode: \"number\" }`] };\n case \"serial\":\n return { name: \"serial\" };\n case \"boolean\":\n return { name: \"boolean\" };\n case \"bytea\":\n return { name: generateBinaryCustomType(ctx, customTypes), isCustomType: true };\n case \"json\":\n return { name: \"json\" };\n case \"text\":\n return { name: \"text\" };\n case \"bigint\":\n return { name: \"bigint\", params: [`{ mode: \"number\" }`] };\n default:\n if (dbType.startsWith(\"varchar(\")) {\n const length = parseVarchar(dbType);\n return { name: \"varchar\", params: [`{ length: ${length} }`] };\n }\n return { name: dbType };\n }\n }\n\n if (ctx.provider === \"mysql\") {\n switch (dbType) {\n case \"boolean\":\n return { name: \"boolean\" };\n case \"text\":\n return { name: \"text\" };\n case \"longblob\":\n return { name: generateBinaryCustomType(ctx, customTypes), isCustomType: true };\n case \"bigint\":\n // MySQL bigint requires mode parameter\n return { name: \"bigint\", params: [`{ mode: \"number\" }`] };\n case \"integer\":\n // MySQL uses \"int\" not \"integer\" in Drizzle ORM\n return { name: \"int\" };\n default:\n if (dbType.startsWith(\"varchar(\")) {\n const length = parseVarchar(dbType);\n return { name: \"varchar\", params: [`{ length: ${length} }`] };\n }\n return { name: dbType };\n }\n }\n\n if (ctx.provider === \"sqlite\") {\n switch (dbType) {\n case \"integer\":\n // Need to determine the mode based on the original column type\n if (column.type === \"bool\") {\n return { name: \"integer\", params: [`{ mode: \"boolean\" }`] };\n }\n if (column.type === \"timestamp\" || column.type === \"date\") {\n return { name: \"integer\", params: [`{ mode: \"timestamp\" }`] };\n }\n return { name: \"integer\" };\n case \"blob\":\n // Need to determine the mode based on the original column type\n if (column.type === \"bigint\") {\n return { name: \"blob\", params: [`{ mode: \"bigint\" }`] };\n }\n return { name: generateBinaryCustomType(ctx, customTypes), isCustomType: true };\n case \"text\":\n // Check if it's JSON\n if (column.type === \"json\") {\n return { name: \"blob\", params: [`{ mode: \"json\" }`] };\n }\n return { name: \"text\" };\n case \"real\":\n return { name: \"real\" };\n default:\n return { name: dbType };\n }\n }\n\n // Fallback for other providers\n return { name: dbType };\n}\n\n// ============================================================================\n// TABLE NAME HELPERS\n// ============================================================================\n\n/**\n * Get the physical table name (with namespace suffix) using the mapper if available\n */\nfunction getPhysicalTableName(\n logicalName: string,\n namespace: string | undefined,\n mapper: TableNameMapper | undefined,\n): string {\n if (!namespace) {\n return logicalName;\n }\n return mapper ? mapper.toPhysical(logicalName) : `${logicalName}_${sanitizeNamespace(namespace)}`;\n}\n\n// ============================================================================\n// COLUMN GENERATION\n// ============================================================================\n\nfunction generateColumnDefinition(\n ctx: GeneratorContext,\n column: AnyColumn,\n customTypes: string[],\n): string {\n const parts: string[] = [];\n const typeFn = getColumnTypeFunction(ctx, column, customTypes);\n\n // Column type with parameters\n const params: string[] = [`\"${column.name}\"`, ...(typeFn.params ?? [])];\n if (!typeFn.isCustomType) {\n ctx.imports.addImport(typeFn.name, ctx.importSource);\n }\n parts.push(`${typeFn.name}(${params.join(\", \")})`);\n\n // Primary key for internal ID\n if (column instanceof InternalIdColumn || column.role === \"internal-id\") {\n if (ctx.provider === \"sqlite\") {\n // SQLite uses primaryKey({ autoIncrement: true })\n parts.push(\"primaryKey({ autoIncrement: true })\");\n } else if (ctx.provider === \"mysql\") {\n // MySQL uses primaryKey().autoincrement()\n parts.push(\"primaryKey()\");\n parts.push(\"autoincrement()\");\n } else {\n // PostgreSQL just uses primaryKey()\n parts.push(\"primaryKey()\");\n }\n }\n\n // Nullability\n if (!column.isNullable) {\n parts.push(\"notNull()\");\n }\n\n // Default values\n if (column.default) {\n if (\"value\" in column.default) {\n // Static defaults: defaultTo(value)\n let value: string;\n if (typeof column.default.value === \"bigint\") {\n ctx.imports.addImport(\"sql\", \"drizzle-orm\");\n value = `sql\\`${column.default.value.toString()}\\``;\n } else {\n value = JSON.stringify(column.default.value);\n }\n parts.push(`default(${value})`);\n } else if (\"dbSpecial\" in column.default) {\n // Database-level special functions: defaultTo(b => b.now())\n if (column.default.dbSpecial === \"now\") {\n parts.push(\"defaultNow()\");\n }\n } else if (\"runtime\" in column.default) {\n // Runtime defaults: defaultTo$()\n if (column.default.runtime === \"cuid\") {\n const idGen = ctx.idGeneratorImport ?? { name: \"createId\", from: \"@fragno-dev/db/id\" };\n ctx.imports.addImport(idGen.name, idGen.from);\n parts.push(`$defaultFn(() => ${idGen.name}())`);\n } else if (column.default.runtime === \"now\") {\n // Runtime-generated timestamp (not database-level)\n parts.push(\"$defaultFn(() => new Date())\");\n }\n // Note: Custom functions in defaultTo$(() => ...) are not supported in schema generation\n }\n }\n\n return ` ${column.ormName}: ${parts.join(\".\")}`;\n}\n\nfunction generateAllColumns(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n): string[] {\n return Object.values(table.columns).map((column) =>\n generateColumnDefinition(ctx, column, customTypes),\n );\n}\n\n// ============================================================================\n// CONSTRAINT GENERATION\n// ============================================================================\n\nfunction generateForeignKeys(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string,\n mapper?: TableNameMapper,\n): string[] {\n const keys: string[] = [];\n\n for (const relation of Object.values(table.relations)) {\n // Only \"one\" relations generate foreign keys\n // \"many\" relations don't have foreign keys (they're on the other side)\n if (relation.type === \"many\") {\n continue;\n }\n\n const columns: string[] = [];\n const foreignColumns: string[] = [];\n const isSelfReference = relation.table.ormName === table.ormName;\n\n for (const [localCol, refCol] of relation.on) {\n columns.push(`table.${localCol}`);\n // Foreign keys always reference internal IDs\n const actualRefCol = refCol === \"id\" ? \"_internalId\" : refCol;\n // For self-referencing foreign keys, use table parameter instead of table constant\n if (isSelfReference) {\n foreignColumns.push(`table.${actualRefCol}`);\n } else {\n // Use sanitized TypeScript export name for identifier reference\n const foreignTableRef = namespace\n ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`\n : relation.table.ormName;\n foreignColumns.push(`${foreignTableRef}.${actualRefCol}`);\n }\n }\n\n ctx.imports.addImport(\"foreignKey\", ctx.importSource);\n // Include namespace in FK name to avoid collisions\n const fkName =\n namespace && mapper\n ? \"fk_\" + mapper.toPhysical(`${table.ormName}_${relation.table.ormName}_${relation.name}`)\n : `${table.ormName}_${relation.table.ormName}_${relation.name}_fk`;\n\n keys.push(`foreignKey({\n columns: [${columns.join(\", \")}],\n foreignColumns: [${foreignColumns.join(\", \")}],\n name: \"${fkName}\"\n})`);\n }\n\n return keys;\n}\n\nfunction generateIndexes(ctx: GeneratorContext, table: AnyTable, namespace?: string): string[] {\n const indexes: string[] = [];\n\n for (const idx of Object.values(table.indexes)) {\n const columns = idx.columns.map((col) => `table.${col.ormName}`).join(\", \");\n\n // Include namespace in index name to avoid collisions\n const indexName = namespace ? `${idx.name}_${namespace}` : idx.name;\n\n if (idx.unique) {\n ctx.imports.addImport(\"uniqueIndex\", ctx.importSource);\n indexes.push(`uniqueIndex(\"${indexName}\").on(${columns})`);\n } else {\n ctx.imports.addImport(\"index\", ctx.importSource);\n indexes.push(`index(\"${indexName}\").on(${columns})`);\n }\n }\n\n return indexes;\n}\n\nfunction generateTableConstraints(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string,\n mapper?: TableNameMapper,\n): string[] {\n return [\n ...generateForeignKeys(ctx, table, namespace, mapper),\n ...generateIndexes(ctx, table, namespace),\n ];\n}\n\n// ============================================================================\n// TABLE GENERATION\n// ============================================================================\n\nfunction generateTable(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n namespace?: string,\n mapper?: TableNameMapper,\n): string {\n const tableFn = PROVIDER_TABLE_FUNCTIONS[ctx.provider];\n ctx.imports.addImport(tableFn, ctx.importSource);\n\n const columns = generateAllColumns(ctx, table, customTypes);\n const constraints = generateTableConstraints(ctx, table, namespace, mapper);\n\n // Physical table name in the database (respects mapper configuration)\n const physicalTableName = getPhysicalTableName(table.ormName, namespace, mapper);\n // TypeScript export name must always be sanitized to be a valid JavaScript identifier\n const exportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;\n\n const args: string[] = [`\"${physicalTableName}\"`, `{\\n${columns.join(\",\\n\")}\\n}`];\n\n if (constraints.length > 0) {\n args.push(`(table) => [\\n${ident(constraints.join(\",\\n\"))}\\n]`);\n }\n\n return `export const ${exportName} = ${tableFn}(${args.join(\", \")})`;\n}\n\n// ============================================================================\n// RELATION GENERATION\n// ============================================================================\n\nfunction generateRelation(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string,\n inverseRelations?: Array<{ fromTable: AnyTable; relation: Relation }>,\n _mapper?: TableNameMapper,\n): string | undefined {\n const relations: string[] = [];\n let hasOne = false;\n let hasMany = false;\n\n // Generate explicit relations defined on this table\n for (const relation of Object.values(table.relations)) {\n const options: string[] = [`relationName: \"${relation.id}\"`];\n\n // Track which relation types are used\n if (relation.type === \"one\") {\n hasOne = true;\n } else if (relation.type === \"many\") {\n hasMany = true;\n }\n\n // For \"one\" relations, specify fields and references\n if (relation.type === \"one\") {\n const fields: string[] = [];\n const references: string[] = [];\n\n // Use sanitized TypeScript export names for identifier references\n const tableRef = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}`\n : table.ormName;\n const relatedTableRef = namespace\n ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`\n : relation.table.ormName;\n\n for (const [left, right] of relation.on) {\n fields.push(`${tableRef}.${left}`);\n // Relations reference internal IDs\n const actualRight = right === \"id\" ? \"_internalId\" : right;\n references.push(`${relatedTableRef}.${actualRight}`);\n }\n\n options.push(`fields: [${fields.join(\", \")}]`, `references: [${references.join(\", \")}]`);\n }\n\n const relatedTableRef = namespace\n ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`\n : relation.table.ormName;\n\n const args: string[] = [relatedTableRef];\n if (options.length > 0) {\n args.push(`{\\n${ident(options.join(\",\\n\"))}\\n}`);\n }\n\n relations.push(ident(`${relation.name}: ${relation.type}(${args.join(\", \")})`));\n }\n\n // Generate inverse relations for tables that reference this table\n // Drizzle requires both sides of a relation to be defined\n if (inverseRelations && inverseRelations.length > 0) {\n for (const { fromTable, relation } of inverseRelations) {\n // Only generate inverse for \"one\" relations (they become \"many\" on this side)\n if (relation.type === \"one\") {\n hasMany = true;\n\n // Use sanitized TypeScript export name for identifier reference\n const fromTableRef = namespace\n ? `${fromTable.ormName}_${sanitizeNamespace(namespace)}`\n : fromTable.ormName;\n\n // Generate inverse relation name with consistent suffix\n // e.g., if session has \"sessionOwner\" relation to user, user gets \"sessionList\" inverse relation\n const inverseRelationName = `${fromTable.ormName}List`;\n\n const options: string[] = [`relationName: \"${relation.id}\"`];\n const args: string[] = [fromTableRef, `{\\n${ident(options.join(\",\\n\"))}\\n}`];\n\n relations.push(ident(`${inverseRelationName}: many(${args.join(\", \")})`));\n }\n }\n }\n\n if (relations.length === 0) {\n return undefined;\n }\n\n // Only include the relation types that are actually used\n const params: string[] = [];\n if (hasOne) {\n params.push(\"one\");\n }\n if (hasMany) {\n params.push(\"many\");\n }\n const relationParams = params.length > 0 ? `{ ${params.join(\", \")} }` : \"{}\";\n\n // Use sanitized names for TypeScript export identifiers\n const exportTableRef = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}`\n : table.ormName;\n const relationsName = namespace ? `${exportTableRef}Relations` : `${table.ormName}Relations`;\n\n ctx.imports.addImport(\"relations\", \"drizzle-orm\");\n return `export const ${relationsName} = relations(${exportTableRef}, (${relationParams}) => ({\n${relations.join(\",\\n\")}\n}));`;\n}\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\n/**\n * Generate a schema export object for a fragment\n * This groups all tables by their logical names for easier access\n */\nfunction generateFragmentSchemaExport(\n schema: AnySchema,\n namespace: string,\n tablesWithRelations?: Set<string>,\n _mapper?: TableNameMapper,\n): string {\n const drizzleEntries: string[] = [];\n\n for (const table of Object.values(schema.tables)) {\n // TypeScript export name (always sanitized for valid JS identifiers)\n const exportName = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}`\n : table.ormName;\n\n // Add physical table name to drizzle schema\n drizzleEntries.push(` ${exportName}: ${exportName}`);\n\n // Include relations for this table if they exist (either explicit or inverse)\n if (tablesWithRelations?.has(table.name)) {\n const relationsName = namespace ? `${exportName}Relations` : `${table.ormName}Relations`;\n\n drizzleEntries.push(` ${relationsName}: ${relationsName}`);\n }\n\n // Add convenience aliases WITH their relations to work around Drizzle bug\n // The key insight: Drizzle needs BOTH the table alias AND its relations alias\n // in the same schema object for relational queries to work\n if (namespace) {\n drizzleEntries.push(` ${table.ormName}: ${exportName}`);\n\n // Also add the relations under the aliased name if they exist\n if (tablesWithRelations?.has(table.name)) {\n const physicalRelationsName = `${exportName}Relations`;\n const aliasRelationsName = `${table.ormName}Relations`;\n drizzleEntries.push(` ${aliasRelationsName}: ${physicalRelationsName}`);\n }\n }\n }\n\n // Add schema version as a number\n drizzleEntries.push(` schemaVersion: ${schema.version}`);\n\n // Use logical name (not physical) for the schema export variable name, sanitized for valid JS identifier\n const exportName = namespace ? `${sanitizeNamespace(namespace)}_schema` : \"_schema\";\n\n return `export const ${exportName} = {\\n${drizzleEntries.join(\",\\n\")}\\n}`;\n}\n\n// ============================================================================\n// MAIN GENERATION\n// ============================================================================\n\nexport interface GenerateSchemaOptions {\n /** Custom ID generator import configuration */\n idGeneratorImport?: {\n /** Function name to import */\n name: string;\n /** Module to import from */\n from: string;\n };\n /** Optional mapper factory for creating table name mappers with custom sanitization */\n mapperFactory?: (namespace: string | undefined) => TableNameMapper | undefined;\n}\n\n/**\n * Generate a settings table for storing fragment versions\n */\n/**\n * Generate a schema file from one or more fragments with automatic de-duplication\n */\nexport function generateSchema(\n fragments: { namespace: string; schema: AnySchema }[],\n provider: SupportedProvider,\n options?: GenerateSchemaOptions,\n): string {\n const ctx = createContext(provider, options?.idGeneratorImport);\n const customTypes: string[] = [];\n const sections: string[] = [];\n const getMapper =\n options?.mapperFactory ||\n ((ns: string | undefined) => (ns ? createTableNameMapper(ns, true) : undefined));\n\n for (const { schema, namespace } of fragments) {\n const fragmentTables: string[] = [];\n const mapper = getMapper(namespace);\n\n // Add section header\n fragmentTables.push(\"\");\n fragmentTables.push(\n \"// ============================================================================\",\n );\n fragmentTables.push(`// Fragment: ${namespace}`);\n fragmentTables.push(\n \"// ============================================================================\",\n );\n\n // Generate tables for this fragment\n for (const table of Object.values(schema.tables)) {\n const tableCode = generateTable(ctx, table, customTypes, namespace, mapper);\n fragmentTables.push(\"\");\n fragmentTables.push(tableCode);\n }\n\n // Build a map of inverse relations for tables that are referenced but don't have their own relations\n // This is needed for Drizzle's relational query API to work correctly\n const inverseRelations = new Map<string, Array<{ fromTable: AnyTable; relation: Relation }>>();\n for (const table of Object.values(schema.tables)) {\n for (const relation of Object.values(table.relations)) {\n // Track this relation as an inverse on the target table\n const targetTableName = relation.table.name;\n if (!inverseRelations.has(targetTableName)) {\n inverseRelations.set(targetTableName, []);\n }\n inverseRelations.get(targetTableName)!.push({ fromTable: table, relation });\n }\n }\n\n // Generate relations for all tables (both explicit and inverse)\n const tablesWithRelations = new Set<string>();\n for (const table of Object.values(schema.tables)) {\n const relationCode = generateRelation(\n ctx,\n table,\n namespace,\n inverseRelations.get(table.name),\n mapper,\n );\n if (relationCode) {\n fragmentTables.push(\"\");\n fragmentTables.push(relationCode);\n tablesWithRelations.add(table.name);\n }\n }\n\n // Generate schema export object (skip for empty namespace to avoid duplicate _schema exports)\n if (namespace !== \"\") {\n fragmentTables.push(\"\");\n fragmentTables.push(\n generateFragmentSchemaExport(schema, namespace, tablesWithRelations, mapper),\n );\n }\n\n sections.push(...fragmentTables);\n }\n\n // Assemble final output\n const lines: string[] = [ctx.imports.format(), ...customTypes, ...sections];\n return lines.join(\"\\n\");\n}\n"],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { TableNameMapper } from "../shared/table-name-mapper.js";
|
|
2
|
-
import { DatabaseAdapter } from "../adapters.js";
|
|
3
|
-
import { GenericSQLAdapter, GenericSQLOptions, UnitOfWorkConfig } from "../generic-sql/generic-sql-adapter.js";
|
|
4
|
-
import { SQLProvider } from "../../shared/providers.js";
|
|
5
|
-
import { Kysely } from "kysely";
|
|
6
|
-
|
|
7
|
-
//#region src/adapters/kysely/kysely-adapter.d.ts
|
|
8
|
-
type KyselyAny = Kysely<any>;
|
|
9
|
-
interface KyselyConfig {
|
|
10
|
-
db: KyselyAny | (() => KyselyAny | Promise<KyselyAny>);
|
|
11
|
-
provider: SQLProvider;
|
|
12
|
-
}
|
|
13
|
-
declare class KyselyAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
|
|
14
|
-
constructor(options: GenericSQLOptions);
|
|
15
|
-
createTableNameMapper(namespace: string): TableNameMapper;
|
|
16
|
-
}
|
|
17
|
-
//#endregion
|
|
18
|
-
export { KyselyAdapter, KyselyConfig };
|
|
19
|
-
//# sourceMappingURL=kysely-adapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kysely-adapter.d.ts","names":[],"sources":["../../../src/adapters/kysely/kysely-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;KAWK,SAAA,GAAY;UAEA,YAAA;MACX,mBAAmB,YAAY,QAAQ;EAHxC,QAAA,EAIO,WAJE;AAEd;AACM,cAIO,aAAA,SAAsB,iBAAA,YAA6B,eAJ1D,CAI0E,gBAJ1E,CAAA,CAAA;EAAmB,WAAA,CAAA,OAAA,EAKF,iBALE;EAAoB,qBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAKL,eALK"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { createTableNameMapper } from "../shared/table-name-mapper.js";
|
|
2
|
-
import { GenericSQLAdapter } from "../generic-sql/generic-sql-adapter.js";
|
|
3
|
-
import "kysely";
|
|
4
|
-
|
|
5
|
-
//#region src/adapters/kysely/kysely-adapter.ts
|
|
6
|
-
var KyselyAdapter = class extends GenericSQLAdapter {
|
|
7
|
-
constructor(options) {
|
|
8
|
-
super(options);
|
|
9
|
-
}
|
|
10
|
-
createTableNameMapper(namespace) {
|
|
11
|
-
return createTableNameMapper(namespace);
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
//#endregion
|
|
16
|
-
export { KyselyAdapter };
|
|
17
|
-
//# sourceMappingURL=kysely-adapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kysely-adapter.js","names":[],"sources":["../../../src/adapters/kysely/kysely-adapter.ts"],"sourcesContent":["import { type Kysely } from \"kysely\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport { type DatabaseAdapter } from \"../adapters\";\nimport { createTableNameMapper } from \"../shared/table-name-mapper\";\nimport {\n GenericSQLAdapter,\n type GenericSQLOptions,\n type UnitOfWorkConfig,\n} from \"../generic-sql/generic-sql-adapter\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\nexport interface KyselyConfig {\n db: KyselyAny | (() => KyselyAny | Promise<KyselyAny>);\n provider: SQLProvider;\n}\n\nexport class KyselyAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {\n constructor(options: GenericSQLOptions) {\n super(options);\n }\n\n createTableNameMapper(namespace: string) {\n return createTableNameMapper(namespace);\n }\n}\n"],"mappings":";;;;;AAkBA,IAAa,gBAAb,cAAmC,kBAA+D;CAChG,YAAY,SAA4B;AACtC,QAAM,QAAQ;;CAGhB,sBAAsB,WAAmB;AACvC,SAAO,sBAAsB,UAAU"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
//#region src/adapters/shared/table-name-mapper.d.ts
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)
|
|
5
|
-
*/
|
|
6
|
-
interface TableNameMapper {
|
|
7
|
-
toPhysical(logicalName: string): string;
|
|
8
|
-
toLogical(physicalName: string): string;
|
|
9
|
-
}
|
|
10
|
-
//#endregion
|
|
11
|
-
export { TableNameMapper };
|
|
12
|
-
//# sourceMappingURL=table-name-mapper.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"table-name-mapper.d.ts","names":[],"sources":["../../../src/adapters/shared/table-name-mapper.ts"],"sourcesContent":[],"mappings":";;;;;UAeiB,eAAA"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
//#region src/adapters/shared/table-name-mapper.ts
|
|
2
|
-
/**
|
|
3
|
-
* Sanitizes a namespace for use in database table names and TypeScript exports.
|
|
4
|
-
* Converts dashes to underscores to ensure compatibility with SQL identifiers
|
|
5
|
-
* and Drizzle's relational query system.
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* sanitizeNamespace("my-fragment") // => "my_fragment"
|
|
9
|
-
*/
|
|
10
|
-
function sanitizeNamespace(namespace) {
|
|
11
|
-
return namespace.replace(/-/g, "_");
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Creates a table name mapper for a given namespace.
|
|
15
|
-
* Physical names have format: {logicalName}_{namespace} (or {logicalName}_{sanitizedNamespace} if sanitize is true)
|
|
16
|
-
*
|
|
17
|
-
* @param namespace - The namespace to use for table name prefixing
|
|
18
|
-
* @param sanitize - Whether to sanitize the namespace by converting dashes to underscores (default: false)
|
|
19
|
-
* @returns A table name mapper with toPhysical and toLogical methods
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
* const mapper = createTableNameMapper("my-fragment");
|
|
23
|
-
* mapper.toPhysical("users") // => "users_my-fragment"
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* const mapper = createTableNameMapper("my-fragment", true);
|
|
27
|
-
* mapper.toPhysical("users") // => "users_my_fragment"
|
|
28
|
-
* mapper.toLogical("users_my_fragment") // => "users"
|
|
29
|
-
*/
|
|
30
|
-
function createTableNameMapper(namespace, sanitize = false) {
|
|
31
|
-
const processedNamespace = sanitize ? sanitizeNamespace(namespace) : namespace;
|
|
32
|
-
return {
|
|
33
|
-
toPhysical: (logicalName) => `${logicalName}_${processedNamespace}`,
|
|
34
|
-
toLogical: (physicalName) => {
|
|
35
|
-
if (physicalName.endsWith(`_${processedNamespace}`)) return physicalName.slice(0, -(processedNamespace.length + 1));
|
|
36
|
-
return physicalName;
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
//#endregion
|
|
42
|
-
export { createTableNameMapper, sanitizeNamespace };
|
|
43
|
-
//# sourceMappingURL=table-name-mapper.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"table-name-mapper.js","names":[],"sources":["../../../src/adapters/shared/table-name-mapper.ts"],"sourcesContent":["/**\n * Sanitizes a namespace for use in database table names and TypeScript exports.\n * Converts dashes to underscores to ensure compatibility with SQL identifiers\n * and Drizzle's relational query system.\n *\n * @example\n * sanitizeNamespace(\"my-fragment\") // => \"my_fragment\"\n */\nexport function sanitizeNamespace(namespace: string): string {\n return namespace.replace(/-/g, \"_\");\n}\n\n/**\n * Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)\n */\nexport interface TableNameMapper {\n toPhysical(logicalName: string): string;\n toLogical(physicalName: string): string;\n}\n\n/**\n * Creates a table name mapper for a given namespace.\n * Physical names have format: {logicalName}_{namespace} (or {logicalName}_{sanitizedNamespace} if sanitize is true)\n *\n * @param namespace - The namespace to use for table name prefixing\n * @param sanitize - Whether to sanitize the namespace by converting dashes to underscores (default: false)\n * @returns A table name mapper with toPhysical and toLogical methods\n *\n * @example\n * const mapper = createTableNameMapper(\"my-fragment\");\n * mapper.toPhysical(\"users\") // => \"users_my-fragment\"\n *\n * @example\n * const mapper = createTableNameMapper(\"my-fragment\", true);\n * mapper.toPhysical(\"users\") // => \"users_my_fragment\"\n * mapper.toLogical(\"users_my_fragment\") // => \"users\"\n */\nexport function createTableNameMapper(namespace: string, sanitize = false): TableNameMapper {\n const processedNamespace = sanitize ? sanitizeNamespace(namespace) : namespace;\n\n return {\n toPhysical: (logicalName: string) => `${logicalName}_${processedNamespace}`,\n toLogical: (physicalName: string) => {\n if (physicalName.endsWith(`_${processedNamespace}`)) {\n return physicalName.slice(0, -(processedNamespace.length + 1));\n }\n return physicalName;\n },\n };\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,kBAAkB,WAA2B;AAC3D,QAAO,UAAU,QAAQ,MAAM,IAAI;;;;;;;;;;;;;;;;;;;AA4BrC,SAAgB,sBAAsB,WAAmB,WAAW,OAAwB;CAC1F,MAAM,qBAAqB,WAAW,kBAAkB,UAAU,GAAG;AAErE,QAAO;EACL,aAAa,gBAAwB,GAAG,YAAY,GAAG;EACvD,YAAY,iBAAyB;AACnC,OAAI,aAAa,SAAS,IAAI,qBAAqB,CACjD,QAAO,aAAa,MAAM,GAAG,EAAE,mBAAmB,SAAS,GAAG;AAEhE,UAAO;;EAEV"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../../../../../node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.mjs"],"sourcesContent":["const NullProtoObj = /* @__PURE__ */ (() => {\n\tconst e = function() {};\n\treturn e.prototype = Object.create(null), Object.freeze(e.prototype), e;\n})();\n\n/**\n* Create a new router context.\n*/\nfunction createRouter() {\n\treturn {\n\t\troot: { key: \"\" },\n\t\tstatic: new NullProtoObj()\n\t};\n}\n\nfunction splitPath(path) {\n\tconst [_, ...s] = path.split(\"/\");\n\treturn s[s.length - 1] === \"\" ? s.slice(0, -1) : s;\n}\nfunction getMatchParams(segments, paramsMap) {\n\tconst params = new NullProtoObj();\n\tfor (const [index, name] of paramsMap) {\n\t\tconst segment = index < 0 ? segments.slice(-1 * index).join(\"/\") : segments[index];\n\t\tif (typeof name === \"string\") params[name] = segment;\n\t\telse {\n\t\t\tconst match = segment.match(name);\n\t\t\tif (match) for (const key in match.groups) params[key] = match.groups[key];\n\t\t}\n\t}\n\treturn params;\n}\n\n/**\n* Add a route to the router context.\n*/\nfunction addRoute(ctx, method = \"\", path, data) {\n\tmethod = method.toUpperCase();\n\tif (path.charCodeAt(0) !== 47) path = `/${path}`;\n\tconst segments = splitPath(path);\n\tlet node = ctx.root;\n\tlet _unnamedParamIndex = 0;\n\tconst paramsMap = [];\n\tconst paramsRegexp = [];\n\tfor (let i = 0; i < segments.length; i++) {\n\t\tconst segment = segments[i];\n\t\tif (segment.startsWith(\"**\")) {\n\t\t\tif (!node.wildcard) node.wildcard = { key: \"**\" };\n\t\t\tnode = node.wildcard;\n\t\t\tparamsMap.push([\n\t\t\t\t-i,\n\t\t\t\tsegment.split(\":\")[1] || \"_\",\n\t\t\t\tsegment.length === 2\n\t\t\t]);\n\t\t\tbreak;\n\t\t}\n\t\tif (segment === \"*\" || segment.includes(\":\")) {\n\t\t\tif (!node.param) node.param = { key: \"*\" };\n\t\t\tnode = node.param;\n\t\t\tif (segment === \"*\") paramsMap.push([\n\t\t\t\ti,\n\t\t\t\t`_${_unnamedParamIndex++}`,\n\t\t\t\ttrue\n\t\t\t]);\n\t\t\telse if (segment.includes(\":\", 1)) {\n\t\t\t\tconst regexp = getParamRegexp(segment);\n\t\t\t\tparamsRegexp[i] = regexp;\n\t\t\t\tnode.hasRegexParam = true;\n\t\t\t\tparamsMap.push([\n\t\t\t\t\ti,\n\t\t\t\t\tregexp,\n\t\t\t\t\tfalse\n\t\t\t\t]);\n\t\t\t} else paramsMap.push([\n\t\t\t\ti,\n\t\t\t\tsegment.slice(1),\n\t\t\t\tfalse\n\t\t\t]);\n\t\t\tcontinue;\n\t\t}\n\t\tconst child = node.static?.[segment];\n\t\tif (child) node = child;\n\t\telse {\n\t\t\tconst staticNode = { key: segment };\n\t\t\tif (!node.static) node.static = new NullProtoObj();\n\t\t\tnode.static[segment] = staticNode;\n\t\t\tnode = staticNode;\n\t\t}\n\t}\n\tconst hasParams = paramsMap.length > 0;\n\tif (!node.methods) node.methods = new NullProtoObj();\n\tnode.methods[method] ??= [];\n\tnode.methods[method].push({\n\t\tdata: data || null,\n\t\tparamsRegexp,\n\t\tparamsMap: hasParams ? paramsMap : void 0\n\t});\n\tif (!hasParams) ctx.static[path] = node;\n}\nfunction getParamRegexp(segment) {\n\tconst regex = segment.replace(/:(\\w+)/g, (_, id) => `(?<${id}>[^/]+)`).replace(/\\./g, \"\\\\.\");\n\treturn /* @__PURE__ */ new RegExp(`^${regex}$`);\n}\n\n/**\n* Find a route by path.\n*/\nfunction findRoute(ctx, method = \"\", path, opts) {\n\tif (path.charCodeAt(path.length - 1) === 47) path = path.slice(0, -1);\n\tconst staticNode = ctx.static[path];\n\tif (staticNode && staticNode.methods) {\n\t\tconst staticMatch = staticNode.methods[method] || staticNode.methods[\"\"];\n\t\tif (staticMatch !== void 0) return staticMatch[0];\n\t}\n\tconst segments = splitPath(path);\n\tconst match = _lookupTree(ctx, ctx.root, method, segments, 0)?.[0];\n\tif (match === void 0) return;\n\tif (opts?.params === false) return match;\n\treturn {\n\t\tdata: match.data,\n\t\tparams: match.paramsMap ? getMatchParams(segments, match.paramsMap) : void 0\n\t};\n}\nfunction _lookupTree(ctx, node, method, segments, index) {\n\tif (index === segments.length) {\n\t\tif (node.methods) {\n\t\t\tconst match = node.methods[method] || node.methods[\"\"];\n\t\t\tif (match) return match;\n\t\t}\n\t\tif (node.param && node.param.methods) {\n\t\t\tconst match = node.param.methods[method] || node.param.methods[\"\"];\n\t\t\tif (match) {\n\t\t\t\tconst pMap = match[0].paramsMap;\n\t\t\t\tif (pMap?.[pMap?.length - 1]?.[2]) return match;\n\t\t\t}\n\t\t}\n\t\tif (node.wildcard && node.wildcard.methods) {\n\t\t\tconst match = node.wildcard.methods[method] || node.wildcard.methods[\"\"];\n\t\t\tif (match) {\n\t\t\t\tconst pMap = match[0].paramsMap;\n\t\t\t\tif (pMap?.[pMap?.length - 1]?.[2]) return match;\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\tconst segment = segments[index];\n\tif (node.static) {\n\t\tconst staticChild = node.static[segment];\n\t\tif (staticChild) {\n\t\t\tconst match = _lookupTree(ctx, staticChild, method, segments, index + 1);\n\t\t\tif (match) return match;\n\t\t}\n\t}\n\tif (node.param) {\n\t\tconst match = _lookupTree(ctx, node.param, method, segments, index + 1);\n\t\tif (match) {\n\t\t\tif (node.param.hasRegexParam) {\n\t\t\t\tconst exactMatch = match.find((m) => m.paramsRegexp[index]?.test(segment)) || match.find((m) => !m.paramsRegexp[index]);\n\t\t\t\treturn exactMatch ? [exactMatch] : void 0;\n\t\t\t}\n\t\t\treturn match;\n\t\t}\n\t}\n\tif (node.wildcard && node.wildcard.methods) return node.wildcard.methods[method] || node.wildcard.methods[\"\"];\n}\n\n/**\n* Remove a route from the router context.\n*/\nfunction removeRoute(ctx, method, path) {\n\tconst segments = splitPath(path);\n\treturn _remove(ctx.root, method || \"\", segments, 0);\n}\nfunction _remove(node, method, segments, index) {\n\tif (index === segments.length) {\n\t\tif (node.methods && method in node.methods) {\n\t\t\tdelete node.methods[method];\n\t\t\tif (Object.keys(node.methods).length === 0) node.methods = void 0;\n\t\t}\n\t\treturn;\n\t}\n\tconst segment = segments[index];\n\tif (segment === \"*\") {\n\t\tif (node.param) {\n\t\t\t_remove(node.param, method, segments, index + 1);\n\t\t\tif (_isEmptyNode(node.param)) node.param = void 0;\n\t\t}\n\t\treturn;\n\t}\n\tif (segment.startsWith(\"**\")) {\n\t\tif (node.wildcard) {\n\t\t\t_remove(node.wildcard, method, segments, index + 1);\n\t\t\tif (_isEmptyNode(node.wildcard)) node.wildcard = void 0;\n\t\t}\n\t\treturn;\n\t}\n\tconst childNode = node.static?.[segment];\n\tif (childNode) {\n\t\t_remove(childNode, method, segments, index + 1);\n\t\tif (_isEmptyNode(childNode)) {\n\t\t\tdelete node.static[segment];\n\t\t\tif (Object.keys(node.static).length === 0) node.static = void 0;\n\t\t}\n\t}\n}\nfunction _isEmptyNode(node) {\n\treturn node.methods === void 0 && node.static === void 0 && node.param === void 0 && node.wildcard === void 0;\n}\n\n/**\n* Find all route patterns that match the given path.\n*/\nfunction findAllRoutes(ctx, method = \"\", path, opts) {\n\tif (path.charCodeAt(path.length - 1) === 47) path = path.slice(0, -1);\n\tconst segments = splitPath(path);\n\tconst matches = _findAll(ctx, ctx.root, method, segments, 0);\n\tif (opts?.params === false) return matches;\n\treturn matches.map((m) => {\n\t\treturn {\n\t\t\tdata: m.data,\n\t\t\tparams: m.paramsMap ? getMatchParams(segments, m.paramsMap) : void 0\n\t\t};\n\t});\n}\nfunction _findAll(ctx, node, method, segments, index, matches = []) {\n\tconst segment = segments[index];\n\tif (node.wildcard && node.wildcard.methods) {\n\t\tconst match = node.wildcard.methods[method] || node.wildcard.methods[\"\"];\n\t\tif (match) matches.push(...match);\n\t}\n\tif (node.param) {\n\t\t_findAll(ctx, node.param, method, segments, index + 1, matches);\n\t\tif (index === segments.length && node.param.methods) {\n\t\t\tconst match = node.param.methods[method] || node.param.methods[\"\"];\n\t\t\tif (match) {\n\t\t\t\tconst pMap = match[0].paramsMap;\n\t\t\t\tif (pMap?.[pMap?.length - 1]?.[2]) matches.push(...match);\n\t\t\t}\n\t\t}\n\t}\n\tconst staticChild = node.static?.[segment];\n\tif (staticChild) _findAll(ctx, staticChild, method, segments, index + 1, matches);\n\tif (index === segments.length && node.methods) {\n\t\tconst match = node.methods[method] || node.methods[\"\"];\n\t\tif (match) matches.push(...match);\n\t}\n\treturn matches;\n}\n\nfunction routeToRegExp(route = \"/\") {\n\tconst reSegments = [];\n\tlet idCtr = 0;\n\tfor (const segment of route.split(\"/\")) {\n\t\tif (!segment) continue;\n\t\tif (segment === \"*\") reSegments.push(`(?<_${idCtr++}>[^/]*)`);\n\t\telse if (segment.startsWith(\"**\")) reSegments.push(segment === \"**\" ? \"?(?<_>.*)\" : `?(?<${segment.slice(3)}>.+)`);\n\t\telse if (segment.includes(\":\")) reSegments.push(segment.replace(/:(\\w+)/g, (_, id) => `(?<${id}>[^/]+)`).replace(/\\./g, \"\\\\.\"));\n\t\telse reSegments.push(segment);\n\t}\n\treturn /* @__PURE__ */ new RegExp(`^/${reSegments.join(\"/\")}/?$`);\n}\n\nexport { NullProtoObj, addRoute, createRouter, findAllRoutes, findRoute, removeRoute, routeToRegExp };"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
//#region src/schema-generator/schema-generator.d.ts
|
|
2
|
-
interface GenerateSchemaOptions {
|
|
3
|
-
path: string;
|
|
4
|
-
toVersion?: number;
|
|
5
|
-
fromVersion?: number;
|
|
6
|
-
}
|
|
7
|
-
interface SchemaGenerator {
|
|
8
|
-
generateSchema: (options?: GenerateSchemaOptions) => {
|
|
9
|
-
schema: string;
|
|
10
|
-
path: string;
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
//#endregion
|
|
14
|
-
export { SchemaGenerator };
|
|
15
|
-
//# sourceMappingURL=schema-generator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema-generator.d.ts","names":[],"sources":["../../src/schema-generator/schema-generator.ts"],"sourcesContent":[],"mappings":";UAAiB,qBAAA;EAAA,IAAA,EAAA,MAAA;EAMA,SAAA,CAAA,EAAA,MAAe;;;UAAf,eAAA;6BACY"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { DatabaseAdapter } from "../adapters";
|
|
2
|
-
import { type AnySchema } from "../../schema/create";
|
|
3
|
-
import type { SchemaGenerator } from "../../schema-generator/schema-generator";
|
|
4
|
-
import { generateSchema } from "./generate";
|
|
5
|
-
import { createTableNameMapper } from "../shared/table-name-mapper";
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
GenericSQLAdapter,
|
|
9
|
-
type GenericSQLOptions,
|
|
10
|
-
type UnitOfWorkConfig,
|
|
11
|
-
} from "../generic-sql/generic-sql-adapter";
|
|
12
|
-
|
|
13
|
-
export class DrizzleAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
|
|
14
|
-
constructor(options: GenericSQLOptions) {
|
|
15
|
-
super(options);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
override createTableNameMapper(namespace: string) {
|
|
19
|
-
return createTableNameMapper(namespace, false);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
createSchemaGenerator(
|
|
23
|
-
fragments: { schema: AnySchema; namespace: string }[],
|
|
24
|
-
options?: { path?: string },
|
|
25
|
-
): SchemaGenerator {
|
|
26
|
-
return {
|
|
27
|
-
generateSchema: (genOptions) => {
|
|
28
|
-
const path = genOptions?.path ?? options?.path ?? "fragno-schema.ts";
|
|
29
|
-
|
|
30
|
-
return {
|
|
31
|
-
schema: generateSchema(fragments, this.driverConfig.databaseType, {
|
|
32
|
-
mapperFactory: (ns) => (ns ? this.createTableNameMapper(ns) : undefined),
|
|
33
|
-
}),
|
|
34
|
-
path,
|
|
35
|
-
};
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { type Kysely } from "kysely";
|
|
2
|
-
import type { SQLProvider } from "../../shared/providers";
|
|
3
|
-
import { type DatabaseAdapter } from "../adapters";
|
|
4
|
-
import { createTableNameMapper } from "../shared/table-name-mapper";
|
|
5
|
-
import {
|
|
6
|
-
GenericSQLAdapter,
|
|
7
|
-
type GenericSQLOptions,
|
|
8
|
-
type UnitOfWorkConfig,
|
|
9
|
-
} from "../generic-sql/generic-sql-adapter";
|
|
10
|
-
|
|
11
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
-
type KyselyAny = Kysely<any>;
|
|
13
|
-
|
|
14
|
-
export interface KyselyConfig {
|
|
15
|
-
db: KyselyAny | (() => KyselyAny | Promise<KyselyAny>);
|
|
16
|
-
provider: SQLProvider;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export class KyselyAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
|
|
20
|
-
constructor(options: GenericSQLOptions) {
|
|
21
|
-
super(options);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
createTableNameMapper(namespace: string) {
|
|
25
|
-
return createTableNameMapper(namespace);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sanitizes a namespace for use in database table names and TypeScript exports.
|
|
3
|
-
* Converts dashes to underscores to ensure compatibility with SQL identifiers
|
|
4
|
-
* and Drizzle's relational query system.
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* sanitizeNamespace("my-fragment") // => "my_fragment"
|
|
8
|
-
*/
|
|
9
|
-
export function sanitizeNamespace(namespace: string): string {
|
|
10
|
-
return namespace.replace(/-/g, "_");
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)
|
|
15
|
-
*/
|
|
16
|
-
export interface TableNameMapper {
|
|
17
|
-
toPhysical(logicalName: string): string;
|
|
18
|
-
toLogical(physicalName: string): string;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Creates a table name mapper for a given namespace.
|
|
23
|
-
* Physical names have format: {logicalName}_{namespace} (or {logicalName}_{sanitizedNamespace} if sanitize is true)
|
|
24
|
-
*
|
|
25
|
-
* @param namespace - The namespace to use for table name prefixing
|
|
26
|
-
* @param sanitize - Whether to sanitize the namespace by converting dashes to underscores (default: false)
|
|
27
|
-
* @returns A table name mapper with toPhysical and toLogical methods
|
|
28
|
-
*
|
|
29
|
-
* @example
|
|
30
|
-
* const mapper = createTableNameMapper("my-fragment");
|
|
31
|
-
* mapper.toPhysical("users") // => "users_my-fragment"
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* const mapper = createTableNameMapper("my-fragment", true);
|
|
35
|
-
* mapper.toPhysical("users") // => "users_my_fragment"
|
|
36
|
-
* mapper.toLogical("users_my_fragment") // => "users"
|
|
37
|
-
*/
|
|
38
|
-
export function createTableNameMapper(namespace: string, sanitize = false): TableNameMapper {
|
|
39
|
-
const processedNamespace = sanitize ? sanitizeNamespace(namespace) : namespace;
|
|
40
|
-
|
|
41
|
-
return {
|
|
42
|
-
toPhysical: (logicalName: string) => `${logicalName}_${processedNamespace}`,
|
|
43
|
-
toLogical: (physicalName: string) => {
|
|
44
|
-
if (physicalName.endsWith(`_${processedNamespace}`)) {
|
|
45
|
-
return physicalName.slice(0, -(processedNamespace.length + 1));
|
|
46
|
-
}
|
|
47
|
-
return physicalName;
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
}
|
package/src/shared/config.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Represents an active database connection that can be released back to the pool.
|
|
3
|
-
*/
|
|
4
|
-
export interface Connection<TDatabase> {
|
|
5
|
-
db: TDatabase;
|
|
6
|
-
release(): Promise<void>;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Connection pool interface for managing database connections.
|
|
11
|
-
* Adapter-specific implementations should be used (e.g., createKyselyConnectionPool, createDrizzleConnectionPool).
|
|
12
|
-
*/
|
|
13
|
-
export interface ConnectionPool<TDatabase> {
|
|
14
|
-
/** Acquire a connection from the pool */
|
|
15
|
-
connect(): Promise<Connection<TDatabase>>;
|
|
16
|
-
/**
|
|
17
|
-
* Get the database instance synchronously. Only works if the pool has already been initialized
|
|
18
|
-
* via connect().
|
|
19
|
-
* @throws an error if called before the pool is initialized.
|
|
20
|
-
*/
|
|
21
|
-
getDatabaseSync(): TDatabase;
|
|
22
|
-
/** Close the pool and cleanup resources */
|
|
23
|
-
close(): Promise<void>;
|
|
24
|
-
}
|