@fragno-dev/db 0.2.1 → 0.3.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 +206 -140
- package/CHANGELOG.md +67 -0
- package/README.md +30 -9
- package/dist/adapters/adapters.d.ts +23 -21
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/generic-sql/driver-config.d.ts +16 -1
- package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -1
- package/dist/adapters/generic-sql/driver-config.js +23 -1
- package/dist/adapters/generic-sql/driver-config.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +27 -9
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.js +55 -16
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +129 -3
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +24 -5
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +6 -5
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +21 -10
- package/dist/adapters/generic-sql/migration/dialect/sqlite.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 +8 -8
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js +74 -51
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +6 -5
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/cursor-utils.js +42 -4
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +25 -17
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/select-builder.js +5 -3
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +15 -12
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/where-builder.js +38 -28
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
- package/dist/adapters/generic-sql/sqlite-storage.d.ts +13 -0
- package/dist/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
- package/dist/adapters/generic-sql/sqlite-storage.js +15 -0
- package/dist/adapters/generic-sql/sqlite-storage.js.map +1 -0
- package/dist/adapters/generic-sql/uow-decoder.js +7 -3
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-encoder.js +28 -8
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
- package/dist/adapters/in-memory/condition-evaluator.js +131 -0
- package/dist/adapters/in-memory/condition-evaluator.js.map +1 -0
- package/dist/adapters/in-memory/errors.d.ts +13 -0
- package/dist/adapters/in-memory/errors.d.ts.map +1 -0
- package/dist/adapters/in-memory/errors.js +23 -0
- package/dist/adapters/in-memory/errors.js.map +1 -0
- package/dist/adapters/in-memory/in-memory-adapter.d.ts +27 -0
- package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -0
- package/dist/adapters/in-memory/in-memory-adapter.js +176 -0
- package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
- package/dist/adapters/in-memory/in-memory-uow.js +648 -0
- package/dist/adapters/in-memory/in-memory-uow.js.map +1 -0
- package/dist/adapters/in-memory/index.d.ts +4 -0
- package/dist/adapters/in-memory/index.js +4 -0
- package/dist/adapters/in-memory/options.d.ts +28 -0
- package/dist/adapters/in-memory/options.d.ts.map +1 -0
- package/dist/adapters/in-memory/options.js +61 -0
- package/dist/adapters/in-memory/options.js.map +1 -0
- package/dist/adapters/in-memory/reference-resolution.js +26 -0
- package/dist/adapters/in-memory/reference-resolution.js.map +1 -0
- package/dist/adapters/in-memory/sorted-array-index.js +129 -0
- package/dist/adapters/in-memory/sorted-array-index.js.map +1 -0
- package/dist/adapters/in-memory/store.js +71 -0
- package/dist/adapters/in-memory/store.js.map +1 -0
- package/dist/adapters/in-memory/value-comparison.js +28 -0
- package/dist/adapters/in-memory/value-comparison.js.map +1 -0
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
- package/dist/adapters/shared/uow-operation-compiler.js +11 -11
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
- package/dist/adapters/sql/index.d.ts +5 -0
- package/dist/adapters/sql/index.js +4 -0
- package/dist/db-fragment-definition-builder.d.ts +45 -96
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +121 -99
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/dispatchers/cloudflare-do/index.d.ts +26 -0
- package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
- package/dist/dispatchers/cloudflare-do/index.js +63 -0
- package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
- package/dist/dispatchers/node/index.d.ts +17 -0
- package/dist/dispatchers/node/index.d.ts.map +1 -0
- package/dist/dispatchers/node/index.js +59 -0
- package/dist/dispatchers/node/index.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +172 -9
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +193 -74
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/fragments/internal-fragment.routes.js +29 -0
- package/dist/fragments/internal-fragment.routes.js.map +1 -0
- package/dist/fragments/internal-fragment.schema.d.ts +9 -0
- package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
- package/dist/fragments/internal-fragment.schema.js +22 -0
- package/dist/fragments/internal-fragment.schema.js.map +1 -0
- package/dist/hooks/durable-hooks-processor.d.ts +14 -0
- package/dist/hooks/durable-hooks-processor.d.ts.map +1 -0
- package/dist/hooks/durable-hooks-processor.js +32 -0
- package/dist/hooks/durable-hooks-processor.js.map +1 -0
- package/dist/hooks/hooks.d.ts +47 -4
- package/dist/hooks/hooks.d.ts.map +1 -1
- package/dist/hooks/hooks.js +106 -39
- package/dist/hooks/hooks.js.map +1 -1
- package/dist/migration-engine/auto-from-schema.js +14 -11
- package/dist/migration-engine/auto-from-schema.js.map +1 -1
- package/dist/migration-engine/generation-engine.d.ts +16 -10
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +72 -33
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/migration-engine/shared.js.map +1 -1
- package/dist/mod.d.ts +17 -10
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +14 -8
- package/dist/mod.js.map +1 -1
- package/dist/naming/sql-naming.d.ts +19 -0
- package/dist/naming/sql-naming.d.ts.map +1 -0
- package/dist/naming/sql-naming.js +116 -0
- package/dist/naming/sql-naming.js.map +1 -0
- package/dist/node_modules/.pnpm/{rou3@0.7.10 → rou3@0.7.12}/node_modules/rou3/dist/index.js +8 -5
- package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js.map +1 -0
- package/dist/outbox/outbox-builder.js +156 -0
- package/dist/outbox/outbox-builder.js.map +1 -0
- package/dist/outbox/outbox.d.ts +52 -0
- package/dist/outbox/outbox.d.ts.map +1 -0
- package/dist/outbox/outbox.js +37 -0
- package/dist/outbox/outbox.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js +3 -2
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -1
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +164 -20
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
- package/dist/packages/fragno/dist/api/request-input-context.js +67 -0
- package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -1
- package/dist/packages/fragno/dist/api/route.js +14 -1
- package/dist/packages/fragno/dist/api/route.js.map +1 -1
- package/dist/packages/fragno/dist/internal/trace-context.js +12 -0
- package/dist/packages/fragno/dist/internal/trace-context.js.map +1 -0
- package/dist/query/column-defaults.js +20 -4
- package/dist/query/column-defaults.js.map +1 -1
- package/dist/query/cursor.d.ts +3 -1
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +45 -14
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/db-now.d.ts +8 -0
- package/dist/query/db-now.d.ts.map +1 -0
- package/dist/query/db-now.js +7 -0
- package/dist/query/db-now.js.map +1 -0
- package/dist/query/serialize/create-sql-serializer.js +3 -2
- package/dist/query/serialize/create-sql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/mysql-serializer.js +12 -6
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/postgres-serializer.js +25 -7
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/sqlite-serializer.js +55 -11
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
- package/dist/query/serialize/sql-serializer.js +2 -2
- package/dist/query/serialize/sql-serializer.js.map +1 -1
- package/dist/query/simple-query-interface.d.ts +6 -1
- package/dist/query/simple-query-interface.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +351 -100
- 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 +440 -267
- 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 +67 -22
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.js +110 -13
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
- package/dist/query/value-decoding.js +8 -5
- package/dist/query/value-decoding.js.map +1 -1
- package/dist/query/value-encoding.js +29 -9
- package/dist/query/value-encoding.js.map +1 -1
- package/dist/schema/create.d.ts +40 -14
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +82 -42
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/generate-id.d.ts +20 -0
- package/dist/schema/generate-id.d.ts.map +1 -0
- package/dist/schema/generate-id.js +28 -0
- package/dist/schema/generate-id.js.map +1 -0
- package/dist/schema/type-conversion/create-sql-type-mapper.js +3 -2
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
- package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
- package/dist/schema/validator.d.ts +10 -0
- package/dist/schema/validator.d.ts.map +1 -0
- package/dist/schema/validator.js +123 -0
- package/dist/schema/validator.js.map +1 -0
- package/dist/schema-output/drizzle.d.ts +30 -0
- package/dist/schema-output/drizzle.d.ts.map +1 -0
- package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +82 -56
- package/dist/schema-output/drizzle.js.map +1 -0
- package/dist/schema-output/prisma.d.ts +17 -0
- package/dist/schema-output/prisma.d.ts.map +1 -0
- package/dist/schema-output/prisma.js +296 -0
- package/dist/schema-output/prisma.js.map +1 -0
- package/dist/util/default-database-adapter.js +61 -0
- package/dist/util/default-database-adapter.js.map +1 -0
- package/dist/with-database.d.ts +1 -1
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +12 -3
- package/dist/with-database.js.map +1 -1
- package/package.json +43 -28
- package/src/adapters/adapters.ts +30 -24
- package/src/adapters/drizzle/migrate-drizzle.test.ts +54 -33
- package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +599 -0
- package/src/adapters/drizzle/test-utils.ts +12 -8
- package/src/adapters/generic-sql/driver-config.ts +38 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -5
- package/src/adapters/generic-sql/generic-sql-adapter.ts +110 -24
- package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +54 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +231 -3
- package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +118 -0
- package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +26 -8
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +46 -8
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +25 -7
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +8 -4
- package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +47 -8
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +27 -12
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +128 -39
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +15 -8
- package/src/adapters/generic-sql/migration/sql-generator.ts +142 -65
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +9 -6
- package/src/adapters/generic-sql/query/cursor-utils.test.ts +271 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +41 -6
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +27 -27
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +38 -24
- package/src/adapters/generic-sql/query/select-builder.test.ts +15 -11
- package/src/adapters/generic-sql/query/select-builder.ts +6 -2
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +52 -2
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +50 -15
- package/src/adapters/generic-sql/query/where-builder.test.ts +91 -17
- package/src/adapters/generic-sql/query/where-builder.ts +90 -38
- package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +6 -6
- package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +806 -0
- package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +11 -11
- package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +49 -35
- package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +48 -32
- package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +6 -6
- package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +1 -1
- package/src/adapters/generic-sql/uow-decoder.ts +21 -3
- package/src/adapters/generic-sql/uow-encoder.test.ts +33 -2
- package/src/adapters/generic-sql/uow-encoder.ts +50 -11
- package/src/adapters/in-memory/condition-evaluator.test.ts +193 -0
- package/src/adapters/in-memory/condition-evaluator.ts +275 -0
- package/src/adapters/in-memory/errors.ts +20 -0
- package/src/adapters/in-memory/in-memory-adapter.ts +277 -0
- package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +296 -0
- package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +100 -0
- package/src/adapters/in-memory/in-memory-uow.ts +1348 -0
- package/src/adapters/in-memory/index.ts +3 -0
- package/src/adapters/in-memory/options.test.ts +41 -0
- package/src/adapters/in-memory/options.ts +87 -0
- package/src/adapters/in-memory/reference-resolution.test.ts +50 -0
- package/src/adapters/in-memory/reference-resolution.ts +67 -0
- package/src/adapters/in-memory/sorted-array-index.test.ts +123 -0
- package/src/adapters/in-memory/sorted-array-index.ts +228 -0
- package/src/adapters/in-memory/store.test.ts +68 -0
- package/src/adapters/in-memory/store.ts +145 -0
- package/src/adapters/in-memory/value-comparison.ts +53 -0
- package/src/adapters/in-memory/value-normalization.test.ts +57 -0
- package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1163 -0
- package/src/adapters/shared/from-unit-of-work-compiler.ts +3 -1
- package/src/adapters/shared/uow-operation-compiler.ts +26 -16
- package/src/adapters/sql/index.ts +12 -0
- package/src/db-fragment-definition-builder.test.ts +88 -54
- package/src/db-fragment-definition-builder.ts +201 -322
- package/src/db-fragment-instantiator.test.ts +169 -101
- package/src/db-fragment-integration.test.ts +301 -149
- package/src/dispatchers/cloudflare-do/index.test.ts +73 -0
- package/src/dispatchers/cloudflare-do/index.ts +104 -0
- package/src/dispatchers/node/index.test.ts +91 -0
- package/src/dispatchers/node/index.ts +87 -0
- package/src/fragments/internal-fragment.routes.ts +42 -0
- package/src/fragments/internal-fragment.schema.ts +51 -0
- package/src/fragments/internal-fragment.test.ts +730 -274
- package/src/fragments/internal-fragment.ts +447 -154
- package/src/hooks/durable-hooks-processor.test.ts +117 -0
- package/src/hooks/durable-hooks-processor.ts +67 -0
- package/src/hooks/hooks.test.ts +411 -259
- package/src/hooks/hooks.ts +265 -66
- package/src/migration-engine/auto-from-schema.test.ts +14 -14
- package/src/migration-engine/auto-from-schema.ts +5 -2
- package/src/migration-engine/create.test.ts +2 -2
- package/src/migration-engine/generation-engine.test.ts +229 -104
- package/src/migration-engine/generation-engine.ts +94 -64
- package/src/migration-engine/shared.ts +1 -0
- package/src/mod.ts +78 -30
- package/src/naming/sql-naming.ts +180 -0
- package/src/outbox/outbox-builder.ts +241 -0
- package/src/outbox/outbox.test.ts +253 -0
- package/src/outbox/outbox.ts +137 -0
- package/src/query/column-defaults.ts +41 -3
- package/src/query/condition-builder.test.ts +3 -3
- package/src/query/cursor.test.ts +116 -18
- package/src/query/cursor.ts +75 -26
- package/src/query/db-now.ts +6 -0
- package/src/query/query-type.test.ts +2 -2
- package/src/query/serialize/create-sql-serializer.ts +7 -2
- package/src/query/serialize/dialect/mysql-serializer.ts +12 -4
- package/src/query/serialize/dialect/postgres-serializer.ts +34 -4
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +51 -1
- package/src/query/serialize/dialect/sqlite-serializer.ts +92 -9
- package/src/query/serialize/sql-serializer.ts +4 -4
- package/src/query/simple-query-interface.ts +5 -0
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +1512 -1458
- package/src/query/unit-of-work/execute-unit-of-work.ts +1708 -596
- package/src/query/unit-of-work/tx-builder.test.ts +1041 -0
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +32 -32
- package/src/query/unit-of-work/unit-of-work-types.test.ts +1 -1
- package/src/query/unit-of-work/unit-of-work.test.ts +231 -36
- package/src/query/unit-of-work/unit-of-work.ts +229 -31
- package/src/query/value-decoding.test.ts +13 -2
- package/src/query/value-decoding.ts +17 -4
- package/src/query/value-encoding.test.ts +85 -2
- package/src/query/value-encoding.ts +56 -6
- package/src/schema/create.test.ts +129 -42
- package/src/schema/create.ts +187 -47
- package/src/schema/generate-id.test.ts +57 -0
- package/src/schema/generate-id.ts +38 -0
- package/src/schema/serialize.test.ts +14 -2
- package/src/schema/type-conversion/create-sql-type-mapper.ts +7 -2
- package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
- package/src/schema/type-conversion/type-mapping.test.ts +25 -1
- package/src/schema/validator.test.ts +197 -0
- package/src/schema/validator.ts +231 -0
- package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +179 -129
- package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +143 -93
- package/src/schema-output/prisma.test.ts +536 -0
- package/src/schema-output/prisma.ts +573 -0
- package/src/util/default-database-adapter.ts +106 -0
- package/src/with-database.ts +22 -3
- package/tsdown.config.ts +6 -4
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
- package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
- package/dist/adapters/drizzle/generate.d.ts +0 -30
- package/dist/adapters/drizzle/generate.d.ts.map +0 -1
- package/dist/adapters/drizzle/generate.js.map +0 -1
- package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-adapter.js +0 -17
- package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
- package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
- package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
- package/dist/adapters/shared/table-name-mapper.js +0 -43
- package/dist/adapters/shared/table-name-mapper.js.map +0 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +0 -1
- package/dist/schema-generator/schema-generator.d.ts +0 -15
- package/dist/schema-generator/schema-generator.d.ts.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
- package/src/adapters/kysely/kysely-adapter.ts +0 -27
- package/src/adapters/shared/table-name-mapper.ts +0 -50
- package/src/schema-generator/schema-generator.ts +0 -12
- package/src/shared/config.ts +0 -10
- package/src/shared/connection-pool.ts +0 -24
- package/src/shared/prisma.ts +0 -45
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { InternalIdColumn } from "
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { InternalIdColumn } from "../schema/create.js";
|
|
2
|
+
import { internalSchema } from "../fragments/internal-fragment.schema.js";
|
|
3
|
+
import { createNamingResolver, sanitizeNamespace } from "../naming/sql-naming.js";
|
|
4
|
+
import { createSQLTypeMapper } from "../schema/type-conversion/create-sql-type-mapper.js";
|
|
5
|
+
import { defaultNamingStrategyForDatabase } from "../adapters/generic-sql/driver-config.js";
|
|
6
|
+
import { importGenerator } from "../util/import-generator.js";
|
|
7
|
+
import { ident, parseVarchar } from "../util/parse.js";
|
|
6
8
|
|
|
7
|
-
//#region src/
|
|
9
|
+
//#region src/schema-output/drizzle.ts
|
|
8
10
|
const PROVIDER_IMPORTS = {
|
|
9
11
|
mysql: "drizzle-orm/mysql-core",
|
|
10
12
|
postgresql: "drizzle-orm/pg-core",
|
|
@@ -133,7 +135,7 @@ function mapDBTypeToDrizzleFunction(ctx, dbType, column, customTypes) {
|
|
|
133
135
|
};
|
|
134
136
|
case "text":
|
|
135
137
|
if (column.type === "json") return {
|
|
136
|
-
name: "
|
|
138
|
+
name: "text",
|
|
137
139
|
params: [`{ mode: "json" }`]
|
|
138
140
|
};
|
|
139
141
|
return { name: "text" };
|
|
@@ -143,16 +145,15 @@ function mapDBTypeToDrizzleFunction(ctx, dbType, column, customTypes) {
|
|
|
143
145
|
return { name: dbType };
|
|
144
146
|
}
|
|
145
147
|
/**
|
|
146
|
-
* Get the physical table name
|
|
148
|
+
* Get the physical table name using the naming resolver if available
|
|
147
149
|
*/
|
|
148
|
-
function getPhysicalTableName(logicalName,
|
|
149
|
-
|
|
150
|
-
return mapper ? mapper.toPhysical(logicalName) : `${logicalName}_${sanitizeNamespace(namespace)}`;
|
|
150
|
+
function getPhysicalTableName(logicalName, resolver) {
|
|
151
|
+
return resolver ? resolver.getTableName(logicalName) : logicalName;
|
|
151
152
|
}
|
|
152
|
-
function generateColumnDefinition(ctx, column, customTypes) {
|
|
153
|
+
function generateColumnDefinition(ctx, column, customTypes, physicalColumnName) {
|
|
153
154
|
const parts = [];
|
|
154
155
|
const typeFn = getColumnTypeFunction(ctx, column, customTypes);
|
|
155
|
-
const params = [`"${
|
|
156
|
+
const params = [`"${physicalColumnName}"`, ...typeFn.params ?? []];
|
|
156
157
|
if (!typeFn.isCustomType) ctx.imports.addImport(typeFn.name, ctx.importSource);
|
|
157
158
|
parts.push(`${typeFn.name}(${params.join(", ")})`);
|
|
158
159
|
if (column instanceof InternalIdColumn || column.role === "internal-id") if (ctx.provider === "sqlite") parts.push("primaryKey({ autoIncrement: true })");
|
|
@@ -161,6 +162,7 @@ function generateColumnDefinition(ctx, column, customTypes) {
|
|
|
161
162
|
parts.push("autoincrement()");
|
|
162
163
|
} else parts.push("primaryKey()");
|
|
163
164
|
if (!column.isNullable) parts.push("notNull()");
|
|
165
|
+
if (column.role === "external-id") parts.push("unique()");
|
|
164
166
|
if (column.default) {
|
|
165
167
|
if ("value" in column.default) {
|
|
166
168
|
let value;
|
|
@@ -170,7 +172,10 @@ function generateColumnDefinition(ctx, column, customTypes) {
|
|
|
170
172
|
} else value = JSON.stringify(column.default.value);
|
|
171
173
|
parts.push(`default(${value})`);
|
|
172
174
|
} else if ("dbSpecial" in column.default) {
|
|
173
|
-
if (column.default.dbSpecial === "now")
|
|
175
|
+
if (column.default.dbSpecial === "now") if (ctx.provider === "mysql") {
|
|
176
|
+
ctx.imports.addImport("sql", "drizzle-orm");
|
|
177
|
+
parts.push("default(sql`(now())`)");
|
|
178
|
+
} else parts.push("defaultNow()");
|
|
174
179
|
} else if ("runtime" in column.default) {
|
|
175
180
|
if (column.default.runtime === "cuid") {
|
|
176
181
|
const idGen = ctx.idGeneratorImport ?? {
|
|
@@ -182,29 +187,33 @@ function generateColumnDefinition(ctx, column, customTypes) {
|
|
|
182
187
|
} else if (column.default.runtime === "now") parts.push("$defaultFn(() => new Date())");
|
|
183
188
|
}
|
|
184
189
|
}
|
|
185
|
-
return ` ${column.
|
|
190
|
+
return ` ${column.name}: ${parts.join(".")}`;
|
|
186
191
|
}
|
|
187
|
-
function generateAllColumns(ctx, table, customTypes) {
|
|
188
|
-
return Object.values(table.columns).map((column) => generateColumnDefinition(ctx, column, customTypes));
|
|
192
|
+
function generateAllColumns(ctx, table, customTypes, resolver) {
|
|
193
|
+
return Object.values(table.columns).map((column) => generateColumnDefinition(ctx, column, customTypes, resolver ? resolver.getColumnName(table.name, column.name) : column.name));
|
|
189
194
|
}
|
|
190
|
-
function generateForeignKeys(ctx, table, namespace,
|
|
195
|
+
function generateForeignKeys(ctx, table, namespace, resolver) {
|
|
191
196
|
const keys = [];
|
|
192
197
|
for (const relation of Object.values(table.relations)) {
|
|
193
198
|
if (relation.type === "many") continue;
|
|
194
199
|
const columns = [];
|
|
195
200
|
const foreignColumns = [];
|
|
196
|
-
const isSelfReference = relation.table.
|
|
201
|
+
const isSelfReference = relation.table.name === table.name;
|
|
197
202
|
for (const [localCol, refCol] of relation.on) {
|
|
198
203
|
columns.push(`table.${localCol}`);
|
|
199
204
|
const actualRefCol = refCol === "id" ? "_internalId" : refCol;
|
|
200
205
|
if (isSelfReference) foreignColumns.push(`table.${actualRefCol}`);
|
|
201
206
|
else {
|
|
202
|
-
const foreignTableRef = namespace ? `${relation.table.
|
|
207
|
+
const foreignTableRef = namespace ? `${relation.table.name}_${sanitizeNamespace(namespace)}` : relation.table.name;
|
|
203
208
|
foreignColumns.push(`${foreignTableRef}.${actualRefCol}`);
|
|
204
209
|
}
|
|
205
210
|
}
|
|
206
211
|
ctx.imports.addImport("foreignKey", ctx.importSource);
|
|
207
|
-
const fkName =
|
|
212
|
+
const fkName = resolver ? resolver.getForeignKeyName({
|
|
213
|
+
logicalTable: table.name,
|
|
214
|
+
logicalReferencedTable: relation.table.name,
|
|
215
|
+
referenceName: relation.name
|
|
216
|
+
}) : `${table.name}_${relation.table.name}_${relation.name}_fk`;
|
|
208
217
|
keys.push(`foreignKey({
|
|
209
218
|
columns: [${columns.join(", ")}],
|
|
210
219
|
foreignColumns: [${foreignColumns.join(", ")}],
|
|
@@ -213,11 +222,11 @@ function generateForeignKeys(ctx, table, namespace, mapper) {
|
|
|
213
222
|
}
|
|
214
223
|
return keys;
|
|
215
224
|
}
|
|
216
|
-
function generateIndexes(ctx, table, namespace) {
|
|
225
|
+
function generateIndexes(ctx, table, namespace, resolver) {
|
|
217
226
|
const indexes = [];
|
|
218
227
|
for (const idx of Object.values(table.indexes)) {
|
|
219
|
-
const columns = idx.columns.map((col) => `table.${col.
|
|
220
|
-
const indexName = namespace ? `${idx.name}_${namespace}` : idx.name;
|
|
228
|
+
const columns = idx.columns.map((col) => `table.${col.name}`).join(", ");
|
|
229
|
+
const indexName = resolver ? idx.unique ? resolver.getUniqueIndexName(idx.name, table.name) : resolver.getIndexName(idx.name, table.name) : namespace ? `${idx.name}_${namespace}` : idx.name;
|
|
221
230
|
if (idx.unique) {
|
|
222
231
|
ctx.imports.addImport("uniqueIndex", ctx.importSource);
|
|
223
232
|
indexes.push(`uniqueIndex("${indexName}").on(${columns})`);
|
|
@@ -228,21 +237,30 @@ function generateIndexes(ctx, table, namespace) {
|
|
|
228
237
|
}
|
|
229
238
|
return indexes;
|
|
230
239
|
}
|
|
231
|
-
function generateTableConstraints(ctx, table, namespace,
|
|
232
|
-
|
|
240
|
+
function generateTableConstraints(ctx, table, namespace, resolver) {
|
|
241
|
+
const constraints = [...generateForeignKeys(ctx, table, namespace, resolver), ...generateIndexes(ctx, table, namespace, resolver)];
|
|
242
|
+
if (ctx.provider === "sqlite") {
|
|
243
|
+
const externalIdColumn = Object.values(table.columns).find((column) => column.role === "external-id");
|
|
244
|
+
if (externalIdColumn) {
|
|
245
|
+
const indexName = resolver ? resolver.getUniqueIndexName(`idx_${table.name}_external_id`, table.name) : namespace ? `idx_${table.name}_external_id_${namespace}` : `idx_${table.name}_external_id`;
|
|
246
|
+
ctx.imports.addImport("uniqueIndex", ctx.importSource);
|
|
247
|
+
constraints.push(`uniqueIndex("${indexName}").on(table.${externalIdColumn.name})`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return constraints;
|
|
233
251
|
}
|
|
234
|
-
function generateTable(ctx, table, customTypes, namespace,
|
|
235
|
-
const tableFn = PROVIDER_TABLE_FUNCTIONS[ctx.provider];
|
|
236
|
-
ctx.imports.addImport(tableFn, ctx.importSource);
|
|
237
|
-
const columns = generateAllColumns(ctx, table, customTypes);
|
|
238
|
-
const constraints = generateTableConstraints(ctx, table, namespace,
|
|
239
|
-
const physicalTableName = getPhysicalTableName(table.
|
|
240
|
-
const exportName = namespace ? `${table.
|
|
252
|
+
function generateTable(ctx, table, customTypes, namespace, resolver, schemaRef) {
|
|
253
|
+
const tableFn = schemaRef ? `${schemaRef}.table` : PROVIDER_TABLE_FUNCTIONS[ctx.provider];
|
|
254
|
+
if (!schemaRef) ctx.imports.addImport(tableFn, ctx.importSource);
|
|
255
|
+
const columns = generateAllColumns(ctx, table, customTypes, resolver);
|
|
256
|
+
const constraints = generateTableConstraints(ctx, table, namespace, resolver);
|
|
257
|
+
const physicalTableName = getPhysicalTableName(table.name, resolver);
|
|
258
|
+
const exportName = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;
|
|
241
259
|
const args = [`"${physicalTableName}"`, `{\n${columns.join(",\n")}\n}`];
|
|
242
260
|
if (constraints.length > 0) args.push(`(table) => [\n${ident(constraints.join(",\n"))}\n]`);
|
|
243
261
|
return `export const ${exportName} = ${tableFn}(${args.join(", ")})`;
|
|
244
262
|
}
|
|
245
|
-
function generateRelation(ctx, table, namespace, inverseRelations,
|
|
263
|
+
function generateRelation(ctx, table, namespace, inverseRelations, _resolver) {
|
|
246
264
|
const relations = [];
|
|
247
265
|
let hasOne = false;
|
|
248
266
|
let hasMany = false;
|
|
@@ -253,8 +271,8 @@ function generateRelation(ctx, table, namespace, inverseRelations, _mapper) {
|
|
|
253
271
|
if (relation.type === "one") {
|
|
254
272
|
const fields = [];
|
|
255
273
|
const references = [];
|
|
256
|
-
const tableRef = namespace ? `${table.
|
|
257
|
-
const relatedTableRef = namespace ? `${relation.table.
|
|
274
|
+
const tableRef = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;
|
|
275
|
+
const relatedTableRef = namespace ? `${relation.table.name}_${sanitizeNamespace(namespace)}` : relation.table.name;
|
|
258
276
|
for (const [left, right] of relation.on) {
|
|
259
277
|
fields.push(`${tableRef}.${left}`);
|
|
260
278
|
const actualRight = right === "id" ? "_internalId" : right;
|
|
@@ -262,15 +280,15 @@ function generateRelation(ctx, table, namespace, inverseRelations, _mapper) {
|
|
|
262
280
|
}
|
|
263
281
|
options.push(`fields: [${fields.join(", ")}]`, `references: [${references.join(", ")}]`);
|
|
264
282
|
}
|
|
265
|
-
const args = [namespace ? `${relation.table.
|
|
283
|
+
const args = [namespace ? `${relation.table.name}_${sanitizeNamespace(namespace)}` : relation.table.name];
|
|
266
284
|
if (options.length > 0) args.push(`{\n${ident(options.join(",\n"))}\n}`);
|
|
267
285
|
relations.push(ident(`${relation.name}: ${relation.type}(${args.join(", ")})`));
|
|
268
286
|
}
|
|
269
287
|
if (inverseRelations && inverseRelations.length > 0) {
|
|
270
288
|
for (const { fromTable, relation } of inverseRelations) if (relation.type === "one") {
|
|
271
289
|
hasMany = true;
|
|
272
|
-
const fromTableRef = namespace ? `${fromTable.
|
|
273
|
-
const inverseRelationName = `${fromTable.
|
|
290
|
+
const fromTableRef = namespace ? `${fromTable.name}_${sanitizeNamespace(namespace)}` : fromTable.name;
|
|
291
|
+
const inverseRelationName = `${fromTable.name}List`;
|
|
274
292
|
const args = [fromTableRef, `{\n${ident([`relationName: "${relation.id}"`].join(",\n"))}\n}`];
|
|
275
293
|
relations.push(ident(`${inverseRelationName}: many(${args.join(", ")})`));
|
|
276
294
|
}
|
|
@@ -280,8 +298,8 @@ function generateRelation(ctx, table, namespace, inverseRelations, _mapper) {
|
|
|
280
298
|
if (hasOne) params.push("one");
|
|
281
299
|
if (hasMany) params.push("many");
|
|
282
300
|
const relationParams = params.length > 0 ? `{ ${params.join(", ")} }` : "{}";
|
|
283
|
-
const exportTableRef = namespace ? `${table.
|
|
284
|
-
const relationsName = namespace ? `${exportTableRef}Relations` : `${table.
|
|
301
|
+
const exportTableRef = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;
|
|
302
|
+
const relationsName = namespace ? `${exportTableRef}Relations` : `${table.name}Relations`;
|
|
285
303
|
ctx.imports.addImport("relations", "drizzle-orm");
|
|
286
304
|
return `export const ${relationsName} = relations(${exportTableRef}, (${relationParams}) => ({
|
|
287
305
|
${relations.join(",\n")}
|
|
@@ -291,20 +309,20 @@ ${relations.join(",\n")}
|
|
|
291
309
|
* Generate a schema export object for a fragment
|
|
292
310
|
* This groups all tables by their logical names for easier access
|
|
293
311
|
*/
|
|
294
|
-
function generateFragmentSchemaExport(schema, namespace, tablesWithRelations,
|
|
312
|
+
function generateFragmentSchemaExport(schema, namespace, tablesWithRelations, _resolver) {
|
|
295
313
|
const drizzleEntries = [];
|
|
296
314
|
for (const table of Object.values(schema.tables)) {
|
|
297
|
-
const exportName = namespace ? `${table.
|
|
315
|
+
const exportName = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;
|
|
298
316
|
drizzleEntries.push(` ${exportName}: ${exportName}`);
|
|
299
317
|
if (tablesWithRelations?.has(table.name)) {
|
|
300
|
-
const relationsName = namespace ? `${exportName}Relations` : `${table.
|
|
318
|
+
const relationsName = namespace ? `${exportName}Relations` : `${table.name}Relations`;
|
|
301
319
|
drizzleEntries.push(` ${relationsName}: ${relationsName}`);
|
|
302
320
|
}
|
|
303
321
|
if (namespace) {
|
|
304
|
-
drizzleEntries.push(` ${table.
|
|
322
|
+
drizzleEntries.push(` ${table.name}: ${exportName}`);
|
|
305
323
|
if (tablesWithRelations?.has(table.name)) {
|
|
306
324
|
const physicalRelationsName = `${exportName}Relations`;
|
|
307
|
-
const aliasRelationsName = `${table.
|
|
325
|
+
const aliasRelationsName = `${table.name}Relations`;
|
|
308
326
|
drizzleEntries.push(` ${aliasRelationsName}: ${physicalRelationsName}`);
|
|
309
327
|
}
|
|
310
328
|
}
|
|
@@ -318,20 +336,28 @@ function generateFragmentSchemaExport(schema, namespace, tablesWithRelations, _m
|
|
|
318
336
|
/**
|
|
319
337
|
* Generate a schema file from one or more fragments with automatic de-duplication
|
|
320
338
|
*/
|
|
321
|
-
function
|
|
339
|
+
function generateDrizzleSchema(fragments, provider, options) {
|
|
322
340
|
const ctx = createContext(provider, options?.idGeneratorImport);
|
|
323
341
|
const customTypes = [];
|
|
324
342
|
const sections = [];
|
|
325
|
-
const
|
|
343
|
+
const namingStrategy = options?.namingStrategy ?? defaultNamingStrategyForDatabase(provider);
|
|
326
344
|
for (const { schema, namespace } of fragments) {
|
|
327
345
|
const fragmentTables = [];
|
|
328
|
-
const
|
|
346
|
+
const resolver = createNamingResolver(schema, namespace, namingStrategy);
|
|
347
|
+
const schemaName = resolver.getSchemaName();
|
|
348
|
+
const schemaRef = ctx.provider === "postgresql" && schemaName ? `schema_${sanitizeNamespace(schemaName)}` : void 0;
|
|
329
349
|
fragmentTables.push("");
|
|
330
350
|
fragmentTables.push("// ============================================================================");
|
|
331
|
-
|
|
351
|
+
const namespaceLabel = namespace ?? "(none)";
|
|
352
|
+
fragmentTables.push(`// Fragment: ${namespaceLabel}`);
|
|
332
353
|
fragmentTables.push("// ============================================================================");
|
|
354
|
+
if (schemaRef && schemaName) {
|
|
355
|
+
ctx.imports.addImport("pgSchema", ctx.importSource);
|
|
356
|
+
fragmentTables.push("");
|
|
357
|
+
fragmentTables.push(`const ${schemaRef} = pgSchema("${schemaName}");`);
|
|
358
|
+
}
|
|
333
359
|
for (const table of Object.values(schema.tables)) {
|
|
334
|
-
const tableCode = generateTable(ctx, table, customTypes, namespace,
|
|
360
|
+
const tableCode = generateTable(ctx, table, customTypes, namespace, resolver, schemaRef);
|
|
335
361
|
fragmentTables.push("");
|
|
336
362
|
fragmentTables.push(tableCode);
|
|
337
363
|
}
|
|
@@ -346,16 +372,16 @@ function generateSchema(fragments, provider, options) {
|
|
|
346
372
|
}
|
|
347
373
|
const tablesWithRelations = /* @__PURE__ */ new Set();
|
|
348
374
|
for (const table of Object.values(schema.tables)) {
|
|
349
|
-
const relationCode = generateRelation(ctx, table, namespace, inverseRelations.get(table.name),
|
|
375
|
+
const relationCode = generateRelation(ctx, table, namespace, inverseRelations.get(table.name), resolver);
|
|
350
376
|
if (relationCode) {
|
|
351
377
|
fragmentTables.push("");
|
|
352
378
|
fragmentTables.push(relationCode);
|
|
353
379
|
tablesWithRelations.add(table.name);
|
|
354
380
|
}
|
|
355
381
|
}
|
|
356
|
-
if (namespace
|
|
382
|
+
if (!(namespace === null && schema.name === internalSchema.name)) {
|
|
357
383
|
fragmentTables.push("");
|
|
358
|
-
fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations
|
|
384
|
+
fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations));
|
|
359
385
|
}
|
|
360
386
|
sections.push(...fragmentTables);
|
|
361
387
|
}
|
|
@@ -367,5 +393,5 @@ function generateSchema(fragments, provider, options) {
|
|
|
367
393
|
}
|
|
368
394
|
|
|
369
395
|
//#endregion
|
|
370
|
-
export {
|
|
371
|
-
//# sourceMappingURL=
|
|
396
|
+
export { generateDrizzleSchema };
|
|
397
|
+
//# sourceMappingURL=drizzle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle.js","names":["parts: string[]","params: string[]","value: string","keys: string[]","columns: string[]","foreignColumns: string[]","indexes: string[]","constraints: string[]","args: string[]","relations: string[]","options: string[]","fields: string[]","references: string[]","drizzleEntries: string[]","customTypes: string[]","sections: string[]","fragmentTables: string[]"],"sources":["../../src/schema-output/drizzle.ts"],"sourcesContent":["import { importGenerator } from \"../util/import-generator\";\nimport { ident, parseVarchar } from \"../util/parse\";\nimport {\n type AnyColumn,\n type AnySchema,\n type AnyTable,\n type Relation,\n InternalIdColumn,\n} from \"../schema/create\";\nimport {\n createNamingResolver,\n sanitizeNamespace,\n type NamingResolver,\n type SqlNamingStrategy,\n} from \"../naming/sql-naming\";\nimport { internalSchema } from \"../fragments/internal-fragment.schema\";\nimport { type DatabaseTypeLiteral } from \"../schema/type-conversion/type-mapping\";\nimport { createSQLTypeMapper } from \"../schema/type-conversion/create-sql-type-mapper\";\nimport {\n defaultNamingStrategyForDatabase,\n type SupportedDatabase,\n} from \"../adapters/generic-sql/driver-config\";\n\n// ============================================================================\n// PROVIDER CONFIGURATION\n// ============================================================================\n\nconst PROVIDER_IMPORTS = {\n mysql: \"drizzle-orm/mysql-core\",\n postgresql: \"drizzle-orm/pg-core\",\n sqlite: \"drizzle-orm/sqlite-core\",\n} as const;\n\nconst PROVIDER_TABLE_FUNCTIONS = {\n mysql: \"mysqlTable\",\n postgresql: \"pgTable\",\n sqlite: \"sqliteTable\",\n} as const;\n\nexport type SupportedProvider = SupportedDatabase;\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\ninterface GeneratorContext {\n provider: SupportedProvider;\n imports: ReturnType<typeof importGenerator>;\n importSource: string;\n generatedCustomTypes: Set<string>;\n idGeneratorImport?: { name: string; from: string };\n}\n\nfunction createContext(\n provider: SupportedDatabase,\n idGeneratorImport?: { name: string; from: string },\n): GeneratorContext {\n return {\n provider,\n imports: importGenerator(),\n importSource: PROVIDER_IMPORTS[provider],\n generatedCustomTypes: new Set<string>(),\n idGeneratorImport,\n };\n}\n\n// ============================================================================\n// CUSTOM TYPE GENERATION\n// ============================================================================\n\ninterface CustomTypeOptions {\n dataType: string;\n driverDataType: string;\n databaseDataType: string;\n fromDriverCode: string;\n toDriverCode: string;\n}\n\nfunction generateCustomType(\n ctx: GeneratorContext,\n name: string,\n options: CustomTypeOptions,\n): string | undefined {\n if (ctx.generatedCustomTypes.has(name)) {\n return undefined;\n }\n\n ctx.imports.addImport(\"customType\", ctx.importSource);\n ctx.generatedCustomTypes.add(name);\n\n return `const ${name} = customType<\n {\n data: ${options.dataType};\n driverData: ${options.driverDataType};\n }\n>({\n dataType() {\n return \"${options.databaseDataType}\";\n },\n fromDriver(value) {\n ${options.fromDriverCode}\n },\n toDriver(value) {\n ${options.toDriverCode}\n }\n});`;\n}\n\nfunction generateBinaryCustomType(ctx: GeneratorContext, customTypes: string[]): string {\n const name = \"customBinary\";\n const typeMapper = createSQLTypeMapper(ctx.provider);\n const code = generateCustomType(ctx, name, {\n dataType: \"Uint8Array\",\n driverDataType: \"Buffer\",\n databaseDataType: typeMapper.getDatabaseType({ type: \"binary\" }),\n fromDriverCode: \"return new Uint8Array(value.buffer, value.byteOffset, value.byteLength)\",\n toDriverCode: `return value instanceof Buffer? value : Buffer.from(value)`,\n });\n\n if (code) {\n customTypes.push(code);\n }\n return name;\n}\n\n// ============================================================================\n// COLUMN TYPE MAPPING\n// ============================================================================\n\ninterface ColumnTypeFunction {\n name: string;\n isCustomType?: boolean;\n params?: string[];\n}\n\n/**\n * Maps SQL database types to Drizzle function names and parameters.\n * Uses SQLTypeMapper as the source of truth for type conversion.\n */\nfunction getColumnTypeFunction(\n ctx: GeneratorContext,\n column: AnyColumn,\n customTypes: string[],\n): ColumnTypeFunction {\n // Get the canonical database type from type mapper\n const typeMapper = createSQLTypeMapper(ctx.provider);\n const dbType = typeMapper.getDatabaseType(column);\n\n // Map database types to Drizzle function names\n return mapDBTypeToDrizzleFunction(ctx, dbType, column, customTypes);\n}\n\n/**\n * Maps a database type string to a Drizzle function name and parameters.\n */\nfunction mapDBTypeToDrizzleFunction(\n ctx: GeneratorContext,\n dbType: DatabaseTypeLiteral,\n column: AnyColumn,\n customTypes: string[],\n): ColumnTypeFunction {\n // Handle provider-specific types\n if (ctx.provider === \"postgresql\") {\n switch (dbType) {\n case \"bigserial\":\n // bigserial requires a mode parameter in Drizzle\n return { name: \"bigserial\", params: [`{ mode: \"number\" }`] };\n case \"serial\":\n return { name: \"serial\" };\n case \"boolean\":\n return { name: \"boolean\" };\n case \"bytea\":\n return { name: generateBinaryCustomType(ctx, customTypes), isCustomType: true };\n case \"json\":\n return { name: \"json\" };\n case \"text\":\n return { name: \"text\" };\n case \"bigint\":\n return { name: \"bigint\", params: [`{ mode: \"number\" }`] };\n default:\n if (dbType.startsWith(\"varchar(\")) {\n const length = parseVarchar(dbType);\n return { name: \"varchar\", params: [`{ length: ${length} }`] };\n }\n return { name: dbType };\n }\n }\n\n if (ctx.provider === \"mysql\") {\n switch (dbType) {\n case \"boolean\":\n return { name: \"boolean\" };\n case \"text\":\n return { name: \"text\" };\n case \"longblob\":\n return { name: generateBinaryCustomType(ctx, customTypes), isCustomType: true };\n case \"bigint\":\n // MySQL bigint requires mode parameter\n return { name: \"bigint\", params: [`{ mode: \"number\" }`] };\n case \"integer\":\n // MySQL uses \"int\" not \"integer\" in Drizzle ORM\n return { name: \"int\" };\n default:\n if (dbType.startsWith(\"varchar(\")) {\n const length = parseVarchar(dbType);\n return { name: \"varchar\", params: [`{ length: ${length} }`] };\n }\n return { name: dbType };\n }\n }\n\n if (ctx.provider === \"sqlite\") {\n switch (dbType) {\n case \"integer\":\n // Need to determine the mode based on the original column type\n if (column.type === \"bool\") {\n return { name: \"integer\", params: [`{ mode: \"boolean\" }`] };\n }\n if (column.type === \"timestamp\" || column.type === \"date\") {\n return { name: \"integer\", params: [`{ mode: \"timestamp\" }`] };\n }\n return { name: \"integer\" };\n case \"blob\":\n // Need to determine the mode based on the original column type\n if (column.type === \"bigint\") {\n return { name: \"blob\", params: [`{ mode: \"bigint\" }`] };\n }\n return { name: generateBinaryCustomType(ctx, customTypes), isCustomType: true };\n case \"text\":\n // Check if it's JSON\n if (column.type === \"json\") {\n return { name: \"text\", params: [`{ mode: \"json\" }`] };\n }\n return { name: \"text\" };\n case \"real\":\n return { name: \"real\" };\n default:\n return { name: dbType };\n }\n }\n\n // Fallback for other providers\n return { name: dbType };\n}\n\n// ============================================================================\n// TABLE NAME HELPERS\n// ============================================================================\n\n/**\n * Get the physical table name using the naming resolver if available\n */\nfunction getPhysicalTableName(logicalName: string, resolver?: NamingResolver): string {\n return resolver ? resolver.getTableName(logicalName) : logicalName;\n}\n\n// ============================================================================\n// COLUMN GENERATION\n// ============================================================================\n\nfunction generateColumnDefinition(\n ctx: GeneratorContext,\n column: AnyColumn,\n customTypes: string[],\n physicalColumnName: string,\n): string {\n const parts: string[] = [];\n const typeFn = getColumnTypeFunction(ctx, column, customTypes);\n\n // Column type with parameters\n const params: string[] = [`\"${physicalColumnName}\"`, ...(typeFn.params ?? [])];\n if (!typeFn.isCustomType) {\n ctx.imports.addImport(typeFn.name, ctx.importSource);\n }\n parts.push(`${typeFn.name}(${params.join(\", \")})`);\n\n // Primary key for internal ID\n if (column instanceof InternalIdColumn || column.role === \"internal-id\") {\n if (ctx.provider === \"sqlite\") {\n // SQLite uses primaryKey({ autoIncrement: true })\n parts.push(\"primaryKey({ autoIncrement: true })\");\n } else if (ctx.provider === \"mysql\") {\n // MySQL uses primaryKey().autoincrement()\n parts.push(\"primaryKey()\");\n parts.push(\"autoincrement()\");\n } else {\n // PostgreSQL just uses primaryKey()\n parts.push(\"primaryKey()\");\n }\n }\n\n // Nullability\n if (!column.isNullable) {\n parts.push(\"notNull()\");\n }\n\n // External IDs are unique by definition in Fragno's SQL migrations.\n if (column.role === \"external-id\") {\n parts.push(\"unique()\");\n }\n\n // Default values\n if (column.default) {\n if (\"value\" in column.default) {\n // Static defaults: defaultTo(value)\n let value: string;\n if (typeof column.default.value === \"bigint\") {\n ctx.imports.addImport(\"sql\", \"drizzle-orm\");\n value = `sql\\`${column.default.value.toString()}\\``;\n } else {\n value = JSON.stringify(column.default.value);\n }\n parts.push(`default(${value})`);\n } else if (\"dbSpecial\" in column.default) {\n // Database-level special functions: defaultTo(b => b.now())\n if (column.default.dbSpecial === \"now\") {\n if (ctx.provider === \"mysql\") {\n ctx.imports.addImport(\"sql\", \"drizzle-orm\");\n parts.push(\"default(sql`(now())`)\");\n } else {\n parts.push(\"defaultNow()\");\n }\n }\n } else if (\"runtime\" in column.default) {\n // Runtime defaults: defaultTo$()\n if (column.default.runtime === \"cuid\") {\n const idGen = ctx.idGeneratorImport ?? { name: \"createId\", from: \"@fragno-dev/db/id\" };\n ctx.imports.addImport(idGen.name, idGen.from);\n parts.push(`$defaultFn(() => ${idGen.name}())`);\n } else if (column.default.runtime === \"now\") {\n // Runtime-generated timestamp (not database-level)\n parts.push(\"$defaultFn(() => new Date())\");\n }\n // Note: Custom functions in defaultTo$(() => ...) are not supported in schema generation\n }\n }\n\n return ` ${column.name}: ${parts.join(\".\")}`;\n}\n\nfunction generateAllColumns(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n resolver?: NamingResolver,\n): string[] {\n return Object.values(table.columns).map((column) =>\n generateColumnDefinition(\n ctx,\n column,\n customTypes,\n resolver ? resolver.getColumnName(table.name, column.name) : column.name,\n ),\n );\n}\n\n// ============================================================================\n// CONSTRAINT GENERATION\n// ============================================================================\n\nfunction generateForeignKeys(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string | null,\n resolver?: NamingResolver,\n): string[] {\n const keys: string[] = [];\n\n for (const relation of Object.values(table.relations)) {\n // Only \"one\" relations generate foreign keys\n // \"many\" relations don't have foreign keys (they're on the other side)\n if (relation.type === \"many\") {\n continue;\n }\n\n const columns: string[] = [];\n const foreignColumns: string[] = [];\n const isSelfReference = relation.table.name === table.name;\n\n for (const [localCol, refCol] of relation.on) {\n columns.push(`table.${localCol}`);\n // Foreign keys always reference internal IDs\n const actualRefCol = refCol === \"id\" ? \"_internalId\" : refCol;\n // For self-referencing foreign keys, use table parameter instead of table constant\n if (isSelfReference) {\n foreignColumns.push(`table.${actualRefCol}`);\n } else {\n // Use sanitized TypeScript export name for identifier reference\n const foreignTableRef = namespace\n ? `${relation.table.name}_${sanitizeNamespace(namespace)}`\n : relation.table.name;\n foreignColumns.push(`${foreignTableRef}.${actualRefCol}`);\n }\n }\n\n ctx.imports.addImport(\"foreignKey\", ctx.importSource);\n // Include namespace in FK name to avoid collisions\n const fkName = resolver\n ? resolver.getForeignKeyName({\n logicalTable: table.name,\n logicalReferencedTable: relation.table.name,\n referenceName: relation.name,\n })\n : `${table.name}_${relation.table.name}_${relation.name}_fk`;\n\n keys.push(`foreignKey({\n columns: [${columns.join(\", \")}],\n foreignColumns: [${foreignColumns.join(\", \")}],\n name: \"${fkName}\"\n})`);\n }\n\n return keys;\n}\n\nfunction generateIndexes(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string | null,\n resolver?: NamingResolver,\n): string[] {\n const indexes: string[] = [];\n\n for (const idx of Object.values(table.indexes)) {\n const columns = idx.columns.map((col) => `table.${col.name}`).join(\", \");\n\n const indexName = resolver\n ? idx.unique\n ? resolver.getUniqueIndexName(idx.name, table.name)\n : resolver.getIndexName(idx.name, table.name)\n : namespace\n ? `${idx.name}_${namespace}`\n : idx.name;\n\n if (idx.unique) {\n ctx.imports.addImport(\"uniqueIndex\", ctx.importSource);\n indexes.push(`uniqueIndex(\"${indexName}\").on(${columns})`);\n } else {\n ctx.imports.addImport(\"index\", ctx.importSource);\n indexes.push(`index(\"${indexName}\").on(${columns})`);\n }\n }\n\n return indexes;\n}\n\nfunction generateTableConstraints(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string | null,\n resolver?: NamingResolver,\n): string[] {\n const constraints: string[] = [\n ...generateForeignKeys(ctx, table, namespace, resolver),\n ...generateIndexes(ctx, table, namespace, resolver),\n ];\n\n if (ctx.provider === \"sqlite\") {\n const externalIdColumn = Object.values(table.columns).find(\n (column) => column.role === \"external-id\",\n );\n if (externalIdColumn) {\n const indexName = resolver\n ? resolver.getUniqueIndexName(`idx_${table.name}_external_id`, table.name)\n : namespace\n ? `idx_${table.name}_external_id_${namespace}`\n : `idx_${table.name}_external_id`;\n ctx.imports.addImport(\"uniqueIndex\", ctx.importSource);\n constraints.push(`uniqueIndex(\"${indexName}\").on(table.${externalIdColumn.name})`);\n }\n }\n\n return constraints;\n}\n\n// ============================================================================\n// TABLE GENERATION\n// ============================================================================\n\nfunction generateTable(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n namespace?: string | null,\n resolver?: NamingResolver,\n schemaRef?: string,\n): string {\n const tableFn = schemaRef ? `${schemaRef}.table` : PROVIDER_TABLE_FUNCTIONS[ctx.provider];\n if (!schemaRef) {\n ctx.imports.addImport(tableFn, ctx.importSource);\n }\n\n const columns = generateAllColumns(ctx, table, customTypes, resolver);\n const constraints = generateTableConstraints(ctx, table, namespace, resolver);\n\n // Physical table name in the database (respects mapper configuration)\n const physicalTableName = getPhysicalTableName(table.name, resolver);\n // TypeScript export name must always be sanitized to be a valid JavaScript identifier\n const exportName = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;\n\n const args: string[] = [`\"${physicalTableName}\"`, `{\\n${columns.join(\",\\n\")}\\n}`];\n\n if (constraints.length > 0) {\n args.push(`(table) => [\\n${ident(constraints.join(\",\\n\"))}\\n]`);\n }\n\n return `export const ${exportName} = ${tableFn}(${args.join(\", \")})`;\n}\n\n// ============================================================================\n// RELATION GENERATION\n// ============================================================================\n\nfunction generateRelation(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string | null,\n inverseRelations?: Array<{ fromTable: AnyTable; relation: Relation }>,\n _resolver?: NamingResolver,\n): string | undefined {\n const relations: string[] = [];\n let hasOne = false;\n let hasMany = false;\n\n // Generate explicit relations defined on this table\n for (const relation of Object.values(table.relations)) {\n const options: string[] = [`relationName: \"${relation.id}\"`];\n\n // Track which relation types are used\n if (relation.type === \"one\") {\n hasOne = true;\n } else if (relation.type === \"many\") {\n hasMany = true;\n }\n\n // For \"one\" relations, specify fields and references\n if (relation.type === \"one\") {\n const fields: string[] = [];\n const references: string[] = [];\n\n // Use sanitized TypeScript export names for identifier references\n const tableRef = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;\n const relatedTableRef = namespace\n ? `${relation.table.name}_${sanitizeNamespace(namespace)}`\n : relation.table.name;\n\n for (const [left, right] of relation.on) {\n fields.push(`${tableRef}.${left}`);\n // Relations reference internal IDs\n const actualRight = right === \"id\" ? \"_internalId\" : right;\n references.push(`${relatedTableRef}.${actualRight}`);\n }\n\n options.push(`fields: [${fields.join(\", \")}]`, `references: [${references.join(\", \")}]`);\n }\n\n const relatedTableRef = namespace\n ? `${relation.table.name}_${sanitizeNamespace(namespace)}`\n : relation.table.name;\n\n const args: string[] = [relatedTableRef];\n if (options.length > 0) {\n args.push(`{\\n${ident(options.join(\",\\n\"))}\\n}`);\n }\n\n relations.push(ident(`${relation.name}: ${relation.type}(${args.join(\", \")})`));\n }\n\n // Generate inverse relations for tables that reference this table\n // Drizzle requires both sides of a relation to be defined\n if (inverseRelations && inverseRelations.length > 0) {\n for (const { fromTable, relation } of inverseRelations) {\n // Only generate inverse for \"one\" relations (they become \"many\" on this side)\n if (relation.type === \"one\") {\n hasMany = true;\n\n // Use sanitized TypeScript export name for identifier reference\n const fromTableRef = namespace\n ? `${fromTable.name}_${sanitizeNamespace(namespace)}`\n : fromTable.name;\n\n // Generate inverse relation name with consistent suffix\n // e.g., if session has \"sessionOwner\" relation to user, user gets \"sessionList\" inverse relation\n const inverseRelationName = `${fromTable.name}List`;\n\n const options: string[] = [`relationName: \"${relation.id}\"`];\n const args: string[] = [fromTableRef, `{\\n${ident(options.join(\",\\n\"))}\\n}`];\n\n relations.push(ident(`${inverseRelationName}: many(${args.join(\", \")})`));\n }\n }\n }\n\n if (relations.length === 0) {\n return undefined;\n }\n\n // Only include the relation types that are actually used\n const params: string[] = [];\n if (hasOne) {\n params.push(\"one\");\n }\n if (hasMany) {\n params.push(\"many\");\n }\n const relationParams = params.length > 0 ? `{ ${params.join(\", \")} }` : \"{}\";\n\n // Use sanitized names for TypeScript export identifiers\n const exportTableRef = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;\n const relationsName = namespace ? `${exportTableRef}Relations` : `${table.name}Relations`;\n\n ctx.imports.addImport(\"relations\", \"drizzle-orm\");\n return `export const ${relationsName} = relations(${exportTableRef}, (${relationParams}) => ({\n${relations.join(\",\\n\")}\n}));`;\n}\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\n/**\n * Generate a schema export object for a fragment\n * This groups all tables by their logical names for easier access\n */\nfunction generateFragmentSchemaExport(\n schema: AnySchema,\n namespace: string | null,\n tablesWithRelations?: Set<string>,\n _resolver?: NamingResolver,\n): string {\n const drizzleEntries: string[] = [];\n\n for (const table of Object.values(schema.tables)) {\n // TypeScript export name (always sanitized for valid JS identifiers)\n const exportName = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;\n\n // Add physical table name to drizzle schema\n drizzleEntries.push(` ${exportName}: ${exportName}`);\n\n // Include relations for this table if they exist (either explicit or inverse)\n if (tablesWithRelations?.has(table.name)) {\n const relationsName = namespace ? `${exportName}Relations` : `${table.name}Relations`;\n\n drizzleEntries.push(` ${relationsName}: ${relationsName}`);\n }\n\n // Add convenience aliases WITH their relations to work around Drizzle bug\n // The key insight: Drizzle needs BOTH the table alias AND its relations alias\n // in the same schema object for relational queries to work\n if (namespace) {\n drizzleEntries.push(` ${table.name}: ${exportName}`);\n\n // Also add the relations under the aliased name if they exist\n if (tablesWithRelations?.has(table.name)) {\n const physicalRelationsName = `${exportName}Relations`;\n const aliasRelationsName = `${table.name}Relations`;\n drizzleEntries.push(` ${aliasRelationsName}: ${physicalRelationsName}`);\n }\n }\n }\n\n // Add schema version as a number\n drizzleEntries.push(` schemaVersion: ${schema.version}`);\n\n // Use logical name (not physical) for the schema export variable name, sanitized for valid JS identifier\n const exportName = namespace ? `${sanitizeNamespace(namespace)}_schema` : \"_schema\";\n\n return `export const ${exportName} = {\\n${drizzleEntries.join(\",\\n\")}\\n}`;\n}\n\n// ============================================================================\n// MAIN GENERATION\n// ============================================================================\n\nexport interface GenerateSchemaOptions {\n /** Custom ID generator import configuration */\n idGeneratorImport?: {\n /** Function name to import */\n name: string;\n /** Module to import from */\n from: string;\n };\n /** Optional naming strategy override for physical names */\n namingStrategy?: SqlNamingStrategy;\n}\n\n/**\n * Generate a settings table for storing fragment versions\n */\n/**\n * Generate a schema file from one or more fragments with automatic de-duplication\n */\nexport function generateDrizzleSchema(\n fragments: { namespace: string | null; schema: AnySchema }[],\n provider: SupportedDatabase,\n options?: GenerateSchemaOptions,\n): string {\n const ctx = createContext(provider, options?.idGeneratorImport);\n const customTypes: string[] = [];\n const sections: string[] = [];\n const namingStrategy = options?.namingStrategy ?? defaultNamingStrategyForDatabase(provider);\n\n for (const { schema, namespace } of fragments) {\n const fragmentTables: string[] = [];\n const resolver = createNamingResolver(schema, namespace, namingStrategy);\n const schemaName = resolver.getSchemaName();\n const schemaRef =\n ctx.provider === \"postgresql\" && schemaName\n ? `schema_${sanitizeNamespace(schemaName)}`\n : undefined;\n\n // Add section header\n fragmentTables.push(\"\");\n fragmentTables.push(\n \"// ============================================================================\",\n );\n const namespaceLabel = namespace ?? \"(none)\";\n fragmentTables.push(`// Fragment: ${namespaceLabel}`);\n fragmentTables.push(\n \"// ============================================================================\",\n );\n\n if (schemaRef && schemaName) {\n ctx.imports.addImport(\"pgSchema\", ctx.importSource);\n fragmentTables.push(\"\");\n fragmentTables.push(`const ${schemaRef} = pgSchema(\"${schemaName}\");`);\n }\n\n // Generate tables for this fragment\n for (const table of Object.values(schema.tables)) {\n const tableCode = generateTable(ctx, table, customTypes, namespace, resolver, schemaRef);\n fragmentTables.push(\"\");\n fragmentTables.push(tableCode);\n }\n\n // Build a map of inverse relations for tables that are referenced but don't have their own relations\n // This is needed for Drizzle's relational query API to work correctly\n const inverseRelations = new Map<string, Array<{ fromTable: AnyTable; relation: Relation }>>();\n for (const table of Object.values(schema.tables)) {\n for (const relation of Object.values(table.relations)) {\n // Track this relation as an inverse on the target table\n const targetTableName = relation.table.name;\n if (!inverseRelations.has(targetTableName)) {\n inverseRelations.set(targetTableName, []);\n }\n inverseRelations.get(targetTableName)!.push({ fromTable: table, relation });\n }\n }\n\n // Generate relations for all tables (both explicit and inverse)\n const tablesWithRelations = new Set<string>();\n for (const table of Object.values(schema.tables)) {\n const relationCode = generateRelation(\n ctx,\n table,\n namespace,\n inverseRelations.get(table.name),\n resolver,\n );\n if (relationCode) {\n fragmentTables.push(\"\");\n fragmentTables.push(relationCode);\n tablesWithRelations.add(table.name);\n }\n }\n\n // Generate schema export object (skip for internal fragment to avoid duplicate _schema exports)\n if (!(namespace === null && schema.name === internalSchema.name)) {\n fragmentTables.push(\"\");\n fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations));\n }\n\n sections.push(...fragmentTables);\n }\n\n // Assemble final output\n const lines: string[] = [ctx.imports.format(), ...customTypes, ...sections];\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;;;AA2BA,MAAM,mBAAmB;CACvB,OAAO;CACP,YAAY;CACZ,QAAQ;CACT;AAED,MAAM,2BAA2B;CAC/B,OAAO;CACP,YAAY;CACZ,QAAQ;CACT;AAgBD,SAAS,cACP,UACA,mBACkB;AAClB,QAAO;EACL;EACA,SAAS,iBAAiB;EAC1B,cAAc,iBAAiB;EAC/B,sCAAsB,IAAI,KAAa;EACvC;EACD;;AAeH,SAAS,mBACP,KACA,MACA,SACoB;AACpB,KAAI,IAAI,qBAAqB,IAAI,KAAK,CACpC;AAGF,KAAI,QAAQ,UAAU,cAAc,IAAI,aAAa;AACrD,KAAI,qBAAqB,IAAI,KAAK;AAElC,QAAO,SAAS,KAAK;;YAEX,QAAQ,SAAS;kBACX,QAAQ,eAAe;;;;cAI3B,QAAQ,iBAAiB;;;MAGjC,QAAQ,eAAe;;;MAGvB,QAAQ,aAAa;;;;AAK3B,SAAS,yBAAyB,KAAuB,aAA+B;CACtF,MAAM,OAAO;CAEb,MAAM,OAAO,mBAAmB,KAAK,MAAM;EACzC,UAAU;EACV,gBAAgB;EAChB,kBAJiB,oBAAoB,IAAI,SAAS,CAIrB,gBAAgB,EAAE,MAAM,UAAU,CAAC;EAChE,gBAAgB;EAChB,cAAc;EACf,CAAC;AAEF,KAAI,KACF,aAAY,KAAK,KAAK;AAExB,QAAO;;;;;;AAiBT,SAAS,sBACP,KACA,QACA,aACoB;AAMpB,QAAO,2BAA2B,KAJf,oBAAoB,IAAI,SAAS,CAC1B,gBAAgB,OAAO,EAGF,QAAQ,YAAY;;;;;AAMrE,SAAS,2BACP,KACA,QACA,QACA,aACoB;AAEpB,KAAI,IAAI,aAAa,aACnB,SAAQ,QAAR;EACE,KAAK,YAEH,QAAO;GAAE,MAAM;GAAa,QAAQ,CAAC,qBAAqB;GAAE;EAC9D,KAAK,SACH,QAAO,EAAE,MAAM,UAAU;EAC3B,KAAK,UACH,QAAO,EAAE,MAAM,WAAW;EAC5B,KAAK,QACH,QAAO;GAAE,MAAM,yBAAyB,KAAK,YAAY;GAAE,cAAc;GAAM;EACjF,KAAK,OACH,QAAO,EAAE,MAAM,QAAQ;EACzB,KAAK,OACH,QAAO,EAAE,MAAM,QAAQ;EACzB,KAAK,SACH,QAAO;GAAE,MAAM;GAAU,QAAQ,CAAC,qBAAqB;GAAE;EAC3D;AACE,OAAI,OAAO,WAAW,WAAW,CAE/B,QAAO;IAAE,MAAM;IAAW,QAAQ,CAAC,aADpB,aAAa,OAAO,CACoB,IAAI;IAAE;AAE/D,UAAO,EAAE,MAAM,QAAQ;;AAI7B,KAAI,IAAI,aAAa,QACnB,SAAQ,QAAR;EACE,KAAK,UACH,QAAO,EAAE,MAAM,WAAW;EAC5B,KAAK,OACH,QAAO,EAAE,MAAM,QAAQ;EACzB,KAAK,WACH,QAAO;GAAE,MAAM,yBAAyB,KAAK,YAAY;GAAE,cAAc;GAAM;EACjF,KAAK,SAEH,QAAO;GAAE,MAAM;GAAU,QAAQ,CAAC,qBAAqB;GAAE;EAC3D,KAAK,UAEH,QAAO,EAAE,MAAM,OAAO;EACxB;AACE,OAAI,OAAO,WAAW,WAAW,CAE/B,QAAO;IAAE,MAAM;IAAW,QAAQ,CAAC,aADpB,aAAa,OAAO,CACoB,IAAI;IAAE;AAE/D,UAAO,EAAE,MAAM,QAAQ;;AAI7B,KAAI,IAAI,aAAa,SACnB,SAAQ,QAAR;EACE,KAAK;AAEH,OAAI,OAAO,SAAS,OAClB,QAAO;IAAE,MAAM;IAAW,QAAQ,CAAC,sBAAsB;IAAE;AAE7D,OAAI,OAAO,SAAS,eAAe,OAAO,SAAS,OACjD,QAAO;IAAE,MAAM;IAAW,QAAQ,CAAC,wBAAwB;IAAE;AAE/D,UAAO,EAAE,MAAM,WAAW;EAC5B,KAAK;AAEH,OAAI,OAAO,SAAS,SAClB,QAAO;IAAE,MAAM;IAAQ,QAAQ,CAAC,qBAAqB;IAAE;AAEzD,UAAO;IAAE,MAAM,yBAAyB,KAAK,YAAY;IAAE,cAAc;IAAM;EACjF,KAAK;AAEH,OAAI,OAAO,SAAS,OAClB,QAAO;IAAE,MAAM;IAAQ,QAAQ,CAAC,mBAAmB;IAAE;AAEvD,UAAO,EAAE,MAAM,QAAQ;EACzB,KAAK,OACH,QAAO,EAAE,MAAM,QAAQ;EACzB,QACE,QAAO,EAAE,MAAM,QAAQ;;AAK7B,QAAO,EAAE,MAAM,QAAQ;;;;;AAUzB,SAAS,qBAAqB,aAAqB,UAAmC;AACpF,QAAO,WAAW,SAAS,aAAa,YAAY,GAAG;;AAOzD,SAAS,yBACP,KACA,QACA,aACA,oBACQ;CACR,MAAMA,QAAkB,EAAE;CAC1B,MAAM,SAAS,sBAAsB,KAAK,QAAQ,YAAY;CAG9D,MAAMC,SAAmB,CAAC,IAAI,mBAAmB,IAAI,GAAI,OAAO,UAAU,EAAE,CAAE;AAC9E,KAAI,CAAC,OAAO,aACV,KAAI,QAAQ,UAAU,OAAO,MAAM,IAAI,aAAa;AAEtD,OAAM,KAAK,GAAG,OAAO,KAAK,GAAG,OAAO,KAAK,KAAK,CAAC,GAAG;AAGlD,KAAI,kBAAkB,oBAAoB,OAAO,SAAS,cACxD,KAAI,IAAI,aAAa,SAEnB,OAAM,KAAK,sCAAsC;UACxC,IAAI,aAAa,SAAS;AAEnC,QAAM,KAAK,eAAe;AAC1B,QAAM,KAAK,kBAAkB;OAG7B,OAAM,KAAK,eAAe;AAK9B,KAAI,CAAC,OAAO,WACV,OAAM,KAAK,YAAY;AAIzB,KAAI,OAAO,SAAS,cAClB,OAAM,KAAK,WAAW;AAIxB,KAAI,OAAO,SACT;MAAI,WAAW,OAAO,SAAS;GAE7B,IAAIC;AACJ,OAAI,OAAO,OAAO,QAAQ,UAAU,UAAU;AAC5C,QAAI,QAAQ,UAAU,OAAO,cAAc;AAC3C,YAAQ,QAAQ,OAAO,QAAQ,MAAM,UAAU,CAAC;SAEhD,SAAQ,KAAK,UAAU,OAAO,QAAQ,MAAM;AAE9C,SAAM,KAAK,WAAW,MAAM,GAAG;aACtB,eAAe,OAAO,SAE/B;OAAI,OAAO,QAAQ,cAAc,MAC/B,KAAI,IAAI,aAAa,SAAS;AAC5B,QAAI,QAAQ,UAAU,OAAO,cAAc;AAC3C,UAAM,KAAK,wBAAwB;SAEnC,OAAM,KAAK,eAAe;aAGrB,aAAa,OAAO,SAE7B;OAAI,OAAO,QAAQ,YAAY,QAAQ;IACrC,MAAM,QAAQ,IAAI,qBAAqB;KAAE,MAAM;KAAY,MAAM;KAAqB;AACtF,QAAI,QAAQ,UAAU,MAAM,MAAM,MAAM,KAAK;AAC7C,UAAM,KAAK,oBAAoB,MAAM,KAAK,KAAK;cACtC,OAAO,QAAQ,YAAY,MAEpC,OAAM,KAAK,+BAA+B;;;AAMhD,QAAO,KAAK,OAAO,KAAK,IAAI,MAAM,KAAK,IAAI;;AAG7C,SAAS,mBACP,KACA,OACA,aACA,UACU;AACV,QAAO,OAAO,OAAO,MAAM,QAAQ,CAAC,KAAK,WACvC,yBACE,KACA,QACA,aACA,WAAW,SAAS,cAAc,MAAM,MAAM,OAAO,KAAK,GAAG,OAAO,KACrE,CACF;;AAOH,SAAS,oBACP,KACA,OACA,WACA,UACU;CACV,MAAMC,OAAiB,EAAE;AAEzB,MAAK,MAAM,YAAY,OAAO,OAAO,MAAM,UAAU,EAAE;AAGrD,MAAI,SAAS,SAAS,OACpB;EAGF,MAAMC,UAAoB,EAAE;EAC5B,MAAMC,iBAA2B,EAAE;EACnC,MAAM,kBAAkB,SAAS,MAAM,SAAS,MAAM;AAEtD,OAAK,MAAM,CAAC,UAAU,WAAW,SAAS,IAAI;AAC5C,WAAQ,KAAK,SAAS,WAAW;GAEjC,MAAM,eAAe,WAAW,OAAO,gBAAgB;AAEvD,OAAI,gBACF,gBAAe,KAAK,SAAS,eAAe;QACvC;IAEL,MAAM,kBAAkB,YACpB,GAAG,SAAS,MAAM,KAAK,GAAG,kBAAkB,UAAU,KACtD,SAAS,MAAM;AACnB,mBAAe,KAAK,GAAG,gBAAgB,GAAG,eAAe;;;AAI7D,MAAI,QAAQ,UAAU,cAAc,IAAI,aAAa;EAErD,MAAM,SAAS,WACX,SAAS,kBAAkB;GACzB,cAAc,MAAM;GACpB,wBAAwB,SAAS,MAAM;GACvC,eAAe,SAAS;GACzB,CAAC,GACF,GAAG,MAAM,KAAK,GAAG,SAAS,MAAM,KAAK,GAAG,SAAS,KAAK;AAE1D,OAAK,KAAK;cACA,QAAQ,KAAK,KAAK,CAAC;qBACZ,eAAe,KAAK,KAAK,CAAC;WACpC,OAAO;IACd;;AAGF,QAAO;;AAGT,SAAS,gBACP,KACA,OACA,WACA,UACU;CACV,MAAMC,UAAoB,EAAE;AAE5B,MAAK,MAAM,OAAO,OAAO,OAAO,MAAM,QAAQ,EAAE;EAC9C,MAAM,UAAU,IAAI,QAAQ,KAAK,QAAQ,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK;EAExE,MAAM,YAAY,WACd,IAAI,SACF,SAAS,mBAAmB,IAAI,MAAM,MAAM,KAAK,GACjD,SAAS,aAAa,IAAI,MAAM,MAAM,KAAK,GAC7C,YACE,GAAG,IAAI,KAAK,GAAG,cACf,IAAI;AAEV,MAAI,IAAI,QAAQ;AACd,OAAI,QAAQ,UAAU,eAAe,IAAI,aAAa;AACtD,WAAQ,KAAK,gBAAgB,UAAU,QAAQ,QAAQ,GAAG;SACrD;AACL,OAAI,QAAQ,UAAU,SAAS,IAAI,aAAa;AAChD,WAAQ,KAAK,UAAU,UAAU,QAAQ,QAAQ,GAAG;;;AAIxD,QAAO;;AAGT,SAAS,yBACP,KACA,OACA,WACA,UACU;CACV,MAAMC,cAAwB,CAC5B,GAAG,oBAAoB,KAAK,OAAO,WAAW,SAAS,EACvD,GAAG,gBAAgB,KAAK,OAAO,WAAW,SAAS,CACpD;AAED,KAAI,IAAI,aAAa,UAAU;EAC7B,MAAM,mBAAmB,OAAO,OAAO,MAAM,QAAQ,CAAC,MACnD,WAAW,OAAO,SAAS,cAC7B;AACD,MAAI,kBAAkB;GACpB,MAAM,YAAY,WACd,SAAS,mBAAmB,OAAO,MAAM,KAAK,eAAe,MAAM,KAAK,GACxE,YACE,OAAO,MAAM,KAAK,eAAe,cACjC,OAAO,MAAM,KAAK;AACxB,OAAI,QAAQ,UAAU,eAAe,IAAI,aAAa;AACtD,eAAY,KAAK,gBAAgB,UAAU,cAAc,iBAAiB,KAAK,GAAG;;;AAItF,QAAO;;AAOT,SAAS,cACP,KACA,OACA,aACA,WACA,UACA,WACQ;CACR,MAAM,UAAU,YAAY,GAAG,UAAU,UAAU,yBAAyB,IAAI;AAChF,KAAI,CAAC,UACH,KAAI,QAAQ,UAAU,SAAS,IAAI,aAAa;CAGlD,MAAM,UAAU,mBAAmB,KAAK,OAAO,aAAa,SAAS;CACrE,MAAM,cAAc,yBAAyB,KAAK,OAAO,WAAW,SAAS;CAG7E,MAAM,oBAAoB,qBAAqB,MAAM,MAAM,SAAS;CAEpE,MAAM,aAAa,YAAY,GAAG,MAAM,KAAK,GAAG,kBAAkB,UAAU,KAAK,MAAM;CAEvF,MAAMC,OAAiB,CAAC,IAAI,kBAAkB,IAAI,MAAM,QAAQ,KAAK,MAAM,CAAC,KAAK;AAEjF,KAAI,YAAY,SAAS,EACvB,MAAK,KAAK,iBAAiB,MAAM,YAAY,KAAK,MAAM,CAAC,CAAC,KAAK;AAGjE,QAAO,gBAAgB,WAAW,KAAK,QAAQ,GAAG,KAAK,KAAK,KAAK,CAAC;;AAOpE,SAAS,iBACP,KACA,OACA,WACA,kBACA,WACoB;CACpB,MAAMC,YAAsB,EAAE;CAC9B,IAAI,SAAS;CACb,IAAI,UAAU;AAGd,MAAK,MAAM,YAAY,OAAO,OAAO,MAAM,UAAU,EAAE;EACrD,MAAMC,UAAoB,CAAC,kBAAkB,SAAS,GAAG,GAAG;AAG5D,MAAI,SAAS,SAAS,MACpB,UAAS;WACA,SAAS,SAAS,OAC3B,WAAU;AAIZ,MAAI,SAAS,SAAS,OAAO;GAC3B,MAAMC,SAAmB,EAAE;GAC3B,MAAMC,aAAuB,EAAE;GAG/B,MAAM,WAAW,YAAY,GAAG,MAAM,KAAK,GAAG,kBAAkB,UAAU,KAAK,MAAM;GACrF,MAAM,kBAAkB,YACpB,GAAG,SAAS,MAAM,KAAK,GAAG,kBAAkB,UAAU,KACtD,SAAS,MAAM;AAEnB,QAAK,MAAM,CAAC,MAAM,UAAU,SAAS,IAAI;AACvC,WAAO,KAAK,GAAG,SAAS,GAAG,OAAO;IAElC,MAAM,cAAc,UAAU,OAAO,gBAAgB;AACrD,eAAW,KAAK,GAAG,gBAAgB,GAAG,cAAc;;AAGtD,WAAQ,KAAK,YAAY,OAAO,KAAK,KAAK,CAAC,IAAI,gBAAgB,WAAW,KAAK,KAAK,CAAC,GAAG;;EAO1F,MAAMJ,OAAiB,CAJC,YACpB,GAAG,SAAS,MAAM,KAAK,GAAG,kBAAkB,UAAU,KACtD,SAAS,MAAM,KAEqB;AACxC,MAAI,QAAQ,SAAS,EACnB,MAAK,KAAK,MAAM,MAAM,QAAQ,KAAK,MAAM,CAAC,CAAC,KAAK;AAGlD,YAAU,KAAK,MAAM,GAAG,SAAS,KAAK,IAAI,SAAS,KAAK,GAAG,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC;;AAKjF,KAAI,oBAAoB,iBAAiB,SAAS,GAChD;OAAK,MAAM,EAAE,WAAW,cAAc,iBAEpC,KAAI,SAAS,SAAS,OAAO;AAC3B,aAAU;GAGV,MAAM,eAAe,YACjB,GAAG,UAAU,KAAK,GAAG,kBAAkB,UAAU,KACjD,UAAU;GAId,MAAM,sBAAsB,GAAG,UAAU,KAAK;GAG9C,MAAMA,OAAiB,CAAC,cAAc,MAAM,MADlB,CAAC,kBAAkB,SAAS,GAAG,GAAG,CACF,KAAK,MAAM,CAAC,CAAC,KAAK;AAE5E,aAAU,KAAK,MAAM,GAAG,oBAAoB,SAAS,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC;;;AAK/E,KAAI,UAAU,WAAW,EACvB;CAIF,MAAMP,SAAmB,EAAE;AAC3B,KAAI,OACF,QAAO,KAAK,MAAM;AAEpB,KAAI,QACF,QAAO,KAAK,OAAO;CAErB,MAAM,iBAAiB,OAAO,SAAS,IAAI,KAAK,OAAO,KAAK,KAAK,CAAC,MAAM;CAGxE,MAAM,iBAAiB,YAAY,GAAG,MAAM,KAAK,GAAG,kBAAkB,UAAU,KAAK,MAAM;CAC3F,MAAM,gBAAgB,YAAY,GAAG,eAAe,aAAa,GAAG,MAAM,KAAK;AAE/E,KAAI,QAAQ,UAAU,aAAa,cAAc;AACjD,QAAO,gBAAgB,cAAc,eAAe,eAAe,KAAK,eAAe;EACvF,UAAU,KAAK,MAAM,CAAC;;;;;;;AAYxB,SAAS,6BACP,QACA,WACA,qBACA,WACQ;CACR,MAAMY,iBAA2B,EAAE;AAEnC,MAAK,MAAM,SAAS,OAAO,OAAO,OAAO,OAAO,EAAE;EAEhD,MAAM,aAAa,YAAY,GAAG,MAAM,KAAK,GAAG,kBAAkB,UAAU,KAAK,MAAM;AAGvF,iBAAe,KAAK,KAAK,WAAW,IAAI,aAAa;AAGrD,MAAI,qBAAqB,IAAI,MAAM,KAAK,EAAE;GACxC,MAAM,gBAAgB,YAAY,GAAG,WAAW,aAAa,GAAG,MAAM,KAAK;AAE3E,kBAAe,KAAK,KAAK,cAAc,IAAI,gBAAgB;;AAM7D,MAAI,WAAW;AACb,kBAAe,KAAK,KAAK,MAAM,KAAK,IAAI,aAAa;AAGrD,OAAI,qBAAqB,IAAI,MAAM,KAAK,EAAE;IACxC,MAAM,wBAAwB,GAAG,WAAW;IAC5C,MAAM,qBAAqB,GAAG,MAAM,KAAK;AACzC,mBAAe,KAAK,KAAK,mBAAmB,IAAI,wBAAwB;;;;AAM9E,gBAAe,KAAK,oBAAoB,OAAO,UAAU;AAKzD,QAAO,gBAFY,YAAY,GAAG,kBAAkB,UAAU,CAAC,WAAW,UAExC,QAAQ,eAAe,KAAK,MAAM,CAAC;;;;;;;;AAyBvE,SAAgB,sBACd,WACA,UACA,SACQ;CACR,MAAM,MAAM,cAAc,UAAU,SAAS,kBAAkB;CAC/D,MAAMC,cAAwB,EAAE;CAChC,MAAMC,WAAqB,EAAE;CAC7B,MAAM,iBAAiB,SAAS,kBAAkB,iCAAiC,SAAS;AAE5F,MAAK,MAAM,EAAE,QAAQ,eAAe,WAAW;EAC7C,MAAMC,iBAA2B,EAAE;EACnC,MAAM,WAAW,qBAAqB,QAAQ,WAAW,eAAe;EACxE,MAAM,aAAa,SAAS,eAAe;EAC3C,MAAM,YACJ,IAAI,aAAa,gBAAgB,aAC7B,UAAU,kBAAkB,WAAW,KACvC;AAGN,iBAAe,KAAK,GAAG;AACvB,iBAAe,KACb,kFACD;EACD,MAAM,iBAAiB,aAAa;AACpC,iBAAe,KAAK,gBAAgB,iBAAiB;AACrD,iBAAe,KACb,kFACD;AAED,MAAI,aAAa,YAAY;AAC3B,OAAI,QAAQ,UAAU,YAAY,IAAI,aAAa;AACnD,kBAAe,KAAK,GAAG;AACvB,kBAAe,KAAK,SAAS,UAAU,eAAe,WAAW,KAAK;;AAIxE,OAAK,MAAM,SAAS,OAAO,OAAO,OAAO,OAAO,EAAE;GAChD,MAAM,YAAY,cAAc,KAAK,OAAO,aAAa,WAAW,UAAU,UAAU;AACxF,kBAAe,KAAK,GAAG;AACvB,kBAAe,KAAK,UAAU;;EAKhC,MAAM,mCAAmB,IAAI,KAAiE;AAC9F,OAAK,MAAM,SAAS,OAAO,OAAO,OAAO,OAAO,CAC9C,MAAK,MAAM,YAAY,OAAO,OAAO,MAAM,UAAU,EAAE;GAErD,MAAM,kBAAkB,SAAS,MAAM;AACvC,OAAI,CAAC,iBAAiB,IAAI,gBAAgB,CACxC,kBAAiB,IAAI,iBAAiB,EAAE,CAAC;AAE3C,oBAAiB,IAAI,gBAAgB,CAAE,KAAK;IAAE,WAAW;IAAO;IAAU,CAAC;;EAK/E,MAAM,sCAAsB,IAAI,KAAa;AAC7C,OAAK,MAAM,SAAS,OAAO,OAAO,OAAO,OAAO,EAAE;GAChD,MAAM,eAAe,iBACnB,KACA,OACA,WACA,iBAAiB,IAAI,MAAM,KAAK,EAChC,SACD;AACD,OAAI,cAAc;AAChB,mBAAe,KAAK,GAAG;AACvB,mBAAe,KAAK,aAAa;AACjC,wBAAoB,IAAI,MAAM,KAAK;;;AAKvC,MAAI,EAAE,cAAc,QAAQ,OAAO,SAAS,eAAe,OAAO;AAChE,kBAAe,KAAK,GAAG;AACvB,kBAAe,KAAK,6BAA6B,QAAQ,WAAW,oBAAoB,CAAC;;AAG3F,WAAS,KAAK,GAAG,eAAe;;AAKlC,QADwB;EAAC,IAAI,QAAQ,QAAQ;EAAE,GAAG;EAAa,GAAG;EAAS,CAC9D,KAAK,KAAK"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AnySchema } from "../schema/create.js";
|
|
2
|
+
import { SqlNamingStrategy } from "../naming/sql-naming.js";
|
|
3
|
+
import { SupportedDatabase } from "../adapters/generic-sql/driver-config.js";
|
|
4
|
+
import { SQLiteStorageMode } from "../adapters/generic-sql/sqlite-storage.js";
|
|
5
|
+
|
|
6
|
+
//#region src/schema-output/prisma.d.ts
|
|
7
|
+
interface GeneratePrismaSchemaOptions {
|
|
8
|
+
sqliteStorageMode?: SQLiteStorageMode;
|
|
9
|
+
namingStrategy?: SqlNamingStrategy;
|
|
10
|
+
}
|
|
11
|
+
declare function generatePrismaSchema(fragments: {
|
|
12
|
+
namespace: string | null;
|
|
13
|
+
schema: AnySchema;
|
|
14
|
+
}[], provider: SupportedDatabase, options?: GeneratePrismaSchemaOptions): string;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { GeneratePrismaSchemaOptions, generatePrismaSchema };
|
|
17
|
+
//# sourceMappingURL=prisma.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.d.ts","names":[],"sources":["../../src/schema-output/prisma.ts"],"sourcesContent":[],"mappings":";;;;;;UAeiB,2BAAA;sBACK;EADL,cAAA,CAAA,EAEE,iBAFyB;AAke5C;AACiD,iBADjC,oBAAA,CACiC,SAAA,EAAA;EACrC,SAAA,EAAA,MAAA,GAAA,IAAA;EACA,MAAA,EAFqC,SAErC;CAA2B,EAAA,EAAA,QAAA,EAD3B,iBAC2B,EAAA,OAAA,CAAA,EAA3B,2BAA2B,CAAA,EAAA,MAAA"}
|