@fragno-dev/db 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +327 -160
- package/CHANGELOG.md +74 -0
- package/README.md +24 -0
- package/dist/adapters/adapters.d.ts +1 -1
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +0 -3
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.js +11 -12
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +46 -6
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +1 -1
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +185 -19
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
- package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
- package/dist/adapters/generic-sql/migration/executor.js +30 -3
- package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
- package/dist/adapters/generic-sql/migration/prepared-migrations.js +3 -3
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
- package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
- package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +9 -6
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +37 -9
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/where-builder.js +24 -20
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-decoder.js +1 -1
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-encoder.js +8 -9
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
- package/dist/adapters/in-memory/condition-evaluator.js +10 -6
- package/dist/adapters/in-memory/condition-evaluator.js.map +1 -1
- package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -1
- package/dist/adapters/in-memory/in-memory-adapter.js +45 -25
- package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -1
- package/dist/adapters/in-memory/in-memory-uow.js +236 -13
- package/dist/adapters/in-memory/in-memory-uow.js.map +1 -1
- package/dist/adapters/in-memory/options.d.ts +2 -0
- package/dist/adapters/in-memory/options.d.ts.map +1 -1
- package/dist/adapters/in-memory/options.js +3 -2
- package/dist/adapters/in-memory/options.js.map +1 -1
- package/dist/adapters/in-memory/reference-resolution.js.map +1 -1
- package/dist/adapters/in-memory/store.js +1 -1
- package/dist/adapters/in-memory/store.js.map +1 -1
- package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
- package/dist/browser/adapters/adapters.d.ts +61 -0
- package/dist/browser/adapters/adapters.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
- package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
- package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
- package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
- package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
- package/dist/browser/adapters/in-memory/index.d.ts +2 -0
- package/dist/browser/adapters/in-memory/options.d.ts +1 -0
- package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
- package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
- package/dist/browser/durable-hooks.d.ts +3 -0
- package/dist/browser/fragments/internal-fragment.d.ts +317 -0
- package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
- package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
- package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
- package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
- package/dist/browser/hooks/hooks.d.ts +146 -0
- package/dist/browser/hooks/hooks.d.ts.map +1 -0
- package/dist/browser/id.js +1 -0
- package/dist/browser/internal/adapter-registry.d.ts +4 -0
- package/dist/browser/internal/outbox-state.d.ts +2 -0
- package/dist/browser/mod.d.ts +15 -0
- package/dist/browser/mod.d.ts.map +1 -0
- package/dist/browser/mod.js +17 -0
- package/dist/browser/mod.js.map +1 -0
- package/dist/browser/mod2.d.ts +48 -0
- package/dist/browser/mod2.d.ts.map +1 -0
- package/dist/browser/naming/sql-naming.d.ts +19 -0
- package/dist/browser/naming/sql-naming.d.ts.map +1 -0
- package/dist/browser/outbox/outbox.d.ts +21 -0
- package/dist/browser/outbox/outbox.d.ts.map +1 -0
- package/dist/browser/query/column-defaults.js +1 -0
- package/dist/browser/query/condition-builder.d.ts +44 -0
- package/dist/browser/query/condition-builder.d.ts.map +1 -0
- package/dist/browser/query/condition-builder.js +97 -0
- package/dist/browser/query/condition-builder.js.map +1 -0
- package/dist/browser/query/cursor.d.ts +105 -0
- package/dist/browser/query/cursor.d.ts.map +1 -0
- package/dist/browser/query/cursor.js +150 -0
- package/dist/browser/query/cursor.js.map +1 -0
- package/dist/browser/query/db-now.d.ts +22 -0
- package/dist/browser/query/db-now.d.ts.map +1 -0
- package/dist/browser/query/db-now.js +33 -0
- package/dist/browser/query/db-now.js.map +1 -0
- package/dist/browser/query/orm/orm.d.ts +18 -0
- package/dist/browser/query/orm/orm.d.ts.map +1 -0
- package/dist/browser/query/simple-query-interface.d.ts +108 -0
- package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
- package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
- package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
- package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
- package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
- package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
- package/dist/browser/query/value-encoding.js +38 -0
- package/dist/browser/query/value-encoding.js.map +1 -0
- package/dist/browser/schema/create.d.ts +326 -0
- package/dist/browser/schema/create.d.ts.map +1 -0
- package/dist/browser/schema/create.js +89 -0
- package/dist/browser/schema/create.js.map +1 -0
- package/dist/browser/schema/generate-id.js +28 -0
- package/dist/browser/schema/generate-id.js.map +1 -0
- package/dist/browser/shared/providers.d.ts +6 -0
- package/dist/browser/shared/providers.d.ts.map +1 -0
- package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
- package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
- package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
- package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
- package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
- package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
- package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
- package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
- package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
- package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
- package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
- package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
- package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
- package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
- package/dist/browser/sync/commands.d.ts +15 -0
- package/dist/browser/sync/commands.d.ts.map +1 -0
- package/dist/browser/sync/commands.js +27 -0
- package/dist/browser/sync/commands.js.map +1 -0
- package/dist/browser/sync/types.d.ts +63 -0
- package/dist/browser/sync/types.d.ts.map +1 -0
- package/dist/browser/util/types.d.ts +8 -0
- package/dist/browser/util/types.d.ts.map +1 -0
- package/dist/browser/with-database.d.ts +29 -0
- package/dist/browser/with-database.d.ts.map +1 -0
- package/dist/client.d.ts +4 -0
- package/dist/client.js +5 -0
- package/dist/db-fragment-definition-builder.d.ts +85 -28
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +374 -46
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
- package/dist/dispatchers/cloudflare-do/index.d.ts +5 -20
- package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -1
- package/dist/dispatchers/cloudflare-do/index.js +23 -55
- package/dist/dispatchers/cloudflare-do/index.js.map +1 -1
- package/dist/dispatchers/node/dispatcher.d.ts +14 -0
- package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
- package/dist/dispatchers/node/dispatcher.js +80 -0
- package/dist/dispatchers/node/dispatcher.js.map +1 -0
- package/dist/dispatchers/node/index.d.ts +5 -10
- package/dist/dispatchers/node/index.d.ts.map +1 -1
- package/dist/dispatchers/node/index.js +21 -53
- package/dist/dispatchers/node/index.js.map +1 -1
- package/dist/durable-hooks.d.ts +31 -0
- package/dist/durable-hooks.d.ts.map +1 -0
- package/dist/durable-hooks.js +23 -0
- package/dist/durable-hooks.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +128 -27
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +125 -78
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/fragments/internal-fragment.routes.js +138 -3
- package/dist/fragments/internal-fragment.routes.js.map +1 -1
- package/dist/fragments/internal-fragment.schema.d.ts +7 -1
- package/dist/fragments/internal-fragment.schema.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.schema.js +18 -1
- package/dist/fragments/internal-fragment.schema.js.map +1 -1
- package/dist/hooks/durable-hooks-logger.d.ts +10 -0
- package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
- package/dist/hooks/durable-hooks-logger.js +75 -0
- package/dist/hooks/durable-hooks-logger.js.map +1 -0
- package/dist/hooks/durable-hooks-processor.d.ts +1 -14
- package/dist/hooks/durable-hooks-processor.js +58 -10
- package/dist/hooks/durable-hooks-processor.js.map +1 -1
- package/dist/hooks/durable-hooks-runtime.js +44 -0
- package/dist/hooks/durable-hooks-runtime.js.map +1 -0
- package/dist/hooks/hooks.d.ts +60 -2
- package/dist/hooks/hooks.d.ts.map +1 -1
- package/dist/hooks/hooks.js +214 -53
- package/dist/hooks/hooks.js.map +1 -1
- package/dist/id.d.ts +2 -2
- package/dist/id.js +2 -2
- package/dist/internal/adapter-registry.d.ts +11 -0
- package/dist/internal/adapter-registry.d.ts.map +1 -0
- package/dist/internal/adapter-registry.js +135 -0
- package/dist/internal/adapter-registry.js.map +1 -0
- package/dist/internal/outbox-state.d.ts +2 -0
- package/dist/internal/outbox-state.js +26 -0
- package/dist/internal/outbox-state.js.map +1 -0
- package/dist/migration-engine/auto-from-schema.d.ts +33 -0
- package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
- package/dist/migration-engine/auto-from-schema.js +210 -27
- package/dist/migration-engine/auto-from-schema.js.map +1 -1
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +17 -5
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/migration-engine/shared.d.ts +113 -0
- package/dist/migration-engine/shared.d.ts.map +1 -0
- package/dist/migration-engine/shared.js.map +1 -1
- package/dist/mod.d.ts +12 -11
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +10 -10
- package/dist/mod.js.map +1 -1
- package/dist/naming/sql-naming.d.ts.map +1 -1
- package/dist/naming/sql-naming.js.map +1 -1
- package/dist/outbox/outbox-builder.js.map +1 -1
- package/dist/outbox/outbox.d.ts +3 -1
- package/dist/outbox/outbox.d.ts.map +1 -1
- package/dist/outbox/outbox.js.map +1 -1
- package/dist/query/column-defaults.js.map +1 -1
- package/dist/query/condition-builder.d.ts +7 -1
- package/dist/query/condition-builder.d.ts.map +1 -1
- package/dist/query/condition-builder.js +5 -1
- package/dist/query/condition-builder.js.map +1 -1
- package/dist/query/cursor-client.d.ts +105 -0
- package/dist/query/cursor-client.d.ts.map +1 -0
- package/dist/query/cursor-client.js +165 -0
- package/dist/query/cursor-client.js.map +1 -0
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +7 -1
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/db-now.d.ts +15 -1
- package/dist/query/db-now.d.ts.map +1 -1
- package/dist/query/db-now.js +30 -2
- package/dist/query/db-now.js.map +1 -1
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +2 -2
- package/dist/query/serialize/create-sql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/sqlite-serializer.js +6 -2
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
- package/dist/query/simple-query-interface.d.ts +7 -3
- package/dist/query/simple-query-interface.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.js +39 -18
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.d.ts +42 -16
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.js +50 -6
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
- package/dist/query/value-decoding.js +8 -1
- package/dist/query/value-decoding.js.map +1 -1
- package/dist/query/value-encoding.js.map +1 -1
- package/dist/schema/create.d.ts +69 -25
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +91 -16
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
- package/dist/schema/validator.d.ts.map +1 -1
- package/dist/schema/validator.js.map +1 -1
- package/dist/schema-output/drizzle.d.ts.map +1 -1
- package/dist/schema-output/drizzle.js +8 -6
- package/dist/schema-output/drizzle.js.map +1 -1
- package/dist/schema-output/prisma.d.ts.map +1 -1
- package/dist/schema-output/prisma.js +21 -10
- package/dist/schema-output/prisma.js.map +1 -1
- package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
- package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
- package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
- package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
- package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
- package/dist/sql-driver/sql.js.map +1 -1
- package/dist/sync/commands.d.ts +15 -0
- package/dist/sync/commands.d.ts.map +1 -0
- package/dist/sync/commands.js +27 -0
- package/dist/sync/commands.js.map +1 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.js +4 -0
- package/dist/sync/read-tracking.d.ts +25 -0
- package/dist/sync/read-tracking.d.ts.map +1 -0
- package/dist/sync/read-tracking.js +148 -0
- package/dist/sync/read-tracking.js.map +1 -0
- package/dist/sync/submit.js +213 -0
- package/dist/sync/submit.js.map +1 -0
- package/dist/sync/types.d.ts +63 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/util/default-database-adapter.js +6 -1
- package/dist/util/default-database-adapter.js.map +1 -1
- package/dist/with-database.d.ts +3 -6
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +7 -15
- package/dist/with-database.js.map +1 -1
- package/package.json +33 -41
- package/src/adapters/adapters.ts +5 -4
- package/src/adapters/drizzle/migrate-drizzle.test.ts +46 -9
- package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +5 -3
- package/src/adapters/drizzle/test-utils.ts +2 -1
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -3
- package/src/adapters/generic-sql/generic-sql-adapter.ts +21 -24
- package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +1 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +81 -15
- package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +4 -2
- package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
- package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +3 -2
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +1 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +5 -4
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +2 -1
- package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +795 -3
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +385 -57
- package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
- package/src/adapters/generic-sql/migration/executor.ts +47 -4
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +117 -14
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +9 -8
- package/src/adapters/generic-sql/migration/sql-generator.ts +5 -3
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +3 -3
- package/src/adapters/generic-sql/query/cursor-utils.test.ts +3 -2
- package/src/adapters/generic-sql/query/cursor-utils.ts +1 -1
- package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +144 -8
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +16 -17
- package/src/adapters/generic-sql/query/select-builder.test.ts +1 -0
- package/src/adapters/generic-sql/query/select-builder.ts +2 -2
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +24 -5
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +83 -13
- package/src/adapters/generic-sql/query/where-builder.test.ts +7 -5
- package/src/adapters/generic-sql/query/where-builder.ts +48 -29
- package/src/adapters/generic-sql/sql-adapter-pglite-migrations.test.ts +6 -15
- package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +52 -7
- package/src/adapters/generic-sql/sql-adapter-pglite-queries.test.ts +9 -6
- package/src/adapters/generic-sql/sql-adapter-sqlite3-driver.test.ts +273 -5
- package/src/adapters/generic-sql/sql-adapter-sqlite3-uow.test.ts +123 -6
- package/src/adapters/generic-sql/sql-adapter-sqlocal.test.ts +4 -2
- package/src/adapters/generic-sql/uow-decoder.test.ts +4 -3
- package/src/adapters/generic-sql/uow-decoder.ts +3 -3
- package/src/adapters/generic-sql/uow-encoder.test.ts +4 -2
- package/src/adapters/generic-sql/uow-encoder.ts +14 -18
- package/src/adapters/in-memory/condition-evaluator.test.ts +2 -1
- package/src/adapters/in-memory/condition-evaluator.ts +9 -4
- package/src/adapters/in-memory/in-memory-adapter.ts +155 -44
- package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +50 -2
- package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +158 -3
- package/src/adapters/in-memory/in-memory-uow.ts +402 -26
- package/src/adapters/in-memory/options.test.ts +1 -0
- package/src/adapters/in-memory/options.ts +5 -1
- package/src/adapters/in-memory/outbox.test.ts +361 -0
- package/src/adapters/in-memory/reference-resolution.test.ts +3 -2
- package/src/adapters/in-memory/reference-resolution.ts +2 -2
- package/src/adapters/in-memory/sorted-array-index.test.ts +1 -0
- package/src/adapters/in-memory/store.test.ts +1 -0
- package/src/adapters/in-memory/store.ts +3 -3
- package/src/adapters/in-memory/value-normalization.test.ts +1 -0
- package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +51 -7
- package/src/adapters/shared/from-unit-of-work-compiler.ts +156 -46
- package/src/adapters/shared/uow-operation-compiler.ts +3 -3
- package/src/browser/mod.ts +64 -0
- package/src/client.ts +19 -0
- package/src/db-fragment-definition-builder.test.ts +821 -47
- package/src/db-fragment-definition-builder.ts +857 -110
- package/src/db-fragment-instantiator.test.ts +114 -90
- package/src/db-fragment-integration.test.ts +9 -6
- package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
- package/src/dispatchers/cloudflare-do/index.test.ts +145 -12
- package/src/dispatchers/cloudflare-do/index.ts +49 -90
- package/src/dispatchers/node/dispatcher.ts +112 -0
- package/src/dispatchers/node/index.test.ts +43 -14
- package/src/dispatchers/node/index.ts +38 -75
- package/src/durable-hooks.test.ts +80 -0
- package/src/durable-hooks.ts +67 -0
- package/src/fragments/internal-fragment.routes.test.ts +570 -0
- package/src/fragments/internal-fragment.routes.ts +297 -5
- package/src/fragments/internal-fragment.schema.ts +45 -1
- package/src/fragments/internal-fragment.test.ts +223 -251
- package/src/fragments/internal-fragment.ts +278 -154
- package/src/hooks/durable-hooks-logger.ts +126 -0
- package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
- package/src/hooks/durable-hooks-processor.test.ts +179 -14
- package/src/hooks/durable-hooks-processor.ts +120 -14
- package/src/hooks/durable-hooks-runtime.test.ts +65 -0
- package/src/hooks/durable-hooks-runtime.ts +81 -0
- package/src/hooks/hooks.test.ts +314 -53
- package/src/hooks/hooks.ts +360 -81
- package/src/id.test.ts +34 -0
- package/src/id.ts +1 -3
- package/src/internal/adapter-registry.test.ts +93 -0
- package/src/internal/adapter-registry.ts +239 -0
- package/src/internal/outbox-state.ts +43 -0
- package/src/migration-engine/auto-from-schema.test.ts +93 -0
- package/src/migration-engine/auto-from-schema.ts +360 -42
- package/src/migration-engine/create.test.ts +2 -1
- package/src/migration-engine/create.ts +1 -1
- package/src/migration-engine/generation-engine.test.ts +66 -9
- package/src/migration-engine/generation-engine.ts +31 -10
- package/src/migration-engine/shared.ts +13 -0
- package/src/mod.ts +45 -27
- package/src/naming/sql-naming.ts +1 -0
- package/src/outbox/outbox-builder.ts +2 -2
- package/src/outbox/outbox.test.ts +216 -45
- package/src/outbox/outbox.ts +3 -1
- package/src/query/column-defaults.ts +1 -1
- package/src/query/condition-builder.test.ts +15 -0
- package/src/query/condition-builder.ts +7 -0
- package/src/query/cursor-client.test.ts +70 -0
- package/src/query/cursor-client.ts +263 -0
- package/src/query/cursor.test.ts +3 -2
- package/src/query/cursor.ts +15 -3
- package/src/query/db-now.ts +69 -2
- package/src/query/orm/orm.ts +2 -2
- package/src/query/query-type.test.ts +2 -1
- package/src/query/serialize/create-sql-serializer.ts +3 -3
- package/src/query/serialize/dialect/mysql-serializer.ts +1 -1
- package/src/query/serialize/dialect/postgres-serializer.ts +1 -1
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +39 -2
- package/src/query/serialize/dialect/sqlite-serializer.ts +18 -5
- package/src/query/simple-query-interface.ts +10 -4
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +347 -9
- package/src/query/unit-of-work/execute-unit-of-work.ts +63 -20
- package/src/query/unit-of-work/retry-policy.test.ts +1 -0
- package/src/query/unit-of-work/tx-builder.test.ts +73 -1
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +5 -4
- package/src/query/unit-of-work/unit-of-work-types.test.ts +41 -11
- package/src/query/unit-of-work/unit-of-work.test.ts +28 -2
- package/src/query/unit-of-work/unit-of-work.ts +105 -19
- package/src/query/value-decoding.test.ts +50 -2
- package/src/query/value-decoding.ts +17 -4
- package/src/query/value-encoding.test.ts +1 -0
- package/src/query/value-encoding.ts +1 -1
- package/src/schema/create.test.ts +164 -5
- package/src/schema/create.ts +222 -24
- package/src/schema/generate-id.test.ts +1 -0
- package/src/schema/serialize.test.ts +4 -3
- package/src/schema/type-conversion/create-sql-type-mapper.ts +1 -1
- package/src/schema/type-conversion/dialect/sqlite.ts +2 -2
- package/src/schema/type-conversion/type-mapping.test.ts +2 -1
- package/src/schema/validator.test.ts +4 -2
- package/src/schema/validator.ts +1 -0
- package/src/schema-output/drizzle.test.ts +72 -19
- package/src/schema-output/drizzle.ts +24 -18
- package/src/schema-output/prisma.test.ts +172 -14
- package/src/schema-output/prisma.ts +34 -14
- package/src/sql-driver/better-sqlite3.test.ts +5 -3
- package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
- package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
- package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
- package/src/sql-driver/query-executor/query-executor.ts +1 -1
- package/src/sql-driver/sql-driver-adapter.ts +2 -2
- package/src/sql-driver/sql.ts +2 -1
- package/src/sql-driver/sqlocal.test.ts +4 -2
- package/src/sync/commands.test.ts +39 -0
- package/src/sync/commands.ts +51 -0
- package/src/sync/conflict-checker.test.ts +450 -0
- package/src/sync/conflict-checker.ts +248 -0
- package/src/sync/index.ts +14 -0
- package/src/sync/plan.ts +9 -0
- package/src/sync/read-tracking.test.ts +177 -0
- package/src/sync/read-tracking.ts +287 -0
- package/src/sync/submit.test.ts +205 -0
- package/src/sync/submit.ts +328 -0
- package/src/sync/types.ts +80 -0
- package/src/util/default-database-adapter.ts +15 -2
- package/src/with-database.ts +20 -50
- package/tsconfig.json +1 -1
- package/tsdown.config.ts +38 -26
- package/vitest.config.ts +1 -0
- package/dist/hooks/durable-hooks-processor.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js +0 -168
- package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js.map +0 -1
- package/dist/packages/fragno/dist/api/bind-services.js +0 -20
- package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
- package/dist/packages/fragno/dist/api/error.js +0 -48
- package/dist/packages/fragno/dist/api/error.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -321
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -669
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
- package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
- package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
- package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
- package/dist/packages/fragno/dist/api/internal/route.js +0 -10
- package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
- package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
- package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
- package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-input-context.js +0 -185
- package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
- package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
- package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
- package/dist/packages/fragno/dist/api/route.js +0 -30
- package/dist/packages/fragno/dist/api/route.js.map +0 -1
- package/dist/packages/fragno/dist/internal/symbols.js +0 -10
- package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
- package/dist/packages/fragno/dist/internal/trace-context.js +0 -12
- package/dist/packages/fragno/dist/internal/trace-context.js.map +0 -1
|
@@ -1,669 +0,0 @@
|
|
|
1
|
-
import { resolveRouteFactories } from "./route.js";
|
|
2
|
-
import { instantiatedFragmentFakeSymbol } from "../internal/symbols.js";
|
|
3
|
-
import { FragnoApiError } from "./error.js";
|
|
4
|
-
import { getMountRoute } from "./internal/route.js";
|
|
5
|
-
import { RequestInputContext } from "./request-input-context.js";
|
|
6
|
-
import { RequestOutputContext } from "./request-output-context.js";
|
|
7
|
-
import { MutableRequestState } from "./mutable-request-state.js";
|
|
8
|
-
import { RequestMiddlewareInputContext, RequestMiddlewareOutputContext } from "./request-middleware.js";
|
|
9
|
-
import { parseFragnoResponse } from "./fragno-response.js";
|
|
10
|
-
import { RequestContextStorage } from "./request-context-storage.js";
|
|
11
|
-
import { bindServicesToContext } from "./bind-services.js";
|
|
12
|
-
import { recordTraceEvent } from "../internal/trace-context.js";
|
|
13
|
-
import { addRoute, createRouter, findRoute } from "../../../../node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js";
|
|
14
|
-
|
|
15
|
-
//#region ../fragno/dist/api/fragment-instantiator.js
|
|
16
|
-
const serializeHeadersForTrace = (headers) => Array.from(headers.entries()).sort(([a], [b]) => a.localeCompare(b));
|
|
17
|
-
const serializeQueryForTrace = (query) => Array.from(query.entries()).sort(([a], [b]) => a.localeCompare(b));
|
|
18
|
-
const serializeBodyForTrace = (body) => {
|
|
19
|
-
if (body instanceof FormData) return {
|
|
20
|
-
type: "form-data",
|
|
21
|
-
entries: Array.from(body.entries()).map(([key, value]) => {
|
|
22
|
-
if (value instanceof Blob) return [key, {
|
|
23
|
-
type: "blob",
|
|
24
|
-
size: value.size,
|
|
25
|
-
mime: value.type
|
|
26
|
-
}];
|
|
27
|
-
return [key, value];
|
|
28
|
-
})
|
|
29
|
-
};
|
|
30
|
-
if (body instanceof Blob) return {
|
|
31
|
-
type: "blob",
|
|
32
|
-
size: body.size,
|
|
33
|
-
mime: body.type
|
|
34
|
-
};
|
|
35
|
-
if (body instanceof ReadableStream) return { type: "stream" };
|
|
36
|
-
return body;
|
|
37
|
-
};
|
|
38
|
-
const INTERNAL_LINKED_FRAGMENT_NAME = "_fragno_internal";
|
|
39
|
-
const INTERNAL_ROUTE_PREFIX = "/_internal";
|
|
40
|
-
function normalizeRoutePrefix(prefix) {
|
|
41
|
-
if (!prefix.startsWith("/")) prefix = `/${prefix}`;
|
|
42
|
-
return prefix.endsWith("/") && prefix.length > 1 ? prefix.slice(0, -1) : prefix;
|
|
43
|
-
}
|
|
44
|
-
function joinRoutePath(prefix, path) {
|
|
45
|
-
const normalizedPrefix = normalizeRoutePrefix(prefix);
|
|
46
|
-
if (!path || path === "/") return normalizedPrefix;
|
|
47
|
-
return `${normalizedPrefix}${path.startsWith("/") ? path : `/${path}`}`;
|
|
48
|
-
}
|
|
49
|
-
function collectLinkedFragmentRoutes(linkedFragments) {
|
|
50
|
-
const linkedRoutes = [];
|
|
51
|
-
for (const [name, fragment] of Object.entries(linkedFragments)) {
|
|
52
|
-
if (name !== INTERNAL_LINKED_FRAGMENT_NAME) continue;
|
|
53
|
-
const internalRoutes = fragment.routes ?? [];
|
|
54
|
-
if (internalRoutes.length === 0) continue;
|
|
55
|
-
for (const route of internalRoutes) linkedRoutes.push({
|
|
56
|
-
...route,
|
|
57
|
-
path: joinRoutePath(INTERNAL_ROUTE_PREFIX, route.path),
|
|
58
|
-
__internal: {
|
|
59
|
-
fragment,
|
|
60
|
-
originalPath: route.path,
|
|
61
|
-
routes: internalRoutes
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
return linkedRoutes;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Instantiated fragment class with encapsulated state.
|
|
69
|
-
* Provides the same public API as the old FragnoInstantiatedFragment but with better encapsulation.
|
|
70
|
-
*/
|
|
71
|
-
var FragnoInstantiatedFragment = class FragnoInstantiatedFragment$1 {
|
|
72
|
-
[instantiatedFragmentFakeSymbol] = instantiatedFragmentFakeSymbol;
|
|
73
|
-
#name;
|
|
74
|
-
#routes;
|
|
75
|
-
#deps;
|
|
76
|
-
#services;
|
|
77
|
-
#mountRoute;
|
|
78
|
-
#router;
|
|
79
|
-
#middlewareHandler;
|
|
80
|
-
#serviceThisContext;
|
|
81
|
-
#handlerThisContext;
|
|
82
|
-
#contextStorage;
|
|
83
|
-
#createRequestStorage;
|
|
84
|
-
#options;
|
|
85
|
-
#linkedFragments;
|
|
86
|
-
#internalData;
|
|
87
|
-
constructor(params) {
|
|
88
|
-
this.#name = params.name;
|
|
89
|
-
this.#routes = params.routes;
|
|
90
|
-
this.#deps = params.deps;
|
|
91
|
-
this.#services = params.services;
|
|
92
|
-
this.#mountRoute = params.mountRoute;
|
|
93
|
-
this.#serviceThisContext = params.serviceThisContext;
|
|
94
|
-
this.#handlerThisContext = params.handlerThisContext;
|
|
95
|
-
this.#contextStorage = params.storage;
|
|
96
|
-
this.#createRequestStorage = params.createRequestStorage;
|
|
97
|
-
this.#options = params.options;
|
|
98
|
-
this.#linkedFragments = params.linkedFragments ?? {};
|
|
99
|
-
this.#internalData = params.internalData ?? {};
|
|
100
|
-
this.#router = createRouter();
|
|
101
|
-
for (const routeConfig of this.#routes) addRoute(this.#router, routeConfig.method.toUpperCase(), routeConfig.path, routeConfig);
|
|
102
|
-
this.handler = this.handler.bind(this);
|
|
103
|
-
}
|
|
104
|
-
get name() {
|
|
105
|
-
return this.#name;
|
|
106
|
-
}
|
|
107
|
-
get routes() {
|
|
108
|
-
return this.#routes;
|
|
109
|
-
}
|
|
110
|
-
get services() {
|
|
111
|
-
return this.#services;
|
|
112
|
-
}
|
|
113
|
-
get mountRoute() {
|
|
114
|
-
return this.#mountRoute;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* @internal
|
|
118
|
-
*/
|
|
119
|
-
get $internal() {
|
|
120
|
-
return {
|
|
121
|
-
deps: this.#deps,
|
|
122
|
-
options: this.#options,
|
|
123
|
-
linkedFragments: this.#linkedFragments,
|
|
124
|
-
...this.#internalData
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Add middleware to this fragment.
|
|
129
|
-
* Middleware can inspect and modify requests before they reach handlers.
|
|
130
|
-
*/
|
|
131
|
-
withMiddleware(handler) {
|
|
132
|
-
if (this.#middlewareHandler) throw new Error("Middleware already set");
|
|
133
|
-
this.#middlewareHandler = handler;
|
|
134
|
-
return this;
|
|
135
|
-
}
|
|
136
|
-
#withRequestStorage(callback) {
|
|
137
|
-
if (!this.#serviceThisContext && !this.#handlerThisContext) return callback();
|
|
138
|
-
const storageData = this.#createRequestStorage ? this.#createRequestStorage() : {};
|
|
139
|
-
return this.#contextStorage.run(storageData, callback);
|
|
140
|
-
}
|
|
141
|
-
inContext(callback) {
|
|
142
|
-
if (this.#handlerThisContext) {
|
|
143
|
-
const boundCallback = callback.bind(this.#handlerThisContext);
|
|
144
|
-
return this.#withRequestStorage(boundCallback);
|
|
145
|
-
}
|
|
146
|
-
return this.#withRequestStorage(callback);
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Get framework-specific handlers for this fragment.
|
|
150
|
-
* Use this to integrate the fragment with different fullstack frameworks.
|
|
151
|
-
*/
|
|
152
|
-
handlersFor(framework) {
|
|
153
|
-
const handler = this.handler.bind(this);
|
|
154
|
-
if (framework === "h3" || framework === "nuxt") throw new Error(`To get handlers for h3, use the 'fromWebHandler' utility function:
|
|
155
|
-
import { fromWebHandler } from "h3";
|
|
156
|
-
export default fromWebHandler(myFragment().handler);`);
|
|
157
|
-
return {
|
|
158
|
-
astro: { ALL: handler },
|
|
159
|
-
"react-router": {
|
|
160
|
-
loader: ({ request }) => handler(request),
|
|
161
|
-
action: ({ request }) => handler(request)
|
|
162
|
-
},
|
|
163
|
-
"next-js": {
|
|
164
|
-
GET: handler,
|
|
165
|
-
POST: handler,
|
|
166
|
-
PUT: handler,
|
|
167
|
-
DELETE: handler,
|
|
168
|
-
PATCH: handler,
|
|
169
|
-
HEAD: handler,
|
|
170
|
-
OPTIONS: handler
|
|
171
|
-
},
|
|
172
|
-
"svelte-kit": {
|
|
173
|
-
GET: handler,
|
|
174
|
-
POST: handler,
|
|
175
|
-
PUT: handler,
|
|
176
|
-
DELETE: handler,
|
|
177
|
-
PATCH: handler,
|
|
178
|
-
HEAD: handler,
|
|
179
|
-
OPTIONS: handler
|
|
180
|
-
},
|
|
181
|
-
"solid-start": {
|
|
182
|
-
GET: ({ request }) => handler(request),
|
|
183
|
-
POST: ({ request }) => handler(request),
|
|
184
|
-
PUT: ({ request }) => handler(request),
|
|
185
|
-
DELETE: ({ request }) => handler(request),
|
|
186
|
-
PATCH: ({ request }) => handler(request),
|
|
187
|
-
HEAD: ({ request }) => handler(request),
|
|
188
|
-
OPTIONS: ({ request }) => handler(request)
|
|
189
|
-
},
|
|
190
|
-
"tanstack-start": {
|
|
191
|
-
GET: ({ request }) => handler(request),
|
|
192
|
-
POST: ({ request }) => handler(request),
|
|
193
|
-
PUT: ({ request }) => handler(request),
|
|
194
|
-
DELETE: ({ request }) => handler(request),
|
|
195
|
-
PATCH: ({ request }) => handler(request),
|
|
196
|
-
HEAD: ({ request }) => handler(request),
|
|
197
|
-
OPTIONS: ({ request }) => handler(request)
|
|
198
|
-
}
|
|
199
|
-
}[framework];
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Main request handler for this fragment.
|
|
203
|
-
* Handles routing, middleware, and error handling.
|
|
204
|
-
*/
|
|
205
|
-
async handler(req) {
|
|
206
|
-
const url = new URL(req.url);
|
|
207
|
-
const pathname = url.pathname;
|
|
208
|
-
const matchRoute = pathname.startsWith(this.#mountRoute) ? pathname.slice(this.#mountRoute.length) : null;
|
|
209
|
-
if (matchRoute === null) return Response.json({
|
|
210
|
-
error: `Fragno: Route for '${this.#name}' not found. Is the fragment mounted on the right route? Expecting: '${this.#mountRoute}'.`,
|
|
211
|
-
code: "ROUTE_NOT_FOUND"
|
|
212
|
-
}, { status: 404 });
|
|
213
|
-
const route = findRoute(this.#router, req.method, matchRoute);
|
|
214
|
-
if (!route) return Response.json({
|
|
215
|
-
error: `Fragno: Route for '${this.#name}' not found`,
|
|
216
|
-
code: "ROUTE_NOT_FOUND"
|
|
217
|
-
}, { status: 404 });
|
|
218
|
-
const routeConfig = route.data;
|
|
219
|
-
const expectedContentType = routeConfig.contentType ?? "application/json";
|
|
220
|
-
let requestBody = void 0;
|
|
221
|
-
let rawBody = void 0;
|
|
222
|
-
if (req.body instanceof ReadableStream) {
|
|
223
|
-
const requestContentType = (req.headers.get("content-type") ?? "").toLowerCase();
|
|
224
|
-
if (expectedContentType === "multipart/form-data") {
|
|
225
|
-
if (!requestContentType.includes("multipart/form-data")) return Response.json({
|
|
226
|
-
error: `This endpoint expects multipart/form-data, but received: ${requestContentType || "no content-type"}`,
|
|
227
|
-
code: "UNSUPPORTED_MEDIA_TYPE"
|
|
228
|
-
}, { status: 415 });
|
|
229
|
-
try {
|
|
230
|
-
requestBody = await req.formData();
|
|
231
|
-
} catch {
|
|
232
|
-
return Response.json({
|
|
233
|
-
error: "Failed to parse multipart form data",
|
|
234
|
-
code: "INVALID_REQUEST_BODY"
|
|
235
|
-
}, { status: 400 });
|
|
236
|
-
}
|
|
237
|
-
} else if (expectedContentType === "application/octet-stream") {
|
|
238
|
-
if (!requestContentType.includes("application/octet-stream")) return Response.json({
|
|
239
|
-
error: `This endpoint expects application/octet-stream, but received: ${requestContentType || "no content-type"}`,
|
|
240
|
-
code: "UNSUPPORTED_MEDIA_TYPE"
|
|
241
|
-
}, { status: 415 });
|
|
242
|
-
requestBody = req.body ?? new ReadableStream();
|
|
243
|
-
} else {
|
|
244
|
-
if (requestContentType.includes("multipart/form-data")) return Response.json({
|
|
245
|
-
error: `This endpoint expects JSON, but received multipart/form-data. Use a route with contentType: "multipart/form-data" for file uploads.`,
|
|
246
|
-
code: "UNSUPPORTED_MEDIA_TYPE"
|
|
247
|
-
}, { status: 415 });
|
|
248
|
-
rawBody = await req.clone().text();
|
|
249
|
-
if (rawBody) try {
|
|
250
|
-
requestBody = JSON.parse(rawBody);
|
|
251
|
-
} catch {
|
|
252
|
-
requestBody = void 0;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
const decodedRouteParams = {};
|
|
257
|
-
for (const [key, value] of Object.entries(route.params ?? {})) decodedRouteParams[key] = decodeURIComponent(value);
|
|
258
|
-
const requestState = new MutableRequestState({
|
|
259
|
-
pathParams: decodedRouteParams,
|
|
260
|
-
searchParams: url.searchParams,
|
|
261
|
-
body: requestBody,
|
|
262
|
-
headers: new Headers(req.headers)
|
|
263
|
-
});
|
|
264
|
-
const executeRequest = async () => {
|
|
265
|
-
const middlewareResult = await this.#executeMiddleware(req, route, requestState);
|
|
266
|
-
if (middlewareResult !== void 0) return middlewareResult;
|
|
267
|
-
const internalMeta = routeConfig.__internal;
|
|
268
|
-
if (internalMeta) {
|
|
269
|
-
const internalResult = await FragnoInstantiatedFragment$1.#runMiddlewareForFragment(internalMeta.fragment, {
|
|
270
|
-
req,
|
|
271
|
-
method: routeConfig.method,
|
|
272
|
-
path: internalMeta.originalPath,
|
|
273
|
-
requestState,
|
|
274
|
-
routes: internalMeta.routes
|
|
275
|
-
});
|
|
276
|
-
if (internalResult !== void 0) return internalResult;
|
|
277
|
-
}
|
|
278
|
-
return this.#executeHandler(req, route, requestState, rawBody);
|
|
279
|
-
};
|
|
280
|
-
return this.#withRequestStorage(executeRequest);
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Call a route directly with typed inputs and outputs.
|
|
284
|
-
* Useful for testing and server-side route calls.
|
|
285
|
-
*/
|
|
286
|
-
async callRoute(method, path, inputOptions) {
|
|
287
|
-
return parseFragnoResponse(await this.callRouteRaw(method, path, inputOptions));
|
|
288
|
-
}
|
|
289
|
-
/**
|
|
290
|
-
* Call a route directly and get the raw Response object.
|
|
291
|
-
* Useful for testing and server-side route calls.
|
|
292
|
-
*/
|
|
293
|
-
async callRouteRaw(method, path, inputOptions) {
|
|
294
|
-
const route = this.#routes.find((r) => r.method === method && r.path === path);
|
|
295
|
-
if (!route) return Response.json({
|
|
296
|
-
error: `Route ${method} ${path} not found`,
|
|
297
|
-
code: "ROUTE_NOT_FOUND"
|
|
298
|
-
}, { status: 404 });
|
|
299
|
-
const { pathParams = {}, body, query, headers } = inputOptions || {};
|
|
300
|
-
const searchParams = query instanceof URLSearchParams ? query : query ? new URLSearchParams(query) : new URLSearchParams();
|
|
301
|
-
const requestHeaders = headers instanceof Headers ? headers : headers ? new Headers(headers) : new Headers();
|
|
302
|
-
const inputContext = new RequestInputContext({
|
|
303
|
-
path: route.path,
|
|
304
|
-
method: route.method,
|
|
305
|
-
pathParams,
|
|
306
|
-
searchParams,
|
|
307
|
-
headers: requestHeaders,
|
|
308
|
-
parsedBody: body,
|
|
309
|
-
inputSchema: route.inputSchema,
|
|
310
|
-
shouldValidateInput: true
|
|
311
|
-
});
|
|
312
|
-
recordTraceEvent({
|
|
313
|
-
type: "route-input",
|
|
314
|
-
method: route.method,
|
|
315
|
-
path: route.path,
|
|
316
|
-
pathParams: pathParams ?? {},
|
|
317
|
-
queryParams: serializeQueryForTrace(searchParams),
|
|
318
|
-
headers: serializeHeadersForTrace(requestHeaders),
|
|
319
|
-
body: serializeBodyForTrace(body)
|
|
320
|
-
});
|
|
321
|
-
const outputContext = new RequestOutputContext(route.outputSchema);
|
|
322
|
-
const executeHandler = async () => {
|
|
323
|
-
try {
|
|
324
|
-
const thisContext = this.#handlerThisContext ?? {};
|
|
325
|
-
return await route.handler.call(thisContext, inputContext, outputContext);
|
|
326
|
-
} catch (error) {
|
|
327
|
-
console.error("Error in callRoute handler", error);
|
|
328
|
-
if (error instanceof FragnoApiError) return error.toResponse();
|
|
329
|
-
return Response.json({
|
|
330
|
-
error: "Internal server error",
|
|
331
|
-
code: "INTERNAL_SERVER_ERROR"
|
|
332
|
-
}, { status: 500 });
|
|
333
|
-
}
|
|
334
|
-
};
|
|
335
|
-
return this.#withRequestStorage(executeHandler);
|
|
336
|
-
}
|
|
337
|
-
/**
|
|
338
|
-
* Execute middleware for a request.
|
|
339
|
-
* Returns undefined if middleware allows the request to continue to the handler.
|
|
340
|
-
*/
|
|
341
|
-
async #executeMiddleware(req, route, requestState) {
|
|
342
|
-
if (!route) return;
|
|
343
|
-
const { path } = route.data;
|
|
344
|
-
return FragnoInstantiatedFragment$1.#runMiddlewareForFragment(this, {
|
|
345
|
-
req,
|
|
346
|
-
method: req.method,
|
|
347
|
-
path,
|
|
348
|
-
requestState
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
static async #runMiddlewareForFragment(fragment, options) {
|
|
352
|
-
if (!fragment.#middlewareHandler) return;
|
|
353
|
-
const middlewareInputContext = new RequestMiddlewareInputContext(options.routes ?? fragment.#routes, {
|
|
354
|
-
method: options.method,
|
|
355
|
-
path: options.path,
|
|
356
|
-
request: options.req,
|
|
357
|
-
state: options.requestState
|
|
358
|
-
});
|
|
359
|
-
const middlewareOutputContext = new RequestMiddlewareOutputContext(fragment.#deps, fragment.#services);
|
|
360
|
-
try {
|
|
361
|
-
const middlewareResult = await fragment.#middlewareHandler(middlewareInputContext, middlewareOutputContext);
|
|
362
|
-
recordTraceEvent({
|
|
363
|
-
type: "middleware-decision",
|
|
364
|
-
method: options.method,
|
|
365
|
-
path: options.path,
|
|
366
|
-
outcome: middlewareResult ? "deny" : "allow",
|
|
367
|
-
status: middlewareResult?.status
|
|
368
|
-
});
|
|
369
|
-
if (middlewareResult !== void 0) return middlewareResult;
|
|
370
|
-
} catch (error) {
|
|
371
|
-
console.error("Error in middleware", error);
|
|
372
|
-
recordTraceEvent({
|
|
373
|
-
type: "middleware-decision",
|
|
374
|
-
method: options.method,
|
|
375
|
-
path: options.path,
|
|
376
|
-
outcome: "deny",
|
|
377
|
-
status: error instanceof FragnoApiError ? error.status : 500
|
|
378
|
-
});
|
|
379
|
-
if (error instanceof FragnoApiError) return error.toResponse();
|
|
380
|
-
return Response.json({
|
|
381
|
-
error: "Internal server error",
|
|
382
|
-
code: "INTERNAL_SERVER_ERROR"
|
|
383
|
-
}, { status: 500 });
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
/**
|
|
387
|
-
* Execute a route handler with proper error handling.
|
|
388
|
-
*/
|
|
389
|
-
async #executeHandler(req, route, requestState, rawBody) {
|
|
390
|
-
if (!route) return Response.json({
|
|
391
|
-
error: "Route not found",
|
|
392
|
-
code: "ROUTE_NOT_FOUND"
|
|
393
|
-
}, { status: 404 });
|
|
394
|
-
const { handler, inputSchema, outputSchema, path } = route.data;
|
|
395
|
-
const inputContext = await RequestInputContext.fromRequest({
|
|
396
|
-
request: req,
|
|
397
|
-
method: req.method,
|
|
398
|
-
path,
|
|
399
|
-
pathParams: route.params ?? {},
|
|
400
|
-
inputSchema,
|
|
401
|
-
state: requestState,
|
|
402
|
-
rawBody
|
|
403
|
-
});
|
|
404
|
-
recordTraceEvent({
|
|
405
|
-
type: "route-input",
|
|
406
|
-
method: req.method,
|
|
407
|
-
path,
|
|
408
|
-
pathParams: inputContext.pathParams,
|
|
409
|
-
queryParams: serializeQueryForTrace(requestState.searchParams),
|
|
410
|
-
headers: serializeHeadersForTrace(requestState.headers),
|
|
411
|
-
body: serializeBodyForTrace(requestState.body)
|
|
412
|
-
});
|
|
413
|
-
const outputContext = new RequestOutputContext(outputSchema);
|
|
414
|
-
try {
|
|
415
|
-
const contextForHandler = this.#handlerThisContext ?? {};
|
|
416
|
-
return await handler.call(contextForHandler, inputContext, outputContext);
|
|
417
|
-
} catch (error) {
|
|
418
|
-
console.error("Error in handler", error);
|
|
419
|
-
if (error instanceof FragnoApiError) return error.toResponse();
|
|
420
|
-
return Response.json({
|
|
421
|
-
error: "Internal server error",
|
|
422
|
-
code: "INTERNAL_SERVER_ERROR"
|
|
423
|
-
}, { status: 500 });
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
};
|
|
427
|
-
/**
|
|
428
|
-
* Core instantiation function that creates a fragment instance from a definition.
|
|
429
|
-
* This function validates dependencies, calls all callbacks, and wires everything together.
|
|
430
|
-
*/
|
|
431
|
-
function instantiateFragment(definition, config, routesOrFactories, options, serviceImplementations, instantiationOptions) {
|
|
432
|
-
const { dryRun = false } = instantiationOptions ?? {};
|
|
433
|
-
const serviceDependencies = definition.serviceDependencies;
|
|
434
|
-
if (serviceDependencies) for (const [serviceName, meta] of Object.entries(serviceDependencies)) {
|
|
435
|
-
const metadata = meta;
|
|
436
|
-
const implementation = serviceImplementations?.[serviceName];
|
|
437
|
-
if (metadata.required && !implementation) throw new Error(`Fragment '${definition.name}' requires service '${metadata.name}' but it was not provided`);
|
|
438
|
-
}
|
|
439
|
-
let deps;
|
|
440
|
-
try {
|
|
441
|
-
deps = definition.dependencies?.({
|
|
442
|
-
config,
|
|
443
|
-
options
|
|
444
|
-
}) ?? {};
|
|
445
|
-
} catch (error) {
|
|
446
|
-
if (dryRun) {
|
|
447
|
-
console.warn("Warning: Failed to initialize dependencies in dry run mode:", error instanceof Error ? error.message : String(error));
|
|
448
|
-
deps = {};
|
|
449
|
-
} else throw error;
|
|
450
|
-
}
|
|
451
|
-
const linkedFragmentInstances = {};
|
|
452
|
-
const linkedFragmentServices = {};
|
|
453
|
-
if (definition.linkedFragments) for (const [name, callback] of Object.entries(definition.linkedFragments)) {
|
|
454
|
-
const linkedFragment = callback({
|
|
455
|
-
config,
|
|
456
|
-
options,
|
|
457
|
-
serviceDependencies: serviceImplementations
|
|
458
|
-
});
|
|
459
|
-
linkedFragmentInstances[name] = linkedFragment;
|
|
460
|
-
const services$1 = linkedFragment.services;
|
|
461
|
-
for (const [serviceName, service] of Object.entries(services$1)) linkedFragmentServices[serviceName] = service;
|
|
462
|
-
}
|
|
463
|
-
const defineService = (services$1) => services$1;
|
|
464
|
-
const privateServices = { ...linkedFragmentServices };
|
|
465
|
-
if (definition.privateServices) for (const [serviceName, factory] of Object.entries(definition.privateServices)) {
|
|
466
|
-
const serviceFactory = factory;
|
|
467
|
-
try {
|
|
468
|
-
privateServices[serviceName] = serviceFactory({
|
|
469
|
-
config,
|
|
470
|
-
options,
|
|
471
|
-
deps,
|
|
472
|
-
serviceDeps: serviceImplementations ?? {},
|
|
473
|
-
privateServices,
|
|
474
|
-
defineService
|
|
475
|
-
});
|
|
476
|
-
} catch (error) {
|
|
477
|
-
if (dryRun) {
|
|
478
|
-
console.warn(`Warning: Failed to initialize private service '${serviceName}' in dry run mode:`, error instanceof Error ? error.message : String(error));
|
|
479
|
-
privateServices[serviceName] = {};
|
|
480
|
-
} else throw error;
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
let baseServices;
|
|
484
|
-
try {
|
|
485
|
-
baseServices = definition.baseServices?.({
|
|
486
|
-
config,
|
|
487
|
-
options,
|
|
488
|
-
deps,
|
|
489
|
-
serviceDeps: serviceImplementations ?? {},
|
|
490
|
-
privateServices,
|
|
491
|
-
defineService
|
|
492
|
-
}) ?? {};
|
|
493
|
-
} catch (error) {
|
|
494
|
-
if (dryRun) {
|
|
495
|
-
console.warn("Warning: Failed to initialize base services in dry run mode:", error instanceof Error ? error.message : String(error));
|
|
496
|
-
baseServices = {};
|
|
497
|
-
} else throw error;
|
|
498
|
-
}
|
|
499
|
-
const namedServices = {};
|
|
500
|
-
if (definition.namedServices) for (const [serviceName, factory] of Object.entries(definition.namedServices)) {
|
|
501
|
-
const serviceFactory = factory;
|
|
502
|
-
try {
|
|
503
|
-
namedServices[serviceName] = serviceFactory({
|
|
504
|
-
config,
|
|
505
|
-
options,
|
|
506
|
-
deps,
|
|
507
|
-
serviceDeps: serviceImplementations ?? {},
|
|
508
|
-
privateServices,
|
|
509
|
-
defineService
|
|
510
|
-
});
|
|
511
|
-
} catch (error) {
|
|
512
|
-
if (dryRun) {
|
|
513
|
-
console.warn(`Warning: Failed to initialize service '${serviceName}' in dry run mode:`, error instanceof Error ? error.message : String(error));
|
|
514
|
-
namedServices[serviceName] = {};
|
|
515
|
-
} else throw error;
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
const services = {
|
|
519
|
-
...baseServices,
|
|
520
|
-
...namedServices
|
|
521
|
-
};
|
|
522
|
-
const storage = definition.getExternalStorage ? definition.getExternalStorage({
|
|
523
|
-
config,
|
|
524
|
-
options,
|
|
525
|
-
deps
|
|
526
|
-
}) : new RequestContextStorage();
|
|
527
|
-
const contexts = definition.createThisContext?.({
|
|
528
|
-
config,
|
|
529
|
-
options,
|
|
530
|
-
deps,
|
|
531
|
-
storage
|
|
532
|
-
});
|
|
533
|
-
const serviceContext = contexts?.serviceContext;
|
|
534
|
-
const handlerContext = contexts?.handlerContext;
|
|
535
|
-
const internalData = definition.internalDataFactory?.({
|
|
536
|
-
config,
|
|
537
|
-
options,
|
|
538
|
-
deps,
|
|
539
|
-
linkedFragments: linkedFragmentInstances
|
|
540
|
-
}) ?? {};
|
|
541
|
-
const boundServices = serviceContext ? bindServicesToContext(services, serviceContext) : services;
|
|
542
|
-
const routes = resolveRouteFactories({
|
|
543
|
-
config,
|
|
544
|
-
deps,
|
|
545
|
-
services: boundServices,
|
|
546
|
-
serviceDeps: serviceImplementations ?? {}
|
|
547
|
-
}, routesOrFactories);
|
|
548
|
-
const linkedRoutes = collectLinkedFragmentRoutes(linkedFragmentInstances);
|
|
549
|
-
const finalRoutes = linkedRoutes.length > 0 ? [...routes, ...linkedRoutes] : routes;
|
|
550
|
-
const mountRoute = getMountRoute({
|
|
551
|
-
name: definition.name,
|
|
552
|
-
mountRoute: options.mountRoute
|
|
553
|
-
});
|
|
554
|
-
const createRequestStorageWithContext = definition.createRequestStorage ? () => definition.createRequestStorage({
|
|
555
|
-
config,
|
|
556
|
-
options,
|
|
557
|
-
deps
|
|
558
|
-
}) : void 0;
|
|
559
|
-
return new FragnoInstantiatedFragment({
|
|
560
|
-
name: definition.name,
|
|
561
|
-
routes: finalRoutes,
|
|
562
|
-
deps,
|
|
563
|
-
services: boundServices,
|
|
564
|
-
mountRoute,
|
|
565
|
-
serviceThisContext: serviceContext,
|
|
566
|
-
handlerThisContext: handlerContext,
|
|
567
|
-
storage,
|
|
568
|
-
createRequestStorage: createRequestStorageWithContext,
|
|
569
|
-
options,
|
|
570
|
-
linkedFragments: linkedFragmentInstances,
|
|
571
|
-
internalData
|
|
572
|
-
});
|
|
573
|
-
}
|
|
574
|
-
/**
|
|
575
|
-
* Fluent builder for instantiating fragments.
|
|
576
|
-
* Provides a type-safe API for configuring and building fragment instances.
|
|
577
|
-
*/
|
|
578
|
-
var FragmentInstantiationBuilder = class FragmentInstantiationBuilder$1 {
|
|
579
|
-
#definition;
|
|
580
|
-
#config;
|
|
581
|
-
#routes;
|
|
582
|
-
#options;
|
|
583
|
-
#services;
|
|
584
|
-
constructor(definition, routes) {
|
|
585
|
-
this.#definition = definition;
|
|
586
|
-
this.#routes = routes;
|
|
587
|
-
}
|
|
588
|
-
/**
|
|
589
|
-
* Get the fragment definition
|
|
590
|
-
*/
|
|
591
|
-
get definition() {
|
|
592
|
-
return this.#definition;
|
|
593
|
-
}
|
|
594
|
-
/**
|
|
595
|
-
* Get the configured routes
|
|
596
|
-
*/
|
|
597
|
-
get routes() {
|
|
598
|
-
return this.#routes ?? [];
|
|
599
|
-
}
|
|
600
|
-
/**
|
|
601
|
-
* Get the configuration
|
|
602
|
-
*/
|
|
603
|
-
get config() {
|
|
604
|
-
return this.#config;
|
|
605
|
-
}
|
|
606
|
-
/**
|
|
607
|
-
* Get the options
|
|
608
|
-
*/
|
|
609
|
-
get options() {
|
|
610
|
-
return this.#options;
|
|
611
|
-
}
|
|
612
|
-
/**
|
|
613
|
-
* Set the configuration for the fragment
|
|
614
|
-
*/
|
|
615
|
-
withConfig(config) {
|
|
616
|
-
this.#config = config;
|
|
617
|
-
return this;
|
|
618
|
-
}
|
|
619
|
-
/**
|
|
620
|
-
* Set the routes for the fragment
|
|
621
|
-
*/
|
|
622
|
-
withRoutes(routes) {
|
|
623
|
-
const newBuilder = new FragmentInstantiationBuilder$1(this.#definition, routes);
|
|
624
|
-
newBuilder.#config = this.#config;
|
|
625
|
-
newBuilder.#options = this.#options;
|
|
626
|
-
newBuilder.#services = this.#services;
|
|
627
|
-
return newBuilder;
|
|
628
|
-
}
|
|
629
|
-
/**
|
|
630
|
-
* Set the options for the fragment (e.g., mountRoute, databaseAdapter)
|
|
631
|
-
*/
|
|
632
|
-
withOptions(options) {
|
|
633
|
-
this.#options = options;
|
|
634
|
-
return this;
|
|
635
|
-
}
|
|
636
|
-
/**
|
|
637
|
-
* Provide implementations for services that this fragment uses
|
|
638
|
-
*/
|
|
639
|
-
withServices(services) {
|
|
640
|
-
this.#services = services;
|
|
641
|
-
return this;
|
|
642
|
-
}
|
|
643
|
-
/**
|
|
644
|
-
* Build and return the instantiated fragment
|
|
645
|
-
*/
|
|
646
|
-
build() {
|
|
647
|
-
const dryRun = process.env["FRAGNO_INIT_DRY_RUN"] === "true";
|
|
648
|
-
return instantiateFragment(this.#definition, this.#config ?? {}, this.#routes ?? [], this.#options ?? {}, this.#services, { dryRun });
|
|
649
|
-
}
|
|
650
|
-
};
|
|
651
|
-
/**
|
|
652
|
-
* Create a fluent builder for instantiating a fragment.
|
|
653
|
-
*
|
|
654
|
-
* @example
|
|
655
|
-
* ```ts
|
|
656
|
-
* const fragment = instantiate(myFragmentDefinition)
|
|
657
|
-
* .withConfig({ apiKey: "key" })
|
|
658
|
-
* .withRoutes([route1, route2])
|
|
659
|
-
* .withOptions({ mountRoute: "/api" })
|
|
660
|
-
* .build();
|
|
661
|
-
* ```
|
|
662
|
-
*/
|
|
663
|
-
function instantiate(definition) {
|
|
664
|
-
return new FragmentInstantiationBuilder(definition);
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
//#endregion
|
|
668
|
-
export { instantiate };
|
|
669
|
-
//# sourceMappingURL=fragment-instantiator.js.map
|