@fragno-dev/db 0.2.2 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +404 -175
- package/CHANGELOG.md +109 -0
- package/README.md +54 -9
- package/dist/adapters/adapters.d.ts +23 -21
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/generic-sql/driver-config.d.ts +16 -1
- package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -1
- package/dist/adapters/generic-sql/driver-config.js +23 -1
- package/dist/adapters/generic-sql/driver-config.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +24 -9
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.js +60 -22
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +169 -3
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +25 -6
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +7 -6
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +193 -16
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
- package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
- package/dist/adapters/generic-sql/migration/executor.js +30 -3
- package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
- package/dist/adapters/generic-sql/migration/prepared-migrations.js +9 -9
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js +75 -52
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +7 -6
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/cursor-utils.js +42 -4
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
- package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
- package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +32 -21
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/select-builder.js +5 -3
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +49 -18
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/where-builder.js +43 -29
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
- package/dist/adapters/generic-sql/sqlite-storage.d.ts +13 -0
- package/dist/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
- package/dist/adapters/generic-sql/sqlite-storage.js +15 -0
- package/dist/adapters/generic-sql/sqlite-storage.js.map +1 -0
- package/dist/adapters/generic-sql/uow-decoder.js +6 -2
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-encoder.js +27 -8
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
- package/dist/adapters/in-memory/condition-evaluator.js +135 -0
- package/dist/adapters/in-memory/condition-evaluator.js.map +1 -0
- package/dist/adapters/in-memory/errors.d.ts +13 -0
- package/dist/adapters/in-memory/errors.d.ts.map +1 -0
- package/dist/adapters/in-memory/errors.js +23 -0
- package/dist/adapters/in-memory/errors.js.map +1 -0
- package/dist/adapters/in-memory/in-memory-adapter.d.ts +27 -0
- package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -0
- package/dist/adapters/in-memory/in-memory-adapter.js +196 -0
- package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
- package/dist/adapters/in-memory/in-memory-uow.js +871 -0
- package/dist/adapters/in-memory/in-memory-uow.js.map +1 -0
- package/dist/adapters/in-memory/index.d.ts +4 -0
- package/dist/adapters/in-memory/index.js +4 -0
- package/dist/adapters/in-memory/options.d.ts +30 -0
- package/dist/adapters/in-memory/options.d.ts.map +1 -0
- package/dist/adapters/in-memory/options.js +62 -0
- package/dist/adapters/in-memory/options.js.map +1 -0
- package/dist/adapters/in-memory/reference-resolution.js +26 -0
- package/dist/adapters/in-memory/reference-resolution.js.map +1 -0
- package/dist/adapters/in-memory/sorted-array-index.js +129 -0
- package/dist/adapters/in-memory/sorted-array-index.js.map +1 -0
- package/dist/adapters/in-memory/store.js +71 -0
- package/dist/adapters/in-memory/store.js.map +1 -0
- package/dist/adapters/in-memory/value-comparison.js +28 -0
- package/dist/adapters/in-memory/value-comparison.js.map +1 -0
- package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
- package/dist/adapters/shared/uow-operation-compiler.js +11 -11
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
- package/dist/adapters/sql/index.d.ts +5 -0
- package/dist/adapters/sql/index.js +4 -0
- package/dist/browser/adapters/adapters.d.ts +61 -0
- package/dist/browser/adapters/adapters.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
- package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
- package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
- package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
- package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
- package/dist/browser/adapters/in-memory/index.d.ts +2 -0
- package/dist/browser/adapters/in-memory/options.d.ts +1 -0
- package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
- package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
- package/dist/browser/durable-hooks.d.ts +3 -0
- package/dist/browser/fragments/internal-fragment.d.ts +317 -0
- package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
- package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
- package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
- package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
- package/dist/browser/hooks/hooks.d.ts +146 -0
- package/dist/browser/hooks/hooks.d.ts.map +1 -0
- package/dist/browser/id.js +1 -0
- package/dist/browser/internal/adapter-registry.d.ts +4 -0
- package/dist/browser/internal/outbox-state.d.ts +2 -0
- package/dist/browser/mod.d.ts +15 -0
- package/dist/browser/mod.d.ts.map +1 -0
- package/dist/browser/mod.js +17 -0
- package/dist/browser/mod.js.map +1 -0
- package/dist/browser/mod2.d.ts +48 -0
- package/dist/browser/mod2.d.ts.map +1 -0
- package/dist/browser/naming/sql-naming.d.ts +19 -0
- package/dist/browser/naming/sql-naming.d.ts.map +1 -0
- package/dist/browser/outbox/outbox.d.ts +21 -0
- package/dist/browser/outbox/outbox.d.ts.map +1 -0
- package/dist/browser/query/column-defaults.js +1 -0
- package/dist/browser/query/condition-builder.d.ts +44 -0
- package/dist/browser/query/condition-builder.d.ts.map +1 -0
- package/dist/browser/query/condition-builder.js +97 -0
- package/dist/browser/query/condition-builder.js.map +1 -0
- package/dist/browser/query/cursor.d.ts +105 -0
- package/dist/browser/query/cursor.d.ts.map +1 -0
- package/dist/browser/query/cursor.js +150 -0
- package/dist/browser/query/cursor.js.map +1 -0
- package/dist/browser/query/db-now.d.ts +22 -0
- package/dist/browser/query/db-now.d.ts.map +1 -0
- package/dist/browser/query/db-now.js +33 -0
- package/dist/browser/query/db-now.js.map +1 -0
- package/dist/browser/query/orm/orm.d.ts +18 -0
- package/dist/browser/query/orm/orm.d.ts.map +1 -0
- package/dist/browser/query/simple-query-interface.d.ts +108 -0
- package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
- package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
- package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
- package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
- package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
- package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
- package/dist/browser/query/value-encoding.js +38 -0
- package/dist/browser/query/value-encoding.js.map +1 -0
- package/dist/browser/schema/create.d.ts +326 -0
- package/dist/browser/schema/create.d.ts.map +1 -0
- package/dist/browser/schema/create.js +89 -0
- package/dist/browser/schema/create.js.map +1 -0
- package/dist/browser/schema/generate-id.js +28 -0
- package/dist/browser/schema/generate-id.js.map +1 -0
- package/dist/browser/shared/providers.d.ts +6 -0
- package/dist/browser/shared/providers.d.ts.map +1 -0
- package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
- package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
- package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
- package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
- package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
- package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
- package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
- package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
- package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
- package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
- package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
- package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
- package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
- package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
- package/dist/browser/sync/commands.d.ts +15 -0
- package/dist/browser/sync/commands.d.ts.map +1 -0
- package/dist/browser/sync/commands.js +27 -0
- package/dist/browser/sync/commands.js.map +1 -0
- package/dist/browser/sync/types.d.ts +63 -0
- package/dist/browser/sync/types.d.ts.map +1 -0
- package/dist/browser/util/types.d.ts +8 -0
- package/dist/browser/util/types.d.ts.map +1 -0
- package/dist/browser/with-database.d.ts +29 -0
- package/dist/browser/with-database.d.ts.map +1 -0
- package/dist/client.d.ts +4 -0
- package/dist/client.js +5 -0
- package/dist/db-fragment-definition-builder.d.ts +101 -33
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +450 -60
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
- package/dist/dispatchers/cloudflare-do/index.d.ts +11 -0
- package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
- package/dist/dispatchers/cloudflare-do/index.js +31 -0
- package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
- package/dist/dispatchers/node/dispatcher.d.ts +14 -0
- package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
- package/dist/dispatchers/node/dispatcher.js +80 -0
- package/dist/dispatchers/node/dispatcher.js.map +1 -0
- package/dist/dispatchers/node/index.d.ts +12 -0
- package/dist/dispatchers/node/index.d.ts.map +1 -0
- package/dist/dispatchers/node/index.js +27 -0
- package/dist/dispatchers/node/index.js.map +1 -0
- package/dist/durable-hooks.d.ts +31 -0
- package/dist/durable-hooks.d.ts.map +1 -0
- package/dist/durable-hooks.js +23 -0
- package/dist/durable-hooks.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +186 -8
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +203 -38
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/fragments/internal-fragment.routes.js +164 -0
- package/dist/fragments/internal-fragment.routes.js.map +1 -0
- package/dist/fragments/internal-fragment.schema.d.ts +15 -0
- package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
- package/dist/fragments/internal-fragment.schema.js +39 -0
- package/dist/fragments/internal-fragment.schema.js.map +1 -0
- package/dist/hooks/durable-hooks-logger.d.ts +10 -0
- package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
- package/dist/hooks/durable-hooks-logger.js +75 -0
- package/dist/hooks/durable-hooks-logger.js.map +1 -0
- package/dist/hooks/durable-hooks-processor.d.ts +1 -0
- package/dist/hooks/durable-hooks-processor.js +80 -0
- package/dist/hooks/durable-hooks-processor.js.map +1 -0
- package/dist/hooks/durable-hooks-runtime.js +44 -0
- package/dist/hooks/durable-hooks-runtime.js.map +1 -0
- package/dist/hooks/hooks.d.ts +100 -1
- package/dist/hooks/hooks.d.ts.map +1 -1
- package/dist/hooks/hooks.js +254 -27
- package/dist/hooks/hooks.js.map +1 -1
- package/dist/id.d.ts +2 -2
- package/dist/id.js +2 -2
- package/dist/internal/adapter-registry.d.ts +11 -0
- package/dist/internal/adapter-registry.d.ts.map +1 -0
- package/dist/internal/adapter-registry.js +135 -0
- package/dist/internal/adapter-registry.js.map +1 -0
- package/dist/internal/outbox-state.d.ts +2 -0
- package/dist/internal/outbox-state.js +26 -0
- package/dist/internal/outbox-state.js.map +1 -0
- package/dist/migration-engine/auto-from-schema.d.ts +33 -0
- package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
- package/dist/migration-engine/auto-from-schema.js +223 -37
- package/dist/migration-engine/auto-from-schema.js.map +1 -1
- package/dist/migration-engine/generation-engine.d.ts +16 -10
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +86 -35
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/migration-engine/shared.d.ts +113 -0
- package/dist/migration-engine/shared.d.ts.map +1 -0
- package/dist/migration-engine/shared.js.map +1 -1
- package/dist/mod.d.ts +20 -12
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +18 -12
- package/dist/mod.js.map +1 -1
- package/dist/naming/sql-naming.d.ts +19 -0
- package/dist/naming/sql-naming.d.ts.map +1 -0
- package/dist/naming/sql-naming.js +116 -0
- package/dist/naming/sql-naming.js.map +1 -0
- package/dist/outbox/outbox-builder.js +156 -0
- package/dist/outbox/outbox-builder.js.map +1 -0
- package/dist/outbox/outbox.d.ts +54 -0
- package/dist/outbox/outbox.d.ts.map +1 -0
- package/dist/outbox/outbox.js +37 -0
- package/dist/outbox/outbox.js.map +1 -0
- package/dist/query/column-defaults.js +20 -4
- package/dist/query/column-defaults.js.map +1 -1
- package/dist/query/condition-builder.d.ts +7 -1
- package/dist/query/condition-builder.d.ts.map +1 -1
- package/dist/query/condition-builder.js +5 -1
- package/dist/query/condition-builder.js.map +1 -1
- package/dist/query/cursor-client.d.ts +105 -0
- package/dist/query/cursor-client.d.ts.map +1 -0
- package/dist/query/cursor-client.js +165 -0
- package/dist/query/cursor-client.js.map +1 -0
- package/dist/query/cursor.d.ts +3 -1
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +51 -14
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/db-now.d.ts +22 -0
- package/dist/query/db-now.d.ts.map +1 -0
- package/dist/query/db-now.js +35 -0
- package/dist/query/db-now.js.map +1 -0
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +5 -4
- package/dist/query/serialize/create-sql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/mysql-serializer.js +12 -6
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/postgres-serializer.js +25 -7
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/sqlite-serializer.js +60 -12
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
- package/dist/query/serialize/sql-serializer.js +2 -2
- package/dist/query/serialize/sql-serializer.js.map +1 -1
- package/dist/query/simple-query-interface.d.ts +13 -4
- package/dist/query/simple-query-interface.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.js +50 -24
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.d.ts +92 -30
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.js +136 -11
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
- package/dist/query/value-decoding.js +16 -6
- package/dist/query/value-decoding.js.map +1 -1
- package/dist/query/value-encoding.js +29 -9
- package/dist/query/value-encoding.js.map +1 -1
- package/dist/schema/create.d.ts +103 -35
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +172 -58
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/generate-id.js +2 -2
- package/dist/schema/generate-id.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +4 -3
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
- package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
- package/dist/schema/validator.d.ts +10 -0
- package/dist/schema/validator.d.ts.map +1 -0
- package/dist/schema/validator.js +123 -0
- package/dist/schema/validator.js.map +1 -0
- package/dist/schema-output/drizzle.d.ts +30 -0
- package/dist/schema-output/drizzle.d.ts.map +1 -0
- package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +88 -60
- package/dist/schema-output/drizzle.js.map +1 -0
- package/dist/schema-output/prisma.d.ts +17 -0
- package/dist/schema-output/prisma.d.ts.map +1 -0
- package/dist/schema-output/prisma.js +307 -0
- package/dist/schema-output/prisma.js.map +1 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
- package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
- package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
- package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
- package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
- package/dist/sql-driver/sql.js.map +1 -1
- package/dist/sync/commands.d.ts +15 -0
- package/dist/sync/commands.d.ts.map +1 -0
- package/dist/sync/commands.js +27 -0
- package/dist/sync/commands.js.map +1 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.js +4 -0
- package/dist/sync/read-tracking.d.ts +25 -0
- package/dist/sync/read-tracking.d.ts.map +1 -0
- package/dist/sync/read-tracking.js +148 -0
- package/dist/sync/read-tracking.js.map +1 -0
- package/dist/sync/submit.js +213 -0
- package/dist/sync/submit.js.map +1 -0
- package/dist/sync/types.d.ts +63 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/util/default-database-adapter.js +66 -0
- package/dist/util/default-database-adapter.js.map +1 -0
- package/dist/with-database.d.ts +3 -6
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +8 -7
- package/dist/with-database.js.map +1 -1
- package/package.json +62 -55
- package/src/adapters/adapters.ts +33 -26
- package/src/adapters/drizzle/migrate-drizzle.test.ts +99 -41
- package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +601 -0
- package/src/adapters/drizzle/test-utils.ts +13 -8
- package/src/adapters/generic-sql/driver-config.ts +38 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +10 -8
- package/src/adapters/generic-sql/generic-sql-adapter.ts +117 -34
- package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +55 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +297 -3
- package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +120 -0
- package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
- package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +27 -8
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +47 -8
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +28 -9
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +9 -4
- package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +839 -8
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +396 -53
- package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
- package/src/adapters/generic-sql/migration/executor.ts +47 -4
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +238 -46
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +21 -13
- package/src/adapters/generic-sql/migration/sql-generator.ts +145 -66
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +11 -8
- package/src/adapters/generic-sql/query/cursor-utils.test.ts +272 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +42 -7
- package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +171 -35
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +53 -40
- package/src/adapters/generic-sql/query/select-builder.test.ts +16 -11
- package/src/adapters/generic-sql/query/select-builder.ts +7 -3
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +75 -6
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +129 -24
- package/src/adapters/generic-sql/query/where-builder.test.ts +96 -20
- package/src/adapters/generic-sql/query/where-builder.ts +112 -41
- package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +11 -20
- package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +851 -0
- package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +18 -15
- package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +282 -14
- package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +129 -12
- package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +9 -7
- package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +5 -4
- package/src/adapters/generic-sql/uow-decoder.ts +23 -5
- package/src/adapters/generic-sql/uow-encoder.test.ts +36 -3
- package/src/adapters/generic-sql/uow-encoder.ts +48 -13
- package/src/adapters/in-memory/condition-evaluator.test.ts +194 -0
- package/src/adapters/in-memory/condition-evaluator.ts +280 -0
- package/src/adapters/in-memory/errors.ts +20 -0
- package/src/adapters/in-memory/in-memory-adapter.ts +388 -0
- package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +344 -0
- package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +255 -0
- package/src/adapters/in-memory/in-memory-uow.ts +1724 -0
- package/src/adapters/in-memory/index.ts +3 -0
- package/src/adapters/in-memory/options.test.ts +42 -0
- package/src/adapters/in-memory/options.ts +91 -0
- package/src/adapters/in-memory/outbox.test.ts +361 -0
- package/src/adapters/in-memory/reference-resolution.test.ts +51 -0
- package/src/adapters/in-memory/reference-resolution.ts +67 -0
- package/src/adapters/in-memory/sorted-array-index.test.ts +124 -0
- package/src/adapters/in-memory/sorted-array-index.ts +228 -0
- package/src/adapters/in-memory/store.test.ts +69 -0
- package/src/adapters/in-memory/store.ts +145 -0
- package/src/adapters/in-memory/value-comparison.ts +53 -0
- package/src/adapters/in-memory/value-normalization.test.ts +58 -0
- package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1207 -0
- package/src/adapters/shared/from-unit-of-work-compiler.ts +159 -47
- package/src/adapters/shared/uow-operation-compiler.ts +28 -18
- package/src/adapters/sql/index.ts +12 -0
- package/src/browser/mod.ts +64 -0
- package/src/client.ts +19 -0
- package/src/db-fragment-definition-builder.test.ts +845 -53
- package/src/db-fragment-definition-builder.ts +911 -95
- package/src/db-fragment-instantiator.test.ts +210 -94
- package/src/db-fragment-integration.test.ts +17 -12
- package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
- package/src/dispatchers/cloudflare-do/index.test.ts +206 -0
- package/src/dispatchers/cloudflare-do/index.ts +63 -0
- package/src/dispatchers/node/dispatcher.ts +112 -0
- package/src/dispatchers/node/index.test.ts +120 -0
- package/src/dispatchers/node/index.ts +50 -0
- package/src/durable-hooks.test.ts +80 -0
- package/src/durable-hooks.ts +67 -0
- package/src/fragments/internal-fragment.routes.test.ts +570 -0
- package/src/fragments/internal-fragment.routes.ts +334 -0
- package/src/fragments/internal-fragment.schema.ts +95 -0
- package/src/fragments/internal-fragment.test.ts +505 -83
- package/src/fragments/internal-fragment.ts +453 -70
- package/src/hooks/durable-hooks-logger.ts +126 -0
- package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
- package/src/hooks/durable-hooks-processor.test.ts +282 -0
- package/src/hooks/durable-hooks-processor.ts +173 -0
- package/src/hooks/durable-hooks-runtime.test.ts +65 -0
- package/src/hooks/durable-hooks-runtime.ts +81 -0
- package/src/hooks/hooks.test.ts +455 -34
- package/src/hooks/hooks.ts +501 -34
- package/src/id.test.ts +34 -0
- package/src/id.ts +1 -3
- package/src/internal/adapter-registry.test.ts +93 -0
- package/src/internal/adapter-registry.ts +239 -0
- package/src/internal/outbox-state.ts +43 -0
- package/src/migration-engine/auto-from-schema.test.ts +107 -14
- package/src/migration-engine/auto-from-schema.ts +365 -44
- package/src/migration-engine/create.test.ts +4 -3
- package/src/migration-engine/create.ts +1 -1
- package/src/migration-engine/generation-engine.test.ts +292 -110
- package/src/migration-engine/generation-engine.ts +117 -66
- package/src/migration-engine/shared.ts +14 -0
- package/src/mod.ts +95 -39
- package/src/naming/sql-naming.ts +181 -0
- package/src/outbox/outbox-builder.ts +241 -0
- package/src/outbox/outbox.test.ts +424 -0
- package/src/outbox/outbox.ts +139 -0
- package/src/query/column-defaults.ts +42 -4
- package/src/query/condition-builder.test.ts +18 -3
- package/src/query/condition-builder.ts +7 -0
- package/src/query/cursor-client.test.ts +70 -0
- package/src/query/cursor-client.ts +263 -0
- package/src/query/cursor.test.ts +119 -20
- package/src/query/cursor.ts +88 -27
- package/src/query/db-now.ts +73 -0
- package/src/query/orm/orm.ts +2 -2
- package/src/query/query-type.test.ts +4 -3
- package/src/query/serialize/create-sql-serializer.ts +10 -5
- package/src/query/serialize/dialect/mysql-serializer.ts +13 -5
- package/src/query/serialize/dialect/postgres-serializer.ts +35 -5
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +90 -3
- package/src/query/serialize/dialect/sqlite-serializer.ts +108 -12
- package/src/query/serialize/sql-serializer.ts +4 -4
- package/src/query/simple-query-interface.ts +15 -4
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +372 -10
- package/src/query/unit-of-work/execute-unit-of-work.ts +87 -27
- package/src/query/unit-of-work/retry-policy.test.ts +1 -0
- package/src/query/unit-of-work/tx-builder.test.ts +73 -1
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +17 -16
- package/src/query/unit-of-work/unit-of-work-types.test.ts +42 -12
- package/src/query/unit-of-work/unit-of-work.test.ts +196 -39
- package/src/query/unit-of-work/unit-of-work.ts +309 -38
- package/src/query/value-decoding.test.ts +63 -4
- package/src/query/value-decoding.ts +32 -6
- package/src/query/value-encoding.test.ts +86 -2
- package/src/query/value-encoding.ts +56 -6
- package/src/schema/create.test.ts +293 -47
- package/src/schema/create.ts +406 -70
- package/src/schema/generate-id.test.ts +3 -2
- package/src/schema/generate-id.ts +2 -2
- package/src/schema/serialize.test.ts +18 -5
- package/src/schema/type-conversion/create-sql-type-mapper.ts +8 -3
- package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
- package/src/schema/type-conversion/type-mapping.test.ts +26 -1
- package/src/schema/validator.test.ts +199 -0
- package/src/schema/validator.ts +232 -0
- package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +232 -129
- package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +155 -99
- package/src/schema-output/prisma.test.ts +694 -0
- package/src/schema-output/prisma.ts +593 -0
- package/src/sql-driver/better-sqlite3.test.ts +5 -3
- package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
- package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
- package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
- package/src/sql-driver/query-executor/query-executor.ts +1 -1
- package/src/sql-driver/sql-driver-adapter.ts +2 -2
- package/src/sql-driver/sql.ts +2 -1
- package/src/sql-driver/sqlocal.test.ts +4 -2
- package/src/sync/commands.test.ts +39 -0
- package/src/sync/commands.ts +51 -0
- package/src/sync/conflict-checker.test.ts +450 -0
- package/src/sync/conflict-checker.ts +248 -0
- package/src/sync/index.ts +14 -0
- package/src/sync/plan.ts +9 -0
- package/src/sync/read-tracking.test.ts +177 -0
- package/src/sync/read-tracking.ts +287 -0
- package/src/sync/submit.test.ts +205 -0
- package/src/sync/submit.ts +328 -0
- package/src/sync/types.ts +80 -0
- package/src/util/default-database-adapter.ts +119 -0
- package/src/with-database.ts +20 -31
- package/tsconfig.json +1 -1
- package/tsdown.config.ts +38 -24
- package/vitest.config.ts +1 -0
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
- package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
- package/dist/adapters/drizzle/generate.d.ts +0 -30
- package/dist/adapters/drizzle/generate.d.ts.map +0 -1
- package/dist/adapters/drizzle/generate.js.map +0 -1
- package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-adapter.js +0 -17
- package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
- package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
- package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
- package/dist/adapters/shared/table-name-mapper.js +0 -43
- package/dist/adapters/shared/table-name-mapper.js.map +0 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +0 -165
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +0 -1
- package/dist/packages/fragno/dist/api/bind-services.js +0 -20
- package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
- package/dist/packages/fragno/dist/api/error.js +0 -48
- package/dist/packages/fragno/dist/api/error.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -320
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -525
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
- package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
- package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
- package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
- package/dist/packages/fragno/dist/api/internal/route.js +0 -10
- package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
- package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
- package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
- package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-input-context.js +0 -118
- package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
- package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
- package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
- package/dist/packages/fragno/dist/api/route.js +0 -17
- package/dist/packages/fragno/dist/api/route.js.map +0 -1
- package/dist/packages/fragno/dist/internal/symbols.js +0 -10
- package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
- package/dist/schema-generator/schema-generator.d.ts +0 -15
- package/dist/schema-generator/schema-generator.d.ts.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
- package/src/adapters/kysely/kysely-adapter.ts +0 -27
- package/src/adapters/shared/table-name-mapper.ts +0 -50
- package/src/schema-generator/schema-generator.ts +0 -12
|
@@ -1,20 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
defaultNamingStrategyForDatabase,
|
|
3
|
+
type SupportedDatabase,
|
|
4
|
+
} from "../adapters/generic-sql/driver-config";
|
|
5
|
+
import { internalSchema } from "../fragments/internal-fragment.schema";
|
|
6
|
+
import {
|
|
7
|
+
createNamingResolver,
|
|
8
|
+
sanitizeNamespace,
|
|
9
|
+
type NamingResolver,
|
|
10
|
+
type SqlNamingStrategy,
|
|
11
|
+
} from "../naming/sql-naming";
|
|
3
12
|
import {
|
|
4
13
|
type AnyColumn,
|
|
5
14
|
type AnySchema,
|
|
6
15
|
type AnyTable,
|
|
7
16
|
type Relation,
|
|
8
17
|
InternalIdColumn,
|
|
9
|
-
} from "
|
|
10
|
-
import
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
type TableNameMapper,
|
|
15
|
-
} from "../shared/table-name-mapper";
|
|
16
|
-
import { type DatabaseTypeLiteral } from "../../schema/type-conversion/type-mapping";
|
|
17
|
-
import { createSQLTypeMapper } from "../../schema/type-conversion/create-sql-type-mapper";
|
|
18
|
+
} from "../schema/create";
|
|
19
|
+
import { createSQLTypeMapper } from "../schema/type-conversion/create-sql-type-mapper";
|
|
20
|
+
import { type DatabaseTypeLiteral } from "../schema/type-conversion/type-mapping";
|
|
21
|
+
import { importGenerator } from "../util/import-generator";
|
|
22
|
+
import { ident, parseVarchar } from "../util/parse";
|
|
18
23
|
|
|
19
24
|
// ============================================================================
|
|
20
25
|
// PROVIDER CONFIGURATION
|
|
@@ -32,7 +37,7 @@ const PROVIDER_TABLE_FUNCTIONS = {
|
|
|
32
37
|
sqlite: "sqliteTable",
|
|
33
38
|
} as const;
|
|
34
39
|
|
|
35
|
-
export type SupportedProvider =
|
|
40
|
+
export type SupportedProvider = SupportedDatabase;
|
|
36
41
|
|
|
37
42
|
// ============================================================================
|
|
38
43
|
// CONTEXT
|
|
@@ -47,7 +52,7 @@ interface GeneratorContext {
|
|
|
47
52
|
}
|
|
48
53
|
|
|
49
54
|
function createContext(
|
|
50
|
-
provider:
|
|
55
|
+
provider: SupportedDatabase,
|
|
51
56
|
idGeneratorImport?: { name: string; from: string },
|
|
52
57
|
): GeneratorContext {
|
|
53
58
|
return {
|
|
@@ -224,7 +229,7 @@ function mapDBTypeToDrizzleFunction(
|
|
|
224
229
|
case "text":
|
|
225
230
|
// Check if it's JSON
|
|
226
231
|
if (column.type === "json") {
|
|
227
|
-
return { name: "
|
|
232
|
+
return { name: "text", params: [`{ mode: "json" }`] };
|
|
228
233
|
}
|
|
229
234
|
return { name: "text" };
|
|
230
235
|
case "real":
|
|
@@ -243,17 +248,10 @@ function mapDBTypeToDrizzleFunction(
|
|
|
243
248
|
// ============================================================================
|
|
244
249
|
|
|
245
250
|
/**
|
|
246
|
-
* Get the physical table name
|
|
251
|
+
* Get the physical table name using the naming resolver if available
|
|
247
252
|
*/
|
|
248
|
-
function getPhysicalTableName(
|
|
249
|
-
logicalName:
|
|
250
|
-
namespace: string | undefined,
|
|
251
|
-
mapper: TableNameMapper | undefined,
|
|
252
|
-
): string {
|
|
253
|
-
if (!namespace) {
|
|
254
|
-
return logicalName;
|
|
255
|
-
}
|
|
256
|
-
return mapper ? mapper.toPhysical(logicalName) : `${logicalName}_${sanitizeNamespace(namespace)}`;
|
|
253
|
+
function getPhysicalTableName(logicalName: string, resolver?: NamingResolver): string {
|
|
254
|
+
return resolver ? resolver.getTableName(logicalName) : logicalName;
|
|
257
255
|
}
|
|
258
256
|
|
|
259
257
|
// ============================================================================
|
|
@@ -264,12 +262,13 @@ function generateColumnDefinition(
|
|
|
264
262
|
ctx: GeneratorContext,
|
|
265
263
|
column: AnyColumn,
|
|
266
264
|
customTypes: string[],
|
|
265
|
+
physicalColumnName: string,
|
|
267
266
|
): string {
|
|
268
267
|
const parts: string[] = [];
|
|
269
268
|
const typeFn = getColumnTypeFunction(ctx, column, customTypes);
|
|
270
269
|
|
|
271
270
|
// Column type with parameters
|
|
272
|
-
const params: string[] = [`"${
|
|
271
|
+
const params: string[] = [`"${physicalColumnName}"`, ...(typeFn.params ?? [])];
|
|
273
272
|
if (!typeFn.isCustomType) {
|
|
274
273
|
ctx.imports.addImport(typeFn.name, ctx.importSource);
|
|
275
274
|
}
|
|
@@ -295,6 +294,11 @@ function generateColumnDefinition(
|
|
|
295
294
|
parts.push("notNull()");
|
|
296
295
|
}
|
|
297
296
|
|
|
297
|
+
// External IDs are unique by definition in Fragno's SQL migrations.
|
|
298
|
+
if (column.role === "external-id") {
|
|
299
|
+
parts.push("unique()");
|
|
300
|
+
}
|
|
301
|
+
|
|
298
302
|
// Default values
|
|
299
303
|
if (column.default) {
|
|
300
304
|
if ("value" in column.default) {
|
|
@@ -310,7 +314,12 @@ function generateColumnDefinition(
|
|
|
310
314
|
} else if ("dbSpecial" in column.default) {
|
|
311
315
|
// Database-level special functions: defaultTo(b => b.now())
|
|
312
316
|
if (column.default.dbSpecial === "now") {
|
|
313
|
-
|
|
317
|
+
if (ctx.provider === "mysql") {
|
|
318
|
+
ctx.imports.addImport("sql", "drizzle-orm");
|
|
319
|
+
parts.push("default(sql`(now())`)");
|
|
320
|
+
} else {
|
|
321
|
+
parts.push("defaultNow()");
|
|
322
|
+
}
|
|
314
323
|
}
|
|
315
324
|
} else if ("runtime" in column.default) {
|
|
316
325
|
// Runtime defaults: defaultTo$()
|
|
@@ -326,16 +335,22 @@ function generateColumnDefinition(
|
|
|
326
335
|
}
|
|
327
336
|
}
|
|
328
337
|
|
|
329
|
-
return ` ${column.
|
|
338
|
+
return ` ${column.name}: ${parts.join(".")}`;
|
|
330
339
|
}
|
|
331
340
|
|
|
332
341
|
function generateAllColumns(
|
|
333
342
|
ctx: GeneratorContext,
|
|
334
343
|
table: AnyTable,
|
|
335
344
|
customTypes: string[],
|
|
345
|
+
resolver?: NamingResolver,
|
|
336
346
|
): string[] {
|
|
337
347
|
return Object.values(table.columns).map((column) =>
|
|
338
|
-
generateColumnDefinition(
|
|
348
|
+
generateColumnDefinition(
|
|
349
|
+
ctx,
|
|
350
|
+
column,
|
|
351
|
+
customTypes,
|
|
352
|
+
resolver ? resolver.getColumnName(table.name, column.name) : column.name,
|
|
353
|
+
),
|
|
339
354
|
);
|
|
340
355
|
}
|
|
341
356
|
|
|
@@ -346,44 +361,47 @@ function generateAllColumns(
|
|
|
346
361
|
function generateForeignKeys(
|
|
347
362
|
ctx: GeneratorContext,
|
|
348
363
|
table: AnyTable,
|
|
349
|
-
namespace?: string,
|
|
350
|
-
|
|
364
|
+
namespace?: string | null,
|
|
365
|
+
resolver?: NamingResolver,
|
|
351
366
|
): string[] {
|
|
352
367
|
const keys: string[] = [];
|
|
353
368
|
|
|
354
369
|
for (const relation of Object.values(table.relations)) {
|
|
355
370
|
// Only "one" relations generate foreign keys
|
|
356
371
|
// "many" relations don't have foreign keys (they're on the other side)
|
|
357
|
-
if (relation.type === "many") {
|
|
372
|
+
if (relation.type === "many" || relation.foreignKey === false) {
|
|
358
373
|
continue;
|
|
359
374
|
}
|
|
360
375
|
|
|
361
376
|
const columns: string[] = [];
|
|
362
377
|
const foreignColumns: string[] = [];
|
|
363
|
-
const isSelfReference = relation.table.
|
|
378
|
+
const isSelfReference = relation.table.name === table.name;
|
|
364
379
|
|
|
365
380
|
for (const [localCol, refCol] of relation.on) {
|
|
366
381
|
columns.push(`table.${localCol}`);
|
|
367
382
|
// Foreign keys always reference internal IDs
|
|
368
|
-
const actualRefCol = refCol
|
|
383
|
+
const actualRefCol = refCol !== "id" ? refCol : "_internalId";
|
|
369
384
|
// For self-referencing foreign keys, use table parameter instead of table constant
|
|
370
385
|
if (isSelfReference) {
|
|
371
386
|
foreignColumns.push(`table.${actualRefCol}`);
|
|
372
387
|
} else {
|
|
373
388
|
// Use sanitized TypeScript export name for identifier reference
|
|
374
389
|
const foreignTableRef = namespace
|
|
375
|
-
? `${relation.table.
|
|
376
|
-
: relation.table.
|
|
390
|
+
? `${relation.table.name}_${sanitizeNamespace(namespace)}`
|
|
391
|
+
: relation.table.name;
|
|
377
392
|
foreignColumns.push(`${foreignTableRef}.${actualRefCol}`);
|
|
378
393
|
}
|
|
379
394
|
}
|
|
380
395
|
|
|
381
396
|
ctx.imports.addImport("foreignKey", ctx.importSource);
|
|
382
397
|
// Include namespace in FK name to avoid collisions
|
|
383
|
-
const fkName =
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
398
|
+
const fkName = resolver
|
|
399
|
+
? resolver.getForeignKeyName({
|
|
400
|
+
logicalTable: table.name,
|
|
401
|
+
logicalReferencedTable: relation.table.name,
|
|
402
|
+
referenceName: relation.name,
|
|
403
|
+
})
|
|
404
|
+
: `${table.name}_${relation.table.name}_${relation.name}_fk`;
|
|
387
405
|
|
|
388
406
|
keys.push(`foreignKey({
|
|
389
407
|
columns: [${columns.join(", ")}],
|
|
@@ -395,14 +413,24 @@ function generateForeignKeys(
|
|
|
395
413
|
return keys;
|
|
396
414
|
}
|
|
397
415
|
|
|
398
|
-
function generateIndexes(
|
|
416
|
+
function generateIndexes(
|
|
417
|
+
ctx: GeneratorContext,
|
|
418
|
+
table: AnyTable,
|
|
419
|
+
namespace?: string | null,
|
|
420
|
+
resolver?: NamingResolver,
|
|
421
|
+
): string[] {
|
|
399
422
|
const indexes: string[] = [];
|
|
400
423
|
|
|
401
424
|
for (const idx of Object.values(table.indexes)) {
|
|
402
|
-
const columns = idx.columns.map((col) => `table.${col.
|
|
425
|
+
const columns = idx.columns.map((col) => `table.${col.name}`).join(", ");
|
|
403
426
|
|
|
404
|
-
|
|
405
|
-
|
|
427
|
+
const indexName = resolver
|
|
428
|
+
? idx.unique
|
|
429
|
+
? resolver.getUniqueIndexName(idx.name, table.name)
|
|
430
|
+
: resolver.getIndexName(idx.name, table.name)
|
|
431
|
+
: namespace
|
|
432
|
+
? `${idx.name}_${namespace}`
|
|
433
|
+
: idx.name;
|
|
406
434
|
|
|
407
435
|
if (idx.unique) {
|
|
408
436
|
ctx.imports.addImport("uniqueIndex", ctx.importSource);
|
|
@@ -419,13 +447,30 @@ function generateIndexes(ctx: GeneratorContext, table: AnyTable, namespace?: str
|
|
|
419
447
|
function generateTableConstraints(
|
|
420
448
|
ctx: GeneratorContext,
|
|
421
449
|
table: AnyTable,
|
|
422
|
-
namespace?: string,
|
|
423
|
-
|
|
450
|
+
namespace?: string | null,
|
|
451
|
+
resolver?: NamingResolver,
|
|
424
452
|
): string[] {
|
|
425
|
-
|
|
426
|
-
...generateForeignKeys(ctx, table, namespace,
|
|
427
|
-
...generateIndexes(ctx, table, namespace),
|
|
453
|
+
const constraints: string[] = [
|
|
454
|
+
...generateForeignKeys(ctx, table, namespace, resolver),
|
|
455
|
+
...generateIndexes(ctx, table, namespace, resolver),
|
|
428
456
|
];
|
|
457
|
+
|
|
458
|
+
if (ctx.provider === "sqlite") {
|
|
459
|
+
const externalIdColumn = Object.values(table.columns).find(
|
|
460
|
+
(column) => column.role === "external-id",
|
|
461
|
+
);
|
|
462
|
+
if (externalIdColumn) {
|
|
463
|
+
const indexName = resolver
|
|
464
|
+
? resolver.getUniqueIndexName(`idx_${table.name}_external_id`, table.name)
|
|
465
|
+
: namespace
|
|
466
|
+
? `idx_${table.name}_external_id_${namespace}`
|
|
467
|
+
: `idx_${table.name}_external_id`;
|
|
468
|
+
ctx.imports.addImport("uniqueIndex", ctx.importSource);
|
|
469
|
+
constraints.push(`uniqueIndex("${indexName}").on(table.${externalIdColumn.name})`);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
return constraints;
|
|
429
474
|
}
|
|
430
475
|
|
|
431
476
|
// ============================================================================
|
|
@@ -436,19 +481,22 @@ function generateTable(
|
|
|
436
481
|
ctx: GeneratorContext,
|
|
437
482
|
table: AnyTable,
|
|
438
483
|
customTypes: string[],
|
|
439
|
-
namespace?: string,
|
|
440
|
-
|
|
484
|
+
namespace?: string | null,
|
|
485
|
+
resolver?: NamingResolver,
|
|
486
|
+
schemaRef?: string,
|
|
441
487
|
): string {
|
|
442
|
-
const tableFn = PROVIDER_TABLE_FUNCTIONS[ctx.provider];
|
|
443
|
-
|
|
488
|
+
const tableFn = schemaRef ? `${schemaRef}.table` : PROVIDER_TABLE_FUNCTIONS[ctx.provider];
|
|
489
|
+
if (!schemaRef) {
|
|
490
|
+
ctx.imports.addImport(tableFn, ctx.importSource);
|
|
491
|
+
}
|
|
444
492
|
|
|
445
|
-
const columns = generateAllColumns(ctx, table, customTypes);
|
|
446
|
-
const constraints = generateTableConstraints(ctx, table, namespace,
|
|
493
|
+
const columns = generateAllColumns(ctx, table, customTypes, resolver);
|
|
494
|
+
const constraints = generateTableConstraints(ctx, table, namespace, resolver);
|
|
447
495
|
|
|
448
496
|
// Physical table name in the database (respects mapper configuration)
|
|
449
|
-
const physicalTableName = getPhysicalTableName(table.
|
|
497
|
+
const physicalTableName = getPhysicalTableName(table.name, resolver);
|
|
450
498
|
// TypeScript export name must always be sanitized to be a valid JavaScript identifier
|
|
451
|
-
const exportName = namespace ? `${table.
|
|
499
|
+
const exportName = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;
|
|
452
500
|
|
|
453
501
|
const args: string[] = [`"${physicalTableName}"`, `{\n${columns.join(",\n")}\n}`];
|
|
454
502
|
|
|
@@ -466,9 +514,9 @@ function generateTable(
|
|
|
466
514
|
function generateRelation(
|
|
467
515
|
ctx: GeneratorContext,
|
|
468
516
|
table: AnyTable,
|
|
469
|
-
namespace?: string,
|
|
517
|
+
namespace?: string | null,
|
|
470
518
|
inverseRelations?: Array<{ fromTable: AnyTable; relation: Relation }>,
|
|
471
|
-
|
|
519
|
+
_resolver?: NamingResolver,
|
|
472
520
|
): string | undefined {
|
|
473
521
|
const relations: string[] = [];
|
|
474
522
|
let hasOne = false;
|
|
@@ -476,6 +524,9 @@ function generateRelation(
|
|
|
476
524
|
|
|
477
525
|
// Generate explicit relations defined on this table
|
|
478
526
|
for (const relation of Object.values(table.relations)) {
|
|
527
|
+
if (relation.foreignKey === false) {
|
|
528
|
+
continue;
|
|
529
|
+
}
|
|
479
530
|
const options: string[] = [`relationName: "${relation.id}"`];
|
|
480
531
|
|
|
481
532
|
// Track which relation types are used
|
|
@@ -491,17 +542,15 @@ function generateRelation(
|
|
|
491
542
|
const references: string[] = [];
|
|
492
543
|
|
|
493
544
|
// Use sanitized TypeScript export names for identifier references
|
|
494
|
-
const tableRef = namespace
|
|
495
|
-
? `${table.ormName}_${sanitizeNamespace(namespace)}`
|
|
496
|
-
: table.ormName;
|
|
545
|
+
const tableRef = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;
|
|
497
546
|
const relatedTableRef = namespace
|
|
498
|
-
? `${relation.table.
|
|
499
|
-
: relation.table.
|
|
547
|
+
? `${relation.table.name}_${sanitizeNamespace(namespace)}`
|
|
548
|
+
: relation.table.name;
|
|
500
549
|
|
|
501
550
|
for (const [left, right] of relation.on) {
|
|
502
551
|
fields.push(`${tableRef}.${left}`);
|
|
503
552
|
// Relations reference internal IDs
|
|
504
|
-
const actualRight = right
|
|
553
|
+
const actualRight = right !== "id" ? right : "_internalId";
|
|
505
554
|
references.push(`${relatedTableRef}.${actualRight}`);
|
|
506
555
|
}
|
|
507
556
|
|
|
@@ -509,8 +558,8 @@ function generateRelation(
|
|
|
509
558
|
}
|
|
510
559
|
|
|
511
560
|
const relatedTableRef = namespace
|
|
512
|
-
? `${relation.table.
|
|
513
|
-
: relation.table.
|
|
561
|
+
? `${relation.table.name}_${sanitizeNamespace(namespace)}`
|
|
562
|
+
: relation.table.name;
|
|
514
563
|
|
|
515
564
|
const args: string[] = [relatedTableRef];
|
|
516
565
|
if (options.length > 0) {
|
|
@@ -525,17 +574,17 @@ function generateRelation(
|
|
|
525
574
|
if (inverseRelations && inverseRelations.length > 0) {
|
|
526
575
|
for (const { fromTable, relation } of inverseRelations) {
|
|
527
576
|
// Only generate inverse for "one" relations (they become "many" on this side)
|
|
528
|
-
if (relation.type === "one") {
|
|
577
|
+
if (relation.type === "one" && relation.foreignKey !== false) {
|
|
529
578
|
hasMany = true;
|
|
530
579
|
|
|
531
580
|
// Use sanitized TypeScript export name for identifier reference
|
|
532
581
|
const fromTableRef = namespace
|
|
533
|
-
? `${fromTable.
|
|
534
|
-
: fromTable.
|
|
582
|
+
? `${fromTable.name}_${sanitizeNamespace(namespace)}`
|
|
583
|
+
: fromTable.name;
|
|
535
584
|
|
|
536
585
|
// Generate inverse relation name with consistent suffix
|
|
537
586
|
// e.g., if session has "sessionOwner" relation to user, user gets "sessionList" inverse relation
|
|
538
|
-
const inverseRelationName = `${fromTable.
|
|
587
|
+
const inverseRelationName = `${fromTable.name}List`;
|
|
539
588
|
|
|
540
589
|
const options: string[] = [`relationName: "${relation.id}"`];
|
|
541
590
|
const args: string[] = [fromTableRef, `{\n${ident(options.join(",\n"))}\n}`];
|
|
@@ -560,10 +609,8 @@ function generateRelation(
|
|
|
560
609
|
const relationParams = params.length > 0 ? `{ ${params.join(", ")} }` : "{}";
|
|
561
610
|
|
|
562
611
|
// Use sanitized names for TypeScript export identifiers
|
|
563
|
-
const exportTableRef = namespace
|
|
564
|
-
|
|
565
|
-
: table.ormName;
|
|
566
|
-
const relationsName = namespace ? `${exportTableRef}Relations` : `${table.ormName}Relations`;
|
|
612
|
+
const exportTableRef = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;
|
|
613
|
+
const relationsName = namespace ? `${exportTableRef}Relations` : `${table.name}Relations`;
|
|
567
614
|
|
|
568
615
|
ctx.imports.addImport("relations", "drizzle-orm");
|
|
569
616
|
return `export const ${relationsName} = relations(${exportTableRef}, (${relationParams}) => ({
|
|
@@ -581,24 +628,22 @@ ${relations.join(",\n")}
|
|
|
581
628
|
*/
|
|
582
629
|
function generateFragmentSchemaExport(
|
|
583
630
|
schema: AnySchema,
|
|
584
|
-
namespace: string,
|
|
631
|
+
namespace: string | null,
|
|
585
632
|
tablesWithRelations?: Set<string>,
|
|
586
|
-
|
|
633
|
+
_resolver?: NamingResolver,
|
|
587
634
|
): string {
|
|
588
635
|
const drizzleEntries: string[] = [];
|
|
589
636
|
|
|
590
637
|
for (const table of Object.values(schema.tables)) {
|
|
591
638
|
// TypeScript export name (always sanitized for valid JS identifiers)
|
|
592
|
-
const exportName = namespace
|
|
593
|
-
? `${table.ormName}_${sanitizeNamespace(namespace)}`
|
|
594
|
-
: table.ormName;
|
|
639
|
+
const exportName = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;
|
|
595
640
|
|
|
596
641
|
// Add physical table name to drizzle schema
|
|
597
642
|
drizzleEntries.push(` ${exportName}: ${exportName}`);
|
|
598
643
|
|
|
599
644
|
// Include relations for this table if they exist (either explicit or inverse)
|
|
600
645
|
if (tablesWithRelations?.has(table.name)) {
|
|
601
|
-
const relationsName = namespace ? `${exportName}Relations` : `${table.
|
|
646
|
+
const relationsName = namespace ? `${exportName}Relations` : `${table.name}Relations`;
|
|
602
647
|
|
|
603
648
|
drizzleEntries.push(` ${relationsName}: ${relationsName}`);
|
|
604
649
|
}
|
|
@@ -607,12 +652,12 @@ function generateFragmentSchemaExport(
|
|
|
607
652
|
// The key insight: Drizzle needs BOTH the table alias AND its relations alias
|
|
608
653
|
// in the same schema object for relational queries to work
|
|
609
654
|
if (namespace) {
|
|
610
|
-
drizzleEntries.push(` ${table.
|
|
655
|
+
drizzleEntries.push(` ${table.name}: ${exportName}`);
|
|
611
656
|
|
|
612
657
|
// Also add the relations under the aliased name if they exist
|
|
613
658
|
if (tablesWithRelations?.has(table.name)) {
|
|
614
659
|
const physicalRelationsName = `${exportName}Relations`;
|
|
615
|
-
const aliasRelationsName = `${table.
|
|
660
|
+
const aliasRelationsName = `${table.name}Relations`;
|
|
616
661
|
drizzleEntries.push(` ${aliasRelationsName}: ${physicalRelationsName}`);
|
|
617
662
|
}
|
|
618
663
|
}
|
|
@@ -639,8 +684,8 @@ export interface GenerateSchemaOptions {
|
|
|
639
684
|
/** Module to import from */
|
|
640
685
|
from: string;
|
|
641
686
|
};
|
|
642
|
-
/** Optional
|
|
643
|
-
|
|
687
|
+
/** Optional naming strategy override for physical names */
|
|
688
|
+
namingStrategy?: SqlNamingStrategy;
|
|
644
689
|
}
|
|
645
690
|
|
|
646
691
|
/**
|
|
@@ -649,35 +694,45 @@ export interface GenerateSchemaOptions {
|
|
|
649
694
|
/**
|
|
650
695
|
* Generate a schema file from one or more fragments with automatic de-duplication
|
|
651
696
|
*/
|
|
652
|
-
export function
|
|
653
|
-
fragments: { namespace: string; schema: AnySchema }[],
|
|
654
|
-
provider:
|
|
697
|
+
export function generateDrizzleSchema(
|
|
698
|
+
fragments: { namespace: string | null; schema: AnySchema }[],
|
|
699
|
+
provider: SupportedDatabase,
|
|
655
700
|
options?: GenerateSchemaOptions,
|
|
656
701
|
): string {
|
|
657
702
|
const ctx = createContext(provider, options?.idGeneratorImport);
|
|
658
703
|
const customTypes: string[] = [];
|
|
659
704
|
const sections: string[] = [];
|
|
660
|
-
const
|
|
661
|
-
options?.mapperFactory ||
|
|
662
|
-
((ns: string | undefined) => (ns ? createTableNameMapper(ns, true) : undefined));
|
|
705
|
+
const namingStrategy = options?.namingStrategy ?? defaultNamingStrategyForDatabase(provider);
|
|
663
706
|
|
|
664
707
|
for (const { schema, namespace } of fragments) {
|
|
665
708
|
const fragmentTables: string[] = [];
|
|
666
|
-
const
|
|
709
|
+
const resolver = createNamingResolver(schema, namespace, namingStrategy);
|
|
710
|
+
const schemaName = resolver.getSchemaName();
|
|
711
|
+
const schemaRef =
|
|
712
|
+
ctx.provider === "postgresql" && schemaName
|
|
713
|
+
? `schema_${sanitizeNamespace(schemaName)}`
|
|
714
|
+
: undefined;
|
|
667
715
|
|
|
668
716
|
// Add section header
|
|
669
717
|
fragmentTables.push("");
|
|
670
718
|
fragmentTables.push(
|
|
671
719
|
"// ============================================================================",
|
|
672
720
|
);
|
|
673
|
-
|
|
721
|
+
const namespaceLabel = namespace ?? "(none)";
|
|
722
|
+
fragmentTables.push(`// Fragment: ${namespaceLabel}`);
|
|
674
723
|
fragmentTables.push(
|
|
675
724
|
"// ============================================================================",
|
|
676
725
|
);
|
|
677
726
|
|
|
727
|
+
if (schemaRef && schemaName) {
|
|
728
|
+
ctx.imports.addImport("pgSchema", ctx.importSource);
|
|
729
|
+
fragmentTables.push("");
|
|
730
|
+
fragmentTables.push(`const ${schemaRef} = pgSchema("${schemaName}");`);
|
|
731
|
+
}
|
|
732
|
+
|
|
678
733
|
// Generate tables for this fragment
|
|
679
734
|
for (const table of Object.values(schema.tables)) {
|
|
680
|
-
const tableCode = generateTable(ctx, table, customTypes, namespace,
|
|
735
|
+
const tableCode = generateTable(ctx, table, customTypes, namespace, resolver, schemaRef);
|
|
681
736
|
fragmentTables.push("");
|
|
682
737
|
fragmentTables.push(tableCode);
|
|
683
738
|
}
|
|
@@ -687,6 +742,9 @@ export function generateSchema(
|
|
|
687
742
|
const inverseRelations = new Map<string, Array<{ fromTable: AnyTable; relation: Relation }>>();
|
|
688
743
|
for (const table of Object.values(schema.tables)) {
|
|
689
744
|
for (const relation of Object.values(table.relations)) {
|
|
745
|
+
if (relation.foreignKey === false) {
|
|
746
|
+
continue;
|
|
747
|
+
}
|
|
690
748
|
// Track this relation as an inverse on the target table
|
|
691
749
|
const targetTableName = relation.table.name;
|
|
692
750
|
if (!inverseRelations.has(targetTableName)) {
|
|
@@ -704,7 +762,7 @@ export function generateSchema(
|
|
|
704
762
|
table,
|
|
705
763
|
namespace,
|
|
706
764
|
inverseRelations.get(table.name),
|
|
707
|
-
|
|
765
|
+
resolver,
|
|
708
766
|
);
|
|
709
767
|
if (relationCode) {
|
|
710
768
|
fragmentTables.push("");
|
|
@@ -713,12 +771,10 @@ export function generateSchema(
|
|
|
713
771
|
}
|
|
714
772
|
}
|
|
715
773
|
|
|
716
|
-
// Generate schema export object (skip for
|
|
717
|
-
if (namespace
|
|
774
|
+
// Generate schema export object (skip for internal fragment to avoid duplicate _schema exports)
|
|
775
|
+
if (!(namespace === null && schema.name === internalSchema.name)) {
|
|
718
776
|
fragmentTables.push("");
|
|
719
|
-
fragmentTables.push(
|
|
720
|
-
generateFragmentSchemaExport(schema, namespace, tablesWithRelations, mapper),
|
|
721
|
-
);
|
|
777
|
+
fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations));
|
|
722
778
|
}
|
|
723
779
|
|
|
724
780
|
sections.push(...fragmentTables);
|