@fragno-dev/db 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +327 -160
- package/CHANGELOG.md +74 -0
- package/README.md +24 -0
- package/dist/adapters/adapters.d.ts +1 -1
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +0 -3
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.js +11 -12
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +46 -6
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +1 -1
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +185 -19
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
- package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
- package/dist/adapters/generic-sql/migration/executor.js +30 -3
- package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
- package/dist/adapters/generic-sql/migration/prepared-migrations.js +3 -3
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
- package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
- package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +9 -6
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +37 -9
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/where-builder.js +24 -20
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-decoder.js +1 -1
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-encoder.js +8 -9
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
- package/dist/adapters/in-memory/condition-evaluator.js +10 -6
- package/dist/adapters/in-memory/condition-evaluator.js.map +1 -1
- package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -1
- package/dist/adapters/in-memory/in-memory-adapter.js +45 -25
- package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -1
- package/dist/adapters/in-memory/in-memory-uow.js +236 -13
- package/dist/adapters/in-memory/in-memory-uow.js.map +1 -1
- package/dist/adapters/in-memory/options.d.ts +2 -0
- package/dist/adapters/in-memory/options.d.ts.map +1 -1
- package/dist/adapters/in-memory/options.js +3 -2
- package/dist/adapters/in-memory/options.js.map +1 -1
- package/dist/adapters/in-memory/reference-resolution.js.map +1 -1
- package/dist/adapters/in-memory/store.js +1 -1
- package/dist/adapters/in-memory/store.js.map +1 -1
- package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
- package/dist/browser/adapters/adapters.d.ts +61 -0
- package/dist/browser/adapters/adapters.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
- package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
- package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
- package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
- package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
- package/dist/browser/adapters/in-memory/index.d.ts +2 -0
- package/dist/browser/adapters/in-memory/options.d.ts +1 -0
- package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
- package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
- package/dist/browser/durable-hooks.d.ts +3 -0
- package/dist/browser/fragments/internal-fragment.d.ts +317 -0
- package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
- package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
- package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
- package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
- package/dist/browser/hooks/hooks.d.ts +146 -0
- package/dist/browser/hooks/hooks.d.ts.map +1 -0
- package/dist/browser/id.js +1 -0
- package/dist/browser/internal/adapter-registry.d.ts +4 -0
- package/dist/browser/internal/outbox-state.d.ts +2 -0
- package/dist/browser/mod.d.ts +15 -0
- package/dist/browser/mod.d.ts.map +1 -0
- package/dist/browser/mod.js +17 -0
- package/dist/browser/mod.js.map +1 -0
- package/dist/browser/mod2.d.ts +48 -0
- package/dist/browser/mod2.d.ts.map +1 -0
- package/dist/browser/naming/sql-naming.d.ts +19 -0
- package/dist/browser/naming/sql-naming.d.ts.map +1 -0
- package/dist/browser/outbox/outbox.d.ts +21 -0
- package/dist/browser/outbox/outbox.d.ts.map +1 -0
- package/dist/browser/query/column-defaults.js +1 -0
- package/dist/browser/query/condition-builder.d.ts +44 -0
- package/dist/browser/query/condition-builder.d.ts.map +1 -0
- package/dist/browser/query/condition-builder.js +97 -0
- package/dist/browser/query/condition-builder.js.map +1 -0
- package/dist/browser/query/cursor.d.ts +105 -0
- package/dist/browser/query/cursor.d.ts.map +1 -0
- package/dist/browser/query/cursor.js +150 -0
- package/dist/browser/query/cursor.js.map +1 -0
- package/dist/browser/query/db-now.d.ts +22 -0
- package/dist/browser/query/db-now.d.ts.map +1 -0
- package/dist/browser/query/db-now.js +33 -0
- package/dist/browser/query/db-now.js.map +1 -0
- package/dist/browser/query/orm/orm.d.ts +18 -0
- package/dist/browser/query/orm/orm.d.ts.map +1 -0
- package/dist/browser/query/simple-query-interface.d.ts +108 -0
- package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
- package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
- package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
- package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
- package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
- package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
- package/dist/browser/query/value-encoding.js +38 -0
- package/dist/browser/query/value-encoding.js.map +1 -0
- package/dist/browser/schema/create.d.ts +326 -0
- package/dist/browser/schema/create.d.ts.map +1 -0
- package/dist/browser/schema/create.js +89 -0
- package/dist/browser/schema/create.js.map +1 -0
- package/dist/browser/schema/generate-id.js +28 -0
- package/dist/browser/schema/generate-id.js.map +1 -0
- package/dist/browser/shared/providers.d.ts +6 -0
- package/dist/browser/shared/providers.d.ts.map +1 -0
- package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
- package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
- package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
- package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
- package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
- package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
- package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
- package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
- package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
- package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
- package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
- package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
- package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
- package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
- package/dist/browser/sync/commands.d.ts +15 -0
- package/dist/browser/sync/commands.d.ts.map +1 -0
- package/dist/browser/sync/commands.js +27 -0
- package/dist/browser/sync/commands.js.map +1 -0
- package/dist/browser/sync/types.d.ts +63 -0
- package/dist/browser/sync/types.d.ts.map +1 -0
- package/dist/browser/util/types.d.ts +8 -0
- package/dist/browser/util/types.d.ts.map +1 -0
- package/dist/browser/with-database.d.ts +29 -0
- package/dist/browser/with-database.d.ts.map +1 -0
- package/dist/client.d.ts +4 -0
- package/dist/client.js +5 -0
- package/dist/db-fragment-definition-builder.d.ts +85 -28
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +374 -46
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
- package/dist/dispatchers/cloudflare-do/index.d.ts +5 -20
- package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -1
- package/dist/dispatchers/cloudflare-do/index.js +23 -55
- package/dist/dispatchers/cloudflare-do/index.js.map +1 -1
- package/dist/dispatchers/node/dispatcher.d.ts +14 -0
- package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
- package/dist/dispatchers/node/dispatcher.js +80 -0
- package/dist/dispatchers/node/dispatcher.js.map +1 -0
- package/dist/dispatchers/node/index.d.ts +5 -10
- package/dist/dispatchers/node/index.d.ts.map +1 -1
- package/dist/dispatchers/node/index.js +21 -53
- package/dist/dispatchers/node/index.js.map +1 -1
- package/dist/durable-hooks.d.ts +31 -0
- package/dist/durable-hooks.d.ts.map +1 -0
- package/dist/durable-hooks.js +23 -0
- package/dist/durable-hooks.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +128 -27
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +125 -78
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/fragments/internal-fragment.routes.js +138 -3
- package/dist/fragments/internal-fragment.routes.js.map +1 -1
- package/dist/fragments/internal-fragment.schema.d.ts +7 -1
- package/dist/fragments/internal-fragment.schema.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.schema.js +18 -1
- package/dist/fragments/internal-fragment.schema.js.map +1 -1
- package/dist/hooks/durable-hooks-logger.d.ts +10 -0
- package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
- package/dist/hooks/durable-hooks-logger.js +75 -0
- package/dist/hooks/durable-hooks-logger.js.map +1 -0
- package/dist/hooks/durable-hooks-processor.d.ts +1 -14
- package/dist/hooks/durable-hooks-processor.js +58 -10
- package/dist/hooks/durable-hooks-processor.js.map +1 -1
- package/dist/hooks/durable-hooks-runtime.js +44 -0
- package/dist/hooks/durable-hooks-runtime.js.map +1 -0
- package/dist/hooks/hooks.d.ts +60 -2
- package/dist/hooks/hooks.d.ts.map +1 -1
- package/dist/hooks/hooks.js +214 -53
- package/dist/hooks/hooks.js.map +1 -1
- package/dist/id.d.ts +2 -2
- package/dist/id.js +2 -2
- package/dist/internal/adapter-registry.d.ts +11 -0
- package/dist/internal/adapter-registry.d.ts.map +1 -0
- package/dist/internal/adapter-registry.js +135 -0
- package/dist/internal/adapter-registry.js.map +1 -0
- package/dist/internal/outbox-state.d.ts +2 -0
- package/dist/internal/outbox-state.js +26 -0
- package/dist/internal/outbox-state.js.map +1 -0
- package/dist/migration-engine/auto-from-schema.d.ts +33 -0
- package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
- package/dist/migration-engine/auto-from-schema.js +210 -27
- package/dist/migration-engine/auto-from-schema.js.map +1 -1
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +17 -5
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/migration-engine/shared.d.ts +113 -0
- package/dist/migration-engine/shared.d.ts.map +1 -0
- package/dist/migration-engine/shared.js.map +1 -1
- package/dist/mod.d.ts +12 -11
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +10 -10
- package/dist/mod.js.map +1 -1
- package/dist/naming/sql-naming.d.ts.map +1 -1
- package/dist/naming/sql-naming.js.map +1 -1
- package/dist/outbox/outbox-builder.js.map +1 -1
- package/dist/outbox/outbox.d.ts +3 -1
- package/dist/outbox/outbox.d.ts.map +1 -1
- package/dist/outbox/outbox.js.map +1 -1
- package/dist/query/column-defaults.js.map +1 -1
- package/dist/query/condition-builder.d.ts +7 -1
- package/dist/query/condition-builder.d.ts.map +1 -1
- package/dist/query/condition-builder.js +5 -1
- package/dist/query/condition-builder.js.map +1 -1
- package/dist/query/cursor-client.d.ts +105 -0
- package/dist/query/cursor-client.d.ts.map +1 -0
- package/dist/query/cursor-client.js +165 -0
- package/dist/query/cursor-client.js.map +1 -0
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +7 -1
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/db-now.d.ts +15 -1
- package/dist/query/db-now.d.ts.map +1 -1
- package/dist/query/db-now.js +30 -2
- package/dist/query/db-now.js.map +1 -1
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +2 -2
- package/dist/query/serialize/create-sql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/sqlite-serializer.js +6 -2
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
- package/dist/query/simple-query-interface.d.ts +7 -3
- package/dist/query/simple-query-interface.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.js +39 -18
- 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 +42 -16
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.js +50 -6
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
- package/dist/query/value-decoding.js +8 -1
- package/dist/query/value-decoding.js.map +1 -1
- package/dist/query/value-encoding.js.map +1 -1
- package/dist/schema/create.d.ts +69 -25
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +91 -16
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
- package/dist/schema/validator.d.ts.map +1 -1
- package/dist/schema/validator.js.map +1 -1
- package/dist/schema-output/drizzle.d.ts.map +1 -1
- package/dist/schema-output/drizzle.js +8 -6
- package/dist/schema-output/drizzle.js.map +1 -1
- package/dist/schema-output/prisma.d.ts.map +1 -1
- package/dist/schema-output/prisma.js +21 -10
- package/dist/schema-output/prisma.js.map +1 -1
- package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
- package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
- package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
- package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
- package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
- package/dist/sql-driver/sql.js.map +1 -1
- package/dist/sync/commands.d.ts +15 -0
- package/dist/sync/commands.d.ts.map +1 -0
- package/dist/sync/commands.js +27 -0
- package/dist/sync/commands.js.map +1 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.js +4 -0
- package/dist/sync/read-tracking.d.ts +25 -0
- package/dist/sync/read-tracking.d.ts.map +1 -0
- package/dist/sync/read-tracking.js +148 -0
- package/dist/sync/read-tracking.js.map +1 -0
- package/dist/sync/submit.js +213 -0
- package/dist/sync/submit.js.map +1 -0
- package/dist/sync/types.d.ts +63 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/util/default-database-adapter.js +6 -1
- package/dist/util/default-database-adapter.js.map +1 -1
- package/dist/with-database.d.ts +3 -6
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +7 -15
- package/dist/with-database.js.map +1 -1
- package/package.json +33 -41
- package/src/adapters/adapters.ts +5 -4
- package/src/adapters/drizzle/migrate-drizzle.test.ts +46 -9
- package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +5 -3
- package/src/adapters/drizzle/test-utils.ts +2 -1
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -3
- package/src/adapters/generic-sql/generic-sql-adapter.ts +21 -24
- package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +1 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +81 -15
- package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +4 -2
- package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
- package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +3 -2
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +1 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +5 -4
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +2 -1
- package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +795 -3
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +385 -57
- package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
- package/src/adapters/generic-sql/migration/executor.ts +47 -4
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +117 -14
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +9 -8
- package/src/adapters/generic-sql/migration/sql-generator.ts +5 -3
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +3 -3
- package/src/adapters/generic-sql/query/cursor-utils.test.ts +3 -2
- package/src/adapters/generic-sql/query/cursor-utils.ts +1 -1
- package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +144 -8
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +16 -17
- package/src/adapters/generic-sql/query/select-builder.test.ts +1 -0
- package/src/adapters/generic-sql/query/select-builder.ts +2 -2
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +24 -5
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +83 -13
- package/src/adapters/generic-sql/query/where-builder.test.ts +7 -5
- package/src/adapters/generic-sql/query/where-builder.ts +48 -29
- package/src/adapters/generic-sql/sql-adapter-pglite-migrations.test.ts +6 -15
- package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +52 -7
- package/src/adapters/generic-sql/sql-adapter-pglite-queries.test.ts +9 -6
- package/src/adapters/generic-sql/sql-adapter-sqlite3-driver.test.ts +273 -5
- package/src/adapters/generic-sql/sql-adapter-sqlite3-uow.test.ts +123 -6
- package/src/adapters/generic-sql/sql-adapter-sqlocal.test.ts +4 -2
- package/src/adapters/generic-sql/uow-decoder.test.ts +4 -3
- package/src/adapters/generic-sql/uow-decoder.ts +3 -3
- package/src/adapters/generic-sql/uow-encoder.test.ts +4 -2
- package/src/adapters/generic-sql/uow-encoder.ts +14 -18
- package/src/adapters/in-memory/condition-evaluator.test.ts +2 -1
- package/src/adapters/in-memory/condition-evaluator.ts +9 -4
- package/src/adapters/in-memory/in-memory-adapter.ts +155 -44
- package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +50 -2
- package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +158 -3
- package/src/adapters/in-memory/in-memory-uow.ts +402 -26
- package/src/adapters/in-memory/options.test.ts +1 -0
- package/src/adapters/in-memory/options.ts +5 -1
- package/src/adapters/in-memory/outbox.test.ts +361 -0
- package/src/adapters/in-memory/reference-resolution.test.ts +3 -2
- package/src/adapters/in-memory/reference-resolution.ts +2 -2
- package/src/adapters/in-memory/sorted-array-index.test.ts +1 -0
- package/src/adapters/in-memory/store.test.ts +1 -0
- package/src/adapters/in-memory/store.ts +3 -3
- package/src/adapters/in-memory/value-normalization.test.ts +1 -0
- package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +51 -7
- package/src/adapters/shared/from-unit-of-work-compiler.ts +156 -46
- package/src/adapters/shared/uow-operation-compiler.ts +3 -3
- package/src/browser/mod.ts +64 -0
- package/src/client.ts +19 -0
- package/src/db-fragment-definition-builder.test.ts +821 -47
- package/src/db-fragment-definition-builder.ts +857 -110
- package/src/db-fragment-instantiator.test.ts +114 -90
- package/src/db-fragment-integration.test.ts +9 -6
- package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
- package/src/dispatchers/cloudflare-do/index.test.ts +145 -12
- package/src/dispatchers/cloudflare-do/index.ts +49 -90
- package/src/dispatchers/node/dispatcher.ts +112 -0
- package/src/dispatchers/node/index.test.ts +43 -14
- package/src/dispatchers/node/index.ts +38 -75
- package/src/durable-hooks.test.ts +80 -0
- package/src/durable-hooks.ts +67 -0
- package/src/fragments/internal-fragment.routes.test.ts +570 -0
- package/src/fragments/internal-fragment.routes.ts +297 -5
- package/src/fragments/internal-fragment.schema.ts +45 -1
- package/src/fragments/internal-fragment.test.ts +223 -251
- package/src/fragments/internal-fragment.ts +278 -154
- package/src/hooks/durable-hooks-logger.ts +126 -0
- package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
- package/src/hooks/durable-hooks-processor.test.ts +179 -14
- package/src/hooks/durable-hooks-processor.ts +120 -14
- package/src/hooks/durable-hooks-runtime.test.ts +65 -0
- package/src/hooks/durable-hooks-runtime.ts +81 -0
- package/src/hooks/hooks.test.ts +314 -53
- package/src/hooks/hooks.ts +360 -81
- package/src/id.test.ts +34 -0
- package/src/id.ts +1 -3
- package/src/internal/adapter-registry.test.ts +93 -0
- package/src/internal/adapter-registry.ts +239 -0
- package/src/internal/outbox-state.ts +43 -0
- package/src/migration-engine/auto-from-schema.test.ts +93 -0
- package/src/migration-engine/auto-from-schema.ts +360 -42
- package/src/migration-engine/create.test.ts +2 -1
- package/src/migration-engine/create.ts +1 -1
- package/src/migration-engine/generation-engine.test.ts +66 -9
- package/src/migration-engine/generation-engine.ts +31 -10
- package/src/migration-engine/shared.ts +13 -0
- package/src/mod.ts +45 -27
- package/src/naming/sql-naming.ts +1 -0
- package/src/outbox/outbox-builder.ts +2 -2
- package/src/outbox/outbox.test.ts +216 -45
- package/src/outbox/outbox.ts +3 -1
- package/src/query/column-defaults.ts +1 -1
- package/src/query/condition-builder.test.ts +15 -0
- package/src/query/condition-builder.ts +7 -0
- package/src/query/cursor-client.test.ts +70 -0
- package/src/query/cursor-client.ts +263 -0
- package/src/query/cursor.test.ts +3 -2
- package/src/query/cursor.ts +15 -3
- package/src/query/db-now.ts +69 -2
- package/src/query/orm/orm.ts +2 -2
- package/src/query/query-type.test.ts +2 -1
- package/src/query/serialize/create-sql-serializer.ts +3 -3
- package/src/query/serialize/dialect/mysql-serializer.ts +1 -1
- package/src/query/serialize/dialect/postgres-serializer.ts +1 -1
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +39 -2
- package/src/query/serialize/dialect/sqlite-serializer.ts +18 -5
- package/src/query/simple-query-interface.ts +10 -4
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +347 -9
- package/src/query/unit-of-work/execute-unit-of-work.ts +63 -20
- package/src/query/unit-of-work/retry-policy.test.ts +1 -0
- package/src/query/unit-of-work/tx-builder.test.ts +73 -1
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +5 -4
- package/src/query/unit-of-work/unit-of-work-types.test.ts +41 -11
- package/src/query/unit-of-work/unit-of-work.test.ts +28 -2
- package/src/query/unit-of-work/unit-of-work.ts +105 -19
- package/src/query/value-decoding.test.ts +50 -2
- package/src/query/value-decoding.ts +17 -4
- package/src/query/value-encoding.test.ts +1 -0
- package/src/query/value-encoding.ts +1 -1
- package/src/schema/create.test.ts +164 -5
- package/src/schema/create.ts +222 -24
- package/src/schema/generate-id.test.ts +1 -0
- package/src/schema/serialize.test.ts +4 -3
- package/src/schema/type-conversion/create-sql-type-mapper.ts +1 -1
- package/src/schema/type-conversion/dialect/sqlite.ts +2 -2
- package/src/schema/type-conversion/type-mapping.test.ts +2 -1
- package/src/schema/validator.test.ts +4 -2
- package/src/schema/validator.ts +1 -0
- package/src/schema-output/drizzle.test.ts +72 -19
- package/src/schema-output/drizzle.ts +24 -18
- package/src/schema-output/prisma.test.ts +172 -14
- package/src/schema-output/prisma.ts +34 -14
- package/src/sql-driver/better-sqlite3.test.ts +5 -3
- package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
- package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
- package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
- package/src/sql-driver/query-executor/query-executor.ts +1 -1
- package/src/sql-driver/sql-driver-adapter.ts +2 -2
- package/src/sql-driver/sql.ts +2 -1
- package/src/sql-driver/sqlocal.test.ts +4 -2
- package/src/sync/commands.test.ts +39 -0
- package/src/sync/commands.ts +51 -0
- package/src/sync/conflict-checker.test.ts +450 -0
- package/src/sync/conflict-checker.ts +248 -0
- package/src/sync/index.ts +14 -0
- package/src/sync/plan.ts +9 -0
- package/src/sync/read-tracking.test.ts +177 -0
- package/src/sync/read-tracking.ts +287 -0
- package/src/sync/submit.test.ts +205 -0
- package/src/sync/submit.ts +328 -0
- package/src/sync/types.ts +80 -0
- package/src/util/default-database-adapter.ts +15 -2
- package/src/with-database.ts +20 -50
- package/tsconfig.json +1 -1
- package/tsdown.config.ts +38 -26
- package/vitest.config.ts +1 -0
- package/dist/hooks/durable-hooks-processor.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js +0 -168
- package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js.map +0 -1
- package/dist/packages/fragno/dist/api/bind-services.js +0 -20
- package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
- package/dist/packages/fragno/dist/api/error.js +0 -48
- package/dist/packages/fragno/dist/api/error.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -321
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -669
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
- package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
- package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
- package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
- package/dist/packages/fragno/dist/api/internal/route.js +0 -10
- package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
- package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
- package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
- package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-input-context.js +0 -185
- package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
- package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
- package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
- package/dist/packages/fragno/dist/api/route.js +0 -30
- package/dist/packages/fragno/dist/api/route.js.map +0 -1
- package/dist/packages/fragno/dist/internal/symbols.js +0 -10
- package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
- package/dist/packages/fragno/dist/internal/trace-context.js +0 -12
- package/dist/packages/fragno/dist/internal/trace-context.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drizzle.js","names":["parts: string[]","params: string[]","value: string","keys: string[]","columns: string[]","foreignColumns: string[]","indexes: string[]","constraints: string[]","args: string[]","relations: string[]","options: string[]","fields: string[]","references: string[]","drizzleEntries: string[]","customTypes: string[]","sections: string[]","fragmentTables: string[]"],"sources":["../../src/schema-output/drizzle.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 {\n createNamingResolver,\n sanitizeNamespace,\n type NamingResolver,\n type SqlNamingStrategy,\n} from \"../naming/sql-naming\";\nimport { internalSchema } from \"../fragments/internal-fragment.schema\";\nimport { type DatabaseTypeLiteral } from \"../schema/type-conversion/type-mapping\";\nimport { createSQLTypeMapper } from \"../schema/type-conversion/create-sql-type-mapper\";\nimport {\n defaultNamingStrategyForDatabase,\n type SupportedDatabase,\n} from \"../adapters/generic-sql/driver-config\";\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 = SupportedDatabase;\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: SupportedDatabase,\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: \"text\", 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 using the naming resolver if available\n */\nfunction getPhysicalTableName(logicalName: string, resolver?: NamingResolver): string {\n return resolver ? resolver.getTableName(logicalName) : logicalName;\n}\n\n// ============================================================================\n// COLUMN GENERATION\n// ============================================================================\n\nfunction generateColumnDefinition(\n ctx: GeneratorContext,\n column: AnyColumn,\n customTypes: string[],\n physicalColumnName: string,\n): string {\n const parts: string[] = [];\n const typeFn = getColumnTypeFunction(ctx, column, customTypes);\n\n // Column type with parameters\n const params: string[] = [`\"${physicalColumnName}\"`, ...(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 // External IDs are unique by definition in Fragno's SQL migrations.\n if (column.role === \"external-id\") {\n parts.push(\"unique()\");\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 if (ctx.provider === \"mysql\") {\n ctx.imports.addImport(\"sql\", \"drizzle-orm\");\n parts.push(\"default(sql`(now())`)\");\n } else {\n parts.push(\"defaultNow()\");\n }\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.name}: ${parts.join(\".\")}`;\n}\n\nfunction generateAllColumns(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n resolver?: NamingResolver,\n): string[] {\n return Object.values(table.columns).map((column) =>\n generateColumnDefinition(\n ctx,\n column,\n customTypes,\n resolver ? resolver.getColumnName(table.name, column.name) : column.name,\n ),\n );\n}\n\n// ============================================================================\n// CONSTRAINT GENERATION\n// ============================================================================\n\nfunction generateForeignKeys(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string | null,\n resolver?: NamingResolver,\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.name === table.name;\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.name}_${sanitizeNamespace(namespace)}`\n : relation.table.name;\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 = resolver\n ? resolver.getForeignKeyName({\n logicalTable: table.name,\n logicalReferencedTable: relation.table.name,\n referenceName: relation.name,\n })\n : `${table.name}_${relation.table.name}_${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(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string | null,\n resolver?: NamingResolver,\n): string[] {\n const indexes: string[] = [];\n\n for (const idx of Object.values(table.indexes)) {\n const columns = idx.columns.map((col) => `table.${col.name}`).join(\", \");\n\n const indexName = resolver\n ? idx.unique\n ? resolver.getUniqueIndexName(idx.name, table.name)\n : resolver.getIndexName(idx.name, table.name)\n : namespace\n ? `${idx.name}_${namespace}`\n : 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 | null,\n resolver?: NamingResolver,\n): string[] {\n const constraints: string[] = [\n ...generateForeignKeys(ctx, table, namespace, resolver),\n ...generateIndexes(ctx, table, namespace, resolver),\n ];\n\n if (ctx.provider === \"sqlite\") {\n const externalIdColumn = Object.values(table.columns).find(\n (column) => column.role === \"external-id\",\n );\n if (externalIdColumn) {\n const indexName = resolver\n ? resolver.getUniqueIndexName(`idx_${table.name}_external_id`, table.name)\n : namespace\n ? `idx_${table.name}_external_id_${namespace}`\n : `idx_${table.name}_external_id`;\n ctx.imports.addImport(\"uniqueIndex\", ctx.importSource);\n constraints.push(`uniqueIndex(\"${indexName}\").on(table.${externalIdColumn.name})`);\n }\n }\n\n return constraints;\n}\n\n// ============================================================================\n// TABLE GENERATION\n// ============================================================================\n\nfunction generateTable(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n namespace?: string | null,\n resolver?: NamingResolver,\n schemaRef?: string,\n): string {\n const tableFn = schemaRef ? `${schemaRef}.table` : PROVIDER_TABLE_FUNCTIONS[ctx.provider];\n if (!schemaRef) {\n ctx.imports.addImport(tableFn, ctx.importSource);\n }\n\n const columns = generateAllColumns(ctx, table, customTypes, resolver);\n const constraints = generateTableConstraints(ctx, table, namespace, resolver);\n\n // Physical table name in the database (respects mapper configuration)\n const physicalTableName = getPhysicalTableName(table.name, resolver);\n // TypeScript export name must always be sanitized to be a valid JavaScript identifier\n const exportName = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;\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 | null,\n inverseRelations?: Array<{ fromTable: AnyTable; relation: Relation }>,\n _resolver?: NamingResolver,\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 ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;\n const relatedTableRef = namespace\n ? `${relation.table.name}_${sanitizeNamespace(namespace)}`\n : relation.table.name;\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.name}_${sanitizeNamespace(namespace)}`\n : relation.table.name;\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.name}_${sanitizeNamespace(namespace)}`\n : fromTable.name;\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.name}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 ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;\n const relationsName = namespace ? `${exportTableRef}Relations` : `${table.name}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 | null,\n tablesWithRelations?: Set<string>,\n _resolver?: NamingResolver,\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 ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;\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.name}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.name}: ${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.name}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 naming strategy override for physical names */\n namingStrategy?: SqlNamingStrategy;\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 generateDrizzleSchema(\n fragments: { namespace: string | null; schema: AnySchema }[],\n provider: SupportedDatabase,\n options?: GenerateSchemaOptions,\n): string {\n const ctx = createContext(provider, options?.idGeneratorImport);\n const customTypes: string[] = [];\n const sections: string[] = [];\n const namingStrategy = options?.namingStrategy ?? defaultNamingStrategyForDatabase(provider);\n\n for (const { schema, namespace } of fragments) {\n const fragmentTables: string[] = [];\n const resolver = createNamingResolver(schema, namespace, namingStrategy);\n const schemaName = resolver.getSchemaName();\n const schemaRef =\n ctx.provider === \"postgresql\" && schemaName\n ? `schema_${sanitizeNamespace(schemaName)}`\n : undefined;\n\n // Add section header\n fragmentTables.push(\"\");\n fragmentTables.push(\n \"// ============================================================================\",\n );\n const namespaceLabel = namespace ?? \"(none)\";\n fragmentTables.push(`// Fragment: ${namespaceLabel}`);\n fragmentTables.push(\n \"// ============================================================================\",\n );\n\n if (schemaRef && schemaName) {\n ctx.imports.addImport(\"pgSchema\", ctx.importSource);\n fragmentTables.push(\"\");\n fragmentTables.push(`const ${schemaRef} = pgSchema(\"${schemaName}\");`);\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, resolver, schemaRef);\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 resolver,\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 internal fragment to avoid duplicate _schema exports)\n if (!(namespace === null && schema.name === internalSchema.name)) {\n fragmentTables.push(\"\");\n fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations));\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
|
+
{"version":3,"file":"drizzle.js","names":["parts: string[]","params: string[]","value: string","keys: string[]","columns: string[]","foreignColumns: string[]","indexes: string[]","constraints: string[]","args: string[]","relations: string[]","options: string[]","fields: string[]","references: string[]","drizzleEntries: string[]","customTypes: string[]","sections: string[]","fragmentTables: string[]"],"sources":["../../src/schema-output/drizzle.ts"],"sourcesContent":["import {\n defaultNamingStrategyForDatabase,\n type SupportedDatabase,\n} from \"../adapters/generic-sql/driver-config\";\nimport { internalSchema } from \"../fragments/internal-fragment.schema\";\nimport {\n createNamingResolver,\n sanitizeNamespace,\n type NamingResolver,\n type SqlNamingStrategy,\n} from \"../naming/sql-naming\";\nimport {\n type AnyColumn,\n type AnySchema,\n type AnyTable,\n type Relation,\n InternalIdColumn,\n} from \"../schema/create\";\nimport { createSQLTypeMapper } from \"../schema/type-conversion/create-sql-type-mapper\";\nimport { type DatabaseTypeLiteral } from \"../schema/type-conversion/type-mapping\";\nimport { importGenerator } from \"../util/import-generator\";\nimport { ident, parseVarchar } from \"../util/parse\";\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 = SupportedDatabase;\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: SupportedDatabase,\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: \"text\", 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 using the naming resolver if available\n */\nfunction getPhysicalTableName(logicalName: string, resolver?: NamingResolver): string {\n return resolver ? resolver.getTableName(logicalName) : logicalName;\n}\n\n// ============================================================================\n// COLUMN GENERATION\n// ============================================================================\n\nfunction generateColumnDefinition(\n ctx: GeneratorContext,\n column: AnyColumn,\n customTypes: string[],\n physicalColumnName: string,\n): string {\n const parts: string[] = [];\n const typeFn = getColumnTypeFunction(ctx, column, customTypes);\n\n // Column type with parameters\n const params: string[] = [`\"${physicalColumnName}\"`, ...(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 // External IDs are unique by definition in Fragno's SQL migrations.\n if (column.role === \"external-id\") {\n parts.push(\"unique()\");\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 if (ctx.provider === \"mysql\") {\n ctx.imports.addImport(\"sql\", \"drizzle-orm\");\n parts.push(\"default(sql`(now())`)\");\n } else {\n parts.push(\"defaultNow()\");\n }\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.name}: ${parts.join(\".\")}`;\n}\n\nfunction generateAllColumns(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n resolver?: NamingResolver,\n): string[] {\n return Object.values(table.columns).map((column) =>\n generateColumnDefinition(\n ctx,\n column,\n customTypes,\n resolver ? resolver.getColumnName(table.name, column.name) : column.name,\n ),\n );\n}\n\n// ============================================================================\n// CONSTRAINT GENERATION\n// ============================================================================\n\nfunction generateForeignKeys(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string | null,\n resolver?: NamingResolver,\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\" || relation.foreignKey === false) {\n continue;\n }\n\n const columns: string[] = [];\n const foreignColumns: string[] = [];\n const isSelfReference = relation.table.name === table.name;\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\" ? refCol : \"_internalId\";\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.name}_${sanitizeNamespace(namespace)}`\n : relation.table.name;\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 = resolver\n ? resolver.getForeignKeyName({\n logicalTable: table.name,\n logicalReferencedTable: relation.table.name,\n referenceName: relation.name,\n })\n : `${table.name}_${relation.table.name}_${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(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string | null,\n resolver?: NamingResolver,\n): string[] {\n const indexes: string[] = [];\n\n for (const idx of Object.values(table.indexes)) {\n const columns = idx.columns.map((col) => `table.${col.name}`).join(\", \");\n\n const indexName = resolver\n ? idx.unique\n ? resolver.getUniqueIndexName(idx.name, table.name)\n : resolver.getIndexName(idx.name, table.name)\n : namespace\n ? `${idx.name}_${namespace}`\n : 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 | null,\n resolver?: NamingResolver,\n): string[] {\n const constraints: string[] = [\n ...generateForeignKeys(ctx, table, namespace, resolver),\n ...generateIndexes(ctx, table, namespace, resolver),\n ];\n\n if (ctx.provider === \"sqlite\") {\n const externalIdColumn = Object.values(table.columns).find(\n (column) => column.role === \"external-id\",\n );\n if (externalIdColumn) {\n const indexName = resolver\n ? resolver.getUniqueIndexName(`idx_${table.name}_external_id`, table.name)\n : namespace\n ? `idx_${table.name}_external_id_${namespace}`\n : `idx_${table.name}_external_id`;\n ctx.imports.addImport(\"uniqueIndex\", ctx.importSource);\n constraints.push(`uniqueIndex(\"${indexName}\").on(table.${externalIdColumn.name})`);\n }\n }\n\n return constraints;\n}\n\n// ============================================================================\n// TABLE GENERATION\n// ============================================================================\n\nfunction generateTable(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n namespace?: string | null,\n resolver?: NamingResolver,\n schemaRef?: string,\n): string {\n const tableFn = schemaRef ? `${schemaRef}.table` : PROVIDER_TABLE_FUNCTIONS[ctx.provider];\n if (!schemaRef) {\n ctx.imports.addImport(tableFn, ctx.importSource);\n }\n\n const columns = generateAllColumns(ctx, table, customTypes, resolver);\n const constraints = generateTableConstraints(ctx, table, namespace, resolver);\n\n // Physical table name in the database (respects mapper configuration)\n const physicalTableName = getPhysicalTableName(table.name, resolver);\n // TypeScript export name must always be sanitized to be a valid JavaScript identifier\n const exportName = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;\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 | null,\n inverseRelations?: Array<{ fromTable: AnyTable; relation: Relation }>,\n _resolver?: NamingResolver,\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 if (relation.foreignKey === false) {\n continue;\n }\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 ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;\n const relatedTableRef = namespace\n ? `${relation.table.name}_${sanitizeNamespace(namespace)}`\n : relation.table.name;\n\n for (const [left, right] of relation.on) {\n fields.push(`${tableRef}.${left}`);\n // Relations reference internal IDs\n const actualRight = right !== \"id\" ? right : \"_internalId\";\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.name}_${sanitizeNamespace(namespace)}`\n : relation.table.name;\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\" && relation.foreignKey !== false) {\n hasMany = true;\n\n // Use sanitized TypeScript export name for identifier reference\n const fromTableRef = namespace\n ? `${fromTable.name}_${sanitizeNamespace(namespace)}`\n : fromTable.name;\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.name}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 ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;\n const relationsName = namespace ? `${exportTableRef}Relations` : `${table.name}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 | null,\n tablesWithRelations?: Set<string>,\n _resolver?: NamingResolver,\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 ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;\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.name}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.name}: ${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.name}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 naming strategy override for physical names */\n namingStrategy?: SqlNamingStrategy;\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 generateDrizzleSchema(\n fragments: { namespace: string | null; schema: AnySchema }[],\n provider: SupportedDatabase,\n options?: GenerateSchemaOptions,\n): string {\n const ctx = createContext(provider, options?.idGeneratorImport);\n const customTypes: string[] = [];\n const sections: string[] = [];\n const namingStrategy = options?.namingStrategy ?? defaultNamingStrategyForDatabase(provider);\n\n for (const { schema, namespace } of fragments) {\n const fragmentTables: string[] = [];\n const resolver = createNamingResolver(schema, namespace, namingStrategy);\n const schemaName = resolver.getSchemaName();\n const schemaRef =\n ctx.provider === \"postgresql\" && schemaName\n ? `schema_${sanitizeNamespace(schemaName)}`\n : undefined;\n\n // Add section header\n fragmentTables.push(\"\");\n fragmentTables.push(\n \"// ============================================================================\",\n );\n const namespaceLabel = namespace ?? \"(none)\";\n fragmentTables.push(`// Fragment: ${namespaceLabel}`);\n fragmentTables.push(\n \"// ============================================================================\",\n );\n\n if (schemaRef && schemaName) {\n ctx.imports.addImport(\"pgSchema\", ctx.importSource);\n fragmentTables.push(\"\");\n fragmentTables.push(`const ${schemaRef} = pgSchema(\"${schemaName}\");`);\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, resolver, schemaRef);\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 if (relation.foreignKey === false) {\n continue;\n }\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 resolver,\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 internal fragment to avoid duplicate _schema exports)\n if (!(namespace === null && schema.name === internalSchema.name)) {\n fragmentTables.push(\"\");\n fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations));\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma.d.ts","names":[],"sources":["../../src/schema-output/prisma.ts"],"sourcesContent":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"prisma.d.ts","names":[],"sources":["../../src/schema-output/prisma.ts"],"sourcesContent":[],"mappings":";;;;;;UAgBiB,2BAAA;sBACK;EADL,cAAA,CAAA,EAEE,iBAFyB;AAif5C;AACiD,iBADjC,oBAAA,CACiC,SAAA,EAAA;EACrC,SAAA,EAAA,MAAA,GAAA,IAAA;EACA,MAAA,EAFqC,SAErC;CAA2B,EAAA,EAAA,QAAA,EAD3B,iBAC2B,EAAA,OAAA,CAAA,EAA3B,2BAA2B,CAAA,EAAA,MAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { sqliteStorageDefault, sqliteStoragePrisma } from "../adapters/generic-sql/sqlite-storage.js";
|
|
2
1
|
import { createNamingResolver, sanitizeNamespace } from "../naming/sql-naming.js";
|
|
3
2
|
import { defaultNamingStrategyForDatabase } from "../adapters/generic-sql/driver-config.js";
|
|
3
|
+
import { sqliteStorageDefault, sqliteStoragePrisma } from "../adapters/generic-sql/sqlite-storage.js";
|
|
4
|
+
import { internalSchema } from "../fragments/internal-fragment.schema.js";
|
|
4
5
|
import { parseVarchar } from "../util/parse.js";
|
|
5
6
|
|
|
6
7
|
//#region src/schema-output/prisma.ts
|
|
@@ -145,18 +146,21 @@ function getColumnFieldMappings(table) {
|
|
|
145
146
|
}
|
|
146
147
|
function areInverseRelations(one, many) {
|
|
147
148
|
if (one.type !== "one" || many.type !== "many") return false;
|
|
149
|
+
if (one.foreignKey === false || many.foreignKey === false) return false;
|
|
148
150
|
if (one.referencer !== many.table || one.table !== many.referencer) return false;
|
|
149
151
|
return one.on.every(([left, right]) => many.on.some(([manyLeft, manyRight]) => manyLeft === right && manyRight === left));
|
|
150
152
|
}
|
|
151
153
|
function findMatchingManyRelation(one) {
|
|
152
154
|
for (const relation of Object.values(one.table.relations)) {
|
|
153
155
|
if (relation.type !== "many") continue;
|
|
156
|
+
if (relation.foreignKey === false) continue;
|
|
154
157
|
if (areInverseRelations(one, relation)) return relation;
|
|
155
158
|
}
|
|
156
159
|
}
|
|
157
160
|
function findMatchingOneRelation(many) {
|
|
158
161
|
for (const relation of Object.values(many.table.relations)) {
|
|
159
162
|
if (relation.type !== "one") continue;
|
|
163
|
+
if (relation.foreignKey === false) continue;
|
|
160
164
|
if (areInverseRelations(relation, many)) return relation;
|
|
161
165
|
}
|
|
162
166
|
}
|
|
@@ -186,6 +190,7 @@ function generateRelationFields(table, namespace, fieldNameByColumn, columnByNam
|
|
|
186
190
|
const relations = Object.values(table.relations).slice().sort((a, b) => a.name.localeCompare(b.name));
|
|
187
191
|
for (const relation of relations) {
|
|
188
192
|
if (relation.type !== "one") continue;
|
|
193
|
+
if (relation.foreignKey === false) continue;
|
|
189
194
|
const fieldName = getRelationFieldName(relation.name, usedNames);
|
|
190
195
|
usedNames.add(fieldName);
|
|
191
196
|
const relationName = getRelationName(namespace, table.name, relation.name, relation.table.name);
|
|
@@ -207,6 +212,7 @@ function generateRelationFields(table, namespace, fieldNameByColumn, columnByNam
|
|
|
207
212
|
}
|
|
208
213
|
for (const relation of relations) {
|
|
209
214
|
if (relation.type !== "many") continue;
|
|
215
|
+
if (relation.foreignKey === false) continue;
|
|
210
216
|
const matchingOne = findMatchingOneRelation(relation);
|
|
211
217
|
const relationName = matchingOne ? getRelationName(namespace, matchingOne.referencer.name, matchingOne.name, matchingOne.table.name) : getRelationName(namespace, relation.referencer.name, relation.name, relation.table.name);
|
|
212
218
|
const fieldName = getRelationFieldName(relation.name, usedNames);
|
|
@@ -215,7 +221,7 @@ function generateRelationFields(table, namespace, fieldNameByColumn, columnByNam
|
|
|
215
221
|
lines.push(` ${fieldName} ${relatedModel}[] @relation("${relationName}")`);
|
|
216
222
|
}
|
|
217
223
|
const inverseCandidates = [];
|
|
218
|
-
for (const sourceTable of fieldNameByTableColumn.keys()) for (const rel of Object.values(sourceTable.relations)) if (rel.type === "one" && rel.table === table) inverseCandidates.push(rel);
|
|
224
|
+
for (const sourceTable of fieldNameByTableColumn.keys()) for (const rel of Object.values(sourceTable.relations)) if (rel.type === "one" && rel.table === table && rel.foreignKey !== false) inverseCandidates.push(rel);
|
|
219
225
|
for (const rel of inverseCandidates.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
220
226
|
if (findMatchingManyRelation(rel)) continue;
|
|
221
227
|
const baseName = rel.referencer.name;
|
|
@@ -254,14 +260,19 @@ function generateModel(table, namespace, provider, sqliteStorageMode, fieldNameB
|
|
|
254
260
|
function generatePrismaSchema(fragments, provider, options) {
|
|
255
261
|
const sqliteStorageMode = options?.sqliteStorageMode ?? (provider === "sqlite" ? sqliteStoragePrisma : sqliteStorageDefault);
|
|
256
262
|
const namingStrategy = options?.namingStrategy ?? defaultNamingStrategyForDatabase(provider);
|
|
257
|
-
const
|
|
258
|
-
const
|
|
259
|
-
const
|
|
260
|
-
if (
|
|
261
|
-
if (
|
|
262
|
-
return
|
|
263
|
+
const sortedFragments = [...fragments].sort((a, b) => {
|
|
264
|
+
const aInternal = a.schema === internalSchema;
|
|
265
|
+
const bInternal = b.schema === internalSchema;
|
|
266
|
+
if (aInternal) return -1;
|
|
267
|
+
if (bInternal) return 1;
|
|
268
|
+
return a.schema.name.localeCompare(b.schema.name);
|
|
263
269
|
});
|
|
264
|
-
const
|
|
270
|
+
const namespaces = [];
|
|
271
|
+
const seenNamespaces = /* @__PURE__ */ new Set();
|
|
272
|
+
for (const fragment of sortedFragments) if (!seenNamespaces.has(fragment.namespace)) {
|
|
273
|
+
seenNamespaces.add(fragment.namespace);
|
|
274
|
+
namespaces.push(fragment.namespace);
|
|
275
|
+
}
|
|
265
276
|
const fieldNameByTableColumn = /* @__PURE__ */ new Map();
|
|
266
277
|
const columnByTableName = /* @__PURE__ */ new Map();
|
|
267
278
|
for (const fragment of sortedFragments) for (const table of Object.values(fragment.schema.tables)) {
|
|
@@ -269,7 +280,7 @@ function generatePrismaSchema(fragments, provider, options) {
|
|
|
269
280
|
fieldNameByTableColumn.set(table, mapping.fieldNameByColumn);
|
|
270
281
|
columnByTableName.set(table, mapping.columnByName);
|
|
271
282
|
}
|
|
272
|
-
const headerNamespaces =
|
|
283
|
+
const headerNamespaces = namespaces.filter(Boolean);
|
|
273
284
|
const headerSuffix = headerNamespaces.length > 0 ? headerNamespaces.join(", ") : "(internal)";
|
|
274
285
|
const lines = [
|
|
275
286
|
"// Generated by Fragno Prisma adapter.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma.js","names":["exhaustiveCheck: never","lines: string[]","attributes: string[]","inverseCandidates: Relation[]","indexLines: string[]","models: string[]"],"sources":["../../src/schema-output/prisma.ts"],"sourcesContent":["import { parseVarchar } from \"../util/parse\";\nimport type { AnyColumn, AnySchema, AnyTable, Relation } from \"../schema/create\";\nimport {\n defaultNamingStrategyForDatabase,\n type SupportedDatabase,\n} from \"../adapters/generic-sql/driver-config\";\nimport type { SQLiteStorageMode } from \"../adapters/generic-sql/sqlite-storage\";\nimport { sqliteStorageDefault, sqliteStoragePrisma } from \"../adapters/generic-sql/sqlite-storage\";\nimport {\n sanitizeNamespace,\n createNamingResolver,\n type NamingResolver,\n type SqlNamingStrategy,\n} from \"../naming/sql-naming\";\n\nexport interface GeneratePrismaSchemaOptions {\n sqliteStorageMode?: SQLiteStorageMode;\n namingStrategy?: SqlNamingStrategy;\n}\n\nconst VALID_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nfunction isValidIdentifier(name: string): boolean {\n return VALID_IDENTIFIER.test(name);\n}\n\nfunction sanitizeIdentifier(name: string): string {\n const sanitized = name.replace(/[^A-Za-z0-9_]/g, \"_\");\n if (sanitized.length === 0) {\n return \"_\";\n }\n if (/^[0-9]/.test(sanitized)) {\n return `_${sanitized}`;\n }\n return sanitized;\n}\n\nfunction ensureUniqueName(base: string, used: Set<string>): string {\n if (!used.has(base)) {\n return base;\n }\n let index = 1;\n let candidate = `${base}_${index}`;\n while (used.has(candidate)) {\n index += 1;\n candidate = `${base}_${index}`;\n }\n return candidate;\n}\n\nfunction toPascalCase(value: string): string {\n return value\n .split(/[_-]+/)\n .filter(Boolean)\n .map((part) => part[0]?.toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction isVarcharType(value: string): value is `varchar(${number})` {\n return value.startsWith(\"varchar(\");\n}\n\nfunction getModelName(table: AnyTable, namespace: string | null): string {\n const base = toPascalCase(table.name);\n if (!namespace) {\n return base;\n }\n return `${base}_${sanitizeNamespace(namespace)}`;\n}\n\nfunction getPhysicalTableName(table: AnyTable, resolver?: NamingResolver): string {\n return resolver ? resolver.getTableName(table.name) : table.name;\n}\n\nfunction getRelationName(\n namespace: string | null,\n from: string,\n referenceName: string,\n to: string,\n): string {\n if (!namespace) {\n return `${from}_${referenceName}_${to}`;\n }\n return `${namespace}_${from}_${referenceName}_${to}`;\n}\n\nfunction getForeignKeyMapName(\n table: AnyTable,\n relation: Relation,\n _namespace: string | null,\n resolver?: NamingResolver,\n): string {\n if (resolver) {\n return resolver.getForeignKeyName({\n logicalTable: table.name,\n logicalReferencedTable: relation.table.name,\n referenceName: relation.name,\n });\n }\n return `${table.name}_${relation.table.name}_${relation.name}_fk`;\n}\n\nfunction getIndexMapName(\n indexName: string,\n tableName: string,\n namespace: string | null,\n resolver?: NamingResolver,\n unique?: boolean,\n): string {\n if (!resolver) {\n return namespace ? `${indexName}_${namespace}` : indexName;\n }\n return unique\n ? resolver.getUniqueIndexName(indexName, tableName)\n : resolver.getIndexName(indexName, tableName);\n}\n\nfunction getPrismaScalarType(\n column: AnyColumn,\n provider: SupportedDatabase,\n sqliteStorageMode: SQLiteStorageMode,\n): { type: string; nativeType?: string } {\n const internalIdType = provider === \"sqlite\" ? \"Int\" : \"BigInt\";\n\n if (column.role === \"internal-id\") {\n return { type: internalIdType };\n }\n\n if (column.role === \"reference\") {\n return { type: internalIdType };\n }\n\n if (isVarcharType(column.type)) {\n const length = parseVarchar(column.type);\n if (provider === \"postgresql\" || provider === \"mysql\") {\n return { type: \"String\", nativeType: `@db.VarChar(${length})` };\n }\n return { type: \"String\" };\n }\n\n switch (column.type) {\n case \"string\":\n return { type: \"String\" };\n case \"integer\":\n return { type: \"Int\" };\n case \"bigint\":\n if (provider === \"sqlite\" && sqliteStorageMode.bigintStorage === \"blob\") {\n return { type: \"Bytes\" };\n }\n return { type: \"BigInt\" };\n case \"bool\":\n return { type: \"Boolean\" };\n case \"decimal\":\n if (provider === \"sqlite\") {\n return { type: \"Float\" };\n }\n return { type: \"Decimal\" };\n case \"binary\":\n return { type: \"Bytes\" };\n case \"json\":\n if (provider === \"postgresql\") {\n return { type: \"Json\", nativeType: \"@db.Json\" };\n }\n return { type: \"Json\" };\n case \"timestamp\":\n if (provider === \"sqlite\" && sqliteStorageMode.timestampStorage === \"epoch-ms\") {\n return { type: \"Int\" };\n }\n return { type: \"DateTime\" };\n case \"date\":\n if (provider === \"sqlite\" && sqliteStorageMode.dateStorage === \"epoch-ms\") {\n return { type: \"Int\" };\n }\n if (provider === \"postgresql\" || provider === \"mysql\") {\n return { type: \"DateTime\", nativeType: \"@db.Date\" };\n }\n return { type: \"DateTime\" };\n default: {\n const exhaustiveCheck: never = column.type;\n throw new Error(`Unsupported column type: ${exhaustiveCheck}`);\n }\n }\n}\n\nfunction formatDefaultValue(value: unknown): string {\n if (value instanceof Date) {\n return JSON.stringify(value.toISOString());\n }\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return JSON.stringify(value);\n}\n\nfunction getColumnDefault(\n column: AnyColumn,\n provider: SupportedDatabase,\n sqliteStorageMode: SQLiteStorageMode,\n): string | undefined {\n if (!column.default) {\n return undefined;\n }\n\n if (\"value\" in column.default) {\n return `@default(${formatDefaultValue(column.default.value)})`;\n }\n\n if (\"dbSpecial\" in column.default && column.default.dbSpecial === \"now\") {\n const scalar = getPrismaScalarType(column, provider, sqliteStorageMode);\n if (scalar.type === \"DateTime\") {\n return \"@default(now())\";\n }\n if (provider === \"sqlite\") {\n const storage =\n column.type === \"date\" ? sqliteStorageMode.dateStorage : sqliteStorageMode.timestampStorage;\n if (storage === \"epoch-ms\") {\n return `@default(dbgenerated(\"CURRENT_TIMESTAMP\"))`;\n }\n }\n }\n\n return undefined;\n}\n\nfunction getColumnFieldName(\n columnName: string,\n usedNames: Set<string>,\n): { fieldName: string; needsMap: boolean } {\n const isValid = isValidIdentifier(columnName);\n const baseName = isValid ? columnName : sanitizeIdentifier(columnName);\n const fieldName = ensureUniqueName(baseName, usedNames);\n return { fieldName, needsMap: fieldName !== columnName };\n}\n\nfunction getRelationFieldName(baseName: string, usedNames: Set<string>): string {\n const validBase = isValidIdentifier(baseName) ? baseName : sanitizeIdentifier(baseName);\n return ensureUniqueName(validBase, usedNames);\n}\n\nfunction isRelationOptional(relation: Relation, columnFieldNames: Map<string, AnyColumn>): boolean {\n for (const [localColumn] of relation.on) {\n const column = columnFieldNames.get(localColumn);\n if (column?.isNullable) {\n return true;\n }\n }\n return false;\n}\n\nfunction getColumnFieldMappings(table: AnyTable): {\n fieldNameByColumn: Map<string, string>;\n columnByName: Map<string, AnyColumn>;\n} {\n const fieldNameByColumn = new Map<string, string>();\n const columnByName = new Map<string, AnyColumn>();\n const usedNames = new Set<string>();\n\n for (const column of Object.values(table.columns)) {\n const { fieldName } = getColumnFieldName(column.name, usedNames);\n usedNames.add(fieldName);\n fieldNameByColumn.set(column.name, fieldName);\n columnByName.set(column.name, column);\n }\n\n return { fieldNameByColumn, columnByName };\n}\n\nfunction areInverseRelations(one: Relation, many: Relation): boolean {\n if (one.type !== \"one\" || many.type !== \"many\") {\n return false;\n }\n if (one.referencer !== many.table || one.table !== many.referencer) {\n return false;\n }\n return one.on.every(([left, right]) =>\n many.on.some(([manyLeft, manyRight]) => manyLeft === right && manyRight === left),\n );\n}\n\nfunction findMatchingManyRelation(one: Relation): Relation | undefined {\n for (const relation of Object.values(one.table.relations)) {\n if (relation.type !== \"many\") {\n continue;\n }\n if (areInverseRelations(one, relation)) {\n return relation;\n }\n }\n return undefined;\n}\n\nfunction findMatchingOneRelation(many: Relation): Relation | undefined {\n for (const relation of Object.values(many.table.relations)) {\n if (relation.type !== \"one\") {\n continue;\n }\n if (areInverseRelations(relation, many)) {\n return relation;\n }\n }\n return undefined;\n}\n\nfunction generateColumnFields(\n table: AnyTable,\n provider: SupportedDatabase,\n sqliteStorageMode: SQLiteStorageMode,\n fieldNameByColumn: Map<string, string>,\n resolver?: NamingResolver,\n): string[] {\n const lines: string[] = [];\n\n for (const column of Object.values(table.columns)) {\n const fieldName = fieldNameByColumn.get(column.name)!;\n const scalar = getPrismaScalarType(column, provider, sqliteStorageMode);\n const isOptional = column.isNullable;\n\n const attributes: string[] = [];\n\n if (column.role === \"internal-id\") {\n attributes.push(\"@id\", \"@default(autoincrement())\");\n }\n\n if (column.role === \"external-id\") {\n attributes.push(\"@unique\", \"@default(cuid())\");\n }\n\n const defaultValue = getColumnDefault(column, provider, sqliteStorageMode);\n if (defaultValue) {\n attributes.push(defaultValue);\n }\n\n if (scalar.nativeType) {\n attributes.push(scalar.nativeType);\n }\n\n const physicalName = resolver ? resolver.getColumnName(table.name, column.name) : column.name;\n if (fieldName !== physicalName) {\n attributes.push(`@map(\"${physicalName}\")`);\n }\n\n const suffix = isOptional ? \"?\" : \"\";\n const attrSuffix = attributes.length > 0 ? ` ${attributes.join(\" \")}` : \"\";\n lines.push(` ${fieldName} ${scalar.type}${suffix}${attrSuffix}`);\n }\n\n return lines;\n}\n\nfunction generateRelationFields(\n table: AnyTable,\n namespace: string | null,\n fieldNameByColumn: Map<string, string>,\n columnByName: Map<string, AnyColumn>,\n fieldNameByTableColumn: Map<AnyTable, Map<string, string>>,\n resolver?: NamingResolver,\n): string[] {\n const lines: string[] = [];\n const usedNames = new Set<string>(fieldNameByColumn.values());\n const relations = Object.values(table.relations)\n .slice()\n .sort((a, b) => a.name.localeCompare(b.name));\n\n for (const relation of relations) {\n if (relation.type !== \"one\") {\n continue;\n }\n\n const fieldName = getRelationFieldName(relation.name, usedNames);\n usedNames.add(fieldName);\n\n const relationName = getRelationName(namespace, table.name, relation.name, relation.table.name);\n\n const relatedModel = getModelName(relation.table, namespace);\n const localFields = relation.on.map(([left]) => fieldNameByColumn.get(left) ?? left);\n const referenceFields = relation.on.map(([, right]) => {\n const actualRight = right === \"id\" ? \"_internalId\" : right;\n const refFieldNames = fieldNameByTableColumn.get(relation.table);\n return refFieldNames?.get(actualRight) ?? actualRight;\n });\n\n const fkMapName = getForeignKeyMapName(table, relation, namespace, resolver);\n\n const relationParts = [\n `\"${relationName}\"`,\n `fields: [${localFields.join(\", \")}]`,\n `references: [${referenceFields.join(\", \")}]`,\n `map: \"${fkMapName}\"`,\n ];\n\n const optional = isRelationOptional(relation, columnByName);\n const suffix = optional ? \"?\" : \"\";\n\n lines.push(` ${fieldName} ${relatedModel}${suffix} @relation(${relationParts.join(\", \")})`);\n }\n\n for (const relation of relations) {\n if (relation.type !== \"many\") {\n continue;\n }\n\n const matchingOne = findMatchingOneRelation(relation);\n const relationName = matchingOne\n ? getRelationName(\n namespace,\n matchingOne.referencer.name,\n matchingOne.name,\n matchingOne.table.name,\n )\n : getRelationName(namespace, relation.referencer.name, relation.name, relation.table.name);\n\n const fieldName = getRelationFieldName(relation.name, usedNames);\n usedNames.add(fieldName);\n\n const relatedModel = getModelName(relation.table, namespace);\n lines.push(` ${fieldName} ${relatedModel}[] @relation(\"${relationName}\")`);\n }\n\n const inverseCandidates: Relation[] = [];\n for (const sourceTable of fieldNameByTableColumn.keys()) {\n for (const rel of Object.values(sourceTable.relations)) {\n if (rel.type === \"one\" && rel.table === table) {\n inverseCandidates.push(rel);\n }\n }\n }\n\n for (const rel of inverseCandidates.sort((a, b) => a.name.localeCompare(b.name))) {\n const matchingMany = findMatchingManyRelation(rel);\n if (matchingMany) {\n continue;\n }\n\n const baseName = rel.referencer.name;\n let fieldName = baseName;\n if (usedNames.has(fieldName)) {\n fieldName = `${baseName}_${rel.name}`;\n }\n fieldName = getRelationFieldName(fieldName, usedNames);\n usedNames.add(fieldName);\n\n const relationName = getRelationName(namespace, rel.referencer.name, rel.name, rel.table.name);\n\n const relatedModel = getModelName(rel.referencer, namespace);\n lines.push(` ${fieldName} ${relatedModel}[] @relation(\"${relationName}\")`);\n }\n\n return lines;\n}\n\nfunction generateModel(\n table: AnyTable,\n namespace: string | null,\n provider: SupportedDatabase,\n sqliteStorageMode: SQLiteStorageMode,\n fieldNameByTableColumn: Map<AnyTable, Map<string, string>>,\n columnByTableName: Map<AnyTable, Map<string, AnyColumn>>,\n resolver?: NamingResolver,\n): string {\n const modelName = getModelName(table, namespace);\n const physicalName = getPhysicalTableName(table, resolver);\n\n const fieldNameByColumn = fieldNameByTableColumn.get(table)!;\n const columnByName = columnByTableName.get(table)!;\n\n const fieldLines = [\n ...generateColumnFields(table, provider, sqliteStorageMode, fieldNameByColumn, resolver),\n ...generateRelationFields(\n table,\n namespace,\n fieldNameByColumn,\n columnByName,\n fieldNameByTableColumn,\n resolver,\n ),\n ];\n\n const indexLines: string[] = [];\n const sortedIndexes = Object.values(table.indexes)\n .slice()\n .sort((a, b) => a.name.localeCompare(b.name));\n\n for (const index of sortedIndexes) {\n const fields = index.columnNames\n .map((name) => fieldNameByColumn.get(name as string) ?? name)\n .join(\", \");\n const mapName = getIndexMapName(index.name, table.name, namespace, resolver, index.unique);\n const directive = index.unique ? \"@@unique\" : \"@@index\";\n indexLines.push(` ${directive}([${fields}], map: \"${mapName}\")`);\n }\n\n indexLines.push(` @@map(\"${physicalName}\")`);\n\n const lines = [`model ${modelName} {`, ...fieldLines, ...indexLines, `}`];\n return lines.join(\"\\n\");\n}\n\nexport function generatePrismaSchema(\n fragments: { namespace: string | null; schema: AnySchema }[],\n provider: SupportedDatabase,\n options?: GeneratePrismaSchemaOptions,\n): string {\n const sqliteStorageMode =\n options?.sqliteStorageMode ??\n (provider === \"sqlite\" ? sqliteStoragePrisma : sqliteStorageDefault);\n const namingStrategy = options?.namingStrategy ?? defaultNamingStrategyForDatabase(provider);\n const namespaces = Array.from(new Set(fragments.map((fragment) => fragment.namespace)));\n const sortedNamespaces = namespaces.sort((a, b) => {\n const aKey = a ?? \"\";\n const bKey = b ?? \"\";\n if (aKey === \"\") {\n return -1;\n }\n if (bKey === \"\") {\n return 1;\n }\n return aKey.localeCompare(bKey);\n });\n\n const sortedFragments = sortedNamespaces\n .map((namespace) => fragments.find((fragment) => fragment.namespace === namespace))\n .filter((fragment): fragment is { namespace: string | null; schema: AnySchema } => !!fragment);\n\n const fieldNameByTableColumn = new Map<AnyTable, Map<string, string>>();\n const columnByTableName = new Map<AnyTable, Map<string, AnyColumn>>();\n\n for (const fragment of sortedFragments) {\n for (const table of Object.values(fragment.schema.tables)) {\n const mapping = getColumnFieldMappings(table);\n fieldNameByTableColumn.set(table, mapping.fieldNameByColumn);\n columnByTableName.set(table, mapping.columnByName);\n }\n }\n\n const headerNamespaces = sortedNamespaces.filter(Boolean);\n const headerSuffix = headerNamespaces.length > 0 ? headerNamespaces.join(\", \") : \"(internal)\";\n const lines: string[] = [\n \"// Generated by Fragno Prisma adapter.\",\n `// Provider: ${provider}`,\n `// Namespaces: ${headerSuffix}`,\n \"\",\n ];\n\n const models: string[] = [];\n\n for (const fragment of sortedFragments) {\n const resolver = createNamingResolver(fragment.schema, fragment.namespace, namingStrategy);\n const tables = Object.values(fragment.schema.tables)\n .slice()\n .sort((a, b) => {\n const aName = getPhysicalTableName(a, resolver);\n const bName = getPhysicalTableName(b, resolver);\n return aName.localeCompare(bName);\n });\n\n for (const table of tables) {\n models.push(\n generateModel(\n table,\n fragment.namespace,\n provider,\n sqliteStorageMode,\n fieldNameByTableColumn,\n columnByTableName,\n resolver,\n ),\n );\n }\n }\n\n lines.push(models.join(\"\\n\\n\"));\n return lines.join(\"\\n\");\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prisma.js","names":["exhaustiveCheck: never","lines: string[]","attributes: string[]","inverseCandidates: Relation[]","indexLines: string[]","namespaces: Array<string | null>","models: string[]"],"sources":["../../src/schema-output/prisma.ts"],"sourcesContent":["import {\n defaultNamingStrategyForDatabase,\n type SupportedDatabase,\n} from \"../adapters/generic-sql/driver-config\";\nimport type { SQLiteStorageMode } from \"../adapters/generic-sql/sqlite-storage\";\nimport { sqliteStorageDefault, sqliteStoragePrisma } from \"../adapters/generic-sql/sqlite-storage\";\nimport { internalSchema } from \"../fragments/internal-fragment.schema\";\nimport {\n sanitizeNamespace,\n createNamingResolver,\n type NamingResolver,\n type SqlNamingStrategy,\n} from \"../naming/sql-naming\";\nimport type { AnyColumn, AnySchema, AnyTable, Relation } from \"../schema/create\";\nimport { parseVarchar } from \"../util/parse\";\n\nexport interface GeneratePrismaSchemaOptions {\n sqliteStorageMode?: SQLiteStorageMode;\n namingStrategy?: SqlNamingStrategy;\n}\n\nconst VALID_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nfunction isValidIdentifier(name: string): boolean {\n return VALID_IDENTIFIER.test(name);\n}\n\nfunction sanitizeIdentifier(name: string): string {\n const sanitized = name.replace(/[^A-Za-z0-9_]/g, \"_\");\n if (sanitized.length === 0) {\n return \"_\";\n }\n if (/^[0-9]/.test(sanitized)) {\n return `_${sanitized}`;\n }\n return sanitized;\n}\n\nfunction ensureUniqueName(base: string, used: Set<string>): string {\n if (!used.has(base)) {\n return base;\n }\n let index = 1;\n let candidate = `${base}_${index}`;\n while (used.has(candidate)) {\n index += 1;\n candidate = `${base}_${index}`;\n }\n return candidate;\n}\n\nfunction toPascalCase(value: string): string {\n return value\n .split(/[_-]+/)\n .filter(Boolean)\n .map((part) => part[0]?.toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction isVarcharType(value: string): value is `varchar(${number})` {\n return value.startsWith(\"varchar(\");\n}\n\nfunction getModelName(table: AnyTable, namespace: string | null): string {\n const base = toPascalCase(table.name);\n if (!namespace) {\n return base;\n }\n return `${base}_${sanitizeNamespace(namespace)}`;\n}\n\nfunction getPhysicalTableName(table: AnyTable, resolver?: NamingResolver): string {\n return resolver ? resolver.getTableName(table.name) : table.name;\n}\n\nfunction getRelationName(\n namespace: string | null,\n from: string,\n referenceName: string,\n to: string,\n): string {\n if (!namespace) {\n return `${from}_${referenceName}_${to}`;\n }\n return `${namespace}_${from}_${referenceName}_${to}`;\n}\n\nfunction getForeignKeyMapName(\n table: AnyTable,\n relation: Relation,\n _namespace: string | null,\n resolver?: NamingResolver,\n): string {\n if (resolver) {\n return resolver.getForeignKeyName({\n logicalTable: table.name,\n logicalReferencedTable: relation.table.name,\n referenceName: relation.name,\n });\n }\n return `${table.name}_${relation.table.name}_${relation.name}_fk`;\n}\n\nfunction getIndexMapName(\n indexName: string,\n tableName: string,\n namespace: string | null,\n resolver?: NamingResolver,\n unique?: boolean,\n): string {\n if (!resolver) {\n return namespace ? `${indexName}_${namespace}` : indexName;\n }\n return unique\n ? resolver.getUniqueIndexName(indexName, tableName)\n : resolver.getIndexName(indexName, tableName);\n}\n\nfunction getPrismaScalarType(\n column: AnyColumn,\n provider: SupportedDatabase,\n sqliteStorageMode: SQLiteStorageMode,\n): { type: string; nativeType?: string } {\n const internalIdType = provider === \"sqlite\" ? \"Int\" : \"BigInt\";\n\n if (column.role === \"internal-id\") {\n return { type: internalIdType };\n }\n\n if (column.role === \"reference\") {\n return { type: internalIdType };\n }\n\n if (isVarcharType(column.type)) {\n const length = parseVarchar(column.type);\n if (provider === \"postgresql\" || provider === \"mysql\") {\n return { type: \"String\", nativeType: `@db.VarChar(${length})` };\n }\n return { type: \"String\" };\n }\n\n switch (column.type) {\n case \"string\":\n return { type: \"String\" };\n case \"integer\":\n return { type: \"Int\" };\n case \"bigint\":\n if (provider === \"sqlite\" && sqliteStorageMode.bigintStorage === \"blob\") {\n return { type: \"Bytes\" };\n }\n return { type: \"BigInt\" };\n case \"bool\":\n return { type: \"Boolean\" };\n case \"decimal\":\n if (provider === \"sqlite\") {\n return { type: \"Float\" };\n }\n return { type: \"Decimal\" };\n case \"binary\":\n return { type: \"Bytes\" };\n case \"json\":\n if (provider === \"postgresql\") {\n return { type: \"Json\", nativeType: \"@db.Json\" };\n }\n return { type: \"Json\" };\n case \"timestamp\":\n if (provider === \"sqlite\" && sqliteStorageMode.timestampStorage === \"epoch-ms\") {\n return { type: \"Int\" };\n }\n return { type: \"DateTime\" };\n case \"date\":\n if (provider === \"sqlite\" && sqliteStorageMode.dateStorage === \"epoch-ms\") {\n return { type: \"Int\" };\n }\n if (provider === \"postgresql\" || provider === \"mysql\") {\n return { type: \"DateTime\", nativeType: \"@db.Date\" };\n }\n return { type: \"DateTime\" };\n default: {\n const exhaustiveCheck: never = column.type;\n throw new Error(`Unsupported column type: ${exhaustiveCheck}`);\n }\n }\n}\n\nfunction formatDefaultValue(value: unknown): string {\n if (value instanceof Date) {\n return JSON.stringify(value.toISOString());\n }\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return JSON.stringify(value);\n}\n\nfunction getColumnDefault(\n column: AnyColumn,\n provider: SupportedDatabase,\n sqliteStorageMode: SQLiteStorageMode,\n): string | undefined {\n if (!column.default) {\n return undefined;\n }\n\n if (\"value\" in column.default) {\n return `@default(${formatDefaultValue(column.default.value)})`;\n }\n\n if (\"dbSpecial\" in column.default && column.default.dbSpecial === \"now\") {\n const scalar = getPrismaScalarType(column, provider, sqliteStorageMode);\n if (scalar.type === \"DateTime\") {\n return \"@default(now())\";\n }\n if (provider === \"sqlite\") {\n const storage =\n column.type === \"date\" ? sqliteStorageMode.dateStorage : sqliteStorageMode.timestampStorage;\n if (storage === \"epoch-ms\") {\n return `@default(dbgenerated(\"CURRENT_TIMESTAMP\"))`;\n }\n }\n }\n\n return undefined;\n}\n\nfunction getColumnFieldName(\n columnName: string,\n usedNames: Set<string>,\n): { fieldName: string; needsMap: boolean } {\n const isValid = isValidIdentifier(columnName);\n const baseName = isValid ? columnName : sanitizeIdentifier(columnName);\n const fieldName = ensureUniqueName(baseName, usedNames);\n return { fieldName, needsMap: fieldName !== columnName };\n}\n\nfunction getRelationFieldName(baseName: string, usedNames: Set<string>): string {\n const validBase = isValidIdentifier(baseName) ? baseName : sanitizeIdentifier(baseName);\n return ensureUniqueName(validBase, usedNames);\n}\n\nfunction isRelationOptional(relation: Relation, columnFieldNames: Map<string, AnyColumn>): boolean {\n for (const [localColumn] of relation.on) {\n const column = columnFieldNames.get(localColumn);\n if (column?.isNullable) {\n return true;\n }\n }\n return false;\n}\n\nfunction getColumnFieldMappings(table: AnyTable): {\n fieldNameByColumn: Map<string, string>;\n columnByName: Map<string, AnyColumn>;\n} {\n const fieldNameByColumn = new Map<string, string>();\n const columnByName = new Map<string, AnyColumn>();\n const usedNames = new Set<string>();\n\n for (const column of Object.values(table.columns)) {\n const { fieldName } = getColumnFieldName(column.name, usedNames);\n usedNames.add(fieldName);\n fieldNameByColumn.set(column.name, fieldName);\n columnByName.set(column.name, column);\n }\n\n return { fieldNameByColumn, columnByName };\n}\n\nfunction areInverseRelations(one: Relation, many: Relation): boolean {\n if (one.type !== \"one\" || many.type !== \"many\") {\n return false;\n }\n if (one.foreignKey === false || many.foreignKey === false) {\n return false;\n }\n if (one.referencer !== many.table || one.table !== many.referencer) {\n return false;\n }\n return one.on.every(([left, right]) =>\n many.on.some(([manyLeft, manyRight]) => manyLeft === right && manyRight === left),\n );\n}\n\nfunction findMatchingManyRelation(one: Relation): Relation | undefined {\n for (const relation of Object.values(one.table.relations)) {\n if (relation.type !== \"many\") {\n continue;\n }\n if (relation.foreignKey === false) {\n continue;\n }\n if (areInverseRelations(one, relation)) {\n return relation;\n }\n }\n return undefined;\n}\n\nfunction findMatchingOneRelation(many: Relation): Relation | undefined {\n for (const relation of Object.values(many.table.relations)) {\n if (relation.type !== \"one\") {\n continue;\n }\n if (relation.foreignKey === false) {\n continue;\n }\n if (areInverseRelations(relation, many)) {\n return relation;\n }\n }\n return undefined;\n}\n\nfunction generateColumnFields(\n table: AnyTable,\n provider: SupportedDatabase,\n sqliteStorageMode: SQLiteStorageMode,\n fieldNameByColumn: Map<string, string>,\n resolver?: NamingResolver,\n): string[] {\n const lines: string[] = [];\n\n for (const column of Object.values(table.columns)) {\n const fieldName = fieldNameByColumn.get(column.name)!;\n const scalar = getPrismaScalarType(column, provider, sqliteStorageMode);\n const isOptional = column.isNullable;\n\n const attributes: string[] = [];\n\n if (column.role === \"internal-id\") {\n attributes.push(\"@id\", \"@default(autoincrement())\");\n }\n\n if (column.role === \"external-id\") {\n attributes.push(\"@unique\", \"@default(cuid())\");\n }\n\n const defaultValue = getColumnDefault(column, provider, sqliteStorageMode);\n if (defaultValue) {\n attributes.push(defaultValue);\n }\n\n if (scalar.nativeType) {\n attributes.push(scalar.nativeType);\n }\n\n const physicalName = resolver ? resolver.getColumnName(table.name, column.name) : column.name;\n if (fieldName !== physicalName) {\n attributes.push(`@map(\"${physicalName}\")`);\n }\n\n const suffix = isOptional ? \"?\" : \"\";\n const attrSuffix = attributes.length > 0 ? ` ${attributes.join(\" \")}` : \"\";\n lines.push(` ${fieldName} ${scalar.type}${suffix}${attrSuffix}`);\n }\n\n return lines;\n}\n\nfunction generateRelationFields(\n table: AnyTable,\n namespace: string | null,\n fieldNameByColumn: Map<string, string>,\n columnByName: Map<string, AnyColumn>,\n fieldNameByTableColumn: Map<AnyTable, Map<string, string>>,\n resolver?: NamingResolver,\n): string[] {\n const lines: string[] = [];\n const usedNames = new Set<string>(fieldNameByColumn.values());\n const relations = Object.values(table.relations)\n .slice()\n .sort((a, b) => a.name.localeCompare(b.name));\n\n for (const relation of relations) {\n if (relation.type !== \"one\") {\n continue;\n }\n if (relation.foreignKey === false) {\n continue;\n }\n\n const fieldName = getRelationFieldName(relation.name, usedNames);\n usedNames.add(fieldName);\n\n const relationName = getRelationName(namespace, table.name, relation.name, relation.table.name);\n\n const relatedModel = getModelName(relation.table, namespace);\n const localFields = relation.on.map(([left]) => fieldNameByColumn.get(left) ?? left);\n const referenceFields = relation.on.map(([, right]) => {\n const actualRight = right === \"id\" ? \"_internalId\" : right;\n const refFieldNames = fieldNameByTableColumn.get(relation.table);\n return refFieldNames?.get(actualRight) ?? actualRight;\n });\n\n const fkMapName = getForeignKeyMapName(table, relation, namespace, resolver);\n\n const relationParts = [\n `\"${relationName}\"`,\n `fields: [${localFields.join(\", \")}]`,\n `references: [${referenceFields.join(\", \")}]`,\n `map: \"${fkMapName}\"`,\n ];\n\n const optional = isRelationOptional(relation, columnByName);\n const suffix = optional ? \"?\" : \"\";\n\n lines.push(` ${fieldName} ${relatedModel}${suffix} @relation(${relationParts.join(\", \")})`);\n }\n\n for (const relation of relations) {\n if (relation.type !== \"many\") {\n continue;\n }\n if (relation.foreignKey === false) {\n continue;\n }\n\n const matchingOne = findMatchingOneRelation(relation);\n const relationName = matchingOne\n ? getRelationName(\n namespace,\n matchingOne.referencer.name,\n matchingOne.name,\n matchingOne.table.name,\n )\n : getRelationName(namespace, relation.referencer.name, relation.name, relation.table.name);\n\n const fieldName = getRelationFieldName(relation.name, usedNames);\n usedNames.add(fieldName);\n\n const relatedModel = getModelName(relation.table, namespace);\n lines.push(` ${fieldName} ${relatedModel}[] @relation(\"${relationName}\")`);\n }\n\n const inverseCandidates: Relation[] = [];\n for (const sourceTable of fieldNameByTableColumn.keys()) {\n for (const rel of Object.values(sourceTable.relations)) {\n if (rel.type === \"one\" && rel.table === table && rel.foreignKey !== false) {\n inverseCandidates.push(rel);\n }\n }\n }\n\n for (const rel of inverseCandidates.sort((a, b) => a.name.localeCompare(b.name))) {\n const matchingMany = findMatchingManyRelation(rel);\n if (matchingMany) {\n continue;\n }\n\n const baseName = rel.referencer.name;\n let fieldName = baseName;\n if (usedNames.has(fieldName)) {\n fieldName = `${baseName}_${rel.name}`;\n }\n fieldName = getRelationFieldName(fieldName, usedNames);\n usedNames.add(fieldName);\n\n const relationName = getRelationName(namespace, rel.referencer.name, rel.name, rel.table.name);\n\n const relatedModel = getModelName(rel.referencer, namespace);\n lines.push(` ${fieldName} ${relatedModel}[] @relation(\"${relationName}\")`);\n }\n\n return lines;\n}\n\nfunction generateModel(\n table: AnyTable,\n namespace: string | null,\n provider: SupportedDatabase,\n sqliteStorageMode: SQLiteStorageMode,\n fieldNameByTableColumn: Map<AnyTable, Map<string, string>>,\n columnByTableName: Map<AnyTable, Map<string, AnyColumn>>,\n resolver?: NamingResolver,\n): string {\n const modelName = getModelName(table, namespace);\n const physicalName = getPhysicalTableName(table, resolver);\n\n const fieldNameByColumn = fieldNameByTableColumn.get(table)!;\n const columnByName = columnByTableName.get(table)!;\n\n const fieldLines = [\n ...generateColumnFields(table, provider, sqliteStorageMode, fieldNameByColumn, resolver),\n ...generateRelationFields(\n table,\n namespace,\n fieldNameByColumn,\n columnByName,\n fieldNameByTableColumn,\n resolver,\n ),\n ];\n\n const indexLines: string[] = [];\n const sortedIndexes = Object.values(table.indexes)\n .slice()\n .sort((a, b) => a.name.localeCompare(b.name));\n\n for (const index of sortedIndexes) {\n const fields = index.columnNames\n .map((name) => fieldNameByColumn.get(name as string) ?? name)\n .join(\", \");\n const mapName = getIndexMapName(index.name, table.name, namespace, resolver, index.unique);\n const directive = index.unique ? \"@@unique\" : \"@@index\";\n indexLines.push(` ${directive}([${fields}], map: \"${mapName}\")`);\n }\n\n indexLines.push(` @@map(\"${physicalName}\")`);\n\n const lines = [`model ${modelName} {`, ...fieldLines, ...indexLines, `}`];\n return lines.join(\"\\n\");\n}\n\nexport function generatePrismaSchema(\n fragments: { namespace: string | null; schema: AnySchema }[],\n provider: SupportedDatabase,\n options?: GeneratePrismaSchemaOptions,\n): string {\n const sqliteStorageMode =\n options?.sqliteStorageMode ??\n (provider === \"sqlite\" ? sqliteStoragePrisma : sqliteStorageDefault);\n const namingStrategy = options?.namingStrategy ?? defaultNamingStrategyForDatabase(provider);\n const sortedFragments = [...fragments].sort((a, b) => {\n const aInternal = a.schema === internalSchema;\n const bInternal = b.schema === internalSchema;\n if (aInternal) {\n return -1;\n }\n if (bInternal) {\n return 1;\n }\n return a.schema.name.localeCompare(b.schema.name);\n });\n\n const namespaces: Array<string | null> = [];\n const seenNamespaces = new Set<string | null>();\n for (const fragment of sortedFragments) {\n if (!seenNamespaces.has(fragment.namespace)) {\n seenNamespaces.add(fragment.namespace);\n namespaces.push(fragment.namespace);\n }\n }\n\n const fieldNameByTableColumn = new Map<AnyTable, Map<string, string>>();\n const columnByTableName = new Map<AnyTable, Map<string, AnyColumn>>();\n\n for (const fragment of sortedFragments) {\n for (const table of Object.values(fragment.schema.tables)) {\n const mapping = getColumnFieldMappings(table);\n fieldNameByTableColumn.set(table, mapping.fieldNameByColumn);\n columnByTableName.set(table, mapping.columnByName);\n }\n }\n\n const headerNamespaces = namespaces.filter(Boolean);\n const headerSuffix = headerNamespaces.length > 0 ? headerNamespaces.join(\", \") : \"(internal)\";\n const lines: string[] = [\n \"// Generated by Fragno Prisma adapter.\",\n `// Provider: ${provider}`,\n `// Namespaces: ${headerSuffix}`,\n \"\",\n ];\n\n const models: string[] = [];\n\n for (const fragment of sortedFragments) {\n const resolver = createNamingResolver(fragment.schema, fragment.namespace, namingStrategy);\n const tables = Object.values(fragment.schema.tables)\n .slice()\n .sort((a, b) => {\n const aName = getPhysicalTableName(a, resolver);\n const bName = getPhysicalTableName(b, resolver);\n return aName.localeCompare(bName);\n });\n\n for (const table of tables) {\n models.push(\n generateModel(\n table,\n fragment.namespace,\n provider,\n sqliteStorageMode,\n fieldNameByTableColumn,\n columnByTableName,\n resolver,\n ),\n );\n }\n }\n\n lines.push(models.join(\"\\n\\n\"));\n return lines.join(\"\\n\");\n}\n"],"mappings":"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"}
|
|
@@ -34,14 +34,12 @@ var DurableObjectDialect = class {
|
|
|
34
34
|
};
|
|
35
35
|
var DurableObjectDriver = class {
|
|
36
36
|
#config;
|
|
37
|
-
#connection = null;
|
|
38
37
|
constructor(config) {
|
|
39
38
|
this.#config = config;
|
|
40
39
|
}
|
|
41
40
|
async init() {}
|
|
42
41
|
async acquireConnection() {
|
|
43
|
-
|
|
44
|
-
return this.#connection;
|
|
42
|
+
return new DOConnection(this.#config);
|
|
45
43
|
}
|
|
46
44
|
async beginTransaction(conn) {
|
|
47
45
|
return await conn.beginTransaction();
|
|
@@ -52,12 +50,8 @@ var DurableObjectDriver = class {
|
|
|
52
50
|
async rollbackTransaction(conn) {
|
|
53
51
|
return await conn.rollbackTransaction();
|
|
54
52
|
}
|
|
55
|
-
async releaseConnection(_conn) {
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
async destroy() {
|
|
59
|
-
this.#connection = null;
|
|
60
|
-
}
|
|
53
|
+
async releaseConnection(_conn) {}
|
|
54
|
+
async destroy() {}
|
|
61
55
|
};
|
|
62
56
|
var DOConnection = class {
|
|
63
57
|
#config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"durable-object-dialect.js","names":["#config","#
|
|
1
|
+
{"version":3,"file":"durable-object-dialect.js","names":["#config","#transactionPromise","transactionReady: (() => void) | null","#txn","#transactionControl"],"sources":["../../../src/sql-driver/dialects/durable-object-dialect.ts"],"sourcesContent":["import {\n CompiledQuery,\n Kysely,\n SqliteAdapter,\n SqliteIntrospector,\n SqliteQueryCompiler,\n type DatabaseConnection,\n type DatabaseIntrospector,\n type Dialect,\n type Driver,\n type QueryCompiler,\n type QueryResult,\n} from \"kysely\";\n\ninterface DurableObjectId {\n toString(): string;\n equals(other: DurableObjectId): boolean;\n readonly name?: string;\n}\n\ninterface DurableObjectTransaction {\n rollback(): void;\n}\n\ntype SqlStorageValue = ArrayBuffer | string | number | null;\n\ninterface SqlStorage {\n exec<T extends Record<string, SqlStorageValue>>(\n query: string,\n // oxlint-disable-next-line no-explicit-any\n ...bindings: any[]\n ): SqlStorageCursor<T>;\n Cursor: typeof SqlStorageCursor;\n Statement: typeof SqlStorageStatement;\n}\n\ndeclare abstract class SqlStorageStatement {}\ndeclare abstract class SqlStorageCursor<T extends Record<string, SqlStorageValue>> {\n next():\n | {\n done?: false;\n value: T;\n }\n | {\n done: true;\n value?: never;\n };\n toArray(): T[];\n one(): T;\n raw<U extends SqlStorageValue[]>(): IterableIterator<U>;\n columnNames: string[];\n get rowsRead(): number;\n get rowsWritten(): number;\n [Symbol.iterator](): IterableIterator<T>;\n}\n\ninterface DurableObjectStorage {\n transaction<T>(closure: (txn: DurableObjectTransaction) => Promise<T>): Promise<T>;\n\n readonly sql: SqlStorage;\n}\n\ninterface DurableObjectState {\n readonly id: DurableObjectId;\n readonly storage: DurableObjectStorage;\n}\n\n/**\n * Config for the Durable Objects dialect. Pass your Durable Object state to this object.\n */\nexport interface DODialectConfig {\n ctx: DurableObjectState;\n}\n\n/**\n * DO dialect that adds support for [Cloudflare Durable Objects][0] in [Kysely][1].\n * The constructor takes the Durable Object state context.\n *\n * ```typescript\n * new DurableObjectDialect({\n * ctx: this.ctx,\n * })\n * ```\n *\n * [0]: https://developers.cloudflare.com/durable-objects/\n * [1]: https://github.com/koskimas/kysely\n */\nexport class DurableObjectDialect implements Dialect {\n #config: DODialectConfig;\n\n constructor(config: DODialectConfig) {\n this.#config = config;\n }\n\n createAdapter() {\n return new SqliteAdapter();\n }\n\n createDriver(): Driver {\n return new DurableObjectDriver(this.#config);\n }\n\n createQueryCompiler(): QueryCompiler {\n return new SqliteQueryCompiler();\n }\n\n createIntrospector(db: Kysely<unknown>): DatabaseIntrospector {\n return new SqliteIntrospector(db);\n }\n}\n\nclass DurableObjectDriver implements Driver {\n #config: DODialectConfig;\n\n constructor(config: DODialectConfig) {\n this.#config = config;\n }\n\n async init(): Promise<void> {}\n\n async acquireConnection(): Promise<DatabaseConnection> {\n return new DOConnection(this.#config);\n }\n\n async beginTransaction(conn: DOConnection): Promise<void> {\n return await conn.beginTransaction();\n }\n\n async commitTransaction(conn: DOConnection): Promise<void> {\n return await conn.commitTransaction();\n }\n\n async rollbackTransaction(conn: DOConnection): Promise<void> {\n return await conn.rollbackTransaction();\n }\n\n async releaseConnection(_conn: DOConnection): Promise<void> {\n // No-op\n }\n\n async destroy(): Promise<void> {\n // No-op\n }\n}\n\nclass DOConnection implements DatabaseConnection {\n #config: DODialectConfig;\n #transactionPromise: Promise<void> | null = null;\n #transactionControl: {\n resolve: () => void;\n reject: (error: Error) => void;\n } | null = null;\n #txn: DurableObjectTransaction | null = null;\n\n constructor(config: DODialectConfig) {\n this.#config = config;\n }\n\n async executeQuery<O>(compiledQuery: CompiledQuery): Promise<QueryResult<O>> {\n const cursor = this.#config.ctx.storage.sql.exec(\n compiledQuery.sql,\n ...compiledQuery.parameters,\n );\n\n const rows = cursor.toArray() as O[];\n const numAffectedRows = cursor.rowsWritten > 0 ? BigInt(cursor.rowsWritten) : undefined;\n\n return {\n insertId: undefined, // Durable Objects doesn't provide last_row_id like D1\n rows: rows || [],\n numAffectedRows,\n };\n }\n\n async beginTransaction() {\n if (this.#transactionPromise) {\n throw new Error(\"Transaction already in progress\");\n }\n\n // Use a promise to wait for the transaction closure to actually start\n let transactionReady: (() => void) | null = null;\n const readyPromise = new Promise<void>((resolve) => {\n transactionReady = resolve;\n });\n\n // Start the transaction - all queries executed will be inside this closure\n this.#transactionPromise = this.#config.ctx.storage\n .transaction(async (txn) => {\n this.#txn = txn;\n\n // Wait for commit or rollback to be called\n await new Promise<void>((resolve, reject) => {\n this.#transactionControl = { resolve, reject };\n // Signal that transaction is ready\n if (transactionReady) {\n transactionReady();\n }\n });\n })\n .catch((error) => {\n // Don't clear state here - let commit/rollback handle it\n throw error;\n });\n\n // Wait for the transaction closure to set up before returning\n await readyPromise;\n }\n\n async commitTransaction() {\n if (!this.#transactionPromise || !this.#transactionControl) {\n throw new Error(\"No transaction to commit\");\n }\n\n try {\n // Signal commit and wait for transaction to complete\n this.#transactionControl.resolve();\n await this.#transactionPromise;\n } finally {\n this.#transactionPromise = null;\n this.#transactionControl = null;\n this.#txn = null;\n }\n }\n\n async rollbackTransaction() {\n if (!this.#transactionPromise || !this.#transactionControl) {\n throw new Error(\"No transaction to rollback\");\n }\n\n try {\n // Signal rollback\n if (this.#txn) {\n this.#txn.rollback();\n }\n this.#transactionControl.reject(new Error(\"Transaction rolled back\"));\n\n // Wait for transaction to complete (will reject, but we catch it)\n await this.#transactionPromise.catch(() => {\n /* Expected to reject on rollback */\n });\n } finally {\n this.#transactionPromise = null;\n this.#transactionControl = null;\n this.#txn = null;\n }\n }\n\n // oxlint-disable-next-line require-yield\n async *streamQuery<O>(\n _compiledQuery: CompiledQuery,\n _chunkSize: number,\n ): AsyncIterableIterator<QueryResult<O>> {\n throw new Error(\"DO Driver does not support streaming\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAuFA,IAAa,uBAAb,MAAqD;CACnD;CAEA,YAAY,QAAyB;AACnC,QAAKA,SAAU;;CAGjB,gBAAgB;AACd,SAAO,IAAI,eAAe;;CAG5B,eAAuB;AACrB,SAAO,IAAI,oBAAoB,MAAKA,OAAQ;;CAG9C,sBAAqC;AACnC,SAAO,IAAI,qBAAqB;;CAGlC,mBAAmB,IAA2C;AAC5D,SAAO,IAAI,mBAAmB,GAAG;;;AAIrC,IAAM,sBAAN,MAA4C;CAC1C;CAEA,YAAY,QAAyB;AACnC,QAAKA,SAAU;;CAGjB,MAAM,OAAsB;CAE5B,MAAM,oBAAiD;AACrD,SAAO,IAAI,aAAa,MAAKA,OAAQ;;CAGvC,MAAM,iBAAiB,MAAmC;AACxD,SAAO,MAAM,KAAK,kBAAkB;;CAGtC,MAAM,kBAAkB,MAAmC;AACzD,SAAO,MAAM,KAAK,mBAAmB;;CAGvC,MAAM,oBAAoB,MAAmC;AAC3D,SAAO,MAAM,KAAK,qBAAqB;;CAGzC,MAAM,kBAAkB,OAAoC;CAI5D,MAAM,UAAyB;;AAKjC,IAAM,eAAN,MAAiD;CAC/C;CACA,sBAA4C;CAC5C,sBAGW;CACX,OAAwC;CAExC,YAAY,QAAyB;AACnC,QAAKA,SAAU;;CAGjB,MAAM,aAAgB,eAAuD;EAC3E,MAAM,SAAS,MAAKA,OAAQ,IAAI,QAAQ,IAAI,KAC1C,cAAc,KACd,GAAG,cAAc,WAClB;EAED,MAAM,OAAO,OAAO,SAAS;EAC7B,MAAM,kBAAkB,OAAO,cAAc,IAAI,OAAO,OAAO,YAAY,GAAG;AAE9E,SAAO;GACL,UAAU;GACV,MAAM,QAAQ,EAAE;GAChB;GACD;;CAGH,MAAM,mBAAmB;AACvB,MAAI,MAAKC,mBACP,OAAM,IAAI,MAAM,kCAAkC;EAIpD,IAAIC,mBAAwC;EAC5C,MAAM,eAAe,IAAI,SAAe,YAAY;AAClD,sBAAmB;IACnB;AAGF,QAAKD,qBAAsB,MAAKD,OAAQ,IAAI,QACzC,YAAY,OAAO,QAAQ;AAC1B,SAAKG,MAAO;AAGZ,SAAM,IAAI,SAAe,SAAS,WAAW;AAC3C,UAAKC,qBAAsB;KAAE;KAAS;KAAQ;AAE9C,QAAI,iBACF,mBAAkB;KAEpB;IACF,CACD,OAAO,UAAU;AAEhB,SAAM;IACN;AAGJ,QAAM;;CAGR,MAAM,oBAAoB;AACxB,MAAI,CAAC,MAAKH,sBAAuB,CAAC,MAAKG,mBACrC,OAAM,IAAI,MAAM,2BAA2B;AAG7C,MAAI;AAEF,SAAKA,mBAAoB,SAAS;AAClC,SAAM,MAAKH;YACH;AACR,SAAKA,qBAAsB;AAC3B,SAAKG,qBAAsB;AAC3B,SAAKD,MAAO;;;CAIhB,MAAM,sBAAsB;AAC1B,MAAI,CAAC,MAAKF,sBAAuB,CAAC,MAAKG,mBACrC,OAAM,IAAI,MAAM,6BAA6B;AAG/C,MAAI;AAEF,OAAI,MAAKD,IACP,OAAKA,IAAK,UAAU;AAEtB,SAAKC,mBAAoB,uBAAO,IAAI,MAAM,0BAA0B,CAAC;AAGrE,SAAM,MAAKH,mBAAoB,YAAY,GAEzC;YACM;AACR,SAAKA,qBAAsB;AAC3B,SAAKG,qBAAsB;AAC3B,SAAKD,MAAO;;;CAKhB,OAAO,YACL,gBACA,YACuC;AACvC,QAAM,IAAI,MAAM,uCAAuC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-query-executor.js","names":["#connectionProvider"],"sources":["../../../src/sql-driver/query-executor/default-query-executor.ts"],"sourcesContent":["/**\n * Adapted from Kysely's DefaultQueryExecutor\n * Modified from: https://github.com/kysely-org/kysely\n * License: MIT\n * Copyright (c) 2022 Sami Koskimäki\n *\n * Simplified to remove query compilation.\n */\n\nimport type {
|
|
1
|
+
{"version":3,"file":"default-query-executor.js","names":["#connectionProvider"],"sources":["../../../src/sql-driver/query-executor/default-query-executor.ts"],"sourcesContent":["/**\n * Adapted from Kysely's DefaultQueryExecutor\n * Modified from: https://github.com/kysely-org/kysely\n * License: MIT\n * Copyright (c) 2022 Sami Koskimäki\n *\n * Simplified to remove query compilation.\n */\n\nimport type { ConnectionProvider } from \"../connection/connection-provider\";\nimport type { DatabaseConnection } from \"../sql-driver\";\nimport type { GenericSQLPlugin } from \"./plugin\";\nimport { QueryExecutorBase } from \"./query-executor-base\";\n\nexport class DefaultQueryExecutor extends QueryExecutorBase {\n readonly #connectionProvider: ConnectionProvider;\n\n constructor(connectionProvider: ConnectionProvider, plugins: GenericSQLPlugin[] = []) {\n super(plugins);\n this.#connectionProvider = connectionProvider;\n }\n\n provideConnection<T>(consumer: (connection: DatabaseConnection) => Promise<T>): Promise<T> {\n return this.#connectionProvider.provideConnection(consumer);\n }\n\n withConnectionProvider(connectionProvider: ConnectionProvider): DefaultQueryExecutor {\n return new DefaultQueryExecutor(connectionProvider, [...this.plugins]);\n }\n\n withPlugin(plugin: GenericSQLPlugin): DefaultQueryExecutor {\n return new DefaultQueryExecutor(this.#connectionProvider, [...this.plugins, plugin]);\n }\n\n withoutPlugins(): DefaultQueryExecutor {\n return new DefaultQueryExecutor(this.#connectionProvider, []);\n }\n}\n"],"mappings":";;;AAcA,IAAa,uBAAb,MAAa,6BAA6B,kBAAkB;CAC1D,CAASA;CAET,YAAY,oBAAwC,UAA8B,EAAE,EAAE;AACpF,QAAM,QAAQ;AACd,QAAKA,qBAAsB;;CAG7B,kBAAqB,UAAsE;AACzF,SAAO,MAAKA,mBAAoB,kBAAkB,SAAS;;CAG7D,uBAAuB,oBAA8D;AACnF,SAAO,IAAI,qBAAqB,oBAAoB,CAAC,GAAG,KAAK,QAAQ,CAAC;;CAGxE,WAAW,QAAgD;AACzD,SAAO,IAAI,qBAAqB,MAAKA,oBAAqB,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC;;CAGtF,iBAAuC;AACrC,SAAO,IAAI,qBAAqB,MAAKA,oBAAqB,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-executor-base.js","names":["NO_PLUGINS: ReadonlyArray<GenericSQLPlugin>","#plugins","#transformResult"],"sources":["../../../src/sql-driver/query-executor/query-executor-base.ts"],"sourcesContent":["/**\n * Adapted from Kysely's QueryExecutorBase\n * Modified from: https://github.com/kysely-org/kysely\n * License: MIT\n * Copyright (c) 2022 Sami Koskimäki\n *\n * Simplified to remove query compilation, streaming, and batching.\n */\n\nimport type {
|
|
1
|
+
{"version":3,"file":"query-executor-base.js","names":["NO_PLUGINS: ReadonlyArray<GenericSQLPlugin>","#plugins","#transformResult"],"sources":["../../../src/sql-driver/query-executor/query-executor-base.ts"],"sourcesContent":["/**\n * Adapted from Kysely's QueryExecutorBase\n * Modified from: https://github.com/kysely-org/kysely\n * License: MIT\n * Copyright (c) 2022 Sami Koskimäki\n *\n * Simplified to remove query compilation, streaming, and batching.\n */\n\nimport type { ConnectionProvider } from \"../connection/connection-provider\";\nimport type { DatabaseConnection, CompiledQuery, QueryResult } from \"../sql-driver\";\nimport type { GenericSQLPlugin } from \"./plugin\";\nimport type { QueryExecutor } from \"./query-executor\";\n\nconst NO_PLUGINS: ReadonlyArray<GenericSQLPlugin> = Object.freeze([]);\n\nexport abstract class QueryExecutorBase implements QueryExecutor {\n readonly #plugins: ReadonlyArray<GenericSQLPlugin>;\n\n constructor(plugins: ReadonlyArray<GenericSQLPlugin> = NO_PLUGINS) {\n this.#plugins = plugins;\n }\n\n get plugins(): ReadonlyArray<GenericSQLPlugin> {\n return this.#plugins;\n }\n\n abstract provideConnection<T>(\n consumer: (connection: DatabaseConnection) => Promise<T>,\n ): Promise<T>;\n\n async executeQuery<R>(compiledQuery: CompiledQuery): Promise<QueryResult<R>> {\n return await this.provideConnection(async (connection) => {\n const result = await connection.executeQuery(compiledQuery);\n return await this.#transformResult(result);\n });\n }\n\n abstract withConnectionProvider(connectionProvider: ConnectionProvider): QueryExecutorBase;\n\n abstract withPlugin(plugin: GenericSQLPlugin): QueryExecutorBase;\n\n abstract withoutPlugins(): QueryExecutorBase;\n\n // oxlint-disable-next-line no-explicit-any\n async #transformResult<T>(result: QueryResult<any>): Promise<QueryResult<T>> {\n for (const plugin of this.#plugins) {\n result = await plugin.transformResult({ result });\n }\n\n return result;\n }\n}\n"],"mappings":";AAcA,MAAMA,aAA8C,OAAO,OAAO,EAAE,CAAC;AAErE,IAAsB,oBAAtB,MAAiE;CAC/D,CAASC;CAET,YAAY,UAA2C,YAAY;AACjE,QAAKA,UAAW;;CAGlB,IAAI,UAA2C;AAC7C,SAAO,MAAKA;;CAOd,MAAM,aAAgB,eAAuD;AAC3E,SAAO,MAAM,KAAK,kBAAkB,OAAO,eAAe;GACxD,MAAM,SAAS,MAAM,WAAW,aAAa,cAAc;AAC3D,UAAO,MAAM,MAAKC,gBAAiB,OAAO;IAC1C;;CAUJ,OAAMA,gBAAoB,QAAmD;AAC3E,OAAK,MAAM,UAAU,MAAKD,QACxB,UAAS,MAAM,OAAO,gBAAgB,EAAE,QAAQ,CAAC;AAGnD,SAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-driver-adapter.js","names":["#dialect","#driver","#executor"],"sources":["../../src/sql-driver/sql-driver-adapter.ts"],"sourcesContent":["/**\n * Adapted from Kysely patterns\n * Modified from: https://github.com/kysely-org/kysely\n * License: MIT\n * Copyright (c) 2022 Sami Koskimäki\n */\n\nimport
|
|
1
|
+
{"version":3,"file":"sql-driver-adapter.js","names":["#dialect","#driver","#executor"],"sources":["../../src/sql-driver/sql-driver-adapter.ts"],"sourcesContent":["/**\n * Adapted from Kysely patterns\n * Modified from: https://github.com/kysely-org/kysely\n * License: MIT\n * Copyright (c) 2022 Sami Koskimäki\n */\n\nimport { DefaultConnectionProvider } from \"./connection/connection-provider\";\nimport { SingleConnectionProvider } from \"./connection/single-connection-provider\";\nimport { RuntimeDriver } from \"./driver/runtime-driver\";\nimport { DefaultQueryExecutor } from \"./query-executor/default-query-executor\";\nimport type { GenericSQLPlugin } from \"./query-executor/plugin\";\nimport type { QueryExecutor } from \"./query-executor/query-executor\";\nimport type { CompiledQuery, Dialect, QueryResult } from \"./sql-driver\";\n\nexport class SqlDriverAdapter {\n readonly #dialect: Dialect;\n readonly #driver: RuntimeDriver | null;\n readonly #executor: QueryExecutor;\n\n constructor(dialect: Dialect);\n constructor(dialect: Dialect, executor: QueryExecutor, driver: RuntimeDriver | null);\n constructor(dialect: Dialect, executor?: QueryExecutor, driver?: RuntimeDriver | null) {\n this.#dialect = dialect;\n\n if (executor) {\n this.#driver = driver ?? null;\n this.#executor = executor;\n } else {\n const rawDriver = dialect.createDriver();\n const runtimeDriver = new RuntimeDriver(rawDriver);\n const connectionProvider = new DefaultConnectionProvider(runtimeDriver);\n this.#driver = runtimeDriver;\n this.#executor = new DefaultQueryExecutor(connectionProvider);\n }\n }\n\n async executeQuery(query: CompiledQuery): Promise<QueryResult<Record<string, unknown>>> {\n return await this.#executor.executeQuery(query);\n }\n\n async transaction<T>(callback: (trx: SqlDriverAdapter) => Promise<T>): Promise<T> {\n if (this.#driver === null) {\n throw new Error(\"Cannot start transaction: adapter was created with custom executor\");\n }\n\n const driver = this.#driver;\n\n return await this.#executor.provideConnection(async (connection) => {\n const singleConnectionProvider = new SingleConnectionProvider(connection);\n const transactionExecutor = this.#executor.withConnectionProvider(singleConnectionProvider);\n const transactionAdapter = new SqlDriverAdapter(this.#dialect, transactionExecutor, driver);\n\n let transactionBegun = false;\n try {\n await driver.beginTransaction(connection, {});\n transactionBegun = true;\n\n const result = await callback(transactionAdapter);\n\n await driver.commitTransaction(connection);\n\n return result;\n } catch (error) {\n if (transactionBegun) {\n await driver.rollbackTransaction(connection);\n }\n\n throw error;\n }\n });\n }\n\n /**\n * Returns a copy of this adapter with the given plugin installed.\n */\n withPlugin(plugin: GenericSQLPlugin): SqlDriverAdapter {\n return new SqlDriverAdapter(this.#dialect, this.#executor.withPlugin(plugin), this.#driver);\n }\n\n /**\n * Returns a copy of this adapter without any plugins.\n */\n withoutPlugins(): SqlDriverAdapter {\n return new SqlDriverAdapter(this.#dialect, this.#executor.withoutPlugins(), this.#driver);\n }\n\n /**\n * Releases all resources and disconnects from the database.\n */\n async destroy(): Promise<void> {\n if (this.#driver !== null) {\n await this.#driver.destroy();\n }\n }\n}\n"],"mappings":";;;;;;AAeA,IAAa,mBAAb,MAAa,iBAAiB;CAC5B,CAASA;CACT,CAASC;CACT,CAASC;CAIT,YAAY,SAAkB,UAA0B,QAA+B;AACrF,QAAKF,UAAW;AAEhB,MAAI,UAAU;AACZ,SAAKC,SAAU,UAAU;AACzB,SAAKC,WAAY;SACZ;GAEL,MAAM,gBAAgB,IAAI,cADR,QAAQ,cAAc,CACU;GAClD,MAAM,qBAAqB,IAAI,0BAA0B,cAAc;AACvE,SAAKD,SAAU;AACf,SAAKC,WAAY,IAAI,qBAAqB,mBAAmB;;;CAIjE,MAAM,aAAa,OAAqE;AACtF,SAAO,MAAM,MAAKA,SAAU,aAAa,MAAM;;CAGjD,MAAM,YAAe,UAA6D;AAChF,MAAI,MAAKD,WAAY,KACnB,OAAM,IAAI,MAAM,qEAAqE;EAGvF,MAAM,SAAS,MAAKA;AAEpB,SAAO,MAAM,MAAKC,SAAU,kBAAkB,OAAO,eAAe;GAClE,MAAM,2BAA2B,IAAI,yBAAyB,WAAW;GACzE,MAAM,sBAAsB,MAAKA,SAAU,uBAAuB,yBAAyB;GAC3F,MAAM,qBAAqB,IAAI,iBAAiB,MAAKF,SAAU,qBAAqB,OAAO;GAE3F,IAAI,mBAAmB;AACvB,OAAI;AACF,UAAM,OAAO,iBAAiB,YAAY,EAAE,CAAC;AAC7C,uBAAmB;IAEnB,MAAM,SAAS,MAAM,SAAS,mBAAmB;AAEjD,UAAM,OAAO,kBAAkB,WAAW;AAE1C,WAAO;YACA,OAAO;AACd,QAAI,iBACF,OAAM,OAAO,oBAAoB,WAAW;AAG9C,UAAM;;IAER;;;;;CAMJ,WAAW,QAA4C;AACrD,SAAO,IAAI,iBAAiB,MAAKA,SAAU,MAAKE,SAAU,WAAW,OAAO,EAAE,MAAKD,OAAQ;;;;;CAM7F,iBAAmC;AACjC,SAAO,IAAI,iBAAiB,MAAKD,SAAU,MAAKE,SAAU,gBAAgB,EAAE,MAAKD,OAAQ;;;;;CAM3F,MAAM,UAAyB;AAC7B,MAAI,MAAKA,WAAY,KACnB,OAAM,MAAKA,OAAQ,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql.js","names":["#kyselyBuilder","sql","kyselySql"],"sources":["../../src/sql-driver/sql.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"sql.js","names":["#kyselyBuilder","sql","kyselySql"],"sources":["../../src/sql-driver/sql.ts"],"sourcesContent":["import {\n sql as kyselySql,\n type QueryExecutor,\n type CompiledQuery as KyselyCompiledQuery,\n} from \"kysely\";\n\nimport type { CompiledQuery, Dialect } from \"./sql-driver\";\n\n/**\n * Wrapper around Kysely's RawBuilder that provides a compile() method with a dialect parameter.\n */\nexport class RawBuilder {\n #kyselyBuilder: ReturnType<typeof kyselySql>;\n\n constructor(kyselyBuilder: ReturnType<typeof kyselySql>) {\n this.#kyselyBuilder = kyselyBuilder;\n }\n\n /**\n * Compiles the SQL query using the provided Kysely dialect.\n * Creates a minimal query executor with the dialect's adapter and query compiler.\n *\n * @param dialect - Kysely dialect (e.g., SqliteDialect, PostgresDialect, MysqlDialect)\n * @returns Compiled query with SQL string and parameters\n */\n compile(dialect: Dialect): CompiledQuery {\n const queryCompiler = dialect.createQueryCompiler();\n\n return this.#kyselyBuilder.compile({\n getExecutor(): QueryExecutor {\n return {\n transformQuery(node, _queryId) {\n return node;\n },\n compileQuery(node, queryId) {\n return queryCompiler.compileQuery(node, queryId) as KyselyCompiledQuery;\n },\n } as QueryExecutor;\n },\n });\n }\n}\n\n/**\n * Tagged template function for building SQL queries with parameters.\n * Wraps Kysely's sql function to provide a compile() method without arguments.\n *\n * @example\n * ```ts\n * const userId = 123;\n * const query = sql`SELECT * FROM users WHERE id = ${userId}`;\n * const compiled = query.compile();\n * ```\n */\nexport function sql(strings: TemplateStringsArray, ...values: unknown[]): RawBuilder {\n const kyselyBuilder = kyselySql(strings, ...values);\n return new RawBuilder(kyselyBuilder);\n}\n"],"mappings":";;;;;;AAWA,IAAa,aAAb,MAAwB;CACtB;CAEA,YAAY,eAA6C;AACvD,QAAKA,gBAAiB;;;;;;;;;CAUxB,QAAQ,SAAiC;EACvC,MAAM,gBAAgB,QAAQ,qBAAqB;AAEnD,SAAO,MAAKA,cAAe,QAAQ,EACjC,cAA6B;AAC3B,UAAO;IACL,eAAe,MAAM,UAAU;AAC7B,YAAO;;IAET,aAAa,MAAM,SAAS;AAC1B,YAAO,cAAc,aAAa,MAAM,QAAQ;;IAEnD;KAEJ,CAAC;;;;;;;;;;;;;;AAeN,SAAgBC,MAAI,SAA+B,GAAG,QAA+B;AAEnF,QAAO,IAAI,WADWC,IAAU,SAAS,GAAG,OAAO,CACf"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AnySchema } from "../schema/create.js";
|
|
2
|
+
import { SyncCommandDefinition, SyncCommandRegistry } from "./types.js";
|
|
3
|
+
|
|
4
|
+
//#region src/sync/commands.d.ts
|
|
5
|
+
type DefineSyncCommandsContext = {
|
|
6
|
+
defineCommand: <TInput, TContext>(definition: SyncCommandDefinition<TInput, TContext>) => SyncCommandDefinition<TInput, TContext>;
|
|
7
|
+
};
|
|
8
|
+
declare const defineSyncCommands: <TSchema extends AnySchema>(options: {
|
|
9
|
+
schema: TSchema;
|
|
10
|
+
}) => {
|
|
11
|
+
create: <const TCommands extends readonly SyncCommandDefinition[]>(factory: (context: DefineSyncCommandsContext) => TCommands) => SyncCommandRegistry;
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
export { defineSyncCommands };
|
|
15
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","names":[],"sources":["../../src/sync/commands.ts"],"sourcesContent":[],"mappings":";;;;KAGK,yBAAA;gDAEW,sBAAsB,QAAQ,cACvC,sBAAsB,QAAQ;AALqC,CAAA;AAIpC,cAmCzB,kBAnCyB,EAAA,CAAA,gBAmCa,SAnCb,CAAA,CAAA,OAAA,EAAA;EAAQ,MAAA,EAmCmC,OAnCnC;CAA9B,EAAA,GAAA;EACa,MAAA,EAAA,CAAA,wBAAA,SAqCiB,qBArCjB,EAAA,CAAA,CAAA,OAAA,EAAA,CAAA,OAAA,EAsCJ,yBAtCI,EAAA,GAsC0B,SAtC1B,EAAA,GAuCtB,mBAvCsB;CAAQ"}
|