@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,10 +1,11 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { column, idColumn, referenceColumn, schema } from "../../schema/create";
|
|
3
|
-
import { generateSchema } from "./generate";
|
|
4
|
-
import { internalSchema } from "../../fragments/internal-fragment";
|
|
5
2
|
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
import { internalSchema } from "../fragments/internal-fragment";
|
|
4
|
+
import { column, idColumn, referenceColumn, schema } from "../schema/create";
|
|
5
|
+
import { generateDrizzleSchema } from "./drizzle";
|
|
6
|
+
|
|
7
|
+
describe("generateDrizzleSchema", () => {
|
|
8
|
+
const testSchema = schema("test", (s) => {
|
|
8
9
|
return s
|
|
9
10
|
.addTable("users", (t) => {
|
|
10
11
|
return t
|
|
@@ -32,11 +33,34 @@ describe("generateSchema", () => {
|
|
|
32
33
|
});
|
|
33
34
|
});
|
|
34
35
|
|
|
36
|
+
it("should reflect alterColumn nullable changes", () => {
|
|
37
|
+
const alteredSchema = schema("altered", (s) => {
|
|
38
|
+
return s
|
|
39
|
+
.addTable("users", (t) => {
|
|
40
|
+
return t.addColumn("id", idColumn()).addColumn("name", column("string"));
|
|
41
|
+
})
|
|
42
|
+
.alterTable("users", (t) => {
|
|
43
|
+
return t.alterColumn("name").nullable();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const generated = generateDrizzleSchema(
|
|
48
|
+
[{ namespace: "altered", schema: alteredSchema }],
|
|
49
|
+
"postgresql",
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
expect(generated).toContain(`name: text("name")`);
|
|
53
|
+
expect(generated).not.toContain(`name: text("name").notNull()`);
|
|
54
|
+
});
|
|
55
|
+
|
|
35
56
|
describe("postgresql", () => {
|
|
36
57
|
it("should generate PostgreSQL schema", () => {
|
|
37
|
-
const generated =
|
|
58
|
+
const generated = generateDrizzleSchema(
|
|
59
|
+
[{ namespace: "test", schema: testSchema }],
|
|
60
|
+
"postgresql",
|
|
61
|
+
);
|
|
38
62
|
expect(generated).toMatchInlineSnapshot(`
|
|
39
|
-
"import {
|
|
63
|
+
"import { pgSchema, varchar, text, integer, bigserial, uniqueIndex, index, bigint, foreignKey } from "drizzle-orm/pg-core"
|
|
40
64
|
import { createId } from "@fragno-dev/db/id"
|
|
41
65
|
import { relations } from "drizzle-orm"
|
|
42
66
|
|
|
@@ -44,20 +68,22 @@ describe("generateSchema", () => {
|
|
|
44
68
|
// Fragment: test
|
|
45
69
|
// ============================================================================
|
|
46
70
|
|
|
47
|
-
|
|
48
|
-
|
|
71
|
+
const schema_test = pgSchema("test");
|
|
72
|
+
|
|
73
|
+
export const users_test = schema_test.table("users", {
|
|
74
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
49
75
|
name: text("name").notNull(),
|
|
50
76
|
email: text("email").notNull(),
|
|
51
77
|
age: integer("age"),
|
|
52
78
|
_internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
|
|
53
79
|
_version: integer("_version").notNull().default(0)
|
|
54
80
|
}, (table) => [
|
|
55
|
-
uniqueIndex("
|
|
56
|
-
index("
|
|
81
|
+
uniqueIndex("idx_email").on(table.email),
|
|
82
|
+
index("idx_name").on(table.name)
|
|
57
83
|
])
|
|
58
84
|
|
|
59
|
-
export const posts_test =
|
|
60
|
-
id: varchar("id", { length:
|
|
85
|
+
export const posts_test = schema_test.table("posts", {
|
|
86
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
61
87
|
title: text("title").notNull(),
|
|
62
88
|
content: text("content").notNull(),
|
|
63
89
|
userId: bigint("userId", { mode: "number" }).notNull(),
|
|
@@ -68,10 +94,10 @@ describe("generateSchema", () => {
|
|
|
68
94
|
foreignKey({
|
|
69
95
|
columns: [table.userId],
|
|
70
96
|
foreignColumns: [users_test._internalId],
|
|
71
|
-
name: "
|
|
97
|
+
name: "fk_posts_users_author"
|
|
72
98
|
}),
|
|
73
|
-
index("
|
|
74
|
-
index("
|
|
99
|
+
index("idx_user").on(table.userId),
|
|
100
|
+
index("idx_title").on(table.title)
|
|
75
101
|
])
|
|
76
102
|
|
|
77
103
|
export const users_testRelations = relations(users_test, ({ many }) => ({
|
|
@@ -105,7 +131,7 @@ describe("generateSchema", () => {
|
|
|
105
131
|
|
|
106
132
|
describe("mysql", () => {
|
|
107
133
|
it("should generate MySQL schema", () => {
|
|
108
|
-
const generated =
|
|
134
|
+
const generated = generateDrizzleSchema([{ namespace: "test", schema: testSchema }], "mysql");
|
|
109
135
|
expect(generated).toMatchInlineSnapshot(`
|
|
110
136
|
"import { mysqlTable, varchar, text, int, bigint, uniqueIndex, index, foreignKey } from "drizzle-orm/mysql-core"
|
|
111
137
|
import { createId } from "@fragno-dev/db/id"
|
|
@@ -116,19 +142,19 @@ describe("generateSchema", () => {
|
|
|
116
142
|
// ============================================================================
|
|
117
143
|
|
|
118
144
|
export const users_test = mysqlTable("users_test", {
|
|
119
|
-
id: varchar("id", { length:
|
|
145
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
120
146
|
name: text("name").notNull(),
|
|
121
147
|
email: text("email").notNull(),
|
|
122
148
|
age: int("age"),
|
|
123
149
|
_internalId: bigint("_internalId", { mode: "number" }).primaryKey().autoincrement().notNull(),
|
|
124
150
|
_version: int("_version").notNull().default(0)
|
|
125
151
|
}, (table) => [
|
|
126
|
-
uniqueIndex("
|
|
127
|
-
index("
|
|
152
|
+
uniqueIndex("uidx_users_idx_email_test_3d974845").on(table.email),
|
|
153
|
+
index("idx_users_idx_name_test_7f36c497").on(table.name)
|
|
128
154
|
])
|
|
129
155
|
|
|
130
156
|
export const posts_test = mysqlTable("posts_test", {
|
|
131
|
-
id: varchar("id", { length:
|
|
157
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
132
158
|
title: text("title").notNull(),
|
|
133
159
|
content: text("content").notNull(),
|
|
134
160
|
userId: bigint("userId", { mode: "number" }).notNull(),
|
|
@@ -139,10 +165,10 @@ describe("generateSchema", () => {
|
|
|
139
165
|
foreignKey({
|
|
140
166
|
columns: [table.userId],
|
|
141
167
|
foreignColumns: [users_test._internalId],
|
|
142
|
-
name: "
|
|
168
|
+
name: "fk_posts_users_author_test_8d48035c"
|
|
143
169
|
}),
|
|
144
|
-
index("
|
|
145
|
-
index("
|
|
170
|
+
index("idx_posts_idx_user_test_4a5c5c19").on(table.userId),
|
|
171
|
+
index("idx_posts_idx_title_test_00e97ff4").on(table.title)
|
|
146
172
|
])
|
|
147
173
|
|
|
148
174
|
export const users_testRelations = relations(users_test, ({ many }) => ({
|
|
@@ -176,7 +202,10 @@ describe("generateSchema", () => {
|
|
|
176
202
|
|
|
177
203
|
describe("sqlite", () => {
|
|
178
204
|
it("should generate SQLite schema", () => {
|
|
179
|
-
const generated =
|
|
205
|
+
const generated = generateDrizzleSchema(
|
|
206
|
+
[{ namespace: "test", schema: testSchema }],
|
|
207
|
+
"sqlite",
|
|
208
|
+
);
|
|
180
209
|
expect(generated).toMatchInlineSnapshot(`
|
|
181
210
|
"import { sqliteTable, text, integer, uniqueIndex, index, foreignKey } from "drizzle-orm/sqlite-core"
|
|
182
211
|
import { createId } from "@fragno-dev/db/id"
|
|
@@ -187,19 +216,20 @@ describe("generateSchema", () => {
|
|
|
187
216
|
// ============================================================================
|
|
188
217
|
|
|
189
218
|
export const users_test = sqliteTable("users_test", {
|
|
190
|
-
id: text("id").notNull().$defaultFn(() => createId()),
|
|
219
|
+
id: text("id").notNull().unique().$defaultFn(() => createId()),
|
|
191
220
|
name: text("name").notNull(),
|
|
192
221
|
email: text("email").notNull(),
|
|
193
222
|
age: integer("age"),
|
|
194
223
|
_internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
|
|
195
224
|
_version: integer("_version").notNull().default(0)
|
|
196
225
|
}, (table) => [
|
|
197
|
-
uniqueIndex("
|
|
198
|
-
index("
|
|
226
|
+
uniqueIndex("uidx_users_idx_email_test_3d974845").on(table.email),
|
|
227
|
+
index("idx_users_idx_name_test_7f36c497").on(table.name),
|
|
228
|
+
uniqueIndex("uidx_users_idx_users_external_id_test_8eaf053f").on(table.id)
|
|
199
229
|
])
|
|
200
230
|
|
|
201
231
|
export const posts_test = sqliteTable("posts_test", {
|
|
202
|
-
id: text("id").notNull().$defaultFn(() => createId()),
|
|
232
|
+
id: text("id").notNull().unique().$defaultFn(() => createId()),
|
|
203
233
|
title: text("title").notNull(),
|
|
204
234
|
content: text("content").notNull(),
|
|
205
235
|
userId: integer("userId").notNull(),
|
|
@@ -210,10 +240,11 @@ describe("generateSchema", () => {
|
|
|
210
240
|
foreignKey({
|
|
211
241
|
columns: [table.userId],
|
|
212
242
|
foreignColumns: [users_test._internalId],
|
|
213
|
-
name: "
|
|
243
|
+
name: "fk_posts_users_author_test_8d48035c"
|
|
214
244
|
}),
|
|
215
|
-
index("
|
|
216
|
-
index("
|
|
245
|
+
index("idx_posts_idx_user_test_4a5c5c19").on(table.userId),
|
|
246
|
+
index("idx_posts_idx_title_test_00e97ff4").on(table.title),
|
|
247
|
+
uniqueIndex("uidx_posts_idx_posts_external_id_test_80487638").on(table.id)
|
|
217
248
|
])
|
|
218
249
|
|
|
219
250
|
export const users_testRelations = relations(users_test, ({ many }) => ({
|
|
@@ -247,7 +278,7 @@ describe("generateSchema", () => {
|
|
|
247
278
|
|
|
248
279
|
describe("default values", () => {
|
|
249
280
|
it("should handle runtime default values", () => {
|
|
250
|
-
const timestampSchema = schema((s) => {
|
|
281
|
+
const timestampSchema = schema("timestamp", (s) => {
|
|
251
282
|
return s.addTable("events", (t) => {
|
|
252
283
|
return t.addColumn("id", idColumn()).addColumn(
|
|
253
284
|
"createdAt",
|
|
@@ -256,20 +287,22 @@ describe("generateSchema", () => {
|
|
|
256
287
|
});
|
|
257
288
|
});
|
|
258
289
|
|
|
259
|
-
const generated =
|
|
290
|
+
const generated = generateDrizzleSchema(
|
|
260
291
|
[{ namespace: "test", schema: timestampSchema }],
|
|
261
292
|
"postgresql",
|
|
262
293
|
);
|
|
263
294
|
expect(generated).toMatchInlineSnapshot(`
|
|
264
|
-
"import {
|
|
295
|
+
"import { pgSchema, varchar, timestamp, bigserial, integer } from "drizzle-orm/pg-core"
|
|
265
296
|
import { createId } from "@fragno-dev/db/id"
|
|
266
297
|
|
|
267
298
|
// ============================================================================
|
|
268
299
|
// Fragment: test
|
|
269
300
|
// ============================================================================
|
|
270
301
|
|
|
271
|
-
|
|
272
|
-
|
|
302
|
+
const schema_test = pgSchema("test");
|
|
303
|
+
|
|
304
|
+
export const events_test = schema_test.table("events", {
|
|
305
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
273
306
|
createdAt: timestamp("createdAt").notNull().$defaultFn(() => new Date()),
|
|
274
307
|
_internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
|
|
275
308
|
_version: integer("_version").notNull().default(0)
|
|
@@ -284,7 +317,7 @@ describe("generateSchema", () => {
|
|
|
284
317
|
});
|
|
285
318
|
|
|
286
319
|
it("should handle database-level default values", () => {
|
|
287
|
-
const timestampSchema = schema((s) => {
|
|
320
|
+
const timestampSchema = schema("timestamp", (s) => {
|
|
288
321
|
return s.addTable("events", (t) => {
|
|
289
322
|
return t.addColumn("id", idColumn()).addColumn(
|
|
290
323
|
"createdAt",
|
|
@@ -293,20 +326,22 @@ describe("generateSchema", () => {
|
|
|
293
326
|
});
|
|
294
327
|
});
|
|
295
328
|
|
|
296
|
-
const generated =
|
|
329
|
+
const generated = generateDrizzleSchema(
|
|
297
330
|
[{ namespace: "test", schema: timestampSchema }],
|
|
298
331
|
"postgresql",
|
|
299
332
|
);
|
|
300
333
|
expect(generated).toMatchInlineSnapshot(`
|
|
301
|
-
"import {
|
|
334
|
+
"import { pgSchema, varchar, timestamp, bigserial, integer } from "drizzle-orm/pg-core"
|
|
302
335
|
import { createId } from "@fragno-dev/db/id"
|
|
303
336
|
|
|
304
337
|
// ============================================================================
|
|
305
338
|
// Fragment: test
|
|
306
339
|
// ============================================================================
|
|
307
340
|
|
|
308
|
-
|
|
309
|
-
|
|
341
|
+
const schema_test = pgSchema("test");
|
|
342
|
+
|
|
343
|
+
export const events_test = schema_test.table("events", {
|
|
344
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
310
345
|
createdAt: timestamp("createdAt").notNull().defaultNow(),
|
|
311
346
|
_internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
|
|
312
347
|
_version: integer("_version").notNull().default(0)
|
|
@@ -323,15 +358,18 @@ describe("generateSchema", () => {
|
|
|
323
358
|
|
|
324
359
|
describe("binary columns", () => {
|
|
325
360
|
it("should generate custom type for binary columns", () => {
|
|
326
|
-
const binarySchema = schema((s) => {
|
|
361
|
+
const binarySchema = schema("binary", (s) => {
|
|
327
362
|
return s.addTable("files", (t) => {
|
|
328
363
|
return t.addColumn("id", idColumn()).addColumn("data", column("binary"));
|
|
329
364
|
});
|
|
330
365
|
});
|
|
331
366
|
|
|
332
|
-
const generated =
|
|
367
|
+
const generated = generateDrizzleSchema(
|
|
368
|
+
[{ namespace: "test", schema: binarySchema }],
|
|
369
|
+
"postgresql",
|
|
370
|
+
);
|
|
333
371
|
expect(generated).toMatchInlineSnapshot(`
|
|
334
|
-
"import {
|
|
372
|
+
"import { pgSchema, varchar, customType, bigserial, integer } from "drizzle-orm/pg-core"
|
|
335
373
|
import { createId } from "@fragno-dev/db/id"
|
|
336
374
|
const customBinary = customType<
|
|
337
375
|
{
|
|
@@ -354,8 +392,10 @@ describe("generateSchema", () => {
|
|
|
354
392
|
// Fragment: test
|
|
355
393
|
// ============================================================================
|
|
356
394
|
|
|
357
|
-
|
|
358
|
-
|
|
395
|
+
const schema_test = pgSchema("test");
|
|
396
|
+
|
|
397
|
+
export const files_test = schema_test.table("files", {
|
|
398
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
359
399
|
data: customBinary("data").notNull(),
|
|
360
400
|
_internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
|
|
361
401
|
_version: integer("_version").notNull().default(0)
|
|
@@ -371,7 +411,7 @@ describe("generateSchema", () => {
|
|
|
371
411
|
});
|
|
372
412
|
|
|
373
413
|
describe("many relations", () => {
|
|
374
|
-
const oneToManySchema = schema((s) => {
|
|
414
|
+
const oneToManySchema = schema("onetomany", (s) => {
|
|
375
415
|
return s
|
|
376
416
|
.addTable("users", (t) => {
|
|
377
417
|
return t.addColumn("id", idColumn()).addColumn("name", column("string"));
|
|
@@ -396,12 +436,12 @@ describe("generateSchema", () => {
|
|
|
396
436
|
});
|
|
397
437
|
|
|
398
438
|
it("should generate PostgreSQL schema with many relations", () => {
|
|
399
|
-
const generated =
|
|
439
|
+
const generated = generateDrizzleSchema(
|
|
400
440
|
[{ namespace: "test", schema: oneToManySchema }],
|
|
401
441
|
"postgresql",
|
|
402
442
|
);
|
|
403
443
|
expect(generated).toMatchInlineSnapshot(`
|
|
404
|
-
"import {
|
|
444
|
+
"import { pgSchema, varchar, text, bigserial, integer, bigint, foreignKey, index } from "drizzle-orm/pg-core"
|
|
405
445
|
import { createId } from "@fragno-dev/db/id"
|
|
406
446
|
import { relations } from "drizzle-orm"
|
|
407
447
|
|
|
@@ -409,15 +449,17 @@ describe("generateSchema", () => {
|
|
|
409
449
|
// Fragment: test
|
|
410
450
|
// ============================================================================
|
|
411
451
|
|
|
412
|
-
|
|
413
|
-
|
|
452
|
+
const schema_test = pgSchema("test");
|
|
453
|
+
|
|
454
|
+
export const users_test = schema_test.table("users", {
|
|
455
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
414
456
|
name: text("name").notNull(),
|
|
415
457
|
_internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
|
|
416
458
|
_version: integer("_version").notNull().default(0)
|
|
417
459
|
})
|
|
418
460
|
|
|
419
|
-
export const posts_test =
|
|
420
|
-
id: varchar("id", { length:
|
|
461
|
+
export const posts_test = schema_test.table("posts", {
|
|
462
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
421
463
|
title: text("title").notNull(),
|
|
422
464
|
userId: bigint("userId", { mode: "number" }).notNull(),
|
|
423
465
|
_internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
|
|
@@ -426,9 +468,9 @@ describe("generateSchema", () => {
|
|
|
426
468
|
foreignKey({
|
|
427
469
|
columns: [table.userId],
|
|
428
470
|
foreignColumns: [users_test._internalId],
|
|
429
|
-
name: "
|
|
471
|
+
name: "fk_posts_users_author"
|
|
430
472
|
}),
|
|
431
|
-
index("
|
|
473
|
+
index("idx_user").on(table.userId)
|
|
432
474
|
])
|
|
433
475
|
|
|
434
476
|
export const users_testRelations = relations(users_test, ({ many }) => ({
|
|
@@ -463,7 +505,10 @@ describe("generateSchema", () => {
|
|
|
463
505
|
});
|
|
464
506
|
|
|
465
507
|
it("should generate MySQL schema with many relations", () => {
|
|
466
|
-
const generated =
|
|
508
|
+
const generated = generateDrizzleSchema(
|
|
509
|
+
[{ namespace: "test", schema: oneToManySchema }],
|
|
510
|
+
"mysql",
|
|
511
|
+
);
|
|
467
512
|
expect(generated).toMatchInlineSnapshot(`
|
|
468
513
|
"import { mysqlTable, varchar, text, bigint, int, foreignKey, index } from "drizzle-orm/mysql-core"
|
|
469
514
|
import { createId } from "@fragno-dev/db/id"
|
|
@@ -474,14 +519,14 @@ describe("generateSchema", () => {
|
|
|
474
519
|
// ============================================================================
|
|
475
520
|
|
|
476
521
|
export const users_test = mysqlTable("users_test", {
|
|
477
|
-
id: varchar("id", { length:
|
|
522
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
478
523
|
name: text("name").notNull(),
|
|
479
524
|
_internalId: bigint("_internalId", { mode: "number" }).primaryKey().autoincrement().notNull(),
|
|
480
525
|
_version: int("_version").notNull().default(0)
|
|
481
526
|
})
|
|
482
527
|
|
|
483
528
|
export const posts_test = mysqlTable("posts_test", {
|
|
484
|
-
id: varchar("id", { length:
|
|
529
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
485
530
|
title: text("title").notNull(),
|
|
486
531
|
userId: bigint("userId", { mode: "number" }).notNull(),
|
|
487
532
|
_internalId: bigint("_internalId", { mode: "number" }).primaryKey().autoincrement().notNull(),
|
|
@@ -490,9 +535,9 @@ describe("generateSchema", () => {
|
|
|
490
535
|
foreignKey({
|
|
491
536
|
columns: [table.userId],
|
|
492
537
|
foreignColumns: [users_test._internalId],
|
|
493
|
-
name: "
|
|
538
|
+
name: "fk_posts_users_author_test_8d48035c"
|
|
494
539
|
}),
|
|
495
|
-
index("
|
|
540
|
+
index("idx_posts_idx_user_test_4a5c5c19").on(table.userId)
|
|
496
541
|
])
|
|
497
542
|
|
|
498
543
|
export const users_testRelations = relations(users_test, ({ many }) => ({
|
|
@@ -527,9 +572,12 @@ describe("generateSchema", () => {
|
|
|
527
572
|
});
|
|
528
573
|
|
|
529
574
|
it("should generate SQLite schema with many relations", () => {
|
|
530
|
-
const generated =
|
|
575
|
+
const generated = generateDrizzleSchema(
|
|
576
|
+
[{ namespace: "test", schema: oneToManySchema }],
|
|
577
|
+
"sqlite",
|
|
578
|
+
);
|
|
531
579
|
expect(generated).toMatchInlineSnapshot(`
|
|
532
|
-
"import { sqliteTable, text, integer, foreignKey, index } from "drizzle-orm/sqlite-core"
|
|
580
|
+
"import { sqliteTable, text, integer, uniqueIndex, foreignKey, index } from "drizzle-orm/sqlite-core"
|
|
533
581
|
import { createId } from "@fragno-dev/db/id"
|
|
534
582
|
import { relations } from "drizzle-orm"
|
|
535
583
|
|
|
@@ -538,14 +586,16 @@ describe("generateSchema", () => {
|
|
|
538
586
|
// ============================================================================
|
|
539
587
|
|
|
540
588
|
export const users_test = sqliteTable("users_test", {
|
|
541
|
-
id: text("id").notNull().$defaultFn(() => createId()),
|
|
589
|
+
id: text("id").notNull().unique().$defaultFn(() => createId()),
|
|
542
590
|
name: text("name").notNull(),
|
|
543
591
|
_internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
|
|
544
592
|
_version: integer("_version").notNull().default(0)
|
|
545
|
-
})
|
|
593
|
+
}, (table) => [
|
|
594
|
+
uniqueIndex("uidx_users_idx_users_external_id_test_8eaf053f").on(table.id)
|
|
595
|
+
])
|
|
546
596
|
|
|
547
597
|
export const posts_test = sqliteTable("posts_test", {
|
|
548
|
-
id: text("id").notNull().$defaultFn(() => createId()),
|
|
598
|
+
id: text("id").notNull().unique().$defaultFn(() => createId()),
|
|
549
599
|
title: text("title").notNull(),
|
|
550
600
|
userId: integer("userId").notNull(),
|
|
551
601
|
_internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
|
|
@@ -554,9 +604,10 @@ describe("generateSchema", () => {
|
|
|
554
604
|
foreignKey({
|
|
555
605
|
columns: [table.userId],
|
|
556
606
|
foreignColumns: [users_test._internalId],
|
|
557
|
-
name: "
|
|
607
|
+
name: "fk_posts_users_author_test_8d48035c"
|
|
558
608
|
}),
|
|
559
|
-
index("
|
|
609
|
+
index("idx_posts_idx_user_test_4a5c5c19").on(table.userId),
|
|
610
|
+
uniqueIndex("uidx_posts_idx_posts_external_id_test_80487638").on(table.id)
|
|
560
611
|
])
|
|
561
612
|
|
|
562
613
|
export const users_testRelations = relations(users_test, ({ many }) => ({
|
|
@@ -591,7 +642,7 @@ describe("generateSchema", () => {
|
|
|
591
642
|
});
|
|
592
643
|
|
|
593
644
|
it("should handle table with only many relations (no foreign keys)", () => {
|
|
594
|
-
const manyOnlySchema = schema((s) => {
|
|
645
|
+
const manyOnlySchema = schema("manyonly", (s) => {
|
|
595
646
|
return s
|
|
596
647
|
.addTable("categories", (t) => {
|
|
597
648
|
return t.addColumn("id", idColumn()).addColumn("name", column("string"));
|
|
@@ -609,14 +660,14 @@ describe("generateSchema", () => {
|
|
|
609
660
|
});
|
|
610
661
|
});
|
|
611
662
|
|
|
612
|
-
const generated =
|
|
663
|
+
const generated = generateDrizzleSchema(
|
|
613
664
|
[{ namespace: "test", schema: manyOnlySchema }],
|
|
614
665
|
"postgresql",
|
|
615
666
|
);
|
|
616
667
|
|
|
617
668
|
// Categories table should NOT have a constraint callback (no foreign keys, no indexes)
|
|
618
669
|
const categoriesTableMatch = generated.match(
|
|
619
|
-
/export const categories_test =
|
|
670
|
+
/export const categories_test = schema_test\.table\("categories", \{[^}]+\}\)/,
|
|
620
671
|
);
|
|
621
672
|
expect(categoriesTableMatch).toBeTruthy();
|
|
622
673
|
|
|
@@ -629,7 +680,7 @@ describe("generateSchema", () => {
|
|
|
629
680
|
// Should have schema export
|
|
630
681
|
expect(generated).toContain("export const test_schema = {");
|
|
631
682
|
expect(generated).toMatchInlineSnapshot(`
|
|
632
|
-
"import {
|
|
683
|
+
"import { pgSchema, varchar, text, bigserial, integer, bigint } from "drizzle-orm/pg-core"
|
|
633
684
|
import { createId } from "@fragno-dev/db/id"
|
|
634
685
|
import { relations } from "drizzle-orm"
|
|
635
686
|
|
|
@@ -637,15 +688,17 @@ describe("generateSchema", () => {
|
|
|
637
688
|
// Fragment: test
|
|
638
689
|
// ============================================================================
|
|
639
690
|
|
|
640
|
-
|
|
641
|
-
|
|
691
|
+
const schema_test = pgSchema("test");
|
|
692
|
+
|
|
693
|
+
export const categories_test = schema_test.table("categories", {
|
|
694
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
642
695
|
name: text("name").notNull(),
|
|
643
696
|
_internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
|
|
644
697
|
_version: integer("_version").notNull().default(0)
|
|
645
698
|
})
|
|
646
699
|
|
|
647
|
-
export const products_test =
|
|
648
|
-
id: varchar("id", { length:
|
|
700
|
+
export const products_test = schema_test.table("products", {
|
|
701
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
649
702
|
name: text("name").notNull(),
|
|
650
703
|
categoryId: bigint("categoryId", { mode: "number" }).notNull(),
|
|
651
704
|
_internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
|
|
@@ -671,7 +724,7 @@ describe("generateSchema", () => {
|
|
|
671
724
|
});
|
|
672
725
|
|
|
673
726
|
it("should handle self-referencing many relations", () => {
|
|
674
|
-
const selfManySchema = schema((s) => {
|
|
727
|
+
const selfManySchema = schema("selfmany", (s) => {
|
|
675
728
|
return s
|
|
676
729
|
.addTable("category", (t) => {
|
|
677
730
|
return t
|
|
@@ -691,7 +744,7 @@ describe("generateSchema", () => {
|
|
|
691
744
|
});
|
|
692
745
|
});
|
|
693
746
|
|
|
694
|
-
const generated =
|
|
747
|
+
const generated = generateDrizzleSchema(
|
|
695
748
|
[{ namespace: "test", schema: selfManySchema }],
|
|
696
749
|
"postgresql",
|
|
697
750
|
);
|
|
@@ -705,7 +758,7 @@ describe("generateSchema", () => {
|
|
|
705
758
|
expect(fkMatches).toHaveLength(1);
|
|
706
759
|
|
|
707
760
|
expect(generated).toMatchInlineSnapshot(`
|
|
708
|
-
"import {
|
|
761
|
+
"import { pgSchema, varchar, text, bigint, bigserial, integer, foreignKey } from "drizzle-orm/pg-core"
|
|
709
762
|
import { createId } from "@fragno-dev/db/id"
|
|
710
763
|
import { relations } from "drizzle-orm"
|
|
711
764
|
|
|
@@ -713,8 +766,10 @@ describe("generateSchema", () => {
|
|
|
713
766
|
// Fragment: test
|
|
714
767
|
// ============================================================================
|
|
715
768
|
|
|
716
|
-
|
|
717
|
-
|
|
769
|
+
const schema_test = pgSchema("test");
|
|
770
|
+
|
|
771
|
+
export const category_test = schema_test.table("category", {
|
|
772
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
718
773
|
name: text("name").notNull(),
|
|
719
774
|
parentId: bigint("parentId", { mode: "number" }),
|
|
720
775
|
_internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
|
|
@@ -723,7 +778,7 @@ describe("generateSchema", () => {
|
|
|
723
778
|
foreignKey({
|
|
724
779
|
columns: [table.parentId],
|
|
725
780
|
foreignColumns: [table._internalId],
|
|
726
|
-
name: "
|
|
781
|
+
name: "fk_category_category_parent"
|
|
727
782
|
})
|
|
728
783
|
])
|
|
729
784
|
|
|
@@ -752,8 +807,40 @@ describe("generateSchema", () => {
|
|
|
752
807
|
});
|
|
753
808
|
});
|
|
754
809
|
|
|
810
|
+
it("should skip join-only relations in schema output", () => {
|
|
811
|
+
const joinOnlySchema = schema("joinonly", (s) => {
|
|
812
|
+
return s
|
|
813
|
+
.addTable("users", (t) => {
|
|
814
|
+
return t
|
|
815
|
+
.addColumn("id", idColumn())
|
|
816
|
+
.addColumn("email", column("string"))
|
|
817
|
+
.createIndex("idx_users_email", ["email"]);
|
|
818
|
+
})
|
|
819
|
+
.addTable("invitations", (t) => {
|
|
820
|
+
return t
|
|
821
|
+
.addColumn("id", idColumn())
|
|
822
|
+
.addColumn("email", column("string"))
|
|
823
|
+
.createIndex("idx_inv_email", ["email"]);
|
|
824
|
+
})
|
|
825
|
+
.addReference("invitedUser", {
|
|
826
|
+
type: "one",
|
|
827
|
+
from: { table: "invitations", column: "email" },
|
|
828
|
+
to: { table: "users", column: "email" },
|
|
829
|
+
foreignKey: false,
|
|
830
|
+
});
|
|
831
|
+
});
|
|
832
|
+
|
|
833
|
+
const generated = generateDrizzleSchema(
|
|
834
|
+
[{ namespace: "test", schema: joinOnlySchema }],
|
|
835
|
+
"postgresql",
|
|
836
|
+
);
|
|
837
|
+
|
|
838
|
+
expect(generated).not.toContain("foreignKey(");
|
|
839
|
+
expect(generated).not.toContain("relations(");
|
|
840
|
+
});
|
|
841
|
+
|
|
755
842
|
describe("self-referencing foreign keys", () => {
|
|
756
|
-
const selfRefSchema = schema((s) => {
|
|
843
|
+
const selfRefSchema = schema("selfref", (s) => {
|
|
757
844
|
return s
|
|
758
845
|
.addTable("comment", (t) => {
|
|
759
846
|
return t
|
|
@@ -770,12 +857,12 @@ describe("generateSchema", () => {
|
|
|
770
857
|
});
|
|
771
858
|
|
|
772
859
|
it("should generate PostgreSQL self-referencing foreign key using table parameter", () => {
|
|
773
|
-
const generated =
|
|
860
|
+
const generated = generateDrizzleSchema(
|
|
774
861
|
[{ namespace: "test", schema: selfRefSchema }],
|
|
775
862
|
"postgresql",
|
|
776
863
|
);
|
|
777
864
|
expect(generated).toMatchInlineSnapshot(`
|
|
778
|
-
"import {
|
|
865
|
+
"import { pgSchema, varchar, text, bigint, bigserial, integer, foreignKey, index } from "drizzle-orm/pg-core"
|
|
779
866
|
import { createId } from "@fragno-dev/db/id"
|
|
780
867
|
import { relations } from "drizzle-orm"
|
|
781
868
|
|
|
@@ -783,8 +870,10 @@ describe("generateSchema", () => {
|
|
|
783
870
|
// Fragment: test
|
|
784
871
|
// ============================================================================
|
|
785
872
|
|
|
786
|
-
|
|
787
|
-
|
|
873
|
+
const schema_test = pgSchema("test");
|
|
874
|
+
|
|
875
|
+
export const comment_test = schema_test.table("comment", {
|
|
876
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
788
877
|
content: text("content").notNull(),
|
|
789
878
|
parentId: bigint("parentId", { mode: "number" }),
|
|
790
879
|
_internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
|
|
@@ -793,9 +882,9 @@ describe("generateSchema", () => {
|
|
|
793
882
|
foreignKey({
|
|
794
883
|
columns: [table.parentId],
|
|
795
884
|
foreignColumns: [table._internalId],
|
|
796
|
-
name: "
|
|
885
|
+
name: "fk_comment_comment_parent"
|
|
797
886
|
}),
|
|
798
|
-
index("
|
|
887
|
+
index("idx_parent").on(table.parentId)
|
|
799
888
|
])
|
|
800
889
|
|
|
801
890
|
export const comment_testRelations = relations(comment_test, ({ one, many }) => ({
|
|
@@ -820,7 +909,10 @@ describe("generateSchema", () => {
|
|
|
820
909
|
});
|
|
821
910
|
|
|
822
911
|
it("should generate MySQL self-referencing foreign key using table parameter", () => {
|
|
823
|
-
const generated =
|
|
912
|
+
const generated = generateDrizzleSchema(
|
|
913
|
+
[{ namespace: "test", schema: selfRefSchema }],
|
|
914
|
+
"mysql",
|
|
915
|
+
);
|
|
824
916
|
expect(generated).toMatchInlineSnapshot(`
|
|
825
917
|
"import { mysqlTable, varchar, text, bigint, int, foreignKey, index } from "drizzle-orm/mysql-core"
|
|
826
918
|
import { createId } from "@fragno-dev/db/id"
|
|
@@ -831,7 +923,7 @@ describe("generateSchema", () => {
|
|
|
831
923
|
// ============================================================================
|
|
832
924
|
|
|
833
925
|
export const comment_test = mysqlTable("comment_test", {
|
|
834
|
-
id: varchar("id", { length:
|
|
926
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
835
927
|
content: text("content").notNull(),
|
|
836
928
|
parentId: bigint("parentId", { mode: "number" }),
|
|
837
929
|
_internalId: bigint("_internalId", { mode: "number" }).primaryKey().autoincrement().notNull(),
|
|
@@ -840,9 +932,9 @@ describe("generateSchema", () => {
|
|
|
840
932
|
foreignKey({
|
|
841
933
|
columns: [table.parentId],
|
|
842
934
|
foreignColumns: [table._internalId],
|
|
843
|
-
name: "
|
|
935
|
+
name: "fk_comment_comment_parent_test_af0d05a4"
|
|
844
936
|
}),
|
|
845
|
-
index("
|
|
937
|
+
index("idx_comment_idx_parent_test_3c264dbc").on(table.parentId)
|
|
846
938
|
])
|
|
847
939
|
|
|
848
940
|
export const comment_testRelations = relations(comment_test, ({ one, many }) => ({
|
|
@@ -867,9 +959,12 @@ describe("generateSchema", () => {
|
|
|
867
959
|
});
|
|
868
960
|
|
|
869
961
|
it("should generate SQLite self-referencing foreign key using table parameter", () => {
|
|
870
|
-
const generated =
|
|
962
|
+
const generated = generateDrizzleSchema(
|
|
963
|
+
[{ namespace: "test", schema: selfRefSchema }],
|
|
964
|
+
"sqlite",
|
|
965
|
+
);
|
|
871
966
|
expect(generated).toMatchInlineSnapshot(`
|
|
872
|
-
"import { sqliteTable, text, integer, foreignKey, index } from "drizzle-orm/sqlite-core"
|
|
967
|
+
"import { sqliteTable, text, integer, foreignKey, index, uniqueIndex } from "drizzle-orm/sqlite-core"
|
|
873
968
|
import { createId } from "@fragno-dev/db/id"
|
|
874
969
|
import { relations } from "drizzle-orm"
|
|
875
970
|
|
|
@@ -878,7 +973,7 @@ describe("generateSchema", () => {
|
|
|
878
973
|
// ============================================================================
|
|
879
974
|
|
|
880
975
|
export const comment_test = sqliteTable("comment_test", {
|
|
881
|
-
id: text("id").notNull().$defaultFn(() => createId()),
|
|
976
|
+
id: text("id").notNull().unique().$defaultFn(() => createId()),
|
|
882
977
|
content: text("content").notNull(),
|
|
883
978
|
parentId: integer("parentId"),
|
|
884
979
|
_internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
|
|
@@ -887,9 +982,10 @@ describe("generateSchema", () => {
|
|
|
887
982
|
foreignKey({
|
|
888
983
|
columns: [table.parentId],
|
|
889
984
|
foreignColumns: [table._internalId],
|
|
890
|
-
name: "
|
|
985
|
+
name: "fk_comment_comment_parent_test_af0d05a4"
|
|
891
986
|
}),
|
|
892
|
-
index("
|
|
987
|
+
index("idx_comment_idx_parent_test_3c264dbc").on(table.parentId),
|
|
988
|
+
uniqueIndex("uidx_comment_idx_comment_external_id_test_6a1c2b8f").on(table.id)
|
|
893
989
|
])
|
|
894
990
|
|
|
895
991
|
export const comment_testRelations = relations(comment_test, ({ one, many }) => ({
|
|
@@ -915,8 +1011,8 @@ describe("generateSchema", () => {
|
|
|
915
1011
|
});
|
|
916
1012
|
|
|
917
1013
|
describe("namespace sanitization", () => {
|
|
918
|
-
it("should sanitize
|
|
919
|
-
const generated =
|
|
1014
|
+
it("should sanitize exports while preserving physical table names", () => {
|
|
1015
|
+
const generated = generateDrizzleSchema(
|
|
920
1016
|
[{ namespace: "auth-db", schema: testSchema }],
|
|
921
1017
|
"postgresql",
|
|
922
1018
|
);
|
|
@@ -925,12 +1021,13 @@ describe("generateSchema", () => {
|
|
|
925
1021
|
expect(generated).toContain("export const users_auth_db =");
|
|
926
1022
|
expect(generated).toContain("export const posts_auth_db =");
|
|
927
1023
|
|
|
928
|
-
// Physical table names
|
|
929
|
-
expect(generated).toContain('
|
|
930
|
-
expect(generated).toContain('
|
|
1024
|
+
// Physical table names use logical names with schema scoping
|
|
1025
|
+
expect(generated).toContain('const schema_auth_db = pgSchema("auth-db");');
|
|
1026
|
+
expect(generated).toContain('schema_auth_db.table("users"');
|
|
1027
|
+
expect(generated).toContain('schema_auth_db.table("posts"');
|
|
931
1028
|
|
|
932
|
-
// Foreign key name should use
|
|
933
|
-
expect(generated).
|
|
1029
|
+
// Foreign key name should use the original namespace with hashed naming
|
|
1030
|
+
expect(generated).toMatch(/name: "fk_posts_users_author"/);
|
|
934
1031
|
|
|
935
1032
|
// Relations should reference sanitized table names
|
|
936
1033
|
expect(generated).toContain("foreignColumns: [users_auth_db._internalId]");
|
|
@@ -950,7 +1047,10 @@ describe("generateSchema", () => {
|
|
|
950
1047
|
});
|
|
951
1048
|
|
|
952
1049
|
it("should generate inverse relations for namespaced tables", () => {
|
|
953
|
-
const generated =
|
|
1050
|
+
const generated = generateDrizzleSchema(
|
|
1051
|
+
[{ namespace: "my-app", schema: testSchema }],
|
|
1052
|
+
"postgresql",
|
|
1053
|
+
);
|
|
954
1054
|
|
|
955
1055
|
// User should have inverse "many" relation to posts
|
|
956
1056
|
expect(generated).toMatch(
|
|
@@ -963,8 +1063,8 @@ describe("generateSchema", () => {
|
|
|
963
1063
|
expect(generated).toContain("posts_my_appRelations: posts_my_appRelations");
|
|
964
1064
|
});
|
|
965
1065
|
|
|
966
|
-
it("should sanitize
|
|
967
|
-
const generated =
|
|
1066
|
+
it("should sanitize exports with special characters in foreign key references", () => {
|
|
1067
|
+
const generated = generateDrizzleSchema(
|
|
968
1068
|
[{ namespace: "my-fragment-v2", schema: testSchema }],
|
|
969
1069
|
"postgresql",
|
|
970
1070
|
);
|
|
@@ -981,12 +1081,13 @@ describe("generateSchema", () => {
|
|
|
981
1081
|
expect(generated).toContain("fields: [posts_my_fragment_v2.userId]");
|
|
982
1082
|
expect(generated).toContain("references: [users_my_fragment_v2._internalId]");
|
|
983
1083
|
|
|
984
|
-
// Physical table names
|
|
985
|
-
expect(generated).toContain('
|
|
986
|
-
expect(generated).toContain('
|
|
1084
|
+
// Physical table names use logical names with schema scoping
|
|
1085
|
+
expect(generated).toContain('const schema_my_fragment_v2 = pgSchema("my-fragment-v2");');
|
|
1086
|
+
expect(generated).toContain('schema_my_fragment_v2.table("users"');
|
|
1087
|
+
expect(generated).toContain('schema_my_fragment_v2.table("posts"');
|
|
987
1088
|
|
|
988
1089
|
expect(generated).toMatchInlineSnapshot(`
|
|
989
|
-
"import {
|
|
1090
|
+
"import { pgSchema, varchar, text, integer, bigserial, uniqueIndex, index, bigint, foreignKey } from "drizzle-orm/pg-core"
|
|
990
1091
|
import { createId } from "@fragno-dev/db/id"
|
|
991
1092
|
import { relations } from "drizzle-orm"
|
|
992
1093
|
|
|
@@ -994,20 +1095,22 @@ describe("generateSchema", () => {
|
|
|
994
1095
|
// Fragment: my-fragment-v2
|
|
995
1096
|
// ============================================================================
|
|
996
1097
|
|
|
997
|
-
|
|
998
|
-
|
|
1098
|
+
const schema_my_fragment_v2 = pgSchema("my-fragment-v2");
|
|
1099
|
+
|
|
1100
|
+
export const users_my_fragment_v2 = schema_my_fragment_v2.table("users", {
|
|
1101
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
999
1102
|
name: text("name").notNull(),
|
|
1000
1103
|
email: text("email").notNull(),
|
|
1001
1104
|
age: integer("age"),
|
|
1002
1105
|
_internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
|
|
1003
1106
|
_version: integer("_version").notNull().default(0)
|
|
1004
1107
|
}, (table) => [
|
|
1005
|
-
uniqueIndex("
|
|
1006
|
-
index("
|
|
1108
|
+
uniqueIndex("idx_email").on(table.email),
|
|
1109
|
+
index("idx_name").on(table.name)
|
|
1007
1110
|
])
|
|
1008
1111
|
|
|
1009
|
-
export const posts_my_fragment_v2 =
|
|
1010
|
-
id: varchar("id", { length:
|
|
1112
|
+
export const posts_my_fragment_v2 = schema_my_fragment_v2.table("posts", {
|
|
1113
|
+
id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
|
|
1011
1114
|
title: text("title").notNull(),
|
|
1012
1115
|
content: text("content").notNull(),
|
|
1013
1116
|
userId: bigint("userId", { mode: "number" }).notNull(),
|
|
@@ -1018,10 +1121,10 @@ describe("generateSchema", () => {
|
|
|
1018
1121
|
foreignKey({
|
|
1019
1122
|
columns: [table.userId],
|
|
1020
1123
|
foreignColumns: [users_my_fragment_v2._internalId],
|
|
1021
|
-
name: "
|
|
1124
|
+
name: "fk_posts_users_author"
|
|
1022
1125
|
}),
|
|
1023
|
-
index("
|
|
1024
|
-
index("
|
|
1126
|
+
index("idx_user").on(table.userId),
|
|
1127
|
+
index("idx_title").on(table.title)
|
|
1025
1128
|
])
|
|
1026
1129
|
|
|
1027
1130
|
export const users_my_fragment_v2Relations = relations(users_my_fragment_v2, ({ many }) => ({
|
|
@@ -1056,23 +1159,23 @@ describe("generateSchema", () => {
|
|
|
1056
1159
|
describe("schema generation", () => {
|
|
1057
1160
|
it("should generate settings schema and multiple user fragments", () => {
|
|
1058
1161
|
// settingsSchema is imported at the top to simulate what happens with linked internal fragments
|
|
1059
|
-
const fragment1Schema = schema((s) => {
|
|
1162
|
+
const fragment1Schema = schema("fragment1", (s) => {
|
|
1060
1163
|
return s.addTable("users", (t) => {
|
|
1061
1164
|
return t.addColumn("id", idColumn()).addColumn("name", column("string"));
|
|
1062
1165
|
});
|
|
1063
1166
|
});
|
|
1064
1167
|
|
|
1065
|
-
const fragment2Schema = schema((s) => {
|
|
1168
|
+
const fragment2Schema = schema("fragment2", (s) => {
|
|
1066
1169
|
return s.addTable("posts", (t) => {
|
|
1067
1170
|
return t.addColumn("id", idColumn()).addColumn("title", column("string"));
|
|
1068
1171
|
});
|
|
1069
1172
|
});
|
|
1070
1173
|
|
|
1071
|
-
// De-duplication happens in generation-engine.ts before calling
|
|
1072
|
-
// This test verifies
|
|
1073
|
-
const generated =
|
|
1174
|
+
// De-duplication happens in generation-engine.ts before calling generateDrizzleSchema
|
|
1175
|
+
// This test verifies generateDrizzleSchema works correctly with already-deduplicated inputs
|
|
1176
|
+
const generated = generateDrizzleSchema(
|
|
1074
1177
|
[
|
|
1075
|
-
{ namespace:
|
|
1178
|
+
{ namespace: null, schema: internalSchema }, // Internal fragment (namespace: null)
|
|
1076
1179
|
{ namespace: "fragment1", schema: fragment1Schema },
|
|
1077
1180
|
{ namespace: "fragment2", schema: fragment2Schema },
|
|
1078
1181
|
],
|
|
@@ -1104,14 +1207,14 @@ describe("generateSchema", () => {
|
|
|
1104
1207
|
|
|
1105
1208
|
it("should generate schema for single fragment with custom namespace", () => {
|
|
1106
1209
|
// Test a simple single-schema generation
|
|
1107
|
-
const sharedSchema = schema((s) => {
|
|
1210
|
+
const sharedSchema = schema("shared", (s) => {
|
|
1108
1211
|
return s.addTable("shared_table", (t) => {
|
|
1109
1212
|
return t.addColumn("id", idColumn()).addColumn("data", column("string"));
|
|
1110
1213
|
});
|
|
1111
1214
|
});
|
|
1112
1215
|
|
|
1113
1216
|
// De-duplication happens in generation-engine.ts, so we pass pre-deduplicated input
|
|
1114
|
-
const generated =
|
|
1217
|
+
const generated = generateDrizzleSchema(
|
|
1115
1218
|
[{ namespace: "namespace1", schema: sharedSchema }],
|
|
1116
1219
|
"postgresql",
|
|
1117
1220
|
);
|