@fragno-dev/db 0.1.15 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +242 -179
- package/CHANGELOG.md +23 -0
- package/README.md +123 -8
- package/dist/adapters/adapters.d.ts +5 -5
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -21
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +7 -54
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
- package/dist/adapters/drizzle/generate.d.ts +3 -0
- package/dist/adapters/drizzle/generate.d.ts.map +1 -1
- package/dist/adapters/drizzle/generate.js +36 -28
- package/dist/adapters/drizzle/generate.js.map +1 -1
- package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
- package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
- package/dist/adapters/generic-sql/driver-config.js +94 -0
- package/dist/adapters/generic-sql/driver-config.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.js +18 -0
- package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/select-builder.js +69 -0
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/where-builder.js +129 -0
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
- package/dist/adapters/generic-sql/result-interpreter.js +74 -0
- package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
- package/dist/adapters/generic-sql/uow-decoder.js +105 -0
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
- package/dist/adapters/generic-sql/uow-encoder.js +93 -0
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
- package/dist/adapters/kysely/kysely-adapter.d.ts +5 -18
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +6 -165
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +47 -61
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
- package/dist/adapters/{drizzle/shared.d.ts → shared/table-name-mapper.d.ts} +2 -4
- package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
- package/dist/adapters/shared/table-name-mapper.js +43 -0
- package/dist/adapters/shared/table-name-mapper.js.map +1 -0
- package/dist/adapters/shared/uow-operation-compiler.js +105 -0
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
- package/dist/db-fragment-definition-builder.d.ts +53 -19
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +89 -19
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/fragments/internal-fragment.d.ts +39 -5
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +82 -10
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/hooks/hooks.d.ts +51 -0
- package/dist/hooks/hooks.d.ts.map +1 -0
- package/dist/hooks/hooks.js +88 -0
- package/dist/hooks/hooks.js.map +1 -0
- package/dist/migration-engine/generation-engine.d.ts +0 -2
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +23 -61
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/mod.d.ts +34 -10
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +47 -16
- package/dist/mod.js.map +1 -1
- package/dist/node_modules/.pnpm/{rou3@0.7.8 → rou3@0.7.10}/node_modules/rou3/dist/index.js +1 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +69 -31
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
- package/dist/query/column-defaults.js +27 -0
- package/dist/query/column-defaults.js.map +1 -0
- package/dist/query/cursor.d.ts +4 -4
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +8 -6
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/orm/orm.d.ts +1 -1
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +30 -0
- package/dist/query/serialize/create-sql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
- package/dist/query/serialize/sql-serializer.js +67 -0
- package/dist/query/serialize/sql-serializer.js.map +1 -0
- package/dist/query/{query.d.ts → simple-query-interface.d.ts} +5 -5
- package/dist/query/simple-query-interface.d.ts.map +1 -0
- package/dist/query/{execute-unit-of-work.d.ts → unit-of-work/execute-unit-of-work.d.ts} +13 -3
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/query/{execute-unit-of-work.js → unit-of-work/execute-unit-of-work.js} +17 -4
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/query/{retry-policy.d.ts → unit-of-work/retry-policy.d.ts} +1 -1
- package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/query/{retry-policy.js → unit-of-work/retry-policy.js} +1 -1
- package/dist/query/unit-of-work/retry-policy.js.map +1 -0
- package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +51 -18
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
- package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +58 -11
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
- package/dist/query/value-decoding.js +71 -0
- package/dist/query/value-decoding.js.map +1 -0
- package/dist/query/value-encoding.js +124 -0
- package/dist/query/value-encoding.js.map +1 -0
- package/dist/schema/create.d.ts +3 -0
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +4 -0
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
- package/dist/schema/type-conversion/dialect/mysql.js +57 -0
- package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
- package/dist/schema/type-conversion/dialect/postgres.js +56 -0
- package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
- package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
- package/dist/schema/type-conversion/type-mapping.js +63 -0
- package/dist/schema/type-conversion/type-mapping.js.map +1 -0
- package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
- package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
- package/dist/sql-driver/connection/connection-provider.js +19 -0
- package/dist/sql-driver/connection/connection-provider.js.map +1 -0
- package/dist/sql-driver/connection/single-connection-provider.js +23 -0
- package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
- package/dist/sql-driver/dialects/dialects.d.ts +2 -0
- package/dist/sql-driver/dialects/dialects.js +3 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.js +56 -0
- package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
- package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
- package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
- package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
- package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
- package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
- package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.js +68 -0
- package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
- package/dist/sql-driver/sql-driver.d.ts +38 -0
- package/dist/sql-driver/sql-driver.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver.js +1 -0
- package/dist/sql-driver/sql.js +50 -0
- package/dist/sql-driver/sql.js.map +1 -0
- package/dist/with-database.d.ts +6 -2
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +1 -1
- package/dist/with-database.js.map +1 -1
- package/package.json +37 -10
- package/src/adapters/adapters.ts +8 -5
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +60 -169
- package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +31 -55
- package/src/adapters/drizzle/drizzle-adapter.ts +15 -107
- package/src/adapters/drizzle/generate.test.ts +2 -2
- package/src/adapters/drizzle/generate.ts +78 -34
- package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
- package/src/adapters/drizzle/shared.ts +0 -34
- package/src/adapters/drizzle/test-utils.ts +3 -3
- package/src/adapters/generic-sql/README.md +14 -0
- package/src/adapters/generic-sql/driver-config.ts +144 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
- package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
- package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
- package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
- package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
- package/src/adapters/generic-sql/migration/executor.ts +33 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
- package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
- package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
- package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
- package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
- package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
- package/src/adapters/generic-sql/query/select-builder.ts +137 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
- package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
- package/src/adapters/generic-sql/query/where-builder.ts +211 -0
- package/src/adapters/generic-sql/result-interpreter.ts +102 -0
- package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
- package/src/adapters/generic-sql/uow-decoder.ts +152 -0
- package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
- package/src/adapters/generic-sql/uow-encoder.ts +131 -0
- package/src/adapters/kysely/kysely-adapter-pglite.test.ts +26 -76
- package/src/adapters/kysely/{kysely-adapter-sqlite.test.ts → kysely-adapter-sqlocal.test.ts} +76 -17
- package/src/adapters/kysely/kysely-adapter.ts +10 -250
- package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +110 -104
- package/src/adapters/shared/table-name-mapper.ts +50 -0
- package/src/adapters/shared/uow-operation-compiler.ts +211 -0
- package/src/db-fragment-definition-builder.test.ts +2 -2
- package/src/db-fragment-definition-builder.ts +281 -50
- package/src/db-fragment-instantiator.test.ts +78 -2
- package/src/db-fragment-integration.test.ts +14 -16
- package/src/fragments/internal-fragment.test.ts +434 -45
- package/src/fragments/internal-fragment.ts +184 -20
- package/src/hooks/hooks.test.ts +575 -0
- package/src/hooks/hooks.ts +179 -0
- package/src/migration-engine/generation-engine.test.ts +44 -54
- package/src/migration-engine/generation-engine.ts +48 -94
- package/src/mod.ts +117 -29
- package/src/query/column-defaults.ts +49 -0
- package/src/query/cursor.test.ts +31 -6
- package/src/query/cursor.ts +11 -7
- package/src/query/orm/orm.ts +1 -1
- package/src/query/query-type.test.ts +9 -9
- package/src/query/serialize/create-sql-serializer.ts +34 -0
- package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
- package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
- package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
- package/src/query/serialize/sql-serializer.ts +143 -0
- package/src/query/{query.ts → simple-query-interface.ts} +2 -2
- package/src/query/{execute-unit-of-work.test.ts → unit-of-work/execute-unit-of-work.test.ts} +16 -16
- package/src/query/{execute-unit-of-work.ts → unit-of-work/execute-unit-of-work.ts} +49 -8
- package/src/query/{unit-of-work-coordinator.test.ts → unit-of-work/unit-of-work-coordinator.test.ts} +41 -43
- package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +5 -3
- package/src/query/{unit-of-work.test.ts → unit-of-work/unit-of-work.test.ts} +100 -9
- package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +135 -32
- package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -427
- package/src/query/value-decoding.ts +113 -0
- package/src/query/value-encoding.test.ts +390 -0
- package/src/query/value-encoding.ts +168 -0
- package/src/schema/create.test.ts +5 -1
- package/src/schema/create.ts +5 -0
- package/src/schema/serialize.test.ts +165 -407
- package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
- package/src/schema/type-conversion/dialect/mysql.ts +64 -0
- package/src/schema/type-conversion/dialect/postgres.ts +62 -0
- package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
- package/src/schema/type-conversion/type-mapping.test.ts +137 -0
- package/src/schema/type-conversion/type-mapping.ts +153 -0
- package/src/shared/connection-pool.ts +5 -5
- package/src/sql-driver/better-sqlite3.test.ts +126 -0
- package/src/sql-driver/connection/connection-provider.ts +27 -0
- package/src/sql-driver/connection/single-connection-provider.ts +42 -0
- package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
- package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
- package/src/sql-driver/dialects/dialects.ts +1 -0
- package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
- package/src/sql-driver/driver/runtime-driver.ts +91 -0
- package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
- package/src/sql-driver/query-executor/plugin.ts +22 -0
- package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
- package/src/sql-driver/query-executor/query-executor.ts +44 -0
- package/src/sql-driver/sql-driver-adapter.ts +96 -0
- package/src/sql-driver/sql-driver.ts +53 -0
- package/src/sql-driver/sql.ts +57 -0
- package/src/sql-driver/sqlocal.test.ts +117 -0
- package/src/with-database.ts +35 -23
- package/tsdown.config.ts +7 -2
- package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
- package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
- package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -334
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -123
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -160
- package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
- package/dist/adapters/drizzle/join-column-utils.js +0 -28
- package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
- package/dist/adapters/drizzle/shared.d.ts.map +0 -1
- package/dist/adapters/drizzle/shared.js +0 -35
- package/dist/adapters/drizzle/shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
- package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-builder.js +0 -321
- package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-compiler.js +0 -67
- package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-query.d.ts +0 -23
- package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-query.js +0 -230
- package/dist/adapters/kysely/kysely-query.js.map +0 -1
- package/dist/adapters/kysely/kysely-shared.d.ts +0 -14
- package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-shared.js +0 -33
- package/dist/adapters/kysely/kysely-shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-compiler.js +0 -193
- package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-executor.js +0 -93
- package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-base.js +0 -128
- package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-factory.js +0 -34
- package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
- package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
- package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
- package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
- package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
- package/dist/adapters/kysely/migration/execute.js +0 -34
- package/dist/adapters/kysely/migration/execute.js.map +0 -1
- package/dist/migration-engine/create.d.ts +0 -37
- package/dist/migration-engine/create.d.ts.map +0 -1
- package/dist/migration-engine/create.js +0 -58
- package/dist/migration-engine/create.js.map +0 -1
- package/dist/migration-engine/shared.d.ts +0 -112
- package/dist/migration-engine/shared.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +0 -1
- package/dist/query/execute-unit-of-work.d.ts.map +0 -1
- package/dist/query/execute-unit-of-work.js.map +0 -1
- package/dist/query/query.d.ts.map +0 -1
- package/dist/query/result-transform.js +0 -170
- package/dist/query/result-transform.js.map +0 -1
- package/dist/query/retry-policy.d.ts.map +0 -1
- package/dist/query/retry-policy.js.map +0 -1
- package/dist/query/unit-of-work.d.ts.map +0 -1
- package/dist/query/unit-of-work.js.map +0 -1
- package/dist/schema/serialize.js +0 -111
- package/dist/schema/serialize.js.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -122
- package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
- package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
- package/src/adapters/drizzle/drizzle-uow-compiler-mysql.test.ts +0 -1442
- package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +0 -1414
- package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1400
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -677
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -228
- package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -309
- package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
- package/src/adapters/drizzle/join-column-utils.ts +0 -39
- package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
- package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
- package/src/adapters/kysely/kysely-query-builder.ts +0 -666
- package/src/adapters/kysely/kysely-query-compiler.ts +0 -127
- package/src/adapters/kysely/kysely-query.test.ts +0 -498
- package/src/adapters/kysely/kysely-query.ts +0 -399
- package/src/adapters/kysely/kysely-shared.ts +0 -57
- package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -986
- package/src/adapters/kysely/kysely-uow-compiler.ts +0 -350
- package/src/adapters/kysely/kysely-uow-executor.ts +0 -164
- package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -794
- package/src/adapters/kysely/migration/execute-base.ts +0 -256
- package/src/adapters/kysely/migration/execute-factory.ts +0 -53
- package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
- package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
- package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
- package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
- package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
- package/src/adapters/kysely/migration/execute.ts +0 -50
- package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
- package/src/query/result-transform.ts +0 -274
- package/src/schema/serialize.ts +0 -407
- /package/dist/query/{query.js → simple-query-interface.js} +0 -0
- /package/src/query/{retry-policy.test.ts → unit-of-work/retry-policy.test.ts} +0 -0
- /package/src/query/{retry-policy.ts → unit-of-work/retry-policy.ts} +0 -0
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Kysely } from "kysely";
|
|
2
1
|
import { SQLocalKysely } from "sqlocal/kysely";
|
|
3
2
|
import { assert, beforeAll, describe, expect, it } from "vitest";
|
|
4
3
|
import { z } from "zod";
|
|
@@ -8,6 +7,8 @@ import { defineFragment, instantiate } from "@fragno-dev/core";
|
|
|
8
7
|
import { defineRoutes } from "@fragno-dev/core/route";
|
|
9
8
|
import { withDatabase } from "./with-database";
|
|
10
9
|
import type { FragnoPublicConfigWithDatabase } from "./db-fragment-definition-builder";
|
|
10
|
+
import { ConcurrencyConflictError } from "./query/unit-of-work/execute-unit-of-work";
|
|
11
|
+
import { SQLocalDriverConfig } from "./adapters/generic-sql/driver-config";
|
|
11
12
|
|
|
12
13
|
describe.sequential("Database Fragment Integration", () => {
|
|
13
14
|
// Schema 1: Users fragment
|
|
@@ -180,8 +181,6 @@ describe.sequential("Database Fragment Integration", () => {
|
|
|
180
181
|
]);
|
|
181
182
|
|
|
182
183
|
let adapter: KyselyAdapter;
|
|
183
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
184
|
-
let kysely: Kysely<any>;
|
|
185
184
|
let usersFragment: ReturnType<typeof instantiateUsersFragment>;
|
|
186
185
|
let ordersFragment: ReturnType<typeof instantiateOrdersFragment>;
|
|
187
186
|
|
|
@@ -211,23 +210,21 @@ describe.sequential("Database Fragment Integration", () => {
|
|
|
211
210
|
beforeAll(async () => {
|
|
212
211
|
// Create in-memory SQLite database with Kysely
|
|
213
212
|
const { dialect } = new SQLocalKysely(":memory:");
|
|
214
|
-
kysely = new Kysely({
|
|
215
|
-
dialect,
|
|
216
|
-
});
|
|
217
|
-
|
|
218
213
|
adapter = new KyselyAdapter({
|
|
219
|
-
|
|
220
|
-
|
|
214
|
+
dialect,
|
|
215
|
+
driverConfig: new SQLocalDriverConfig(),
|
|
221
216
|
});
|
|
222
217
|
|
|
223
218
|
// Run migrations for both schemas
|
|
224
|
-
const
|
|
225
|
-
|
|
226
|
-
|
|
219
|
+
const usersPreparedMigrations = adapter.prepareMigrations(usersSchema, "users");
|
|
220
|
+
await usersPreparedMigrations.execute(0, usersSchema.version, {
|
|
221
|
+
updateVersionInMigration: false,
|
|
222
|
+
});
|
|
227
223
|
|
|
228
|
-
const
|
|
229
|
-
|
|
230
|
-
|
|
224
|
+
const ordersPreparedMigrations = adapter.prepareMigrations(ordersSchema, "orders");
|
|
225
|
+
await ordersPreparedMigrations.execute(0, ordersSchema.version, {
|
|
226
|
+
updateVersionInMigration: false,
|
|
227
|
+
});
|
|
231
228
|
|
|
232
229
|
// Instantiate fragments with shared database adapter
|
|
233
230
|
const options: FragnoPublicConfigWithDatabase = {
|
|
@@ -375,7 +372,8 @@ describe.sequential("Database Fragment Integration", () => {
|
|
|
375
372
|
|
|
376
373
|
if (currentAttempt === 0) {
|
|
377
374
|
firstNonce = nonce;
|
|
378
|
-
|
|
375
|
+
// Trigger a conflict by throwing the specific conflict error
|
|
376
|
+
throw new ConcurrencyConflictError();
|
|
379
377
|
}
|
|
380
378
|
|
|
381
379
|
expect(nonce).toBe(firstNonce);
|
|
@@ -1,22 +1,17 @@
|
|
|
1
|
-
import
|
|
1
|
+
import SQLite from "better-sqlite3";
|
|
2
|
+
import { SqliteDialect } from "kysely";
|
|
2
3
|
import { beforeAll, describe, expect, it } from "vitest";
|
|
3
4
|
import { instantiate } from "@fragno-dev/core";
|
|
4
|
-
import { internalFragmentDef,
|
|
5
|
+
import { internalFragmentDef, internalSchema, SETTINGS_NAMESPACE } from "./internal-fragment";
|
|
5
6
|
import type { FragnoPublicConfigWithDatabase } from "../db-fragment-definition-builder";
|
|
6
7
|
import { DrizzleAdapter } from "../adapters/drizzle/drizzle-adapter";
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { createRequire } from "node:module";
|
|
11
|
-
|
|
12
|
-
// Import drizzle-kit for migrations
|
|
13
|
-
const require = createRequire(import.meta.url);
|
|
14
|
-
const { generateSQLiteDrizzleJson, generateSQLiteMigration } =
|
|
15
|
-
require("drizzle-kit/api") as typeof import("drizzle-kit/api");
|
|
8
|
+
import { BetterSQLite3DriverConfig } from "../adapters/generic-sql/driver-config";
|
|
9
|
+
import { ExponentialBackoffRetryPolicy, NoRetryPolicy } from "../query/unit-of-work/retry-policy";
|
|
10
|
+
import type { FragnoId } from "../schema/create";
|
|
16
11
|
|
|
17
12
|
describe("Internal Fragment", () => {
|
|
13
|
+
let sqliteDatabase: SQLite.Database;
|
|
18
14
|
let adapter: DrizzleAdapter;
|
|
19
|
-
let db: DBType;
|
|
20
15
|
let fragment: ReturnType<typeof instantiateFragment>;
|
|
21
16
|
|
|
22
17
|
function instantiateFragment(options: FragnoPublicConfigWithDatabase) {
|
|
@@ -24,36 +19,22 @@ describe("Internal Fragment", () => {
|
|
|
24
19
|
}
|
|
25
20
|
|
|
26
21
|
beforeAll(async () => {
|
|
27
|
-
|
|
28
|
-
"internal-fragment",
|
|
29
|
-
settingsSchema,
|
|
30
|
-
"sqlite",
|
|
31
|
-
"",
|
|
32
|
-
);
|
|
22
|
+
sqliteDatabase = new SQLite(":memory:");
|
|
33
23
|
|
|
34
|
-
const
|
|
35
|
-
|
|
24
|
+
const dialect = new SqliteDialect({
|
|
25
|
+
database: sqliteDatabase,
|
|
36
26
|
});
|
|
37
27
|
|
|
38
|
-
db = drizzle(client, {
|
|
39
|
-
schema: schemaModule,
|
|
40
|
-
}) as unknown as DBType;
|
|
41
|
-
|
|
42
|
-
// Generate and run migrations for both schemas
|
|
43
|
-
const emptyJson = await generateSQLiteDrizzleJson({});
|
|
44
|
-
const targetJson = await generateSQLiteDrizzleJson(schemaModule);
|
|
45
|
-
|
|
46
|
-
const migrationStatements = await generateSQLiteMigration(emptyJson, targetJson);
|
|
47
|
-
|
|
48
|
-
for (const statement of migrationStatements) {
|
|
49
|
-
await client.execute(statement);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
28
|
adapter = new DrizzleAdapter({
|
|
53
|
-
|
|
54
|
-
|
|
29
|
+
dialect,
|
|
30
|
+
driverConfig: new BetterSQLite3DriverConfig(),
|
|
55
31
|
});
|
|
56
32
|
|
|
33
|
+
{
|
|
34
|
+
const migrations = adapter.prepareMigrations(internalSchema, "");
|
|
35
|
+
await migrations.executeWithDriver(adapter.driver, 0);
|
|
36
|
+
}
|
|
37
|
+
|
|
57
38
|
// Instantiate fragment with shared database adapter
|
|
58
39
|
const options: FragnoPublicConfigWithDatabase = {
|
|
59
40
|
databaseAdapter: adapter,
|
|
@@ -62,15 +43,14 @@ describe("Internal Fragment", () => {
|
|
|
62
43
|
fragment = instantiateFragment(options);
|
|
63
44
|
|
|
64
45
|
return async () => {
|
|
65
|
-
|
|
66
|
-
await cleanup();
|
|
46
|
+
await adapter.close();
|
|
67
47
|
};
|
|
68
48
|
}, 12000);
|
|
69
49
|
|
|
70
50
|
it("should get undefined for non-existent key", async () => {
|
|
71
51
|
const result = await fragment.inContext(async function () {
|
|
72
52
|
return await this.uow(async ({ executeRetrieve }) => {
|
|
73
|
-
const valuePromise = fragment.services.settingsService.get("test-key");
|
|
53
|
+
const valuePromise = fragment.services.settingsService.get(SETTINGS_NAMESPACE, "test-key");
|
|
74
54
|
await executeRetrieve();
|
|
75
55
|
return await valuePromise;
|
|
76
56
|
});
|
|
@@ -82,7 +62,11 @@ describe("Internal Fragment", () => {
|
|
|
82
62
|
it("should set and get a value", async () => {
|
|
83
63
|
await fragment.inContext(async function () {
|
|
84
64
|
return await this.uow(async ({ executeMutate }) => {
|
|
85
|
-
const setPromise = fragment.services.settingsService.set(
|
|
65
|
+
const setPromise = fragment.services.settingsService.set(
|
|
66
|
+
SETTINGS_NAMESPACE,
|
|
67
|
+
"test-key",
|
|
68
|
+
"test-value",
|
|
69
|
+
);
|
|
86
70
|
await executeMutate();
|
|
87
71
|
await setPromise;
|
|
88
72
|
});
|
|
@@ -90,7 +74,7 @@ describe("Internal Fragment", () => {
|
|
|
90
74
|
|
|
91
75
|
const result = await fragment.inContext(async function () {
|
|
92
76
|
return await this.uow(async ({ executeRetrieve }) => {
|
|
93
|
-
const valuePromise = fragment.services.settingsService.get("test-key");
|
|
77
|
+
const valuePromise = fragment.services.settingsService.get(SETTINGS_NAMESPACE, "test-key");
|
|
94
78
|
await executeRetrieve();
|
|
95
79
|
return await valuePromise;
|
|
96
80
|
});
|
|
@@ -105,7 +89,11 @@ describe("Internal Fragment", () => {
|
|
|
105
89
|
it("should update an existing value", async () => {
|
|
106
90
|
await fragment.inContext(async function () {
|
|
107
91
|
return await this.uow(async ({ executeMutate }) => {
|
|
108
|
-
const setPromise = fragment.services.settingsService.set(
|
|
92
|
+
const setPromise = fragment.services.settingsService.set(
|
|
93
|
+
SETTINGS_NAMESPACE,
|
|
94
|
+
"test-key",
|
|
95
|
+
"updated-value",
|
|
96
|
+
);
|
|
109
97
|
await executeMutate();
|
|
110
98
|
await setPromise;
|
|
111
99
|
});
|
|
@@ -113,7 +101,7 @@ describe("Internal Fragment", () => {
|
|
|
113
101
|
|
|
114
102
|
const result = await fragment.inContext(async function () {
|
|
115
103
|
return await this.uow(async ({ executeRetrieve }) => {
|
|
116
|
-
const valuePromise = fragment.services.settingsService.get("test-key");
|
|
104
|
+
const valuePromise = fragment.services.settingsService.get(SETTINGS_NAMESPACE, "test-key");
|
|
117
105
|
await executeRetrieve();
|
|
118
106
|
return await valuePromise;
|
|
119
107
|
});
|
|
@@ -129,7 +117,7 @@ describe("Internal Fragment", () => {
|
|
|
129
117
|
// First get the ID
|
|
130
118
|
const setting = await fragment.inContext(async function () {
|
|
131
119
|
return await this.uow(async ({ executeRetrieve }) => {
|
|
132
|
-
const valuePromise = fragment.services.settingsService.get("test-key");
|
|
120
|
+
const valuePromise = fragment.services.settingsService.get(SETTINGS_NAMESPACE, "test-key");
|
|
133
121
|
await executeRetrieve();
|
|
134
122
|
return await valuePromise;
|
|
135
123
|
});
|
|
@@ -149,7 +137,7 @@ describe("Internal Fragment", () => {
|
|
|
149
137
|
// Verify it's gone
|
|
150
138
|
const result = await fragment.inContext(async function () {
|
|
151
139
|
return await this.uow(async ({ executeRetrieve }) => {
|
|
152
|
-
const valuePromise = fragment.services.settingsService.get("test-key");
|
|
140
|
+
const valuePromise = fragment.services.settingsService.get(SETTINGS_NAMESPACE, "test-key");
|
|
153
141
|
await executeRetrieve();
|
|
154
142
|
return await valuePromise;
|
|
155
143
|
});
|
|
@@ -158,3 +146,404 @@ describe("Internal Fragment", () => {
|
|
|
158
146
|
expect(result).toBeUndefined();
|
|
159
147
|
});
|
|
160
148
|
});
|
|
149
|
+
|
|
150
|
+
describe("Hook Service", () => {
|
|
151
|
+
let sqliteDatabase: SQLite.Database;
|
|
152
|
+
let adapter: DrizzleAdapter;
|
|
153
|
+
let fragment: ReturnType<typeof instantiateFragment>;
|
|
154
|
+
|
|
155
|
+
function instantiateFragment(options: FragnoPublicConfigWithDatabase) {
|
|
156
|
+
return instantiate(internalFragmentDef).withConfig({}).withOptions(options).build();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
beforeAll(async () => {
|
|
160
|
+
sqliteDatabase = new SQLite(":memory:");
|
|
161
|
+
|
|
162
|
+
const dialect = new SqliteDialect({
|
|
163
|
+
database: sqliteDatabase,
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
adapter = new DrizzleAdapter({
|
|
167
|
+
dialect,
|
|
168
|
+
driverConfig: new BetterSQLite3DriverConfig(),
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
{
|
|
172
|
+
const migrations = adapter.prepareMigrations(internalSchema, "");
|
|
173
|
+
await migrations.executeWithDriver(adapter.driver, 0);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const options: FragnoPublicConfigWithDatabase = {
|
|
177
|
+
databaseAdapter: adapter,
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
fragment = instantiateFragment(options);
|
|
181
|
+
|
|
182
|
+
return async () => {
|
|
183
|
+
await adapter.close();
|
|
184
|
+
};
|
|
185
|
+
}, 12000);
|
|
186
|
+
|
|
187
|
+
it("should create a hook event and retrieve it by namespace", async () => {
|
|
188
|
+
const nonce = "test-nonce-1";
|
|
189
|
+
|
|
190
|
+
await fragment.inContext(async function () {
|
|
191
|
+
return await this.uow(async ({ forSchema, executeMutate }) => {
|
|
192
|
+
const uow = forSchema(internalSchema);
|
|
193
|
+
uow.create("fragno_hooks", {
|
|
194
|
+
namespace: "test-namespace",
|
|
195
|
+
hookName: "onTest",
|
|
196
|
+
payload: { test: "data" },
|
|
197
|
+
status: "pending",
|
|
198
|
+
attempts: 0,
|
|
199
|
+
maxAttempts: 5,
|
|
200
|
+
lastAttemptAt: null,
|
|
201
|
+
nextRetryAt: null,
|
|
202
|
+
error: null,
|
|
203
|
+
nonce,
|
|
204
|
+
});
|
|
205
|
+
uow.create("fragno_hooks", {
|
|
206
|
+
namespace: "test-namespace",
|
|
207
|
+
hookName: "onTest",
|
|
208
|
+
payload: { test: "already-completed-data" },
|
|
209
|
+
status: "completed",
|
|
210
|
+
attempts: 0,
|
|
211
|
+
maxAttempts: 5,
|
|
212
|
+
lastAttemptAt: null,
|
|
213
|
+
nextRetryAt: null,
|
|
214
|
+
error: null,
|
|
215
|
+
nonce,
|
|
216
|
+
});
|
|
217
|
+
await executeMutate();
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
const events = await fragment.inContext(async function () {
|
|
222
|
+
return await this.uow(async ({ executeRetrieve }) => {
|
|
223
|
+
const eventsPromise = fragment.services.hookService.getPendingHookEvents("test-namespace");
|
|
224
|
+
await executeRetrieve();
|
|
225
|
+
return await eventsPromise;
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
expect(events).toHaveLength(1);
|
|
230
|
+
expect(events[0]).toMatchObject({
|
|
231
|
+
hookName: "onTest",
|
|
232
|
+
payload: { test: "data" },
|
|
233
|
+
attempts: 0,
|
|
234
|
+
maxAttempts: 5,
|
|
235
|
+
nonce,
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it("should mark a hook event as completed", async () => {
|
|
240
|
+
const nonce = "test-nonce-2";
|
|
241
|
+
let eventId: FragnoId;
|
|
242
|
+
|
|
243
|
+
await fragment.inContext(async function () {
|
|
244
|
+
return await this.uow(async ({ forSchema, executeMutate }) => {
|
|
245
|
+
const uow = forSchema(internalSchema);
|
|
246
|
+
eventId = uow.create("fragno_hooks", {
|
|
247
|
+
namespace: "test-namespace",
|
|
248
|
+
hookName: "onComplete",
|
|
249
|
+
payload: { test: "data" },
|
|
250
|
+
status: "pending",
|
|
251
|
+
attempts: 0,
|
|
252
|
+
maxAttempts: 5,
|
|
253
|
+
lastAttemptAt: null,
|
|
254
|
+
nextRetryAt: null,
|
|
255
|
+
error: null,
|
|
256
|
+
nonce,
|
|
257
|
+
});
|
|
258
|
+
await executeMutate();
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
await fragment.inContext(async function () {
|
|
263
|
+
return await this.uow(async ({ executeMutate }) => {
|
|
264
|
+
fragment.services.hookService.markHookCompleted(eventId);
|
|
265
|
+
await executeMutate();
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
const result = await fragment.inContext(async function () {
|
|
270
|
+
return await this.uow(async ({ forSchema, executeRetrieve }) => {
|
|
271
|
+
const uow = forSchema(internalSchema);
|
|
272
|
+
const findUow = uow.find("fragno_hooks", (b) =>
|
|
273
|
+
b.whereIndex("primary", (eb) => eb("id", "=", eventId)),
|
|
274
|
+
);
|
|
275
|
+
await executeRetrieve();
|
|
276
|
+
const [events] = await findUow.retrievalPhase;
|
|
277
|
+
return events?.[0];
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
expect(result).toBeDefined();
|
|
282
|
+
expect(result?.status).toBe("completed");
|
|
283
|
+
expect(result?.lastAttemptAt).toBeInstanceOf(Date);
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
it("should mark a hook event as processing", async () => {
|
|
287
|
+
const nonce = "test-nonce-3";
|
|
288
|
+
let eventId: FragnoId;
|
|
289
|
+
|
|
290
|
+
await fragment.inContext(async function () {
|
|
291
|
+
return await this.uow(async ({ forSchema, executeMutate }) => {
|
|
292
|
+
const uow = forSchema(internalSchema);
|
|
293
|
+
eventId = uow.create("fragno_hooks", {
|
|
294
|
+
namespace: "test-namespace",
|
|
295
|
+
hookName: "onProcess",
|
|
296
|
+
payload: { test: "data" },
|
|
297
|
+
status: "pending",
|
|
298
|
+
attempts: 0,
|
|
299
|
+
maxAttempts: 5,
|
|
300
|
+
lastAttemptAt: null,
|
|
301
|
+
nextRetryAt: null,
|
|
302
|
+
error: null,
|
|
303
|
+
nonce,
|
|
304
|
+
});
|
|
305
|
+
await executeMutate();
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
await fragment.inContext(async function () {
|
|
310
|
+
return await this.uow(async ({ executeMutate }) => {
|
|
311
|
+
fragment.services.hookService.markHookProcessing(eventId);
|
|
312
|
+
await executeMutate();
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
const result = await fragment.inContext(async function () {
|
|
317
|
+
return await this.uow(async ({ forSchema, executeRetrieve }) => {
|
|
318
|
+
const uow = forSchema(internalSchema);
|
|
319
|
+
const findUow = uow.find("fragno_hooks", (b) =>
|
|
320
|
+
b.whereIndex("primary", (eb) => eb("id", "=", eventId)),
|
|
321
|
+
);
|
|
322
|
+
await executeRetrieve();
|
|
323
|
+
const [events] = await findUow.retrievalPhase;
|
|
324
|
+
return events?.[0];
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
expect(result).toBeDefined();
|
|
329
|
+
expect(result?.status).toBe("processing");
|
|
330
|
+
expect(result?.lastAttemptAt).toBeInstanceOf(Date);
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
it("should mark a hook event as failed with retry scheduled", async () => {
|
|
334
|
+
const nonce = "test-nonce-4";
|
|
335
|
+
let eventId: FragnoId;
|
|
336
|
+
|
|
337
|
+
await fragment.inContext(async function () {
|
|
338
|
+
return await this.uow(async ({ forSchema, executeMutate }) => {
|
|
339
|
+
const uow = forSchema(internalSchema);
|
|
340
|
+
eventId = uow.create("fragno_hooks", {
|
|
341
|
+
namespace: "test-namespace",
|
|
342
|
+
hookName: "onFail",
|
|
343
|
+
payload: { test: "data" },
|
|
344
|
+
status: "pending",
|
|
345
|
+
attempts: 0,
|
|
346
|
+
maxAttempts: 5,
|
|
347
|
+
lastAttemptAt: null,
|
|
348
|
+
nextRetryAt: null,
|
|
349
|
+
error: null,
|
|
350
|
+
nonce,
|
|
351
|
+
});
|
|
352
|
+
await executeMutate();
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
const retryPolicy = new ExponentialBackoffRetryPolicy({ maxRetries: 3 });
|
|
357
|
+
|
|
358
|
+
await fragment.inContext(async function () {
|
|
359
|
+
return await this.uow(async ({ executeMutate }) => {
|
|
360
|
+
fragment.services.hookService.markHookFailed(eventId, "Test error", 0, retryPolicy);
|
|
361
|
+
await executeMutate();
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
const result = await fragment.inContext(async function () {
|
|
366
|
+
return await this.uow(async ({ forSchema, executeRetrieve }) => {
|
|
367
|
+
const uow = forSchema(internalSchema);
|
|
368
|
+
const findUow = uow.find("fragno_hooks", (b) =>
|
|
369
|
+
b.whereIndex("primary", (eb) => eb("id", "=", eventId)),
|
|
370
|
+
);
|
|
371
|
+
await executeRetrieve();
|
|
372
|
+
const [events] = await findUow.retrievalPhase;
|
|
373
|
+
return events?.[0];
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
expect(result).toBeDefined();
|
|
378
|
+
expect(result?.status).toBe("pending");
|
|
379
|
+
expect(result?.attempts).toBe(1);
|
|
380
|
+
expect(result?.error).toBe("Test error");
|
|
381
|
+
expect(result?.nextRetryAt).toBeInstanceOf(Date);
|
|
382
|
+
expect(result?.lastAttemptAt).toBeInstanceOf(Date);
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
it("should mark a hook event as permanently failed when max attempts reached", async () => {
|
|
386
|
+
const nonce = "test-nonce-5";
|
|
387
|
+
let eventId: FragnoId;
|
|
388
|
+
|
|
389
|
+
await fragment.inContext(async function () {
|
|
390
|
+
return await this.uow(async ({ forSchema, executeMutate }) => {
|
|
391
|
+
const uow = forSchema(internalSchema);
|
|
392
|
+
eventId = uow.create("fragno_hooks", {
|
|
393
|
+
namespace: "test-namespace",
|
|
394
|
+
hookName: "onMaxFail",
|
|
395
|
+
payload: { test: "data" },
|
|
396
|
+
status: "pending",
|
|
397
|
+
attempts: 0,
|
|
398
|
+
maxAttempts: 1,
|
|
399
|
+
lastAttemptAt: null,
|
|
400
|
+
nextRetryAt: null,
|
|
401
|
+
error: null,
|
|
402
|
+
nonce,
|
|
403
|
+
});
|
|
404
|
+
await executeMutate();
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
const retryPolicy = new NoRetryPolicy();
|
|
409
|
+
|
|
410
|
+
await fragment.inContext(async function () {
|
|
411
|
+
return await this.uow(async ({ executeMutate }) => {
|
|
412
|
+
fragment.services.hookService.markHookFailed(
|
|
413
|
+
eventId,
|
|
414
|
+
"Max attempts reached",
|
|
415
|
+
0,
|
|
416
|
+
retryPolicy,
|
|
417
|
+
);
|
|
418
|
+
await executeMutate();
|
|
419
|
+
});
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
const result = await fragment.inContext(async function () {
|
|
423
|
+
return await this.uow(async ({ forSchema, executeRetrieve }) => {
|
|
424
|
+
const uow = forSchema(internalSchema);
|
|
425
|
+
const findUow = uow.find("fragno_hooks", (b) =>
|
|
426
|
+
b.whereIndex("primary", (eb) => eb("id", "=", eventId)),
|
|
427
|
+
);
|
|
428
|
+
await executeRetrieve();
|
|
429
|
+
const [events] = await findUow.retrievalPhase;
|
|
430
|
+
return events?.[0];
|
|
431
|
+
});
|
|
432
|
+
});
|
|
433
|
+
|
|
434
|
+
expect(result).toBeDefined();
|
|
435
|
+
expect(result?.status).toBe("failed");
|
|
436
|
+
expect(result?.attempts).toBe(1);
|
|
437
|
+
expect(result?.error).toBe("Max attempts reached");
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
it("should retrieve stale events ready for retry", async () => {
|
|
441
|
+
const nonce = "test-nonce-6";
|
|
442
|
+
let eventId: FragnoId;
|
|
443
|
+
|
|
444
|
+
const pastTime = new Date(Date.now() - 10000);
|
|
445
|
+
|
|
446
|
+
await fragment.inContext(async function () {
|
|
447
|
+
return await this.uow(async ({ forSchema, executeMutate }) => {
|
|
448
|
+
const uow = forSchema(internalSchema);
|
|
449
|
+
eventId = uow.create("fragno_hooks", {
|
|
450
|
+
namespace: "test-namespace",
|
|
451
|
+
hookName: "onStale",
|
|
452
|
+
payload: { test: "stale" },
|
|
453
|
+
status: "pending",
|
|
454
|
+
attempts: 1,
|
|
455
|
+
maxAttempts: 5,
|
|
456
|
+
lastAttemptAt: pastTime,
|
|
457
|
+
nextRetryAt: pastTime,
|
|
458
|
+
error: "Previous error",
|
|
459
|
+
nonce,
|
|
460
|
+
});
|
|
461
|
+
await executeMutate();
|
|
462
|
+
});
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
const events = await fragment.inContext(async function () {
|
|
466
|
+
return await this.uow(async ({ executeRetrieve }) => {
|
|
467
|
+
const eventsPromise = fragment.services.hookService.getPendingHookEvents("test-namespace");
|
|
468
|
+
await executeRetrieve();
|
|
469
|
+
return await eventsPromise;
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
const staleEvent = events.find((e) => e.id.externalId === eventId.externalId);
|
|
474
|
+
expect(staleEvent).toBeDefined();
|
|
475
|
+
expect(staleEvent?.hookName).toBe("onStale");
|
|
476
|
+
expect(staleEvent?.attempts).toBe(1);
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
it("should not retrieve events from different namespace", async () => {
|
|
480
|
+
const nonce = "test-nonce-7";
|
|
481
|
+
|
|
482
|
+
await fragment.inContext(async function () {
|
|
483
|
+
return await this.uow(async ({ forSchema, executeMutate }) => {
|
|
484
|
+
const uow = forSchema(internalSchema);
|
|
485
|
+
uow.create("fragno_hooks", {
|
|
486
|
+
namespace: "other-namespace",
|
|
487
|
+
hookName: "onOther",
|
|
488
|
+
payload: { test: "other" },
|
|
489
|
+
status: "pending",
|
|
490
|
+
attempts: 0,
|
|
491
|
+
maxAttempts: 5,
|
|
492
|
+
lastAttemptAt: null,
|
|
493
|
+
nextRetryAt: null,
|
|
494
|
+
error: null,
|
|
495
|
+
nonce,
|
|
496
|
+
});
|
|
497
|
+
await executeMutate();
|
|
498
|
+
});
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
const events = await fragment.inContext(async function () {
|
|
502
|
+
return await this.uow(async ({ executeRetrieve }) => {
|
|
503
|
+
const eventsPromise = fragment.services.hookService.getPendingHookEvents("test-namespace");
|
|
504
|
+
await executeRetrieve();
|
|
505
|
+
return await eventsPromise;
|
|
506
|
+
});
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
const otherEvent = events.find((e) => e.hookName === "onOther");
|
|
510
|
+
expect(otherEvent).toBeUndefined();
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
it("should not retrieve events not yet ready for retry", async () => {
|
|
514
|
+
const nonce = "test-nonce-8";
|
|
515
|
+
let eventId: FragnoId;
|
|
516
|
+
|
|
517
|
+
const futureTime = new Date(Date.now() + 60000);
|
|
518
|
+
|
|
519
|
+
await fragment.inContext(async function () {
|
|
520
|
+
return await this.uow(async ({ forSchema, executeMutate }) => {
|
|
521
|
+
const uow = forSchema(internalSchema);
|
|
522
|
+
eventId = uow.create("fragno_hooks", {
|
|
523
|
+
namespace: "test-namespace",
|
|
524
|
+
hookName: "onFuture",
|
|
525
|
+
payload: { test: "future" },
|
|
526
|
+
status: "pending",
|
|
527
|
+
attempts: 1,
|
|
528
|
+
maxAttempts: 5,
|
|
529
|
+
lastAttemptAt: new Date(),
|
|
530
|
+
nextRetryAt: futureTime,
|
|
531
|
+
error: "Previous error",
|
|
532
|
+
nonce,
|
|
533
|
+
});
|
|
534
|
+
await executeMutate();
|
|
535
|
+
});
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
const events = await fragment.inContext(async function () {
|
|
539
|
+
return await this.uow(async ({ executeRetrieve }) => {
|
|
540
|
+
const eventsPromise = fragment.services.hookService.getPendingHookEvents("test-namespace");
|
|
541
|
+
await executeRetrieve();
|
|
542
|
+
return await eventsPromise;
|
|
543
|
+
});
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
const futureEvent = events.find((e) => e.id.externalId === eventId.externalId);
|
|
547
|
+
expect(futureEvent).toBeUndefined();
|
|
548
|
+
});
|
|
549
|
+
});
|