@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,32 +1,65 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { SETTINGS_NAMESPACE, getSchemaVersionFromDatabase, internalFragmentDef, internalSchema } from "../fragments/internal-fragment.js";
|
|
1
|
+
import { supportedDatabases } from "../adapters/generic-sql/driver-config.js";
|
|
3
2
|
import { fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters/adapters.js";
|
|
3
|
+
import { SETTINGS_TABLE_NAME, internalSchema } from "../fragments/internal-fragment.schema.js";
|
|
4
|
+
import { getSchemaVersionFromDatabase, internalFragmentDef } from "../fragments/internal-fragment.js";
|
|
5
|
+
import { getRegistryForAdapterSync } from "../internal/adapter-registry.js";
|
|
6
|
+
import { generateDrizzleSchema } from "../schema-output/drizzle.js";
|
|
7
|
+
import { generatePrismaSchema } from "../schema-output/prisma.js";
|
|
8
|
+
import { instantiate } from "@fragno-dev/core";
|
|
4
9
|
|
|
5
10
|
//#region src/migration-engine/generation-engine.ts
|
|
6
|
-
|
|
11
|
+
const DEFAULT_DRIZZLE_PATH = "fragno-schema.ts";
|
|
12
|
+
const DEFAULT_PRISMA_PATH = "fragno.prisma";
|
|
13
|
+
const isSupportedDatabase = (value) => supportedDatabases.includes(value);
|
|
14
|
+
async function generateSchemaArtifacts(databases, options) {
|
|
7
15
|
if (databases.length === 0) throw new Error("No databases provided for schema generation");
|
|
8
16
|
const firstDb = databases[0];
|
|
9
17
|
const adapter = firstDb.adapter;
|
|
10
|
-
|
|
11
|
-
|
|
18
|
+
const format = options?.format ?? "sql";
|
|
19
|
+
if (format !== "sql") {
|
|
20
|
+
if (options?.toVersion !== void 0 || options?.fromVersion !== void 0) throw new Error("--from and --to are only supported when generating SQL migrations.");
|
|
21
|
+
const databaseType = adapter.adapterMetadata?.databaseType;
|
|
22
|
+
if (!databaseType || !isSupportedDatabase(databaseType)) throw new Error("Adapter does not expose databaseType metadata required for schema output generation.");
|
|
12
23
|
const fragmentsMap = /* @__PURE__ */ new Map();
|
|
13
|
-
fragmentsMap.set(
|
|
24
|
+
fragmentsMap.set(internalSchema.name, {
|
|
14
25
|
schema: internalSchema,
|
|
15
|
-
namespace:
|
|
26
|
+
namespace: null
|
|
16
27
|
});
|
|
17
|
-
for (const db of databases)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
28
|
+
for (const db of databases) {
|
|
29
|
+
const namespaceKey = db.namespace ?? db.schema.name;
|
|
30
|
+
if (!fragmentsMap.has(namespaceKey)) fragmentsMap.set(namespaceKey, {
|
|
31
|
+
schema: db.schema,
|
|
32
|
+
namespace: db.namespace
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const allFragments = Array.from(fragmentsMap.entries()).map(([namespaceKey, fragment]) => ({
|
|
36
|
+
...fragment,
|
|
37
|
+
namespaceKey,
|
|
38
|
+
isInternal: fragment.schema === internalSchema
|
|
39
|
+
})).sort((a, b) => {
|
|
40
|
+
if (a.isInternal) return -1;
|
|
41
|
+
if (b.isInternal) return 1;
|
|
42
|
+
return a.schema.name.localeCompare(b.schema.name);
|
|
43
|
+
}).map(({ schema, namespace }) => ({
|
|
44
|
+
schema,
|
|
45
|
+
namespace
|
|
46
|
+
}));
|
|
47
|
+
const defaultPath = format === "drizzle" ? DEFAULT_DRIZZLE_PATH : DEFAULT_PRISMA_PATH;
|
|
22
48
|
return [{
|
|
23
|
-
|
|
49
|
+
schema: format === "drizzle" ? generateDrizzleSchema(allFragments, databaseType, { namingStrategy: adapter.namingStrategy }) : generatePrismaSchema(allFragments, databaseType, {
|
|
50
|
+
sqliteStorageMode: adapter.adapterMetadata?.sqliteStorageMode,
|
|
51
|
+
namingStrategy: adapter.namingStrategy
|
|
52
|
+
}),
|
|
53
|
+
path: options?.path ?? defaultPath,
|
|
24
54
|
namespace: firstDb.namespace
|
|
25
55
|
}];
|
|
26
56
|
}
|
|
27
|
-
if (!adapter.prepareMigrations) throw new Error("Adapter does not support migration
|
|
57
|
+
if (!adapter.prepareMigrations) throw new Error("Adapter does not support migration generation. Ensure your adapter implements prepareMigrations.");
|
|
28
58
|
if (!await adapter.isConnectionHealthy()) throw new Error("Database connection is not healthy. Please check your database connection and try again.");
|
|
29
|
-
const settingsSourceVersion = await getSchemaVersionFromDatabase(instantiate(internalFragmentDef).withConfig({
|
|
59
|
+
const settingsSourceVersion = await getSchemaVersionFromDatabase(instantiate(internalFragmentDef).withConfig({ registry: getRegistryForAdapterSync(adapter) }).withOptions({
|
|
60
|
+
databaseAdapter: adapter,
|
|
61
|
+
databaseNamespace: null
|
|
62
|
+
}).build(), "");
|
|
30
63
|
const generatedFiles = [];
|
|
31
64
|
const settingsPreparedMigrations = adapter.prepareMigrations(internalSchema, "");
|
|
32
65
|
const settingsTargetVersion = internalSchema.version;
|
|
@@ -34,13 +67,16 @@ async function generateMigrationsOrSchema(databases, options) {
|
|
|
34
67
|
if (settingsSql.trim()) generatedFiles.push({
|
|
35
68
|
schema: settingsSql,
|
|
36
69
|
path: "settings-migration.sql",
|
|
37
|
-
namespace:
|
|
70
|
+
namespace: null,
|
|
71
|
+
namespaceKey: SETTINGS_TABLE_NAME,
|
|
72
|
+
schemaName: internalSchema.name,
|
|
73
|
+
isSettings: true,
|
|
38
74
|
fromVersion: settingsSourceVersion,
|
|
39
75
|
toVersion: settingsTargetVersion
|
|
40
76
|
});
|
|
41
77
|
for (const db of databases) {
|
|
42
78
|
const dbAdapter = db.adapter;
|
|
43
|
-
if (!dbAdapter.prepareMigrations) throw new Error(`Adapter for ${db.namespace} does not support
|
|
79
|
+
if (!dbAdapter.prepareMigrations) throw new Error(`Adapter for ${db.namespace ?? db.schema.name} does not support migration generation. Ensure your adapter implements prepareMigrations.`);
|
|
44
80
|
const preparedMigrations = dbAdapter.prepareMigrations(db.schema, db.namespace);
|
|
45
81
|
const targetVersion = options?.toVersion ?? db.schema.version;
|
|
46
82
|
const sourceVersion = options?.fromVersion ?? 0;
|
|
@@ -49,6 +85,9 @@ async function generateMigrationsOrSchema(databases, options) {
|
|
|
49
85
|
schema: sql,
|
|
50
86
|
path: "schema.sql",
|
|
51
87
|
namespace: db.namespace,
|
|
88
|
+
namespaceKey: db.namespace ?? db.schema.name,
|
|
89
|
+
schemaName: db.schema.name,
|
|
90
|
+
isSettings: false,
|
|
52
91
|
fromVersion: sourceVersion,
|
|
53
92
|
toVersion: targetVersion
|
|
54
93
|
});
|
|
@@ -65,7 +104,7 @@ async function generateMigrationsOrSchema(databases, options) {
|
|
|
65
104
|
async function executeMigrations(databases) {
|
|
66
105
|
if (databases.length === 0) throw new Error("No databases provided for migration");
|
|
67
106
|
const adapter = databases[0].adapter;
|
|
68
|
-
if (!adapter.prepareMigrations) throw new Error("Adapter does not support running migrations. The adapter only supports schema generation.\nTry using '
|
|
107
|
+
if (!adapter.prepareMigrations) throw new Error("Adapter does not support running migrations. The adapter only supports schema generation.\nTry using 'generateSchemaArtifacts' instead to generate schema files.");
|
|
69
108
|
const firstAdapterName = adapter[fragnoDatabaseAdapterNameFakeSymbol];
|
|
70
109
|
const firstAdapterVersion = adapter[fragnoDatabaseAdapterVersionFakeSymbol];
|
|
71
110
|
for (const db of databases) {
|
|
@@ -76,32 +115,40 @@ async function executeMigrations(databases) {
|
|
|
76
115
|
if (!await adapter.isConnectionHealthy()) throw new Error("Database connection is not healthy. Please check your database connection and try again.");
|
|
77
116
|
const results = [];
|
|
78
117
|
const migrationsToExecute = [];
|
|
79
|
-
const internalFragment = instantiate(internalFragmentDef).withConfig({
|
|
80
|
-
|
|
118
|
+
const internalFragment = instantiate(internalFragmentDef).withConfig({ registry: getRegistryForAdapterSync(adapter) }).withOptions({
|
|
119
|
+
databaseAdapter: adapter,
|
|
120
|
+
databaseNamespace: null
|
|
121
|
+
}).build();
|
|
122
|
+
const settingsSourceVersion = await getSchemaVersionFromDatabase(internalFragment, "");
|
|
81
123
|
const settingsPreparedMigrations = adapter.prepareMigrations(internalSchema, "");
|
|
82
124
|
const settingsTargetVersion = internalSchema.version;
|
|
83
125
|
if (settingsSourceVersion < settingsTargetVersion) {
|
|
84
126
|
if (settingsPreparedMigrations.compile(settingsSourceVersion, settingsTargetVersion, { updateVersionInMigration: true }).statements.length > 0) migrationsToExecute.push({
|
|
85
|
-
namespace:
|
|
127
|
+
namespace: null,
|
|
128
|
+
namespaceKey: SETTINGS_TABLE_NAME,
|
|
86
129
|
fromVersion: settingsSourceVersion,
|
|
87
130
|
toVersion: settingsTargetVersion,
|
|
88
131
|
execute: () => settingsPreparedMigrations.execute(settingsSourceVersion, settingsTargetVersion, { updateVersionInMigration: true })
|
|
89
132
|
});
|
|
90
133
|
}
|
|
91
|
-
const
|
|
134
|
+
const getNamespaceKey = (db) => db.namespace ?? db.schema.name;
|
|
135
|
+
const sortedDatabases = [...databases].sort((a, b) => getNamespaceKey(a).localeCompare(getNamespaceKey(b)));
|
|
92
136
|
for (const fragnoDb of sortedDatabases) {
|
|
137
|
+
const namespaceKey = getNamespaceKey(fragnoDb);
|
|
93
138
|
const preparedMigrations = adapter.prepareMigrations(fragnoDb.schema, fragnoDb.namespace);
|
|
94
|
-
const currentVersion = await getSchemaVersionFromDatabase(internalFragment,
|
|
139
|
+
const currentVersion = await getSchemaVersionFromDatabase(internalFragment, namespaceKey);
|
|
95
140
|
const targetVersion = fragnoDb.schema.version;
|
|
96
141
|
if (currentVersion < targetVersion) {
|
|
97
142
|
if (preparedMigrations.compile(currentVersion, targetVersion, { updateVersionInMigration: true }).statements.length > 0) migrationsToExecute.push({
|
|
98
143
|
namespace: fragnoDb.namespace,
|
|
144
|
+
namespaceKey,
|
|
99
145
|
fromVersion: currentVersion,
|
|
100
146
|
toVersion: targetVersion,
|
|
101
147
|
execute: () => preparedMigrations.execute(currentVersion, targetVersion, { updateVersionInMigration: true })
|
|
102
148
|
});
|
|
103
149
|
}
|
|
104
150
|
}
|
|
151
|
+
const executedNamespaceKeys = /* @__PURE__ */ new Set();
|
|
105
152
|
for (const migration of migrationsToExecute) {
|
|
106
153
|
await migration.execute();
|
|
107
154
|
results.push({
|
|
@@ -110,19 +157,23 @@ async function executeMigrations(databases) {
|
|
|
110
157
|
fromVersion: migration.fromVersion,
|
|
111
158
|
toVersion: migration.toVersion
|
|
112
159
|
});
|
|
160
|
+
executedNamespaceKeys.add(migration.namespaceKey);
|
|
161
|
+
}
|
|
162
|
+
for (const fragnoDb of databases) {
|
|
163
|
+
const namespaceKey = getNamespaceKey(fragnoDb);
|
|
164
|
+
if (!executedNamespaceKeys.has(namespaceKey)) results.push({
|
|
165
|
+
namespace: fragnoDb.namespace,
|
|
166
|
+
didMigrate: false,
|
|
167
|
+
fromVersion: fragnoDb.schema.version,
|
|
168
|
+
toVersion: fragnoDb.schema.version
|
|
169
|
+
});
|
|
113
170
|
}
|
|
114
|
-
for (const fragnoDb of databases) if (!results.find((r) => r.namespace === fragnoDb.namespace)) results.push({
|
|
115
|
-
namespace: fragnoDb.namespace,
|
|
116
|
-
didMigrate: false,
|
|
117
|
-
fromVersion: fragnoDb.schema.version,
|
|
118
|
-
toVersion: fragnoDb.schema.version
|
|
119
|
-
});
|
|
120
171
|
return results;
|
|
121
172
|
}
|
|
122
173
|
/**
|
|
123
174
|
* Post-processes migration files to add ordering and standardize naming.
|
|
124
175
|
*
|
|
125
|
-
* Sorts files with settings namespace first, then alphabetically by namespace,
|
|
176
|
+
* Sorts files with settings namespace first, then alphabetically by namespace key,
|
|
126
177
|
* and assigns ordering numbers. Transforms filenames to format:
|
|
127
178
|
* `<date>_<n>_f<from>_t<to>_<namespace>.sql`
|
|
128
179
|
*
|
|
@@ -132,15 +183,15 @@ async function executeMigrations(databases) {
|
|
|
132
183
|
function postProcessMigrationFilenames(files) {
|
|
133
184
|
if (files.length === 0) return [];
|
|
134
185
|
const sortedFiles = [...files].sort((a, b) => {
|
|
135
|
-
if (a.
|
|
136
|
-
if (b.
|
|
137
|
-
return a.
|
|
186
|
+
if (a.isSettings) return -1;
|
|
187
|
+
if (b.isSettings) return 1;
|
|
188
|
+
return a.namespaceKey.localeCompare(b.namespaceKey);
|
|
138
189
|
});
|
|
139
190
|
const date = (/* @__PURE__ */ new Date()).toISOString().split("T")[0].replace(/-/g, "");
|
|
140
191
|
return sortedFiles.map((file, index) => {
|
|
141
192
|
const fromVersion = file.fromVersion ?? 0;
|
|
142
193
|
const toVersion = file.toVersion ?? 0;
|
|
143
|
-
const newPath = `${date}_${(index + 1).toString().padStart(3, "0")}_f${fromVersion.toString().padStart(3, "0")}_t${toVersion.toString().padStart(3, "0")}_${file.
|
|
194
|
+
const newPath = `${date}_${(index + 1).toString().padStart(3, "0")}_f${fromVersion.toString().padStart(3, "0")}_t${toVersion.toString().padStart(3, "0")}_${file.namespaceKey.replace(/[^a-z0-9-]/gi, "_")}.sql`;
|
|
144
195
|
return {
|
|
145
196
|
schema: file.schema,
|
|
146
197
|
path: newPath,
|
|
@@ -150,5 +201,5 @@ function postProcessMigrationFilenames(files) {
|
|
|
150
201
|
}
|
|
151
202
|
|
|
152
203
|
//#endregion
|
|
153
|
-
export { executeMigrations,
|
|
204
|
+
export { executeMigrations, generateSchemaArtifacts, postProcessMigrationFilenames };
|
|
154
205
|
//# sourceMappingURL=generation-engine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generation-engine.js","names":["generatedFiles: GenerationInternalResult[]","results: ExecuteMigrationResult[]","migrationsToExecute: Array<{\n namespace: string;\n fromVersion: number;\n toVersion: number;\n execute: () => Promise<void>;\n }>"],"sources":["../../src/migration-engine/generation-engine.ts"],"sourcesContent":["import type { FragnoDatabase } from \"../mod\";\nimport type { AnySchema } from \"../schema/create\";\nimport {\n fragnoDatabaseAdapterNameFakeSymbol,\n fragnoDatabaseAdapterVersionFakeSymbol,\n} from \"../adapters/adapters\";\nimport {\n internalFragmentDef,\n internalSchema,\n SETTINGS_NAMESPACE,\n getSchemaVersionFromDatabase,\n} from \"../fragments/internal-fragment\";\nimport { instantiate } from \"@fragno-dev/core\";\n\nexport interface GenerationEngineResult {\n schema: string;\n path: string;\n namespace: string;\n}\n\nexport interface GenerationInternalResult {\n schema: string;\n path: string;\n namespace: string;\n fromVersion: number;\n toVersion: number;\n}\n\nexport interface ExecuteMigrationResult {\n namespace: string;\n didMigrate: boolean;\n fromVersion: number;\n toVersion: number;\n}\n\nexport async function generateMigrationsOrSchema<\n // oxlint-disable-next-line no-explicit-any\n const TDatabases extends FragnoDatabase<AnySchema, any>[],\n>(\n databases: TDatabases,\n options?: {\n path?: string;\n toVersion?: number;\n fromVersion?: number;\n },\n): Promise<GenerationEngineResult[]> {\n if (databases.length === 0) {\n throw new Error(\"No databases provided for schema generation\");\n }\n\n const firstDb = databases[0];\n const adapter = firstDb.adapter;\n\n // If adapter has createSchemaGenerator, use it for combined generation (e.g., Drizzle)\n if (adapter.createSchemaGenerator) {\n if (options?.toVersion !== undefined || options?.fromVersion !== undefined) {\n console.warn(\n \"⚠️ Warning: --from and --to version options are not supported when generating schemas for multiple fragments and will be ignored.\",\n );\n }\n\n // Collect all schemas, de-duplicating by namespace.\n // The internal fragment (settings schema) is always included first since all database\n // fragments automatically link to it via withDatabase().\n const fragmentsMap = new Map<string, { schema: AnySchema; namespace: string }>();\n\n // Include internal fragment first with empty namespace (settings table has no prefix)\n fragmentsMap.set(\"\", {\n schema: internalSchema,\n namespace: \"\",\n });\n\n // Add user fragments, de-duplicating by namespace\n // Each FragnoDatabase has a unique namespace, so this prevents duplicate schema generation\n for (const db of databases) {\n if (!fragmentsMap.has(db.namespace)) {\n fragmentsMap.set(db.namespace, {\n schema: db.schema,\n namespace: db.namespace,\n });\n }\n }\n\n const allFragments = Array.from(fragmentsMap.values());\n const generator = adapter.createSchemaGenerator(allFragments, {\n path: options?.path,\n });\n\n return [\n {\n ...generator.generateSchema(),\n namespace: firstDb.namespace,\n },\n ];\n }\n\n // Otherwise, use migration engine for individual generation (e.g., Kysely, GenericSQL)\n if (!adapter.prepareMigrations) {\n throw new Error(\n \"Adapter does not support migration-based schema generation. Ensure your adapter implements prepareMigrations.\",\n );\n }\n\n if (!(await adapter.isConnectionHealthy())) {\n throw new Error(\n \"Database connection is not healthy. Please check your database connection and try again.\",\n );\n }\n\n // Use the internal fragment for settings management\n const internalFragment = instantiate(internalFragmentDef)\n .withConfig({})\n .withOptions({ databaseAdapter: adapter })\n .build();\n\n const settingsSourceVersion = await getSchemaVersionFromDatabase(\n internalFragment,\n SETTINGS_NAMESPACE,\n );\n\n const generatedFiles: GenerationInternalResult[] = [];\n\n // Use empty namespace for settings (SETTINGS_NAMESPACE is for prefixing keys, not the database namespace)\n const settingsPreparedMigrations = adapter.prepareMigrations(internalSchema, \"\");\n const settingsTargetVersion = internalSchema.version;\n\n // Generate settings table migration\n const settingsSql = settingsPreparedMigrations.getSQL(\n settingsSourceVersion,\n settingsTargetVersion,\n );\n\n if (settingsSql.trim()) {\n generatedFiles.push({\n schema: settingsSql,\n path: \"settings-migration.sql\", // Placeholder, will be renamed in post-processing\n namespace: \"\", // Empty namespace for settings table\n fromVersion: settingsSourceVersion,\n toVersion: settingsTargetVersion,\n });\n }\n\n // Generate migration for each fragment\n for (const db of databases) {\n const dbAdapter = db.adapter;\n\n // Use migration engine\n if (!dbAdapter.prepareMigrations) {\n throw new Error(\n `Adapter for ${db.namespace} does not support schema generation. ` +\n `Ensure your adapter implements either createSchemaGenerator or prepareMigrations.`,\n );\n }\n\n const preparedMigrations = dbAdapter.prepareMigrations(db.schema, db.namespace);\n const targetVersion = options?.toVersion ?? db.schema.version;\n const sourceVersion = options?.fromVersion ?? 0;\n\n // Generate migration from source to target version\n const sql = preparedMigrations.getSQL(sourceVersion, targetVersion);\n\n // If no migrations needed, skip this fragment\n if (sql.trim()) {\n generatedFiles.push({\n schema: sql,\n path: \"schema.sql\", // Placeholder, will be renamed in post-processing\n namespace: db.namespace,\n fromVersion: sourceVersion,\n toVersion: targetVersion,\n });\n }\n }\n\n // Post-process filenames with ordering\n return postProcessMigrationFilenames(generatedFiles);\n}\n\n/**\n * Execute migrations for all fragments in the correct order.\n * Migrates settings table first, then fragments alphabetically.\n *\n * @param databases - Array of FragnoDatabase instances to migrate\n * @returns Array of execution results for each migration\n */\nexport async function executeMigrations<const TDatabases extends FragnoDatabase<AnySchema>[]>(\n databases: TDatabases,\n): Promise<ExecuteMigrationResult[]> {\n if (databases.length === 0) {\n throw new Error(\"No databases provided for migration\");\n }\n\n const firstDb = databases[0];\n const adapter = firstDb.adapter;\n\n // Validate adapter supports migrations\n if (!adapter.prepareMigrations) {\n throw new Error(\n \"Adapter does not support running migrations. The adapter only supports schema generation.\\n\" +\n \"Try using 'generateMigrationsOrSchema' instead to generate schema files.\",\n );\n }\n\n // Validate all use same adapter name and version\n const firstAdapterName = adapter[fragnoDatabaseAdapterNameFakeSymbol];\n const firstAdapterVersion = adapter[fragnoDatabaseAdapterVersionFakeSymbol];\n\n for (const db of databases) {\n const dbAdapterName = db.adapter[fragnoDatabaseAdapterNameFakeSymbol];\n const dbAdapterVersion = db.adapter[fragnoDatabaseAdapterVersionFakeSymbol];\n\n if (dbAdapterName !== firstAdapterName || dbAdapterVersion !== firstAdapterVersion) {\n throw new Error(\n `All fragments must use the same database adapter. ` +\n `Found: ${firstAdapterName}@${firstAdapterVersion} and ${dbAdapterName}@${dbAdapterVersion}`,\n );\n }\n }\n\n if (!(await adapter.isConnectionHealthy())) {\n throw new Error(\n \"Database connection is not healthy. Please check your database connection and try again.\",\n );\n }\n\n const results: ExecuteMigrationResult[] = [];\n const migrationsToExecute: Array<{\n namespace: string;\n fromVersion: number;\n toVersion: number;\n execute: () => Promise<void>;\n }> = [];\n\n // 1. Prepare settings table migration\n // Use the internal fragment for settings management\n const internalFragment = instantiate(internalFragmentDef)\n .withConfig({})\n .withOptions({ databaseAdapter: adapter })\n .build();\n\n const settingsSourceVersion = await getSchemaVersionFromDatabase(\n internalFragment,\n SETTINGS_NAMESPACE,\n );\n\n // Use empty namespace for settings (SETTINGS_NAMESPACE is for prefixing keys, not the database namespace)\n const settingsPreparedMigrations = adapter.prepareMigrations(internalSchema, \"\");\n const settingsTargetVersion = internalSchema.version;\n\n if (settingsSourceVersion < settingsTargetVersion) {\n const compiledMigration = settingsPreparedMigrations.compile(\n settingsSourceVersion,\n settingsTargetVersion,\n { updateVersionInMigration: true },\n );\n\n if (compiledMigration.statements.length > 0) {\n migrationsToExecute.push({\n namespace: \"\", // Empty namespace for settings table\n fromVersion: settingsSourceVersion,\n toVersion: settingsTargetVersion,\n execute: () =>\n settingsPreparedMigrations.execute(settingsSourceVersion, settingsTargetVersion, {\n updateVersionInMigration: true,\n }),\n });\n }\n }\n\n // 2. Prepare fragment migrations (sorted alphabetically)\n const sortedDatabases = [...databases].sort((a, b) => a.namespace.localeCompare(b.namespace));\n\n for (const fragnoDb of sortedDatabases) {\n const preparedMigrations = adapter.prepareMigrations(fragnoDb.schema, fragnoDb.namespace);\n const currentVersion = await getSchemaVersionFromDatabase(internalFragment, fragnoDb.namespace);\n const targetVersion = fragnoDb.schema.version;\n\n if (currentVersion < targetVersion) {\n const compiledMigration = preparedMigrations.compile(currentVersion, targetVersion, {\n updateVersionInMigration: true,\n });\n\n if (compiledMigration.statements.length > 0) {\n migrationsToExecute.push({\n namespace: fragnoDb.namespace,\n fromVersion: currentVersion,\n toVersion: targetVersion,\n execute: () =>\n preparedMigrations.execute(currentVersion, targetVersion, {\n updateVersionInMigration: true,\n }),\n });\n }\n }\n }\n\n // 3. Execute all migrations in order\n for (const migration of migrationsToExecute) {\n await migration.execute();\n results.push({\n namespace: migration.namespace,\n didMigrate: true,\n fromVersion: migration.fromVersion,\n toVersion: migration.toVersion,\n });\n }\n\n // 4. Add skipped migrations (already up-to-date)\n for (const fragnoDb of databases) {\n if (!results.find((r) => r.namespace === fragnoDb.namespace)) {\n results.push({\n namespace: fragnoDb.namespace,\n didMigrate: false,\n fromVersion: fragnoDb.schema.version,\n toVersion: fragnoDb.schema.version,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Post-processes migration files to add ordering and standardize naming.\n *\n * Sorts files with settings namespace first, then alphabetically by namespace,\n * and assigns ordering numbers. Transforms filenames to format:\n * `<date>_<n>_f<from>_t<to>_<namespace>.sql`\n *\n * @param files - Array of generated migration files with version information\n * @returns Array of files with standardized paths and ordering\n */\nexport function postProcessMigrationFilenames(\n files: GenerationInternalResult[],\n): GenerationEngineResult[] {\n if (files.length === 0) {\n return [];\n }\n\n // Sort files: settings namespace first (empty string), then alphabetically by namespace\n const sortedFiles = [...files].sort((a, b) => {\n // Settings table has empty namespace - sort it first\n if (a.namespace === \"\") {\n return -1;\n }\n if (b.namespace === \"\") {\n return 1;\n }\n return a.namespace.localeCompare(b.namespace);\n });\n\n // Generate date prefix for filenames\n const date = new Date().toISOString().split(\"T\")[0].replace(/-/g, \"\");\n\n // Rename files with ordering\n return sortedFiles.map((file, index) => {\n const fromVersion = file.fromVersion ?? 0;\n const toVersion = file.toVersion ?? 0;\n\n // Create new filename with ordering\n const orderNum = (index + 1).toString().padStart(3, \"0\");\n const fromPadded = fromVersion.toString().padStart(3, \"0\");\n const toPadded = toVersion.toString().padStart(3, \"0\");\n\n // For settings table (empty namespace), use \"fragno_db_settings\" in the filename\n // For other tables, use their namespace\n const safeName =\n file.namespace === \"\" ? \"fragno_db_settings\" : file.namespace.replace(/[^a-z0-9-]/gi, \"_\");\n const newPath = `${date}_${orderNum}_f${fromPadded}_t${toPadded}_${safeName}.sql`;\n\n return {\n schema: file.schema,\n path: newPath,\n namespace: file.namespace,\n };\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generation-engine.js","names":["generatedFiles: GenerationInternalResult[]","results: ExecuteMigrationResult[]","migrationsToExecute: Array<{\n namespace: string | null;\n namespaceKey: string;\n fromVersion: number;\n toVersion: number;\n execute: () => Promise<void>;\n }>"],"sources":["../../src/migration-engine/generation-engine.ts"],"sourcesContent":["import { instantiate } from \"@fragno-dev/core\";\n\nimport {\n fragnoDatabaseAdapterNameFakeSymbol,\n fragnoDatabaseAdapterVersionFakeSymbol,\n} from \"../adapters/adapters\";\nimport { supportedDatabases, type SupportedDatabase } from \"../adapters/generic-sql/driver-config\";\nimport {\n internalFragmentDef,\n internalSchema,\n SETTINGS_TABLE_NAME,\n getSchemaVersionFromDatabase,\n} from \"../fragments/internal-fragment\";\nimport { getRegistryForAdapterSync } from \"../internal/adapter-registry\";\nimport type { FragnoDatabase } from \"../mod\";\nimport { generateDrizzleSchema } from \"../schema-output/drizzle\";\nimport { generatePrismaSchema } from \"../schema-output/prisma\";\nimport type { AnySchema } from \"../schema/create\";\n\nexport interface GenerationEngineResult {\n schema: string;\n path: string;\n namespace: string | null;\n}\n\nexport type SchemaOutputFormat = \"sql\" | \"drizzle\" | \"prisma\";\n\nexport interface GenerateSchemaOptions {\n format?: SchemaOutputFormat;\n path?: string;\n toVersion?: number;\n fromVersion?: number;\n}\n\nexport interface GenerationInternalResult {\n schema: string;\n path: string;\n namespace: string | null;\n namespaceKey: string;\n schemaName: string;\n isSettings: boolean;\n fromVersion: number;\n toVersion: number;\n}\n\nexport interface ExecuteMigrationResult {\n namespace: string | null;\n didMigrate: boolean;\n fromVersion: number;\n toVersion: number;\n}\n\nconst DEFAULT_DRIZZLE_PATH = \"fragno-schema.ts\";\nconst DEFAULT_PRISMA_PATH = \"fragno.prisma\";\n\nconst isSupportedDatabase = (value: string): value is SupportedDatabase =>\n supportedDatabases.includes(value as SupportedDatabase);\n\nexport async function generateSchemaArtifacts<\n // oxlint-disable-next-line no-explicit-any\n const TDatabases extends FragnoDatabase<AnySchema, any>[],\n>(databases: TDatabases, options?: GenerateSchemaOptions): Promise<GenerationEngineResult[]> {\n if (databases.length === 0) {\n throw new Error(\"No databases provided for schema generation\");\n }\n\n const firstDb = databases[0];\n const adapter = firstDb.adapter;\n const format = options?.format ?? \"sql\";\n\n if (format !== \"sql\") {\n if (options?.toVersion !== undefined || options?.fromVersion !== undefined) {\n throw new Error(\"--from and --to are only supported when generating SQL migrations.\");\n }\n\n const databaseType = adapter.adapterMetadata?.databaseType;\n if (!databaseType || !isSupportedDatabase(databaseType)) {\n throw new Error(\n \"Adapter does not expose databaseType metadata required for schema output generation.\",\n );\n }\n\n // Collect all schemas, de-duplicating by namespace.\n // The internal fragment (settings schema) is always included first since all database\n // fragments share it via the adapter registry.\n const fragmentsMap = new Map<string, { schema: AnySchema; namespace: string | null }>();\n\n // Include internal fragment first with empty namespace (settings table has no prefix)\n fragmentsMap.set(internalSchema.name, {\n schema: internalSchema,\n namespace: null,\n });\n\n // Add user fragments, de-duplicating by namespace\n // Each FragnoDatabase has a unique namespace, so this prevents duplicate schema generation\n for (const db of databases) {\n const namespaceKey = db.namespace ?? db.schema.name;\n if (!fragmentsMap.has(namespaceKey)) {\n fragmentsMap.set(namespaceKey, {\n schema: db.schema,\n namespace: db.namespace,\n });\n }\n }\n\n const allFragments = Array.from(fragmentsMap.entries())\n .map(([namespaceKey, fragment]) => ({\n ...fragment,\n namespaceKey,\n isInternal: fragment.schema === internalSchema,\n }))\n .sort((a, b) => {\n if (a.isInternal) {\n return -1;\n }\n if (b.isInternal) {\n return 1;\n }\n return a.schema.name.localeCompare(b.schema.name);\n })\n .map(({ schema, namespace }) => ({ schema, namespace }));\n const defaultPath = format === \"drizzle\" ? DEFAULT_DRIZZLE_PATH : DEFAULT_PRISMA_PATH;\n const schema =\n format === \"drizzle\"\n ? generateDrizzleSchema(allFragments, databaseType, {\n namingStrategy: adapter.namingStrategy,\n })\n : generatePrismaSchema(allFragments, databaseType, {\n sqliteStorageMode: adapter.adapterMetadata?.sqliteStorageMode,\n namingStrategy: adapter.namingStrategy,\n });\n\n return [\n {\n schema,\n path: options?.path ?? defaultPath,\n namespace: firstDb.namespace,\n },\n ];\n }\n\n // Otherwise, use migration engine for SQL migration generation.\n if (!adapter.prepareMigrations) {\n throw new Error(\n \"Adapter does not support migration generation. Ensure your adapter implements prepareMigrations.\",\n );\n }\n\n if (!(await adapter.isConnectionHealthy())) {\n throw new Error(\n \"Database connection is not healthy. Please check your database connection and try again.\",\n );\n }\n\n // Use the internal fragment for settings management\n const internalFragment = instantiate(internalFragmentDef)\n .withConfig({ registry: getRegistryForAdapterSync(adapter) })\n .withOptions({ databaseAdapter: adapter, databaseNamespace: null })\n .build();\n\n const settingsSourceVersion = await getSchemaVersionFromDatabase(internalFragment, \"\");\n\n const generatedFiles: GenerationInternalResult[] = [];\n\n // Internal fragment uses empty-string namespace: no table suffix, version key is \".schema_version\"\n const settingsPreparedMigrations = adapter.prepareMigrations(internalSchema, \"\");\n const settingsTargetVersion = internalSchema.version;\n\n // Generate settings table migration\n const settingsSql = settingsPreparedMigrations.getSQL(\n settingsSourceVersion,\n settingsTargetVersion,\n );\n\n if (settingsSql.trim()) {\n generatedFiles.push({\n schema: settingsSql,\n path: \"settings-migration.sql\", // Placeholder, will be renamed in post-processing\n namespace: null,\n namespaceKey: SETTINGS_TABLE_NAME,\n schemaName: internalSchema.name,\n isSettings: true,\n fromVersion: settingsSourceVersion,\n toVersion: settingsTargetVersion,\n });\n }\n\n // Generate migration for each fragment\n for (const db of databases) {\n const dbAdapter = db.adapter;\n\n // Use migration engine\n if (!dbAdapter.prepareMigrations) {\n throw new Error(\n `Adapter for ${db.namespace ?? db.schema.name} does not support migration generation. ` +\n `Ensure your adapter implements prepareMigrations.`,\n );\n }\n\n const preparedMigrations = dbAdapter.prepareMigrations(db.schema, db.namespace);\n const targetVersion = options?.toVersion ?? db.schema.version;\n const sourceVersion = options?.fromVersion ?? 0;\n\n // Generate migration from source to target version\n const sql = preparedMigrations.getSQL(sourceVersion, targetVersion);\n\n // If no migrations needed, skip this fragment\n if (sql.trim()) {\n generatedFiles.push({\n schema: sql,\n path: \"schema.sql\", // Placeholder, will be renamed in post-processing\n namespace: db.namespace,\n namespaceKey: db.namespace ?? db.schema.name,\n schemaName: db.schema.name,\n isSettings: false,\n fromVersion: sourceVersion,\n toVersion: targetVersion,\n });\n }\n }\n\n // Post-process filenames with ordering\n return postProcessMigrationFilenames(generatedFiles);\n}\n\n/**\n * Execute migrations for all fragments in the correct order.\n * Migrates settings table first, then fragments alphabetically.\n *\n * @param databases - Array of FragnoDatabase instances to migrate\n * @returns Array of execution results for each migration\n */\nexport async function executeMigrations<const TDatabases extends FragnoDatabase<AnySchema>[]>(\n databases: TDatabases,\n): Promise<ExecuteMigrationResult[]> {\n if (databases.length === 0) {\n throw new Error(\"No databases provided for migration\");\n }\n\n const firstDb = databases[0];\n const adapter = firstDb.adapter;\n\n // Validate adapter supports migrations\n if (!adapter.prepareMigrations) {\n throw new Error(\n \"Adapter does not support running migrations. The adapter only supports schema generation.\\n\" +\n \"Try using 'generateSchemaArtifacts' instead to generate schema files.\",\n );\n }\n\n // Validate all use same adapter name and version\n const firstAdapterName = adapter[fragnoDatabaseAdapterNameFakeSymbol];\n const firstAdapterVersion = adapter[fragnoDatabaseAdapterVersionFakeSymbol];\n\n for (const db of databases) {\n const dbAdapterName = db.adapter[fragnoDatabaseAdapterNameFakeSymbol];\n const dbAdapterVersion = db.adapter[fragnoDatabaseAdapterVersionFakeSymbol];\n\n if (dbAdapterName !== firstAdapterName || dbAdapterVersion !== firstAdapterVersion) {\n throw new Error(\n `All fragments must use the same database adapter. ` +\n `Found: ${firstAdapterName}@${firstAdapterVersion} and ${dbAdapterName}@${dbAdapterVersion}`,\n );\n }\n }\n\n if (!(await adapter.isConnectionHealthy())) {\n throw new Error(\n \"Database connection is not healthy. Please check your database connection and try again.\",\n );\n }\n\n const results: ExecuteMigrationResult[] = [];\n const migrationsToExecute: Array<{\n namespace: string | null;\n namespaceKey: string;\n fromVersion: number;\n toVersion: number;\n execute: () => Promise<void>;\n }> = [];\n\n // 1. Prepare settings table migration\n // Use the internal fragment for settings management\n const internalFragment = instantiate(internalFragmentDef)\n .withConfig({ registry: getRegistryForAdapterSync(adapter) })\n .withOptions({ databaseAdapter: adapter, databaseNamespace: null })\n .build();\n\n const settingsSourceVersion = await getSchemaVersionFromDatabase(internalFragment, \"\");\n\n // Internal fragment uses empty-string namespace: no table suffix, version key is \".schema_version\"\n const settingsPreparedMigrations = adapter.prepareMigrations(internalSchema, \"\");\n const settingsTargetVersion = internalSchema.version;\n\n if (settingsSourceVersion < settingsTargetVersion) {\n const compiledMigration = settingsPreparedMigrations.compile(\n settingsSourceVersion,\n settingsTargetVersion,\n { updateVersionInMigration: true },\n );\n\n if (compiledMigration.statements.length > 0) {\n migrationsToExecute.push({\n namespace: null,\n namespaceKey: SETTINGS_TABLE_NAME,\n fromVersion: settingsSourceVersion,\n toVersion: settingsTargetVersion,\n execute: () =>\n settingsPreparedMigrations.execute(settingsSourceVersion, settingsTargetVersion, {\n updateVersionInMigration: true,\n }),\n });\n }\n }\n\n // 2. Prepare fragment migrations (sorted alphabetically)\n const getNamespaceKey = (db: FragnoDatabase<AnySchema>) => db.namespace ?? db.schema.name;\n const sortedDatabases = [...databases].sort((a, b) =>\n getNamespaceKey(a).localeCompare(getNamespaceKey(b)),\n );\n\n for (const fragnoDb of sortedDatabases) {\n const namespaceKey = getNamespaceKey(fragnoDb);\n const preparedMigrations = adapter.prepareMigrations(fragnoDb.schema, fragnoDb.namespace);\n const currentVersion = await getSchemaVersionFromDatabase(internalFragment, namespaceKey);\n const targetVersion = fragnoDb.schema.version;\n\n if (currentVersion < targetVersion) {\n const compiledMigration = preparedMigrations.compile(currentVersion, targetVersion, {\n updateVersionInMigration: true,\n });\n\n if (compiledMigration.statements.length > 0) {\n migrationsToExecute.push({\n namespace: fragnoDb.namespace,\n namespaceKey,\n fromVersion: currentVersion,\n toVersion: targetVersion,\n execute: () =>\n preparedMigrations.execute(currentVersion, targetVersion, {\n updateVersionInMigration: true,\n }),\n });\n }\n }\n }\n\n // 3. Execute all migrations in order\n const executedNamespaceKeys = new Set<string>();\n for (const migration of migrationsToExecute) {\n await migration.execute();\n results.push({\n namespace: migration.namespace,\n didMigrate: true,\n fromVersion: migration.fromVersion,\n toVersion: migration.toVersion,\n });\n executedNamespaceKeys.add(migration.namespaceKey);\n }\n\n // 4. Add skipped migrations (already up-to-date)\n for (const fragnoDb of databases) {\n const namespaceKey = getNamespaceKey(fragnoDb);\n if (!executedNamespaceKeys.has(namespaceKey)) {\n results.push({\n namespace: fragnoDb.namespace,\n didMigrate: false,\n fromVersion: fragnoDb.schema.version,\n toVersion: fragnoDb.schema.version,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Post-processes migration files to add ordering and standardize naming.\n *\n * Sorts files with settings namespace first, then alphabetically by namespace key,\n * and assigns ordering numbers. Transforms filenames to format:\n * `<date>_<n>_f<from>_t<to>_<namespace>.sql`\n *\n * @param files - Array of generated migration files with version information\n * @returns Array of files with standardized paths and ordering\n */\nexport function postProcessMigrationFilenames(\n files: GenerationInternalResult[],\n): GenerationEngineResult[] {\n if (files.length === 0) {\n return [];\n }\n\n // Sort files: settings first, then alphabetically by namespace key\n const sortedFiles = [...files].sort((a, b) => {\n if (a.isSettings) {\n return -1;\n }\n if (b.isSettings) {\n return 1;\n }\n return a.namespaceKey.localeCompare(b.namespaceKey);\n });\n\n // Generate date prefix for filenames\n const date = new Date().toISOString().split(\"T\")[0].replace(/-/g, \"\");\n\n // Rename files with ordering\n return sortedFiles.map((file, index) => {\n const fromVersion = file.fromVersion ?? 0;\n const toVersion = file.toVersion ?? 0;\n\n // Create new filename with ordering\n const orderNum = (index + 1).toString().padStart(3, \"0\");\n const fromPadded = fromVersion.toString().padStart(3, \"0\");\n const toPadded = toVersion.toString().padStart(3, \"0\");\n\n const safeName = file.namespaceKey.replace(/[^a-z0-9-]/gi, \"_\");\n const newPath = `${date}_${orderNum}_f${fromPadded}_t${toPadded}_${safeName}.sql`;\n\n return {\n schema: file.schema,\n path: newPath,\n namespace: file.namespace,\n };\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
//#region src/migration-engine/shared.d.ts
|
|
2
|
+
interface ForeignKeyInfo {
|
|
3
|
+
name: string;
|
|
4
|
+
columns: string[];
|
|
5
|
+
referencedTable: string;
|
|
6
|
+
referencedColumns: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Provider-specific metadata that can be attached to operations during preprocessing.
|
|
10
|
+
* This allows providers to add additional context without polluting the core operation types.
|
|
11
|
+
*/
|
|
12
|
+
interface MigrationOperationMetadata {
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
interface ColumnInfo {
|
|
16
|
+
name: string;
|
|
17
|
+
type: "string" | "integer" | "bigint" | "decimal" | "bool" | "date" | "timestamp" | "json" | "binary" | `varchar(${number})`;
|
|
18
|
+
isNullable: boolean;
|
|
19
|
+
role: "external-id" | "internal-id" | "version" | "reference" | "regular";
|
|
20
|
+
default?: {
|
|
21
|
+
value: unknown;
|
|
22
|
+
} | {
|
|
23
|
+
dbSpecial: "now";
|
|
24
|
+
} | {
|
|
25
|
+
runtime: "cuid" | "now";
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
type MigrationOperation<TMeta extends MigrationOperationMetadata = MigrationOperationMetadata> = (TableOperation & {
|
|
29
|
+
metadata?: TMeta;
|
|
30
|
+
}) | ({
|
|
31
|
+
type: "add-foreign-key";
|
|
32
|
+
table: string;
|
|
33
|
+
value: ForeignKeyInfo;
|
|
34
|
+
} & {
|
|
35
|
+
metadata?: TMeta;
|
|
36
|
+
}) | ({
|
|
37
|
+
type: "drop-foreign-key";
|
|
38
|
+
table: string;
|
|
39
|
+
name: string;
|
|
40
|
+
referencedTable: string;
|
|
41
|
+
} & {
|
|
42
|
+
metadata?: TMeta;
|
|
43
|
+
}) | ({
|
|
44
|
+
type: "drop-index";
|
|
45
|
+
table: string;
|
|
46
|
+
name: string;
|
|
47
|
+
} & {
|
|
48
|
+
metadata?: TMeta;
|
|
49
|
+
}) | ({
|
|
50
|
+
type: "add-index";
|
|
51
|
+
table: string;
|
|
52
|
+
columns: string[];
|
|
53
|
+
name: string;
|
|
54
|
+
unique: boolean;
|
|
55
|
+
} & {
|
|
56
|
+
metadata?: TMeta;
|
|
57
|
+
}) | (CustomOperation & {
|
|
58
|
+
metadata?: TMeta;
|
|
59
|
+
});
|
|
60
|
+
type CustomOperation = {
|
|
61
|
+
type: "custom";
|
|
62
|
+
} & Record<string, unknown>;
|
|
63
|
+
type TableOperation = {
|
|
64
|
+
type: "create-table";
|
|
65
|
+
name: string;
|
|
66
|
+
columns: ColumnInfo[];
|
|
67
|
+
} | {
|
|
68
|
+
type: "drop-table";
|
|
69
|
+
name: string;
|
|
70
|
+
} | {
|
|
71
|
+
type: "alter-table";
|
|
72
|
+
name: string;
|
|
73
|
+
value: ColumnOperation[];
|
|
74
|
+
} | {
|
|
75
|
+
type: "rename-table";
|
|
76
|
+
from: string;
|
|
77
|
+
to: string;
|
|
78
|
+
};
|
|
79
|
+
type ColumnOperation = {
|
|
80
|
+
type: "rename-column";
|
|
81
|
+
from: string;
|
|
82
|
+
to: string;
|
|
83
|
+
} | {
|
|
84
|
+
type: "drop-column";
|
|
85
|
+
name: string;
|
|
86
|
+
} | {
|
|
87
|
+
/**
|
|
88
|
+
* Note: unique constraints are not created, please use dedicated operations like `add-index` instead
|
|
89
|
+
*/
|
|
90
|
+
type: "create-column";
|
|
91
|
+
value: ColumnInfo;
|
|
92
|
+
} | {
|
|
93
|
+
/**
|
|
94
|
+
* warning: Not supported by SQLite
|
|
95
|
+
*/
|
|
96
|
+
type: "update-column";
|
|
97
|
+
name: string;
|
|
98
|
+
/**
|
|
99
|
+
* For databases like MySQL, it requires the full definition for any modify column statement.
|
|
100
|
+
* Hence, you need to specify the full information of your column here.
|
|
101
|
+
*
|
|
102
|
+
* Then, opt-in for in-detail modification for other databases that supports changing data type/nullable/default separately, such as PostgreSQL.
|
|
103
|
+
*
|
|
104
|
+
* Note: unique constraints are not updated, please use dedicated operations like `add-index` instead
|
|
105
|
+
*/
|
|
106
|
+
value: ColumnInfo;
|
|
107
|
+
updateNullable: boolean;
|
|
108
|
+
updateDefault: boolean;
|
|
109
|
+
updateDataType: boolean;
|
|
110
|
+
};
|
|
111
|
+
//#endregion
|
|
112
|
+
export { MigrationOperation };
|
|
113
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","names":[],"sources":["../../src/migration-engine/shared.ts"],"sourcesContent":[],"mappings":";UAAiB,cAAA;EAAA,IAAA,EAAA,MAAA;EAWA,OAAA,EAAA,MAAA,EAAA;EAYA,eAAU,EAAA,MAAA;EA+Bf,iBAAA,EAAA,MAAkB,EAAA;;;;;;AAST,UApDJ,0BAAA,CAoDI;EAOA,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAA;;UA/CJ,UAAA;;;;;;;;;;;;;KA+BL,iCACI,6BAA6B,+BAExC;aAA8B;;;;SAKtB;;aACQ;;;;;;;aAOA;;;;;;aAKA;;;;;;;;aAOA;MAChB;aAA+B;;KAExB,eAAA;;IAER;KAEQ,cAAA;;;WAIG;;;;;;;SASF;;;;;;KAQD,eAAA;;;;;;;;;;;;SAeC;;;;;;;;;;;;;;;SAgBA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","names":[],"sources":["../../src/migration-engine/shared.ts"],"sourcesContent":["export interface ForeignKeyInfo {\n name: string;\n columns: string[];\n referencedTable: string;\n referencedColumns: string[];\n}\n\n/**\n * Provider-specific metadata that can be attached to operations during preprocessing.\n * This allows providers to add additional context without polluting the core operation types.\n */\nexport interface MigrationOperationMetadata {\n [key: string]: unknown;\n}\n\n/**\n * SQLite-specific metadata for create-table operations.\n * Includes foreign keys that should be created inline with the table.\n */\nexport interface SqliteCreateTableMetadata extends MigrationOperationMetadata {\n inlineForeignKeys?: ForeignKeyInfo[];\n}\n\nexport interface ColumnInfo {\n name: string;\n type:\n | \"string\"\n | \"integer\"\n | \"bigint\"\n | \"decimal\"\n | \"bool\"\n | \"date\"\n | \"timestamp\"\n | \"json\"\n | \"binary\"\n | `varchar(${number})`;\n isNullable: boolean;\n role: \"external-id\" | \"internal-id\" | \"version\" | \"reference\" | \"regular\";\n default?: { value: unknown } | { dbSpecial: \"now\" } | { runtime: \"cuid\" | \"now\" };\n}\n\nexport type MigrationOperation<\n TMeta extends MigrationOperationMetadata = MigrationOperationMetadata,\n> =\n | (TableOperation & { metadata?: TMeta })\n | ({\n // warning: not supported by SQLite\n type: \"add-foreign-key\";\n table: string;\n value: ForeignKeyInfo;\n } & { metadata?: TMeta })\n | ({\n // warning: not supported by SQLite\n type: \"drop-foreign-key\";\n table: string;\n name: string;\n } & { metadata?: TMeta })\n | ({\n type: \"drop-index\";\n table: string;\n name: string;\n } & { metadata?: TMeta })\n | ({\n type: \"add-index\";\n table: string;\n columns: string[];\n name: string;\n unique: boolean;\n } & { metadata?: TMeta })\n | (CustomOperation & { metadata?: TMeta });\n\nexport type CustomOperation = {\n type: \"custom\";\n} & Record<string, unknown>;\n\nexport type TableOperation =\n | {\n type: \"create-table\";\n name: string;\n columns: ColumnInfo[];\n }\n | {\n type: \"drop-table\";\n name: string;\n }\n | {\n type: \"alter-table\";\n name: string;\n value: ColumnOperation[];\n }\n | {\n type: \"rename-table\";\n from: string;\n to: string;\n };\n\nexport type ColumnOperation =\n | {\n type: \"rename-column\";\n from: string;\n to: string;\n }\n | {\n type: \"drop-column\";\n name: string;\n }\n | {\n /**\n * Note: unique constraints are not created, please use dedicated operations like `add-index` instead\n */\n type: \"create-column\";\n value: ColumnInfo;\n }\n | {\n /**\n * warning: Not supported by SQLite\n */\n type: \"update-column\";\n name: string;\n /**\n * For databases like MySQL, it requires the full definition for any modify column statement.\n * Hence, you need to specify the full information of your column here.\n *\n * Then, opt-in for in-detail modification for other databases that supports changing data type/nullable/default separately, such as PostgreSQL.\n *\n * Note: unique constraints are not updated, please use dedicated operations like `add-index` instead\n */\n value: ColumnInfo;\n\n updateNullable: boolean;\n updateDefault: boolean;\n updateDataType: boolean;\n };\n\nexport function isUpdated(op: Extract<ColumnOperation, { type: \"update-column\" }>): boolean {\n return op.updateDataType || op.updateDefault || op.updateNullable;\n}\n"],"mappings":";
|
|
1
|
+
{"version":3,"file":"shared.js","names":[],"sources":["../../src/migration-engine/shared.ts"],"sourcesContent":["export interface ForeignKeyInfo {\n name: string;\n columns: string[];\n referencedTable: string;\n referencedColumns: string[];\n}\n\n/**\n * Provider-specific metadata that can be attached to operations during preprocessing.\n * This allows providers to add additional context without polluting the core operation types.\n */\nexport interface MigrationOperationMetadata {\n [key: string]: unknown;\n}\n\n/**\n * SQLite-specific metadata for create-table operations.\n * Includes foreign keys that should be created inline with the table.\n */\nexport interface SqliteCreateTableMetadata extends MigrationOperationMetadata {\n inlineForeignKeys?: ForeignKeyInfo[];\n}\n\nexport interface ColumnInfo {\n name: string;\n type:\n | \"string\"\n | \"integer\"\n | \"bigint\"\n | \"decimal\"\n | \"bool\"\n | \"date\"\n | \"timestamp\"\n | \"json\"\n | \"binary\"\n | `varchar(${number})`;\n isNullable: boolean;\n role: \"external-id\" | \"internal-id\" | \"version\" | \"reference\" | \"regular\";\n default?: { value: unknown } | { dbSpecial: \"now\" } | { runtime: \"cuid\" | \"now\" };\n}\n\nexport interface SqliteRecreateTableInfo {\n columns: ColumnInfo[];\n copyColumns: SqliteCopyColumn[];\n indexes: { name: string; columns: string[]; unique: boolean }[];\n foreignKeys: ForeignKeyInfo[];\n}\n\nexport type SqliteCopyColumn = string | { from: string; to: string };\n\nexport interface SqliteAlterTableMetadata extends MigrationOperationMetadata {\n recreateTable?: SqliteRecreateTableInfo;\n}\n\nexport type MigrationOperation<\n TMeta extends MigrationOperationMetadata = MigrationOperationMetadata,\n> =\n | (TableOperation & { metadata?: TMeta })\n | ({\n // warning: not supported by SQLite\n type: \"add-foreign-key\";\n table: string;\n value: ForeignKeyInfo;\n } & { metadata?: TMeta })\n | ({\n // warning: not supported by SQLite\n type: \"drop-foreign-key\";\n table: string;\n name: string;\n referencedTable: string;\n } & { metadata?: TMeta })\n | ({\n type: \"drop-index\";\n table: string;\n name: string;\n } & { metadata?: TMeta })\n | ({\n type: \"add-index\";\n table: string;\n columns: string[];\n name: string;\n unique: boolean;\n } & { metadata?: TMeta })\n | (CustomOperation & { metadata?: TMeta });\n\nexport type CustomOperation = {\n type: \"custom\";\n} & Record<string, unknown>;\n\nexport type TableOperation =\n | {\n type: \"create-table\";\n name: string;\n columns: ColumnInfo[];\n }\n | {\n type: \"drop-table\";\n name: string;\n }\n | {\n type: \"alter-table\";\n name: string;\n value: ColumnOperation[];\n }\n | {\n type: \"rename-table\";\n from: string;\n to: string;\n };\n\nexport type ColumnOperation =\n | {\n type: \"rename-column\";\n from: string;\n to: string;\n }\n | {\n type: \"drop-column\";\n name: string;\n }\n | {\n /**\n * Note: unique constraints are not created, please use dedicated operations like `add-index` instead\n */\n type: \"create-column\";\n value: ColumnInfo;\n }\n | {\n /**\n * warning: Not supported by SQLite\n */\n type: \"update-column\";\n name: string;\n /**\n * For databases like MySQL, it requires the full definition for any modify column statement.\n * Hence, you need to specify the full information of your column here.\n *\n * Then, opt-in for in-detail modification for other databases that supports changing data type/nullable/default separately, such as PostgreSQL.\n *\n * Note: unique constraints are not updated, please use dedicated operations like `add-index` instead\n */\n value: ColumnInfo;\n\n updateNullable: boolean;\n updateDefault: boolean;\n updateDataType: boolean;\n };\n\nexport function isUpdated(op: Extract<ColumnOperation, { type: \"update-column\" }>): boolean {\n return op.updateDataType || op.updateDefault || op.updateNullable;\n}\n"],"mappings":";AAoJA,SAAgB,UAAU,IAAkE;AAC1F,QAAO,GAAG,kBAAkB,GAAG,iBAAiB,GAAG"}
|
package/dist/mod.d.ts
CHANGED
|
@@ -1,20 +1,30 @@
|
|
|
1
|
+
import { DbInterval, DbIntervalInput, DbNow, dbInterval, dbNow } from "./query/db-now.js";
|
|
1
2
|
import { AnySchema } from "./schema/create.js";
|
|
2
3
|
import { Cursor, CursorData, CursorResult, decodeCursor } from "./query/cursor.js";
|
|
3
4
|
import { ExponentialBackoffRetryPolicy, LinearBackoffRetryPolicy, NoRetryPolicy, RetryPolicy } from "./query/unit-of-work/retry-policy.js";
|
|
4
|
-
import { BuilderTransformContextWithMutate, BuilderTransformContextWithoutMutate, ConcurrencyConflictError, ExtractServiceFinalResults, ExtractServiceRetrieveResults, HandlerBuilderMutateContext, HandlerTxBuilder, ServiceBuilderMutateContext, ServiceTxBuilder, TxResult, createHandlerTxBuilder, createServiceTxBuilder } from "./query/unit-of-work/execute-unit-of-work.js";
|
|
5
|
-
import {
|
|
5
|
+
import { BuilderTransformContextWithMutate, BuilderTransformContextWithoutMutate, ConcurrencyConflictError, ExtractServiceFinalResults, ExtractServiceRetrieveResults, HandlerBuilderMutateContext, HandlerTxBuilder, HandlerTxContext, ServiceBuilderMutateContext, ServiceTxBuilder, TxResult, createHandlerTxBuilder, createServiceTxBuilder, serviceCalls } from "./query/unit-of-work/execute-unit-of-work.js";
|
|
6
|
+
import { OutboxConfig, OutboxEntry, OutboxMutation, OutboxPayload, OutboxRefMap } from "./outbox/outbox.js";
|
|
7
|
+
import { SubmitAppliedResponse, SubmitConflictReason, SubmitConflictResponse, SubmitRequest, SubmitResponse, SyncCommandDefinition, SyncCommandHandler, SyncCommandRegistry, SyncCommandTxFactory } from "./sync/types.js";
|
|
8
|
+
import { DatabaseFragmentContext, DatabaseFragmentDefinitionBuilder, DatabaseHandlerContext, DatabaseServiceContext, DbRoundtripGuardConfig, FragnoPublicConfigWithDatabase, ImplicitDatabaseDependencies } from "./db-fragment-definition-builder.js";
|
|
9
|
+
import { InMemoryAdapterOptions } from "./adapters/in-memory/options.js";
|
|
10
|
+
import { InMemoryAdapter } from "./adapters/in-memory/in-memory-adapter.js";
|
|
11
|
+
import "./adapters/in-memory/index.js";
|
|
12
|
+
import { getInternalFragment } from "./internal/adapter-registry.js";
|
|
6
13
|
import { withDatabase } from "./with-database.js";
|
|
14
|
+
import { defineSyncCommands } from "./sync/commands.js";
|
|
15
|
+
import { DurableHookRecord, DurableHookStatus, DurableHooksAccessor, DurableHooksService, getDurableHooksService } from "./durable-hooks.js";
|
|
16
|
+
import { internalSchema } from "./fragments/internal-fragment.schema.js";
|
|
7
17
|
import { InternalFragmentInstance, internalFragmentDef } from "./fragments/internal-fragment.js";
|
|
8
|
-
import { HookContext, HookFn, HookPayload, HooksMap, TriggerHookOptions } from "./hooks/hooks.js";
|
|
18
|
+
import { DurableHooksProcessingOptions, HookContext, HookFn, HookHandlerTx, HookPayload, HooksMap, StuckHookProcessingEvent, StuckHookProcessingInfo, StuckHookProcessingTimeoutMinutes, TriggerHookOptions } from "./hooks/hooks.js";
|
|
9
19
|
import { IUnitOfWork, IUnitOfWorkRestricted, TypedUnitOfWork, UOWCompiler, UOWDecoder, UOWExecutor, UnitOfWork, createUnitOfWork } from "./query/unit-of-work/unit-of-work.js";
|
|
10
20
|
import { DatabaseAdapter } from "./adapters/adapters.js";
|
|
11
|
-
import {
|
|
21
|
+
import { BoundServices, FragnoInstantiatedFragment } from "@fragno-dev/core";
|
|
12
22
|
|
|
13
23
|
//#region src/mod.d.ts
|
|
14
24
|
declare const fragnoDatabaseFakeSymbol: "$fragno-database";
|
|
15
25
|
declare const fragnoDatabaseLibraryVersion: "0.1";
|
|
16
26
|
interface CreateFragnoDatabaseDefinitionOptions<T extends AnySchema> {
|
|
17
|
-
namespace: string;
|
|
27
|
+
namespace: string | null;
|
|
18
28
|
schema: T;
|
|
19
29
|
}
|
|
20
30
|
declare function isFragnoDatabase(value: unknown): value is FragnoDatabase<AnySchema>;
|
|
@@ -25,18 +35,16 @@ declare function isFragnoDatabase(value: unknown): value is FragnoDatabase<AnySc
|
|
|
25
35
|
declare class FragnoDatabase<const T extends AnySchema, TUOWConfig = void> {
|
|
26
36
|
#private;
|
|
27
37
|
constructor(options: {
|
|
28
|
-
namespace: string;
|
|
38
|
+
namespace: string | null;
|
|
29
39
|
schema: T;
|
|
30
40
|
adapter: DatabaseAdapter<TUOWConfig>;
|
|
31
41
|
});
|
|
32
42
|
get [fragnoDatabaseFakeSymbol](): typeof fragnoDatabaseFakeSymbol;
|
|
33
|
-
get namespace(): string;
|
|
43
|
+
get namespace(): string | null;
|
|
34
44
|
get schema(): T;
|
|
35
45
|
get adapter(): DatabaseAdapter<TUOWConfig>;
|
|
36
46
|
}
|
|
37
|
-
type AnyFragnoInstantiatedDatabaseFragment = FragnoInstantiatedFragment<any, ImplicitDatabaseDependencies<
|
|
38
|
-
_fragno_internal: InternalFragmentInstance;
|
|
39
|
-
} & Record<string, AnyFragnoInstantiatedFragment>>;
|
|
47
|
+
type AnyFragnoInstantiatedDatabaseFragment<TSchema extends AnySchema = AnySchema> = FragnoInstantiatedFragment<any, ImplicitDatabaseDependencies<TSchema>, any, any, DatabaseHandlerContext, any, FragnoPublicConfigWithDatabase>;
|
|
40
48
|
/**
|
|
41
49
|
* Helper function to run migrations for a database fragment.
|
|
42
50
|
* Extracts the database adapter, schema, and namespace from the fragment and runs migrations.
|
|
@@ -59,7 +67,7 @@ type AnyFragnoInstantiatedDatabaseFragment = FragnoInstantiatedFragment<any, Imp
|
|
|
59
67
|
* await migrate(fragment);
|
|
60
68
|
* ```
|
|
61
69
|
*/
|
|
62
|
-
declare function migrate(fragment: AnyFragnoInstantiatedDatabaseFragment): Promise<void>;
|
|
70
|
+
declare function migrate<TSchema extends AnySchema>(fragment: AnyFragnoInstantiatedDatabaseFragment<TSchema>): Promise<void>;
|
|
63
71
|
//#endregion
|
|
64
|
-
export { AnyFragnoInstantiatedDatabaseFragment, type BoundServices, type BuilderTransformContextWithMutate, type BuilderTransformContextWithoutMutate, ConcurrencyConflictError, CreateFragnoDatabaseDefinitionOptions, Cursor, type CursorData, type CursorResult, type DatabaseAdapter, type DatabaseFragmentContext, DatabaseFragmentDefinitionBuilder, type DatabaseHandlerContext as DatabaseRequestContext, ExponentialBackoffRetryPolicy, type ExtractServiceFinalResults, type ExtractServiceRetrieveResults, FragnoDatabase, type FragnoPublicConfigWithDatabase, type HandlerBuilderMutateContext, HandlerTxBuilder, type HookContext, type HookFn, type HookPayload, type HooksMap, type IUnitOfWork, type IUnitOfWorkRestricted, type ImplicitDatabaseDependencies, type InternalFragmentInstance, LinearBackoffRetryPolicy, NoRetryPolicy, type RetryPolicy, type ServiceBuilderMutateContext, ServiceTxBuilder, type TriggerHookOptions, type TxResult, TypedUnitOfWork, type UOWCompiler, type UOWDecoder, type UOWExecutor, UnitOfWork, createHandlerTxBuilder, createServiceTxBuilder, createUnitOfWork, decodeCursor, fragnoDatabaseFakeSymbol, fragnoDatabaseLibraryVersion, internalFragmentDef, isFragnoDatabase, migrate, withDatabase };
|
|
72
|
+
export { AnyFragnoInstantiatedDatabaseFragment, type BoundServices, type BuilderTransformContextWithMutate, type BuilderTransformContextWithoutMutate, ConcurrencyConflictError, CreateFragnoDatabaseDefinitionOptions, Cursor, type CursorData, type CursorResult, type DatabaseAdapter, type DatabaseFragmentContext, DatabaseFragmentDefinitionBuilder, type DatabaseHandlerContext as DatabaseRequestContext, type DatabaseServiceContext, type DbInterval, type DbIntervalInput, type DbNow, type DbRoundtripGuardConfig, type DurableHookRecord, type DurableHookStatus, type DurableHooksAccessor, type DurableHooksProcessingOptions, type DurableHooksService, ExponentialBackoffRetryPolicy, type ExtractServiceFinalResults, type ExtractServiceRetrieveResults, FragnoDatabase, type FragnoPublicConfigWithDatabase, type HandlerBuilderMutateContext, HandlerTxBuilder, type HandlerTxContext, type HookContext, type HookFn, type HookHandlerTx, type HookPayload, type HooksMap, type IUnitOfWork, type IUnitOfWorkRestricted, type ImplicitDatabaseDependencies, InMemoryAdapter, type InMemoryAdapterOptions, type InternalFragmentInstance, LinearBackoffRetryPolicy, NoRetryPolicy, type OutboxConfig, type OutboxEntry, type OutboxMutation, type OutboxPayload, type OutboxRefMap, type RetryPolicy, type ServiceBuilderMutateContext, ServiceTxBuilder, type StuckHookProcessingEvent, type StuckHookProcessingInfo, type StuckHookProcessingTimeoutMinutes, type SubmitAppliedResponse, type SubmitConflictReason, type SubmitConflictResponse, type SubmitRequest, type SubmitResponse, type SyncCommandDefinition, type SyncCommandHandler, type SyncCommandRegistry, type SyncCommandTxFactory, type TriggerHookOptions, type TxResult, TypedUnitOfWork, type UOWCompiler, type UOWDecoder, type UOWExecutor, UnitOfWork, createHandlerTxBuilder, createServiceTxBuilder, createUnitOfWork, dbInterval, dbNow, decodeCursor, defineSyncCommands, fragnoDatabaseFakeSymbol, fragnoDatabaseLibraryVersion, getDurableHooksService, getInternalFragment, internalFragmentDef, internalSchema, isFragnoDatabase, migrate, serviceCalls, withDatabase };
|
|
65
73
|
//# sourceMappingURL=mod.d.ts.map
|
package/dist/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","names":[],"sources":["../src/mod.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mod.d.ts","names":[],"sources":["../src/mod.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;cA6Ba;cACA;UAEI,gDAAgD;;UAEvD;;iBAGM,gBAAA,2BAA2C,eAAe;;;AAR1E;AACA;AAEiB,cAwBJ,cAxBI,CAAA,gBAwB2B,SAxBqB,EAAA,aAEtD,IAAA,CAAA,CAAA;EAGK,CAAA,OAAA;EAmBH,WAAA,CAAA,OAAc,EAAA;IAAiB,SAAA,EAAA,MAAA,GAAA,IAAA;IAOhC,MAAA,EAAA,CAAA;IACiB,OAAA,EAAhB,eAAgB,CAAA,UAAA,CAAA;EAAhB,CAAA;EAO8B,KAApC,wBAAA,GAAoC,EAAA,OAAA,wBAAA;EAApC,IAAA,SAAA,CAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAQK,IAAA,MAAA,CAAA,CAAA,EAAA,CAAA;EAIqB,IAAA,OAAA,CAAA,CAAA,EAAhB,eAAgB,CAAA,UAAA,CAAA;;AA2IvB,KAvCE,qCAuCF,CAAA,gBAvCwD,SAuCxD,GAvCoE,SAuCpE,CAAA,GAtCR,0BAsCQ,CAAA,GAAA,EAnCN,4BAmCM,CAnCuB,OAmCvB,CAAA,EAAA,GAAA,EAAA,GAAA,EA9BN,sBA8BM,EAAA,GAAA,EA3BN,8BA2BM,CAAA;;;;;;;;;;;;;;;;;;;;;;;iBAFY,wBAAwB,qBAClC,sCAAsC,WAC/C"}
|
package/dist/mod.js
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
|
+
import { dbInterval, dbNow } from "./query/db-now.js";
|
|
1
2
|
import { ExponentialBackoffRetryPolicy, LinearBackoffRetryPolicy, NoRetryPolicy } from "./query/unit-of-work/retry-policy.js";
|
|
2
|
-
import { ConcurrencyConflictError, HandlerTxBuilder, ServiceTxBuilder, createHandlerTxBuilder, createServiceTxBuilder } from "./query/unit-of-work/execute-unit-of-work.js";
|
|
3
|
-
import { DatabaseFragmentDefinitionBuilder } from "./db-fragment-definition-builder.js";
|
|
3
|
+
import { ConcurrencyConflictError, HandlerTxBuilder, ServiceTxBuilder, createHandlerTxBuilder, createServiceTxBuilder, serviceCalls } from "./query/unit-of-work/execute-unit-of-work.js";
|
|
4
4
|
import { Cursor, decodeCursor } from "./query/cursor.js";
|
|
5
|
+
import { TypedUnitOfWork, UnitOfWork, createUnitOfWork } from "./query/unit-of-work/unit-of-work.js";
|
|
6
|
+
import { internalSchema } from "./fragments/internal-fragment.schema.js";
|
|
7
|
+
import { DatabaseFragmentDefinitionBuilder } from "./db-fragment-definition-builder.js";
|
|
5
8
|
import { getSchemaVersionFromDatabase, internalFragmentDef } from "./fragments/internal-fragment.js";
|
|
9
|
+
import { getInternalFragment } from "./internal/adapter-registry.js";
|
|
10
|
+
import { getDurableHooksService } from "./durable-hooks.js";
|
|
11
|
+
import { InMemoryAdapter } from "./adapters/in-memory/in-memory-adapter.js";
|
|
12
|
+
import "./adapters/in-memory/index.js";
|
|
6
13
|
import { withDatabase } from "./with-database.js";
|
|
7
|
-
import {
|
|
14
|
+
import { defineSyncCommands } from "./sync/commands.js";
|
|
8
15
|
|
|
9
16
|
//#region src/mod.ts
|
|
10
17
|
const fragnoDatabaseFakeSymbol = "$fragno-database";
|
|
@@ -63,19 +70,18 @@ var FragnoDatabase = class {
|
|
|
63
70
|
* ```
|
|
64
71
|
*/
|
|
65
72
|
async function migrate(fragment) {
|
|
66
|
-
const {
|
|
67
|
-
const adapter =
|
|
73
|
+
const { deps } = fragment.$internal;
|
|
74
|
+
const adapter = deps.databaseAdapter;
|
|
68
75
|
if (!adapter.prepareMigrations) throw new Error("Database adapter does not support prepareMigrations. Please use an adapter that implements this method.");
|
|
69
76
|
const schema = deps.schema;
|
|
70
|
-
const namespace = deps.namespace;
|
|
71
|
-
const internalFragment =
|
|
72
|
-
if (!internalFragment) throw new Error("Internal fragment not found. Please ensure the internal fragment is linked.");
|
|
77
|
+
const namespace = deps.namespace ?? schema.name;
|
|
78
|
+
const internalFragment = getInternalFragment(adapter);
|
|
73
79
|
if (!await adapter.isConnectionHealthy()) throw new Error("Database connection is not healthy. Please check your database connection and try again.");
|
|
74
80
|
const internalDeps = internalFragment.$internal.deps;
|
|
75
|
-
const internalSchema = internalDeps.schema;
|
|
76
|
-
const internalNamespace = internalDeps.namespace;
|
|
81
|
+
const internalSchema$1 = internalDeps.schema;
|
|
82
|
+
const internalNamespace = internalDeps.namespace ?? "";
|
|
77
83
|
const internalCurrentVersion = await getSchemaVersionFromDatabase(internalFragment, internalNamespace);
|
|
78
|
-
if (internalCurrentVersion < internalSchema.version) await adapter.prepareMigrations(internalSchema, internalNamespace).execute(internalCurrentVersion, internalSchema.version);
|
|
84
|
+
if (internalCurrentVersion < internalSchema$1.version) await adapter.prepareMigrations(internalSchema$1, internalNamespace).execute(internalCurrentVersion, internalSchema$1.version);
|
|
79
85
|
const currentVersion = await getSchemaVersionFromDatabase(internalFragment, namespace);
|
|
80
86
|
const targetVersion = schema.version;
|
|
81
87
|
if (currentVersion === targetVersion) return;
|
|
@@ -84,5 +90,5 @@ async function migrate(fragment) {
|
|
|
84
90
|
}
|
|
85
91
|
|
|
86
92
|
//#endregion
|
|
87
|
-
export { ConcurrencyConflictError, Cursor, DatabaseFragmentDefinitionBuilder, ExponentialBackoffRetryPolicy, FragnoDatabase, HandlerTxBuilder, LinearBackoffRetryPolicy, NoRetryPolicy, ServiceTxBuilder, TypedUnitOfWork, UnitOfWork, createHandlerTxBuilder, createServiceTxBuilder, createUnitOfWork, decodeCursor, fragnoDatabaseFakeSymbol, fragnoDatabaseLibraryVersion, internalFragmentDef, isFragnoDatabase, migrate, withDatabase };
|
|
93
|
+
export { ConcurrencyConflictError, Cursor, DatabaseFragmentDefinitionBuilder, ExponentialBackoffRetryPolicy, FragnoDatabase, HandlerTxBuilder, InMemoryAdapter, LinearBackoffRetryPolicy, NoRetryPolicy, ServiceTxBuilder, TypedUnitOfWork, UnitOfWork, createHandlerTxBuilder, createServiceTxBuilder, createUnitOfWork, dbInterval, dbNow, decodeCursor, defineSyncCommands, fragnoDatabaseFakeSymbol, fragnoDatabaseLibraryVersion, getDurableHooksService, getInternalFragment, internalFragmentDef, internalSchema, isFragnoDatabase, migrate, serviceCalls, withDatabase };
|
|
88
94
|
//# sourceMappingURL=mod.js.map
|