@fragno-dev/db 0.1.3 → 0.1.5
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 +32 -19
- package/CHANGELOG.md +13 -0
- package/dist/adapters/adapters.js +1 -0
- package/dist/adapters/drizzle/generate.js +1 -1
- package/dist/adapters/drizzle/generate.js.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +33 -22
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/kysely/migration/execute-base.js +128 -0
- package/dist/adapters/kysely/migration/execute-base.js.map +1 -0
- package/dist/adapters/kysely/migration/execute-factory.js +27 -0
- package/dist/adapters/kysely/migration/execute-factory.js.map +1 -0
- package/dist/adapters/kysely/migration/execute-mssql.js +112 -0
- package/dist/adapters/kysely/migration/execute-mssql.js.map +1 -0
- package/dist/adapters/kysely/migration/execute-mysql.js +93 -0
- package/dist/adapters/kysely/migration/execute-mysql.js.map +1 -0
- package/dist/adapters/kysely/migration/execute-postgres.js +104 -0
- package/dist/adapters/kysely/migration/execute-postgres.js.map +1 -0
- package/dist/adapters/kysely/migration/execute-sqlite.js +123 -0
- package/dist/adapters/kysely/migration/execute-sqlite.js.map +1 -0
- package/dist/adapters/kysely/migration/execute.js +23 -168
- package/dist/adapters/kysely/migration/execute.js.map +1 -1
- package/dist/migration-engine/shared.d.ts +24 -5
- package/dist/migration-engine/shared.d.ts.map +1 -1
- package/dist/migration-engine/shared.js.map +1 -1
- package/dist/query/query.d.ts +4 -4
- package/dist/query/query.d.ts.map +1 -1
- package/dist/query/unit-of-work.d.ts +22 -22
- package/dist/query/unit-of-work.d.ts.map +1 -1
- package/dist/schema/create.d.ts +41 -41
- package/dist/schema/create.d.ts.map +1 -1
- package/package.json +7 -2
- package/src/adapters/drizzle/generate.test.ts +97 -0
- package/src/adapters/drizzle/generate.ts +3 -2
- package/src/adapters/kysely/kysely-adapter.ts +46 -27
- package/src/adapters/kysely/migration/execute-base.ts +256 -0
- package/src/adapters/kysely/migration/execute-factory.ts +30 -0
- package/src/adapters/kysely/migration/execute-mssql.ts +250 -0
- package/src/adapters/kysely/migration/execute-mysql.ts +211 -0
- package/src/adapters/kysely/migration/execute-postgres.ts +234 -0
- package/src/adapters/kysely/migration/execute-sqlite.test.ts +1363 -0
- package/src/adapters/kysely/migration/execute-sqlite.ts +247 -0
- package/src/adapters/kysely/migration/execute.ts +33 -396
- package/src/adapters/kysely/migration/kysely-migrator.test.ts +84 -2
- package/src/migration-engine/shared.ts +29 -11
- package/tsdown.config.ts +1 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,57 +1,61 @@
|
|
|
1
1
|
|
|
2
|
-
> @fragno-dev/db@0.1.
|
|
2
|
+
> @fragno-dev/db@0.1.5 build /home/runner/work/fragno/fragno/packages/fragno-db
|
|
3
3
|
> tsdown
|
|
4
4
|
|
|
5
|
-
[34mℹ[39m tsdown [2mv0.15.
|
|
5
|
+
[34mℹ[39m tsdown [2mv0.15.10[22m powered by rolldown [2mv1.0.0-beta.44[22m
|
|
6
6
|
[34mℹ[39m Using tsdown config: [4m/home/runner/work/fragno/fragno/packages/fragno-db/tsdown.config.ts[24m
|
|
7
|
-
[34mℹ[39m entry: [34msrc/fragment.ts, src/id.ts, src/mod.ts, src/migration-engine/generation-engine.ts, src/query/cursor.ts, src/query/query.ts, src/query/unit-of-work.ts, src/schema/create.ts, src/adapters/drizzle/drizzle-adapter.ts, src/adapters/kysely/kysely-adapter.ts[39m
|
|
7
|
+
[34mℹ[39m entry: [34msrc/fragment.ts, src/id.ts, src/mod.ts, src/adapters/adapters.ts, src/migration-engine/generation-engine.ts, src/query/cursor.ts, src/query/query.ts, src/query/unit-of-work.ts, src/schema/create.ts, src/adapters/drizzle/drizzle-adapter.ts, src/adapters/kysely/kysely-adapter.ts[39m
|
|
8
8
|
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
9
9
|
[34mℹ[39m Build start
|
|
10
10
|
[34mℹ[39m [2mdist/[22m[1mschema/create.js[22m [2m19.85 kB[22m [2m│ gzip: 5.20 kB[22m
|
|
11
11
|
[34mℹ[39m [2mdist/[22m[1mquery/unit-of-work.js[22m [2m16.08 kB[22m [2m│ gzip: 3.74 kB[22m
|
|
12
12
|
[34mℹ[39m [2mdist/[22m[1mmigration-engine/generation-engine.js[22m [2m 7.87 kB[22m [2m│ gzip: 2.17 kB[22m
|
|
13
|
-
[34mℹ[39m [2mdist/[22m[1madapters/kysely/kysely-adapter.js[22m [2m
|
|
13
|
+
[34mℹ[39m [2mdist/[22m[1madapters/kysely/kysely-adapter.js[22m [2m 4.25 kB[22m [2m│ gzip: 1.46 kB[22m
|
|
14
14
|
[34mℹ[39m [2mdist/[22m[1mquery/cursor.js[22m [2m 2.99 kB[22m [2m│ gzip: 1.13 kB[22m
|
|
15
15
|
[34mℹ[39m [2mdist/[22m[1mmod.js[22m [2m 2.72 kB[22m [2m│ gzip: 0.90 kB[22m
|
|
16
16
|
[34mℹ[39m [2mdist/[22m[1mfragment.js[22m [2m 2.49 kB[22m [2m│ gzip: 0.71 kB[22m
|
|
17
17
|
[34mℹ[39m [2mdist/[22m[1madapters/drizzle/drizzle-adapter.js[22m [2m 1.67 kB[22m [2m│ gzip: 0.73 kB[22m
|
|
18
18
|
[34mℹ[39m [2mdist/[22m[1mid.js[22m [2m 0.07 kB[22m [2m│ gzip: 0.07 kB[22m
|
|
19
|
+
[34mℹ[39m [2mdist/[22m[1madapters/adapters.js[22m [2m 0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
19
20
|
[34mℹ[39m [2mdist/[22m[1mquery/query.js[22m [2m 0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
20
21
|
[34mℹ[39m [2mdist/[22mschema/create.js.map [2m48.81 kB[22m [2m│ gzip: 11.78 kB[22m
|
|
21
22
|
[34mℹ[39m [2mdist/[22mquery/unit-of-work.js.map [2m45.16 kB[22m [2m│ gzip: 9.98 kB[22m
|
|
22
23
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/dialect.js.map [2m38.90 kB[22m [2m│ gzip: 9.60 kB[22m
|
|
23
|
-
[34mℹ[39m [2mdist/[22madapters/drizzle/generate.js.map [2m30.
|
|
24
|
+
[34mℹ[39m [2mdist/[22madapters/drizzle/generate.js.map [2m30.25 kB[22m [2m│ gzip: 7.48 kB[22m
|
|
24
25
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/select.js.map [2m29.53 kB[22m [2m│ gzip: 6.50 kB[22m
|
|
25
26
|
[34mℹ[39m [2mdist/[22madapters/drizzle/drizzle-uow-compiler.js.map [2m29.11 kB[22m [2m│ gzip: 7.20 kB[22m
|
|
26
27
|
[34mℹ[39m [2mdist/[22madapters/kysely/kysely-query-builder.js.map [2m28.64 kB[22m [2m│ gzip: 7.42 kB[22m
|
|
27
28
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/dialect.js [2m21.25 kB[22m [2m│ gzip: 5.59 kB[22m
|
|
28
29
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/sql.js.map [2m20.27 kB[22m [2m│ gzip: 5.27 kB[22m
|
|
29
30
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/select.js [2m20.16 kB[22m [2m│ gzip: 4.52 kB[22m
|
|
30
|
-
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute.js.map [2m17.61 kB[22m [2m│ gzip: 5.02 kB[22m
|
|
31
31
|
[34mℹ[39m [2mdist/[22mmigration-engine/generation-engine.js.map [2m15.63 kB[22m [2m│ gzip: 4.22 kB[22m
|
|
32
32
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/db.js.map [2m14.29 kB[22m [2m│ gzip: 3.59 kB[22m
|
|
33
33
|
[34mℹ[39m [2mdist/[22madapters/drizzle/drizzle-uow-compiler.js [2m13.95 kB[22m [2m│ gzip: 3.57 kB[22m
|
|
34
34
|
[34mℹ[39m [2mdist/[22madapters/kysely/kysely-uow-compiler.js.map [2m13.52 kB[22m [2m│ gzip: 3.84 kB[22m
|
|
35
|
-
[34mℹ[39m [2mdist/[22madapters/drizzle/generate.js [2m13.
|
|
35
|
+
[34mℹ[39m [2mdist/[22madapters/drizzle/generate.js [2m13.44 kB[22m [2m│ gzip: 3.46 kB[22m
|
|
36
36
|
[34mℹ[39m [2mdist/[22madapters/kysely/kysely-query.js.map [2m12.85 kB[22m [2m│ gzip: 3.47 kB[22m
|
|
37
37
|
[34mℹ[39m [2mdist/[22madapters/kysely/kysely-query-builder.js [2m12.83 kB[22m [2m│ gzip: 3.58 kB[22m
|
|
38
38
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/relations.js.map [2m12.16 kB[22m [2m│ gzip: 3.29 kB[22m
|
|
39
39
|
[34mℹ[39m [2mdist/[22mschema/serialize.js.map [2m12.12 kB[22m [2m│ gzip: 2.75 kB[22m
|
|
40
|
-
[34mℹ[39m [2mdist/[22mschema/create.d.ts.map [2m11.85 kB[22m [2m│ gzip: 4.
|
|
40
|
+
[34mℹ[39m [2mdist/[22mschema/create.d.ts.map [2m11.85 kB[22m [2m│ gzip: 4.65 kB[22m
|
|
41
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute-sqlite.js.map [2m11.80 kB[22m [2m│ gzip: 3.28 kB[22m
|
|
41
42
|
[34mℹ[39m [2mdist/[22madapters/drizzle/drizzle-uow-executor.js.map [2m11.50 kB[22m [2m│ gzip: 3.56 kB[22m
|
|
43
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute-mssql.js.map [2m11.48 kB[22m [2m│ gzip: 2.94 kB[22m
|
|
42
44
|
[34mℹ[39m [2mdist/[22madapters/drizzle/drizzle-query.js.map [2m11.19 kB[22m [2m│ gzip: 2.87 kB[22m
|
|
43
45
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/sql.js [2m10.65 kB[22m [2m│ gzip: 2.97 kB[22m
|
|
44
46
|
[34mℹ[39m [2mdist/[22mquery/result-transform.js.map [2m10.51 kB[22m [2m│ gzip: 3.26 kB[22m
|
|
47
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute-postgres.js.map [2m10.44 kB[22m [2m│ gzip: 2.64 kB[22m
|
|
45
48
|
[34mℹ[39m [2mdist/[22mquery/unit-of-work.d.ts.map [2m 9.79 kB[22m [2m│ gzip: 3.77 kB[22m
|
|
46
49
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js.map [2m 9.78 kB[22m [2m│ gzip: 2.96 kB[22m
|
|
50
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute-base.js.map [2m 9.77 kB[22m [2m│ gzip: 3.27 kB[22m
|
|
51
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute-mysql.js.map [2m 9.30 kB[22m [2m│ gzip: 2.37 kB[22m
|
|
52
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/kysely-adapter.js.map [2m 9.29 kB[22m [2m│ gzip: 3.05 kB[22m
|
|
47
53
|
[34mℹ[39m [2mdist/[22mquery/condition-builder.js.map [2m 9.18 kB[22m [2m│ gzip: 2.42 kB[22m
|
|
48
54
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/columns/common.js.map [2m 8.97 kB[22m [2m│ gzip: 2.98 kB[22m
|
|
49
55
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/db.js [2m 8.91 kB[22m [2m│ gzip: 2.40 kB[22m
|
|
50
56
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/update.js.map [2m 8.58 kB[22m [2m│ gzip: 2.65 kB[22m
|
|
51
|
-
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute.js [2m 8.34 kB[22m [2m│ gzip: 2.46 kB[22m
|
|
52
57
|
[34mℹ[39m [2mdist/[22mmigration-engine/auto-from-schema.js.map [2m 8.31 kB[22m [2m│ gzip: 2.18 kB[22m
|
|
53
58
|
[34mℹ[39m [2mdist/[22mfragment.js.map [2m 8.01 kB[22m [2m│ gzip: 2.12 kB[22m
|
|
54
|
-
[34mℹ[39m [2mdist/[22madapters/kysely/kysely-adapter.js.map [2m 8.01 kB[22m [2m│ gzip: 2.69 kB[22m
|
|
55
59
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/utils.js.map [2m 7.86 kB[22m [2m│ gzip: 2.43 kB[22m
|
|
56
60
|
[34mℹ[39m [2mdist/[22madapters/drizzle/drizzle-uow-decoder.js.map [2m 7.73 kB[22m [2m│ gzip: 2.82 kB[22m
|
|
57
61
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/expressions/conditions.js.map [2m 7.40 kB[22m [2m│ gzip: 1.68 kB[22m
|
|
@@ -66,6 +70,8 @@
|
|
|
66
70
|
[34mℹ[39m [2mdist/[22madapters/kysely/kysely-uow-compiler.js [2m 5.93 kB[22m [2m│ gzip: 1.81 kB[22m
|
|
67
71
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/columns/common.js [2m 5.80 kB[22m [2m│ gzip: 2.04 kB[22m
|
|
68
72
|
[34mℹ[39m [2mdist/[22mquery/result-transform.js [2m 5.52 kB[22m [2m│ gzip: 1.87 kB[22m
|
|
73
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute-mssql.js [2m 5.51 kB[22m [2m│ gzip: 1.52 kB[22m
|
|
74
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute-sqlite.js [2m 5.48 kB[22m [2m│ gzip: 1.63 kB[22m
|
|
69
75
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js.map [2m 5.46 kB[22m [2m│ gzip: 1.89 kB[22m
|
|
70
76
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/relations.js [2m 5.42 kB[22m [2m│ gzip: 1.60 kB[22m
|
|
71
77
|
[34mℹ[39m [2mdist/[22madapters/drizzle/drizzle-query.js [2m 5.41 kB[22m [2m│ gzip: 1.44 kB[22m
|
|
@@ -73,8 +79,12 @@
|
|
|
73
79
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/alias.js.map [2m 5.13 kB[22m [2m│ gzip: 1.56 kB[22m
|
|
74
80
|
[34mℹ[39m [2mdist/[22mquery/cursor.js.map [2m 5.13 kB[22m [2m│ gzip: 1.81 kB[22m
|
|
75
81
|
[34mℹ[39m [2mdist/[22mmod.js.map [2m 5.02 kB[22m [2m│ gzip: 1.68 kB[22m
|
|
82
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute-postgres.js [2m 4.91 kB[22m [2m│ gzip: 1.39 kB[22m
|
|
83
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute-mysql.js [2m 4.34 kB[22m [2m│ gzip: 1.20 kB[22m
|
|
76
84
|
[34mℹ[39m [2mdist/[22mmigration-engine/auto-from-schema.js [2m 4.33 kB[22m [2m│ gzip: 1.21 kB[22m
|
|
77
85
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/column-builder.js.map [2m 4.32 kB[22m [2m│ gzip: 1.47 kB[22m
|
|
86
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute-base.js [2m 4.31 kB[22m [2m│ gzip: 1.69 kB[22m
|
|
87
|
+
[34mℹ[39m [2mdist/[22mmigration-engine/shared.js.map [2m 3.89 kB[22m [2m│ gzip: 1.25 kB[22m
|
|
78
88
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/utils/array.js.map [2m 3.85 kB[22m [2m│ gzip: 1.25 kB[22m
|
|
79
89
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/query.js [2m 3.81 kB[22m [2m│ gzip: 1.03 kB[22m
|
|
80
90
|
[34mℹ[39m [2mdist/[22madapters/drizzle/drizzle-uow-decoder.js [2m 3.78 kB[22m [2m│ gzip: 1.46 kB[22m
|
|
@@ -92,7 +102,6 @@
|
|
|
92
102
|
[34mℹ[39m [2mdist/[22mshared/settings-schema.js.map [2m 3.19 kB[22m [2m│ gzip: 1.24 kB[22m
|
|
93
103
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/foreign-keys.js.map [2m 3.19 kB[22m [2m│ gzip: 1.15 kB[22m
|
|
94
104
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/foreign-keys.js.map [2m 3.13 kB[22m [2m│ gzip: 1.14 kB[22m
|
|
95
|
-
[34mℹ[39m [2mdist/[22mmigration-engine/shared.js.map [2m 3.12 kB[22m [2m│ gzip: 1.01 kB[22m
|
|
96
105
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/table.js.map [2m 3.08 kB[22m [2m│ gzip: 1.12 kB[22m
|
|
97
106
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/utils.js.map [2m 2.92 kB[22m [2m│ gzip: 0.98 kB[22m
|
|
98
107
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/columns/common.js.map [2m 2.92 kB[22m [2m│ gzip: 1.17 kB[22m
|
|
@@ -102,6 +111,7 @@
|
|
|
102
111
|
[34mℹ[39m [2mdist/[22mmigration-engine/create.js [2m 2.52 kB[22m [2m│ gzip: 0.80 kB[22m
|
|
103
112
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/table.js.map [2m 2.44 kB[22m [2m│ gzip: 0.97 kB[22m
|
|
104
113
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/count.js.map [2m 2.36 kB[22m [2m│ gzip: 1.00 kB[22m
|
|
114
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute.js.map [2m 2.34 kB[22m [2m│ gzip: 0.88 kB[22m
|
|
105
115
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/column.js.map [2m 2.33 kB[22m [2m│ gzip: 0.85 kB[22m
|
|
106
116
|
[34mℹ[39m [2mdist/[22madapters/kysely/kysely-query-compiler.js [2m 2.32 kB[22m [2m│ gzip: 0.61 kB[22m
|
|
107
117
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/unique-constraint.js.map [2m 2.31 kB[22m [2m│ gzip: 0.89 kB[22m
|
|
@@ -120,12 +130,14 @@
|
|
|
120
130
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/columns/enum.js [2m 1.74 kB[22m [2m│ gzip: 0.59 kB[22m
|
|
121
131
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/foreign-keys.js [2m 1.74 kB[22m [2m│ gzip: 0.68 kB[22m
|
|
122
132
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/entity.js.map [2m 1.62 kB[22m [2m│ gzip: 0.83 kB[22m
|
|
133
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute-factory.js.map [2m 1.60 kB[22m [2m│ gzip: 0.62 kB[22m
|
|
123
134
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/unique-constraint.js [2m 1.58 kB[22m [2m│ gzip: 0.61 kB[22m
|
|
124
135
|
[34mℹ[39m [2mdist/[22mshared/settings-schema.js [2m 1.57 kB[22m [2m│ gzip: 0.65 kB[22m
|
|
125
136
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js.map [2m 1.56 kB[22m [2m│ gzip: 0.78 kB[22m
|
|
126
137
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/functions/aggregate.js.map [2m 1.49 kB[22m [2m│ gzip: 0.56 kB[22m
|
|
127
138
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/column.js [2m 1.43 kB[22m [2m│ gzip: 0.58 kB[22m
|
|
128
139
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/count.js [2m 1.42 kB[22m [2m│ gzip: 0.63 kB[22m
|
|
140
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute.js [2m 1.40 kB[22m [2m│ gzip: 0.59 kB[22m
|
|
129
141
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/errors.js.map [2m 1.37 kB[22m [2m│ gzip: 0.63 kB[22m
|
|
130
142
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/unique-constraint.js [2m 1.35 kB[22m [2m│ gzip: 0.55 kB[22m
|
|
131
143
|
[34mℹ[39m [2mdist/[22mquery/orm/orm.js [2m 1.33 kB[22m [2m│ gzip: 0.60 kB[22m
|
|
@@ -136,6 +148,7 @@
|
|
|
136
148
|
[34mℹ[39m [2mdist/[22madapters/kysely/kysely-shared.js.map [2m 1.07 kB[22m [2m│ gzip: 0.53 kB[22m
|
|
137
149
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/subquery.js.map [2m 1.07 kB[22m [2m│ gzip: 0.60 kB[22m
|
|
138
150
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js [2m 1.01 kB[22m [2m│ gzip: 0.54 kB[22m
|
|
151
|
+
[34mℹ[39m [2mdist/[22madapters/kysely/migration/execute-factory.js [2m 0.97 kB[22m [2m│ gzip: 0.39 kB[22m
|
|
139
152
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/entity.js [2m 0.95 kB[22m [2m│ gzip: 0.54 kB[22m
|
|
140
153
|
[34mℹ[39m [2mdist/[22mmod.d.ts.map [2m 0.92 kB[22m [2m│ gzip: 0.49 kB[22m
|
|
141
154
|
[34mℹ[39m [2mdist/[22madapters/drizzle/shared.js [2m 0.87 kB[22m [2m│ gzip: 0.48 kB[22m
|
|
@@ -150,11 +163,11 @@
|
|
|
150
163
|
[34mℹ[39m [2mdist/[22mutil/import-generator.js [2m 0.65 kB[22m [2m│ gzip: 0.36 kB[22m
|
|
151
164
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/expressions/select.js.map [2m 0.64 kB[22m [2m│ gzip: 0.39 kB[22m
|
|
152
165
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/subquery.js [2m 0.64 kB[22m [2m│ gzip: 0.39 kB[22m
|
|
153
|
-
[34mℹ[39m [2mdist/[22mmigration-engine/shared.d.ts.map [2m 0.63 kB[22m [2m│ gzip: 0.32 kB[22m
|
|
154
166
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/view-base.js.map [2m 0.62 kB[22m [2m│ gzip: 0.39 kB[22m
|
|
155
167
|
[34mℹ[39m [2mdist/[22madapters/kysely/kysely-adapter.d.ts.map [2m 0.60 kB[22m [2m│ gzip: 0.32 kB[22m
|
|
156
168
|
[34mℹ[39m [2mdist/[22madapters/adapters.d.ts.map [2m 0.60 kB[22m [2m│ gzip: 0.30 kB[22m
|
|
157
169
|
[34mℹ[39m [2mdist/[22madapters/kysely/kysely-shared.js [2m 0.54 kB[22m [2m│ gzip: 0.31 kB[22m
|
|
170
|
+
[34mℹ[39m [2mdist/[22mmigration-engine/shared.d.ts.map [2m 0.51 kB[22m [2m│ gzip: 0.30 kB[22m
|
|
158
171
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/tracing-utils.js.map [2m 0.50 kB[22m [2m│ gzip: 0.34 kB[22m
|
|
159
172
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/query-builders/query-builder.js [2m 0.49 kB[22m [2m│ gzip: 0.32 kB[22m
|
|
160
173
|
[34mℹ[39m [2mdist/[22mnode_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/view-common.js.map [2m 0.49 kB[22m [2m│ gzip: 0.33 kB[22m
|
|
@@ -176,19 +189,19 @@
|
|
|
176
189
|
[34mℹ[39m [2mdist/[22madapters/drizzle/drizzle-query.d.ts.map [2m 0.17 kB[22m [2m│ gzip: 0.14 kB[22m
|
|
177
190
|
[34mℹ[39m [2mdist/[22madapters/drizzle/drizzle-uow-compiler.d.ts.map [2m 0.17 kB[22m [2m│ gzip: 0.14 kB[22m
|
|
178
191
|
[34mℹ[39m [2mdist/[22mshared/providers.d.ts.map [2m 0.15 kB[22m [2m│ gzip: 0.13 kB[22m
|
|
179
|
-
[34mℹ[39m [2mdist/[22m[32m[1mschema/create.d.ts[22m[39m [2m19.
|
|
180
|
-
[34mℹ[39m [2mdist/[22m[32m[1mquery/unit-of-work.d.ts[22m[39m [2m17.
|
|
181
|
-
[34mℹ[39m [2mdist/[22m[32m[1mquery/query.d.ts[22m[39m [2m 6.
|
|
192
|
+
[34mℹ[39m [2mdist/[22m[32m[1mschema/create.d.ts[22m[39m [2m19.46 kB[22m [2m│ gzip: 4.72 kB[22m
|
|
193
|
+
[34mℹ[39m [2mdist/[22m[32m[1mquery/unit-of-work.d.ts[22m[39m [2m17.42 kB[22m [2m│ gzip: 4.23 kB[22m
|
|
194
|
+
[34mℹ[39m [2mdist/[22m[32m[1mquery/query.d.ts[22m[39m [2m 6.17 kB[22m [2m│ gzip: 1.57 kB[22m
|
|
182
195
|
[34mℹ[39m [2mdist/[22m[32m[1mquery/cursor.d.ts[22m[39m [2m 2.57 kB[22m [2m│ gzip: 0.93 kB[22m
|
|
183
196
|
[34mℹ[39m [2mdist/[22m[32m[1mfragment.d.ts[22m[39m [2m 2.39 kB[22m [2m│ gzip: 0.75 kB[22m
|
|
184
197
|
[34mℹ[39m [2mdist/[22m[32m[1mmod.d.ts[22m[39m [2m 2.23 kB[22m [2m│ gzip: 0.73 kB[22m
|
|
185
198
|
[34mℹ[39m [2mdist/[22m[32m[1mmigration-engine/generation-engine.d.ts[22m[39m [2m 1.99 kB[22m [2m│ gzip: 0.72 kB[22m
|
|
199
|
+
[34mℹ[39m [2mdist/[22m[32m[1madapters/adapters.d.ts[22m[39m [2m 1.10 kB[22m [2m│ gzip: 0.51 kB[22m
|
|
186
200
|
[34mℹ[39m [2mdist/[22m[32m[1madapters/drizzle/drizzle-adapter.d.ts[22m[39m [2m 1.09 kB[22m [2m│ gzip: 0.49 kB[22m
|
|
187
201
|
[34mℹ[39m [2mdist/[22m[32m[1madapters/kysely/kysely-adapter.d.ts[22m[39m [2m 0.94 kB[22m [2m│ gzip: 0.44 kB[22m
|
|
188
202
|
[34mℹ[39m [2mdist/[22m[32m[1mid.d.ts[22m[39m [2m 0.07 kB[22m [2m│ gzip: 0.07 kB[22m
|
|
189
|
-
[34mℹ[39m [2mdist/[22m[32mmigration-engine/shared.d.ts[39m [2m 2.
|
|
203
|
+
[34mℹ[39m [2mdist/[22m[32mmigration-engine/shared.d.ts[39m [2m 2.76 kB[22m [2m│ gzip: 0.99 kB[22m
|
|
190
204
|
[34mℹ[39m [2mdist/[22m[32mquery/condition-builder.d.ts[39m [2m 2.00 kB[22m [2m│ gzip: 0.68 kB[22m
|
|
191
|
-
[34mℹ[39m [2mdist/[22m[32madapters/adapters.d.ts[39m [2m 1.10 kB[22m [2m│ gzip: 0.51 kB[22m
|
|
192
205
|
[34mℹ[39m [2mdist/[22m[32mmigration-engine/create.d.ts[39m [2m 1.10 kB[22m [2m│ gzip: 0.51 kB[22m
|
|
193
206
|
[34mℹ[39m [2mdist/[22m[32mquery/orm/orm.d.ts[39m [2m 0.61 kB[22m [2m│ gzip: 0.34 kB[22m
|
|
194
207
|
[34mℹ[39m [2mdist/[22m[32madapters/drizzle/drizzle-query.d.ts[39m [2m 0.51 kB[22m [2m│ gzip: 0.31 kB[22m
|
|
@@ -196,5 +209,5 @@
|
|
|
196
209
|
[34mℹ[39m [2mdist/[22m[32mshared/providers.d.ts[39m [2m 0.26 kB[22m [2m│ gzip: 0.19 kB[22m
|
|
197
210
|
[34mℹ[39m [2mdist/[22m[32mutil/types.d.ts[39m [2m 0.26 kB[22m [2m│ gzip: 0.21 kB[22m
|
|
198
211
|
[34mℹ[39m [2mdist/[22m[32madapters/drizzle/drizzle-uow-compiler.d.ts[39m [2m 0.22 kB[22m [2m│ gzip: 0.17 kB[22m
|
|
199
|
-
[34mℹ[39m
|
|
200
|
-
[32m✔[39m Build complete in [
|
|
212
|
+
[34mℹ[39m 202 files, total: 1078.36 kB
|
|
213
|
+
[32m✔[39m Build complete in [32m9629ms[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @fragno-dev/db
|
|
2
2
|
|
|
3
|
+
## 0.1.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 8b2859c: fix(SQLite + Kysely): fix migrations hanging in some cases
|
|
8
|
+
|
|
9
|
+
## 0.1.4
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 5d56f48: fix(SQLite + Kysely): foreign key references now generate valid migrations
|
|
14
|
+
- fd3ddd2: fix(Drizzle): properly sanitize table references in foreign keys
|
|
15
|
+
|
|
3
16
|
## 0.1.3
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -190,7 +190,7 @@ function generateForeignKeys(ctx, table, namespace) {
|
|
|
190
190
|
const actualRefCol = refCol === "id" ? "_internalId" : refCol;
|
|
191
191
|
if (isSelfReference) foreignColumns.push(`table.${actualRefCol}`);
|
|
192
192
|
else {
|
|
193
|
-
const foreignTableRef =
|
|
193
|
+
const foreignTableRef = namespace ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}` : relation.table.ormName;
|
|
194
194
|
foreignColumns.push(`${foreignTableRef}.${actualRefCol}`);
|
|
195
195
|
}
|
|
196
196
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","names":["parts: string[]","params: string[]","value: string","keys: string[]","columns: string[]","foreignColumns: string[]","indexes: string[]","args: string[]","relations: string[]","options: string[]","fields: string[]","references: string[]","tableRef","entries: string[]","customTypes: string[]","sections: string[]","fragmentTables: string[]"],"sources":["../../../src/adapters/drizzle/generate.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 InternalIdColumn,\n} from \"../../schema/create\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport { schemaToDBType, type DBTypeLiteral } from \"../../schema/serialize\";\nimport { createTableNameMapper } from \"./shared\";\nimport { settingsSchema, SETTINGS_TABLE_NAME } from \"../../shared/settings-schema\";\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 = Exclude<SQLProvider, \"cockroachdb\" | \"mssql\">;\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: SupportedProvider,\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 code = generateCustomType(ctx, name, {\n dataType: \"Uint8Array\",\n driverDataType: \"Buffer\",\n databaseDataType: schemaToDBType({ type: \"binary\" }, ctx.provider),\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 schemaToDBType 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 schemaToDBType\n const dbType = schemaToDBType(column, ctx.provider);\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: DBTypeLiteral,\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 return { name: \"bigint\" };\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: \"blob\", 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// COLUMN GENERATION\n// ============================================================================\n\nfunction generateColumnDefinition(\n ctx: GeneratorContext,\n column: AnyColumn,\n customTypes: string[],\n): string {\n const parts: string[] = [];\n const typeFn = getColumnTypeFunction(ctx, column, customTypes);\n\n // Column type with parameters\n const params: string[] = [`\"${column.name}\"`, ...(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 // 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 parts.push(\"defaultNow()\");\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.ormName}: ${parts.join(\".\")}`;\n}\n\nfunction generateAllColumns(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n): string[] {\n return Object.values(table.columns).map((column) =>\n generateColumnDefinition(ctx, column, customTypes),\n );\n}\n\n// ============================================================================\n// CONSTRAINT GENERATION\n// ============================================================================\n\nfunction generateForeignKeys(ctx: GeneratorContext, table: AnyTable, namespace?: string): string[] {\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\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.ormName === table.ormName;\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 // Suffix the foreign table reference with namespace if provided\n const foreignTableRef =\n mapper && namespace ? mapper.toPhysical(relation.table.ormName) : relation.table.ormName;\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 =\n namespace && mapper\n ? \"fk_\" + mapper.toPhysical(`${table.ormName}_${relation.table.ormName}_${relation.name}`)\n : `${table.ormName}_${relation.table.ormName}_${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(ctx: GeneratorContext, table: AnyTable, namespace?: string): string[] {\n const indexes: string[] = [];\n\n for (const idx of Object.values(table.indexes)) {\n const columns = idx.columns.map((col) => `table.${col.ormName}`).join(\", \");\n\n // Include namespace in index name to avoid collisions\n const indexName = namespace ? `${idx.name}_${namespace}` : 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,\n): string[] {\n return [...generateForeignKeys(ctx, table, namespace), ...generateIndexes(ctx, table, namespace)];\n}\n\n// ============================================================================\n// TABLE GENERATION\n// ============================================================================\n\nfunction generateTable(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n namespace?: string,\n): string {\n const tableFn = PROVIDER_TABLE_FUNCTIONS[ctx.provider];\n ctx.imports.addImport(tableFn, ctx.importSource);\n\n const columns = generateAllColumns(ctx, table, customTypes);\n const constraints = generateTableConstraints(ctx, table, namespace);\n\n // Suffix table name with namespace if provided\n const physicalTableName = namespace ? `${table.ormName}_${namespace}` : table.ormName;\n // Sanitize namespace for use in export name (valid JS identifier)\n const exportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;\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,\n): string | undefined {\n const relations: string[] = [];\n let hasOne = false;\n let hasMany = false;\n\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 namespace for identifier references\n const tableRef = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}`\n : table.ormName;\n const relatedTableRef = namespace\n ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`\n : relation.table.ormName;\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.ormName}_${sanitizeNamespace(namespace)}`\n : relation.table.ormName;\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 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 const tableRef = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;\n const relationsName = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}Relations`\n : `${table.ormName}Relations`;\n\n ctx.imports.addImport(\"relations\", \"drizzle-orm\");\n return `export const ${relationsName} = relations(${tableRef}, (${relationParams}) => ({\n${relations.join(\",\\n\")}\n}));`;\n}\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\n/**\n * Sanitize a namespace to be a valid JavaScript identifier\n * Replaces hyphens and other invalid characters with underscores\n */\nfunction sanitizeNamespace(namespace: string): string {\n return namespace.replace(/[^a-zA-Z0-9_]/g, \"_\");\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(schema: AnySchema, namespace: string): string {\n const entries: string[] = [];\n\n for (const table of Object.values(schema.tables)) {\n const physicalExportName = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}`\n : table.ormName;\n\n if (namespace) {\n const physicalTableName = namespace ? `${table.ormName}_${namespace}` : table.ormName;\n // Use physical table name as key for Drizzle schema lookups\n entries.push(` \"${physicalTableName}\": ${physicalExportName}`);\n }\n\n // Also provide logical name for convenience\n entries.push(` ${table.ormName}: ${physicalExportName}`);\n }\n\n // Add schema version as a number\n entries.push(` schemaVersion: ${schema.version}`);\n\n const exportName = namespace ? `${sanitizeNamespace(namespace)}_schema` : \"_schema\";\n\n return `export const ${exportName} = {\\n${entries.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}\n\n/**\n * Generate a settings table for storing fragment versions\n */\nfunction generateSettingsTable(ctx: GeneratorContext): string {\n // Use centralized settings schema\n\n // Extract the table from the schema\n const settingsTable =\n settingsSchema.tables[SETTINGS_TABLE_NAME as keyof typeof settingsSchema.tables];\n\n // Generate the table using the existing generateTable function\n const customTypes: string[] = [];\n return generateTable(ctx, settingsTable, customTypes);\n}\n\n/**\n * Generate a schema file from one or more fragments with a shared settings table\n */\nexport function generateSchema(\n fragments: { namespace: string; schema: AnySchema }[],\n provider: SupportedProvider,\n options?: GenerateSchemaOptions,\n): string {\n const ctx = createContext(provider, options?.idGeneratorImport);\n const customTypes: string[] = [];\n const sections: string[] = [];\n\n // Generate settings table first\n sections.push(\"\");\n sections.push(\"// ============================================================================\");\n sections.push(\"// Settings Table (shared across all fragments)\");\n sections.push(\"// ============================================================================\");\n sections.push(\"\");\n sections.push(generateSettingsTable(ctx));\n sections.push(\"\");\n sections.push(`export const fragnoDbSettingSchemaVersion = ${settingsSchema.version};`);\n\n // Generate each fragment's tables\n for (const { namespace, schema } of fragments) {\n const fragmentTables: string[] = [];\n\n // Add section header\n fragmentTables.push(\"\");\n fragmentTables.push(\n \"// ============================================================================\",\n );\n fragmentTables.push(`// Fragment: ${namespace}`);\n fragmentTables.push(\n \"// ============================================================================\",\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);\n fragmentTables.push(\"\");\n fragmentTables.push(tableCode);\n\n const relationCode = generateRelation(ctx, table, namespace);\n if (relationCode) {\n fragmentTables.push(\"\");\n fragmentTables.push(relationCode);\n }\n }\n\n // Generate schema export object\n fragmentTables.push(\"\");\n fragmentTables.push(generateFragmentSchemaExport(schema, namespace));\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":";;;;;;;;AAiBA,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;CACb,MAAM,OAAO,mBAAmB,KAAK,MAAM;EACzC,UAAU;EACV,gBAAgB;EAChB,kBAAkB,eAAe,EAAE,MAAM,UAAU,EAAE,IAAI,SAAS;EAClE,gBAAgB;EAChB,cAAc;EACf,CAAC;AAEF,KAAI,KACF,aAAY,KAAK,KAAK;AAExB,QAAO;;;;;;AAiBT,SAAS,sBACP,KACA,QACA,aACoB;AAKpB,QAAO,2BAA2B,KAHnB,eAAe,QAAQ,IAAI,SAAS,EAGJ,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,SACH,QAAO,EAAE,MAAM,UAAU;EAC3B;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;;AAOzB,SAAS,yBACP,KACA,QACA,aACQ;CACR,MAAMA,QAAkB,EAAE;CAC1B,MAAM,SAAS,sBAAsB,KAAK,QAAQ,YAAY;CAG9D,MAAMC,SAAmB,CAAC,IAAI,OAAO,KAAK,IAAI,GAAI,OAAO,UAAU,EAAE,CAAE;AACvE,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,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,OAAM,KAAK,eAAe;aAEnB,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,QAAQ,IAAI,MAAM,KAAK,IAAI;;AAGhD,SAAS,mBACP,KACA,OACA,aACU;AACV,QAAO,OAAO,OAAO,MAAM,QAAQ,CAAC,KAAK,WACvC,yBAAyB,KAAK,QAAQ,YAAY,CACnD;;AAOH,SAAS,oBAAoB,KAAuB,OAAiB,WAA8B;CACjG,MAAM,SAAS,YAAY,sBAAsB,UAAU,GAAG;CAC9D,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,YAAY,MAAM;AAEzD,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,kBACJ,UAAU,YAAY,OAAO,WAAW,SAAS,MAAM,QAAQ,GAAG,SAAS,MAAM;AACnF,mBAAe,KAAK,GAAG,gBAAgB,GAAG,eAAe;;;AAI7D,MAAI,QAAQ,UAAU,cAAc,IAAI,aAAa;EAErD,MAAM,SACJ,aAAa,SACT,QAAQ,OAAO,WAAW,GAAG,MAAM,QAAQ,GAAG,SAAS,MAAM,QAAQ,GAAG,SAAS,OAAO,GACxF,GAAG,MAAM,QAAQ,GAAG,SAAS,MAAM,QAAQ,GAAG,SAAS,KAAK;AAElE,OAAK,KAAK;cACA,QAAQ,KAAK,KAAK,CAAC;qBACZ,eAAe,KAAK,KAAK,CAAC;WACpC,OAAO;IACd;;AAGF,QAAO;;AAGT,SAAS,gBAAgB,KAAuB,OAAiB,WAA8B;CAC7F,MAAMC,UAAoB,EAAE;AAE5B,MAAK,MAAM,OAAO,OAAO,OAAO,MAAM,QAAQ,EAAE;EAC9C,MAAM,UAAU,IAAI,QAAQ,KAAK,QAAQ,SAAS,IAAI,UAAU,CAAC,KAAK,KAAK;EAG3E,MAAM,YAAY,YAAY,GAAG,IAAI,KAAK,GAAG,cAAc,IAAI;AAE/D,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,WACU;AACV,QAAO,CAAC,GAAG,oBAAoB,KAAK,OAAO,UAAU,EAAE,GAAG,gBAAgB,KAAK,OAAO,UAAU,CAAC;;AAOnG,SAAS,cACP,KACA,OACA,aACA,WACQ;CACR,MAAM,UAAU,yBAAyB,IAAI;AAC7C,KAAI,QAAQ,UAAU,SAAS,IAAI,aAAa;CAEhD,MAAM,UAAU,mBAAmB,KAAK,OAAO,YAAY;CAC3D,MAAM,cAAc,yBAAyB,KAAK,OAAO,UAAU;CAGnE,MAAM,oBAAoB,YAAY,GAAG,MAAM,QAAQ,GAAG,cAAc,MAAM;CAE9E,MAAM,aAAa,YAAY,GAAG,MAAM,QAAQ,GAAG,kBAAkB,UAAU,KAAK,MAAM;CAE1F,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,WACoB;CACpB,MAAMC,YAAsB,EAAE;CAC9B,IAAI,SAAS;CACb,IAAI,UAAU;AAEd,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,MAAMC,aAAW,YACb,GAAG,MAAM,QAAQ,GAAG,kBAAkB,UAAU,KAChD,MAAM;GACV,MAAM,kBAAkB,YACpB,GAAG,SAAS,MAAM,QAAQ,GAAG,kBAAkB,UAAU,KACzD,SAAS,MAAM;AAEnB,QAAK,MAAM,CAAC,MAAM,UAAU,SAAS,IAAI;AACvC,WAAO,KAAK,GAAGA,WAAS,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,MAAML,OAAiB,CAJC,YACpB,GAAG,SAAS,MAAM,QAAQ,GAAG,kBAAkB,UAAU,KACzD,SAAS,MAAM,QAEqB;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;;AAGjF,KAAI,UAAU,WAAW,EACvB;CAIF,MAAMN,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;CAExE,MAAM,WAAW,YAAY,GAAG,MAAM,QAAQ,GAAG,kBAAkB,UAAU,KAAK,MAAM;CACxF,MAAM,gBAAgB,YAClB,GAAG,MAAM,QAAQ,GAAG,kBAAkB,UAAU,CAAC,aACjD,GAAG,MAAM,QAAQ;AAErB,KAAI,QAAQ,UAAU,aAAa,cAAc;AACjD,QAAO,gBAAgB,cAAc,eAAe,SAAS,KAAK,eAAe;EACjF,UAAU,KAAK,MAAM,CAAC;;;;;;;AAYxB,SAAS,kBAAkB,WAA2B;AACpD,QAAO,UAAU,QAAQ,kBAAkB,IAAI;;;;;;AAOjD,SAAS,6BAA6B,QAAmB,WAA2B;CAClF,MAAMY,UAAoB,EAAE;AAE5B,MAAK,MAAM,SAAS,OAAO,OAAO,OAAO,OAAO,EAAE;EAChD,MAAM,qBAAqB,YACvB,GAAG,MAAM,QAAQ,GAAG,kBAAkB,UAAU,KAChD,MAAM;AAEV,MAAI,WAAW;GACb,MAAM,oBAAoB,YAAY,GAAG,MAAM,QAAQ,GAAG,cAAc,MAAM;AAE9E,WAAQ,KAAK,MAAM,kBAAkB,KAAK,qBAAqB;;AAIjE,UAAQ,KAAK,KAAK,MAAM,QAAQ,IAAI,qBAAqB;;AAI3D,SAAQ,KAAK,oBAAoB,OAAO,UAAU;AAIlD,QAAO,gBAFY,YAAY,GAAG,kBAAkB,UAAU,CAAC,WAAW,UAExC,QAAQ,QAAQ,KAAK,MAAM,CAAC;;;;;AAoBhE,SAAS,sBAAsB,KAA+B;CAI5D,MAAM,gBACJ,eAAe,OAAO;AAIxB,QAAO,cAAc,KAAK,eADI,EAAE,CACqB;;;;;AAMvD,SAAgB,eACd,WACA,UACA,SACQ;CACR,MAAM,MAAM,cAAc,UAAU,SAAS,kBAAkB;CAC/D,MAAMC,cAAwB,EAAE;CAChC,MAAMC,WAAqB,EAAE;AAG7B,UAAS,KAAK,GAAG;AACjB,UAAS,KAAK,kFAAkF;AAChG,UAAS,KAAK,kDAAkD;AAChE,UAAS,KAAK,kFAAkF;AAChG,UAAS,KAAK,GAAG;AACjB,UAAS,KAAK,sBAAsB,IAAI,CAAC;AACzC,UAAS,KAAK,GAAG;AACjB,UAAS,KAAK,+CAA+C,eAAe,QAAQ,GAAG;AAGvF,MAAK,MAAM,EAAE,WAAW,YAAY,WAAW;EAC7C,MAAMC,iBAA2B,EAAE;AAGnC,iBAAe,KAAK,GAAG;AACvB,iBAAe,KACb,kFACD;AACD,iBAAe,KAAK,gBAAgB,YAAY;AAChD,iBAAe,KACb,kFACD;AAGD,OAAK,MAAM,SAAS,OAAO,OAAO,OAAO,OAAO,EAAE;GAChD,MAAM,YAAY,cAAc,KAAK,OAAO,aAAa,UAAU;AACnE,kBAAe,KAAK,GAAG;AACvB,kBAAe,KAAK,UAAU;GAE9B,MAAM,eAAe,iBAAiB,KAAK,OAAO,UAAU;AAC5D,OAAI,cAAc;AAChB,mBAAe,KAAK,GAAG;AACvB,mBAAe,KAAK,aAAa;;;AAKrC,iBAAe,KAAK,GAAG;AACvB,iBAAe,KAAK,6BAA6B,QAAQ,UAAU,CAAC;AAEpE,WAAS,KAAK,GAAG,eAAe;;AAKlC,QADwB;EAAC,IAAI,QAAQ,QAAQ;EAAE,GAAG;EAAa,GAAG;EAAS,CAC9D,KAAK,KAAK"}
|
|
1
|
+
{"version":3,"file":"generate.js","names":["parts: string[]","params: string[]","value: string","keys: string[]","columns: string[]","foreignColumns: string[]","indexes: string[]","args: string[]","relations: string[]","options: string[]","fields: string[]","references: string[]","tableRef","entries: string[]","customTypes: string[]","sections: string[]","fragmentTables: string[]"],"sources":["../../../src/adapters/drizzle/generate.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 InternalIdColumn,\n} from \"../../schema/create\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport { schemaToDBType, type DBTypeLiteral } from \"../../schema/serialize\";\nimport { createTableNameMapper } from \"./shared\";\nimport { settingsSchema, SETTINGS_TABLE_NAME } from \"../../shared/settings-schema\";\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 = Exclude<SQLProvider, \"cockroachdb\" | \"mssql\">;\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: SupportedProvider,\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 code = generateCustomType(ctx, name, {\n dataType: \"Uint8Array\",\n driverDataType: \"Buffer\",\n databaseDataType: schemaToDBType({ type: \"binary\" }, ctx.provider),\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 schemaToDBType 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 schemaToDBType\n const dbType = schemaToDBType(column, ctx.provider);\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: DBTypeLiteral,\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 return { name: \"bigint\" };\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: \"blob\", 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// COLUMN GENERATION\n// ============================================================================\n\nfunction generateColumnDefinition(\n ctx: GeneratorContext,\n column: AnyColumn,\n customTypes: string[],\n): string {\n const parts: string[] = [];\n const typeFn = getColumnTypeFunction(ctx, column, customTypes);\n\n // Column type with parameters\n const params: string[] = [`\"${column.name}\"`, ...(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 // 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 parts.push(\"defaultNow()\");\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.ormName}: ${parts.join(\".\")}`;\n}\n\nfunction generateAllColumns(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n): string[] {\n return Object.values(table.columns).map((column) =>\n generateColumnDefinition(ctx, column, customTypes),\n );\n}\n\n// ============================================================================\n// CONSTRAINT GENERATION\n// ============================================================================\n\nfunction generateForeignKeys(ctx: GeneratorContext, table: AnyTable, namespace?: string): string[] {\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\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.ormName === table.ormName;\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 // Suffix the foreign table reference with namespace if provided\n const foreignTableRef = namespace\n ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`\n : relation.table.ormName;\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 =\n namespace && mapper\n ? \"fk_\" + mapper.toPhysical(`${table.ormName}_${relation.table.ormName}_${relation.name}`)\n : `${table.ormName}_${relation.table.ormName}_${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(ctx: GeneratorContext, table: AnyTable, namespace?: string): string[] {\n const indexes: string[] = [];\n\n for (const idx of Object.values(table.indexes)) {\n const columns = idx.columns.map((col) => `table.${col.ormName}`).join(\", \");\n\n // Include namespace in index name to avoid collisions\n const indexName = namespace ? `${idx.name}_${namespace}` : 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,\n): string[] {\n return [...generateForeignKeys(ctx, table, namespace), ...generateIndexes(ctx, table, namespace)];\n}\n\n// ============================================================================\n// TABLE GENERATION\n// ============================================================================\n\nfunction generateTable(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n namespace?: string,\n): string {\n const tableFn = PROVIDER_TABLE_FUNCTIONS[ctx.provider];\n ctx.imports.addImport(tableFn, ctx.importSource);\n\n const columns = generateAllColumns(ctx, table, customTypes);\n const constraints = generateTableConstraints(ctx, table, namespace);\n\n // Suffix table name with namespace if provided\n const physicalTableName = namespace ? `${table.ormName}_${namespace}` : table.ormName;\n // Sanitize namespace for use in export name (valid JS identifier)\n const exportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;\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,\n): string | undefined {\n const relations: string[] = [];\n let hasOne = false;\n let hasMany = false;\n\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 namespace for identifier references\n const tableRef = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}`\n : table.ormName;\n const relatedTableRef = namespace\n ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`\n : relation.table.ormName;\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.ormName}_${sanitizeNamespace(namespace)}`\n : relation.table.ormName;\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 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 const tableRef = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;\n const relationsName = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}Relations`\n : `${table.ormName}Relations`;\n\n ctx.imports.addImport(\"relations\", \"drizzle-orm\");\n return `export const ${relationsName} = relations(${tableRef}, (${relationParams}) => ({\n${relations.join(\",\\n\")}\n}));`;\n}\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\n/**\n * Sanitize a namespace to be a valid JavaScript identifier\n * Replaces hyphens and other invalid characters with underscores\n */\nfunction sanitizeNamespace(namespace: string): string {\n return namespace.replace(/[^a-zA-Z0-9_]/g, \"_\");\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(schema: AnySchema, namespace: string): string {\n const entries: string[] = [];\n\n for (const table of Object.values(schema.tables)) {\n const physicalExportName = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}`\n : table.ormName;\n\n if (namespace) {\n const physicalTableName = namespace ? `${table.ormName}_${namespace}` : table.ormName;\n // Use physical table name as key for Drizzle schema lookups\n entries.push(` \"${physicalTableName}\": ${physicalExportName}`);\n }\n\n // Also provide logical name for convenience\n entries.push(` ${table.ormName}: ${physicalExportName}`);\n }\n\n // Add schema version as a number\n entries.push(` schemaVersion: ${schema.version}`);\n\n const exportName = namespace ? `${sanitizeNamespace(namespace)}_schema` : \"_schema\";\n\n return `export const ${exportName} = {\\n${entries.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}\n\n/**\n * Generate a settings table for storing fragment versions\n */\nfunction generateSettingsTable(ctx: GeneratorContext): string {\n // Use centralized settings schema\n\n // Extract the table from the schema\n const settingsTable =\n settingsSchema.tables[SETTINGS_TABLE_NAME as keyof typeof settingsSchema.tables];\n\n // Generate the table using the existing generateTable function\n const customTypes: string[] = [];\n return generateTable(ctx, settingsTable, customTypes);\n}\n\n/**\n * Generate a schema file from one or more fragments with a shared settings table\n */\nexport function generateSchema(\n fragments: { namespace: string; schema: AnySchema }[],\n provider: SupportedProvider,\n options?: GenerateSchemaOptions,\n): string {\n const ctx = createContext(provider, options?.idGeneratorImport);\n const customTypes: string[] = [];\n const sections: string[] = [];\n\n // Generate settings table first\n sections.push(\"\");\n sections.push(\"// ============================================================================\");\n sections.push(\"// Settings Table (shared across all fragments)\");\n sections.push(\"// ============================================================================\");\n sections.push(\"\");\n sections.push(generateSettingsTable(ctx));\n sections.push(\"\");\n sections.push(`export const fragnoDbSettingSchemaVersion = ${settingsSchema.version};`);\n\n // Generate each fragment's tables\n for (const { namespace, schema } of fragments) {\n const fragmentTables: string[] = [];\n\n // Add section header\n fragmentTables.push(\"\");\n fragmentTables.push(\n \"// ============================================================================\",\n );\n fragmentTables.push(`// Fragment: ${namespace}`);\n fragmentTables.push(\n \"// ============================================================================\",\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);\n fragmentTables.push(\"\");\n fragmentTables.push(tableCode);\n\n const relationCode = generateRelation(ctx, table, namespace);\n if (relationCode) {\n fragmentTables.push(\"\");\n fragmentTables.push(relationCode);\n }\n }\n\n // Generate schema export object\n fragmentTables.push(\"\");\n fragmentTables.push(generateFragmentSchemaExport(schema, namespace));\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":";;;;;;;;AAiBA,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;CACb,MAAM,OAAO,mBAAmB,KAAK,MAAM;EACzC,UAAU;EACV,gBAAgB;EAChB,kBAAkB,eAAe,EAAE,MAAM,UAAU,EAAE,IAAI,SAAS;EAClE,gBAAgB;EAChB,cAAc;EACf,CAAC;AAEF,KAAI,KACF,aAAY,KAAK,KAAK;AAExB,QAAO;;;;;;AAiBT,SAAS,sBACP,KACA,QACA,aACoB;AAKpB,QAAO,2BAA2B,KAHnB,eAAe,QAAQ,IAAI,SAAS,EAGJ,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,SACH,QAAO,EAAE,MAAM,UAAU;EAC3B;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;;AAOzB,SAAS,yBACP,KACA,QACA,aACQ;CACR,MAAMA,QAAkB,EAAE;CAC1B,MAAM,SAAS,sBAAsB,KAAK,QAAQ,YAAY;CAG9D,MAAMC,SAAmB,CAAC,IAAI,OAAO,KAAK,IAAI,GAAI,OAAO,UAAU,EAAE,CAAE;AACvE,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,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,OAAM,KAAK,eAAe;aAEnB,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,QAAQ,IAAI,MAAM,KAAK,IAAI;;AAGhD,SAAS,mBACP,KACA,OACA,aACU;AACV,QAAO,OAAO,OAAO,MAAM,QAAQ,CAAC,KAAK,WACvC,yBAAyB,KAAK,QAAQ,YAAY,CACnD;;AAOH,SAAS,oBAAoB,KAAuB,OAAiB,WAA8B;CACjG,MAAM,SAAS,YAAY,sBAAsB,UAAU,GAAG;CAC9D,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,YAAY,MAAM;AAEzD,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,QAAQ,GAAG,kBAAkB,UAAU,KACzD,SAAS,MAAM;AACnB,mBAAe,KAAK,GAAG,gBAAgB,GAAG,eAAe;;;AAI7D,MAAI,QAAQ,UAAU,cAAc,IAAI,aAAa;EAErD,MAAM,SACJ,aAAa,SACT,QAAQ,OAAO,WAAW,GAAG,MAAM,QAAQ,GAAG,SAAS,MAAM,QAAQ,GAAG,SAAS,OAAO,GACxF,GAAG,MAAM,QAAQ,GAAG,SAAS,MAAM,QAAQ,GAAG,SAAS,KAAK;AAElE,OAAK,KAAK;cACA,QAAQ,KAAK,KAAK,CAAC;qBACZ,eAAe,KAAK,KAAK,CAAC;WACpC,OAAO;IACd;;AAGF,QAAO;;AAGT,SAAS,gBAAgB,KAAuB,OAAiB,WAA8B;CAC7F,MAAMC,UAAoB,EAAE;AAE5B,MAAK,MAAM,OAAO,OAAO,OAAO,MAAM,QAAQ,EAAE;EAC9C,MAAM,UAAU,IAAI,QAAQ,KAAK,QAAQ,SAAS,IAAI,UAAU,CAAC,KAAK,KAAK;EAG3E,MAAM,YAAY,YAAY,GAAG,IAAI,KAAK,GAAG,cAAc,IAAI;AAE/D,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,WACU;AACV,QAAO,CAAC,GAAG,oBAAoB,KAAK,OAAO,UAAU,EAAE,GAAG,gBAAgB,KAAK,OAAO,UAAU,CAAC;;AAOnG,SAAS,cACP,KACA,OACA,aACA,WACQ;CACR,MAAM,UAAU,yBAAyB,IAAI;AAC7C,KAAI,QAAQ,UAAU,SAAS,IAAI,aAAa;CAEhD,MAAM,UAAU,mBAAmB,KAAK,OAAO,YAAY;CAC3D,MAAM,cAAc,yBAAyB,KAAK,OAAO,UAAU;CAGnE,MAAM,oBAAoB,YAAY,GAAG,MAAM,QAAQ,GAAG,cAAc,MAAM;CAE9E,MAAM,aAAa,YAAY,GAAG,MAAM,QAAQ,GAAG,kBAAkB,UAAU,KAAK,MAAM;CAE1F,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,WACoB;CACpB,MAAMC,YAAsB,EAAE;CAC9B,IAAI,SAAS;CACb,IAAI,UAAU;AAEd,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,MAAMC,aAAW,YACb,GAAG,MAAM,QAAQ,GAAG,kBAAkB,UAAU,KAChD,MAAM;GACV,MAAM,kBAAkB,YACpB,GAAG,SAAS,MAAM,QAAQ,GAAG,kBAAkB,UAAU,KACzD,SAAS,MAAM;AAEnB,QAAK,MAAM,CAAC,MAAM,UAAU,SAAS,IAAI;AACvC,WAAO,KAAK,GAAGA,WAAS,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,MAAML,OAAiB,CAJC,YACpB,GAAG,SAAS,MAAM,QAAQ,GAAG,kBAAkB,UAAU,KACzD,SAAS,MAAM,QAEqB;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;;AAGjF,KAAI,UAAU,WAAW,EACvB;CAIF,MAAMN,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;CAExE,MAAM,WAAW,YAAY,GAAG,MAAM,QAAQ,GAAG,kBAAkB,UAAU,KAAK,MAAM;CACxF,MAAM,gBAAgB,YAClB,GAAG,MAAM,QAAQ,GAAG,kBAAkB,UAAU,CAAC,aACjD,GAAG,MAAM,QAAQ;AAErB,KAAI,QAAQ,UAAU,aAAa,cAAc;AACjD,QAAO,gBAAgB,cAAc,eAAe,SAAS,KAAK,eAAe;EACjF,UAAU,KAAK,MAAM,CAAC;;;;;;;AAYxB,SAAS,kBAAkB,WAA2B;AACpD,QAAO,UAAU,QAAQ,kBAAkB,IAAI;;;;;;AAOjD,SAAS,6BAA6B,QAAmB,WAA2B;CAClF,MAAMY,UAAoB,EAAE;AAE5B,MAAK,MAAM,SAAS,OAAO,OAAO,OAAO,OAAO,EAAE;EAChD,MAAM,qBAAqB,YACvB,GAAG,MAAM,QAAQ,GAAG,kBAAkB,UAAU,KAChD,MAAM;AAEV,MAAI,WAAW;GACb,MAAM,oBAAoB,YAAY,GAAG,MAAM,QAAQ,GAAG,cAAc,MAAM;AAE9E,WAAQ,KAAK,MAAM,kBAAkB,KAAK,qBAAqB;;AAIjE,UAAQ,KAAK,KAAK,MAAM,QAAQ,IAAI,qBAAqB;;AAI3D,SAAQ,KAAK,oBAAoB,OAAO,UAAU;AAIlD,QAAO,gBAFY,YAAY,GAAG,kBAAkB,UAAU,CAAC,WAAW,UAExC,QAAQ,QAAQ,KAAK,MAAM,CAAC;;;;;AAoBhE,SAAS,sBAAsB,KAA+B;CAI5D,MAAM,gBACJ,eAAe,OAAO;AAIxB,QAAO,cAAc,KAAK,eADI,EAAE,CACqB;;;;;AAMvD,SAAgB,eACd,WACA,UACA,SACQ;CACR,MAAM,MAAM,cAAc,UAAU,SAAS,kBAAkB;CAC/D,MAAMC,cAAwB,EAAE;CAChC,MAAMC,WAAqB,EAAE;AAG7B,UAAS,KAAK,GAAG;AACjB,UAAS,KAAK,kFAAkF;AAChG,UAAS,KAAK,kDAAkD;AAChE,UAAS,KAAK,kFAAkF;AAChG,UAAS,KAAK,GAAG;AACjB,UAAS,KAAK,sBAAsB,IAAI,CAAC;AACzC,UAAS,KAAK,GAAG;AACjB,UAAS,KAAK,+CAA+C,eAAe,QAAQ,GAAG;AAGvF,MAAK,MAAM,EAAE,WAAW,YAAY,WAAW;EAC7C,MAAMC,iBAA2B,EAAE;AAGnC,iBAAe,KAAK,GAAG;AACvB,iBAAe,KACb,kFACD;AACD,iBAAe,KAAK,gBAAgB,YAAY;AAChD,iBAAe,KACb,kFACD;AAGD,OAAK,MAAM,SAAS,OAAO,OAAO,OAAO,OAAO,EAAE;GAChD,MAAM,YAAY,cAAc,KAAK,OAAO,aAAa,UAAU;AACnE,kBAAe,KAAK,GAAG;AACvB,kBAAe,KAAK,UAAU;GAE9B,MAAM,eAAe,iBAAiB,KAAK,OAAO,UAAU;AAC5D,OAAI,cAAc;AAChB,mBAAe,KAAK,GAAG;AACvB,mBAAe,KAAK,aAAa;;;AAKrC,iBAAe,KAAK,GAAG;AACvB,iBAAe,KAAK,6BAA6B,QAAQ,UAAU,CAAC;AAEpE,WAAS,KAAK,GAAG,eAAe;;AAKlC,QADwB;EAAC,IAAI,QAAQ,QAAQ;EAAE,GAAG;EAAa,GAAG;EAAS,CAC9D,KAAK,KAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kysely-adapter.d.ts","names":[],"sources":["../../../src/adapters/kysely/kysely-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;KAcK,SAAA,GAAY;UAEA,YAAA;EAFZ,EAAA,EAGC,SAHQ;EAEG,QAAA,EAEL,WAFiB;AAK7B;AAGsB,cAHT,aAAA,YAAyB,eAGhB,CAAA;EAIQ,CAAA,OAAA;EAAmB,WAAA,CAAA,MAAA,EAJ3B,YAI2B;EAAqC,iBAAA,CAAA,UAAxD,SAAwD,CAAA,CAAA,MAAA,EAArC,CAAqC,EAAA,SAAA,EAAA,MAAA,CAAA,EAAd,aAAc,CAAA,CAAA,CAAA;EAAd,mBAAA,CAAA,CAAA,EAMzC,OANyC,CAAA,OAAA,CAAA;EAMzC,qBAAA,CAAA,MAAA,EAWC,SAXD,EAAA,SAAA,EAAA,MAAA,CAAA,EAWgC,QAXhC;EAWC,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"kysely-adapter.d.ts","names":[],"sources":["../../../src/adapters/kysely/kysely-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;KAcK,SAAA,GAAY;UAEA,YAAA;EAFZ,EAAA,EAGC,SAHQ;EAEG,QAAA,EAEL,WAFiB;AAK7B;AAGsB,cAHT,aAAA,YAAyB,eAGhB,CAAA;EAIQ,CAAA,OAAA;EAAmB,WAAA,CAAA,MAAA,EAJ3B,YAI2B;EAAqC,iBAAA,CAAA,UAAxD,SAAwD,CAAA,CAAA,MAAA,EAArC,CAAqC,EAAA,SAAA,EAAA,MAAA,CAAA,EAAd,aAAc,CAAA,CAAA,CAAA;EAAd,mBAAA,CAAA,CAAA,EAMzC,OANyC,CAAA,OAAA,CAAA;EAMzC,qBAAA,CAAA,MAAA,EAWC,SAXD,EAAA,SAAA,EAAA,MAAA,CAAA,EAWgC,QAXhC;EAWC,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAkGI,OAlGJ,CAAA,MAAA,GAAA,SAAA,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SETTINGS_TABLE_NAME } from "../../shared/settings-schema.js";
|
|
2
2
|
import { createMigrator } from "../../migration-engine/create.js";
|
|
3
|
-
import { execute } from "./migration/execute.js";
|
|
3
|
+
import { execute, preprocessOperations } from "./migration/execute.js";
|
|
4
4
|
import { fromKysely } from "./kysely-query.js";
|
|
5
5
|
import { createTableNameMapper } from "./kysely-shared.js";
|
|
6
6
|
import { sql } from "kysely";
|
|
@@ -26,38 +26,45 @@ var KyselyAdapter = class {
|
|
|
26
26
|
createMigrationEngine(schema, namespace) {
|
|
27
27
|
const manager = createSettingsManager(this.#kyselyConfig.db, namespace);
|
|
28
28
|
const mapper = namespace ? createTableNameMapper(namespace) : void 0;
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
return {
|
|
32
|
-
compile() {
|
|
33
|
-
return statement.compile(db);
|
|
34
|
-
},
|
|
35
|
-
execute() {
|
|
36
|
-
return statement.execute(db);
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
};
|
|
40
|
-
const preprocess = (operations, db) => {
|
|
29
|
+
const preprocessMigrationOperations = (operations) => {
|
|
30
|
+
let preprocessed = preprocessOperations(operations, this.#kyselyConfig);
|
|
41
31
|
if (this.#kyselyConfig.provider === "mysql") {
|
|
42
|
-
|
|
32
|
+
preprocessed.unshift({
|
|
43
33
|
type: "custom",
|
|
44
34
|
sql: "SET FOREIGN_KEY_CHECKS = 0"
|
|
45
35
|
});
|
|
46
|
-
|
|
36
|
+
preprocessed.push({
|
|
47
37
|
type: "custom",
|
|
48
38
|
sql: "SET FOREIGN_KEY_CHECKS = 1"
|
|
49
39
|
});
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
40
|
+
}
|
|
41
|
+
return preprocessed;
|
|
42
|
+
};
|
|
43
|
+
const toExecutableNodes = (operations, db) => {
|
|
44
|
+
const onCustomNode = (node, db$1) => {
|
|
45
|
+
const statement = sql.raw(node["sql"]);
|
|
46
|
+
return {
|
|
47
|
+
compile() {
|
|
48
|
+
return statement.compile(db$1);
|
|
49
|
+
},
|
|
50
|
+
execute() {
|
|
51
|
+
return statement.execute(db$1);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
const dbConfig = {
|
|
56
|
+
db,
|
|
57
|
+
provider: this.#kyselyConfig.provider
|
|
58
|
+
};
|
|
59
|
+
return operations.flatMap((op) => execute(op, dbConfig, (node) => onCustomNode(node, db), mapper));
|
|
55
60
|
};
|
|
56
61
|
return createMigrator({
|
|
57
62
|
schema,
|
|
58
63
|
executor: async (operations) => {
|
|
64
|
+
if (this.#kyselyConfig.provider === "sqlite") await sql.raw("PRAGMA defer_foreign_keys = ON").execute(this.#kyselyConfig.db);
|
|
59
65
|
await this.#kyselyConfig.db.transaction().execute(async (tx) => {
|
|
60
|
-
|
|
66
|
+
const nodes = toExecutableNodes(preprocessMigrationOperations(operations), tx);
|
|
67
|
+
for (const node of nodes) try {
|
|
61
68
|
await node.execute();
|
|
62
69
|
} catch (e) {
|
|
63
70
|
console.error("failed at", node.compile(), e);
|
|
@@ -66,7 +73,11 @@ var KyselyAdapter = class {
|
|
|
66
73
|
});
|
|
67
74
|
},
|
|
68
75
|
sql: { toSql: (operations) => {
|
|
69
|
-
|
|
76
|
+
const parts = [];
|
|
77
|
+
if (this.#kyselyConfig.provider === "sqlite") parts.push("PRAGMA defer_foreign_keys = ON;");
|
|
78
|
+
const compiled = toExecutableNodes(preprocessMigrationOperations(operations), this.#kyselyConfig.db).map((node) => `${node.compile().sql};`);
|
|
79
|
+
parts.push(...compiled);
|
|
80
|
+
return parts.join("\n\n");
|
|
70
81
|
} },
|
|
71
82
|
settings: {
|
|
72
83
|
getVersion: async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kysely-adapter.js","names":["#kyselyConfig"],"sources":["../../../src/adapters/kysely/kysely-adapter.ts"],"sourcesContent":["import { sql, type Kysely } from \"kysely\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport type { DatabaseAdapter } from \"../adapters\";\nimport { createMigrator, type Migrator } from \"../../migration-engine/create\";\nimport type { AnySchema } from \"../../schema/create\";\nimport type { CustomOperation, MigrationOperation } from \"../../migration-engine/shared\";\nimport { execute } from \"./migration/execute\";\nimport type { AbstractQuery } from \"../../query/query\";\nimport { fromKysely } from \"./kysely-query\";\nimport { createTableNameMapper } from \"./kysely-shared\";\nimport { createHash } from \"node:crypto\";\nimport { SETTINGS_TABLE_NAME } from \"../../shared/settings-schema\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\nexport interface KyselyConfig {\n db: KyselyAny;\n provider: SQLProvider;\n}\n\nexport class KyselyAdapter implements DatabaseAdapter {\n #kyselyConfig: KyselyConfig;\n\n constructor(config: KyselyConfig) {\n this.#kyselyConfig = config;\n }\n\n createQueryEngine<T extends AnySchema>(schema: T, namespace: string): AbstractQuery<T> {\n // Only create mapper if namespace is non-empty\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\n return fromKysely(schema, this.#kyselyConfig, mapper);\n }\n\n async isConnectionHealthy(): Promise<boolean> {\n try {\n const result = await this.#kyselyConfig.db.executeQuery(\n sql`SELECT 1 as healthy`.compile(this.#kyselyConfig.db),\n );\n return (result.rows[0] as Record<string, unknown>)[\"healthy\"] === 1;\n } catch {\n return false;\n }\n }\n\n createMigrationEngine(schema: AnySchema, namespace: string): Migrator {\n const manager = createSettingsManager(this.#kyselyConfig.db, namespace);\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\n\n const
|
|
1
|
+
{"version":3,"file":"kysely-adapter.js","names":["#kyselyConfig","db","dbConfig: KyselyConfig","parts: string[]"],"sources":["../../../src/adapters/kysely/kysely-adapter.ts"],"sourcesContent":["import { sql, type Kysely } from \"kysely\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport type { DatabaseAdapter } from \"../adapters\";\nimport { createMigrator, type Migrator } from \"../../migration-engine/create\";\nimport type { AnySchema } from \"../../schema/create\";\nimport type { CustomOperation, MigrationOperation } from \"../../migration-engine/shared\";\nimport { execute, preprocessOperations } from \"./migration/execute\";\nimport type { AbstractQuery } from \"../../query/query\";\nimport { fromKysely } from \"./kysely-query\";\nimport { createTableNameMapper } from \"./kysely-shared\";\nimport { createHash } from \"node:crypto\";\nimport { SETTINGS_TABLE_NAME } from \"../../shared/settings-schema\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\nexport interface KyselyConfig {\n db: KyselyAny;\n provider: SQLProvider;\n}\n\nexport class KyselyAdapter implements DatabaseAdapter {\n #kyselyConfig: KyselyConfig;\n\n constructor(config: KyselyConfig) {\n this.#kyselyConfig = config;\n }\n\n createQueryEngine<T extends AnySchema>(schema: T, namespace: string): AbstractQuery<T> {\n // Only create mapper if namespace is non-empty\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\n return fromKysely(schema, this.#kyselyConfig, mapper);\n }\n\n async isConnectionHealthy(): Promise<boolean> {\n try {\n const result = await this.#kyselyConfig.db.executeQuery(\n sql`SELECT 1 as healthy`.compile(this.#kyselyConfig.db),\n );\n return (result.rows[0] as Record<string, unknown>)[\"healthy\"] === 1;\n } catch {\n return false;\n }\n }\n\n createMigrationEngine(schema: AnySchema, namespace: string): Migrator {\n const manager = createSettingsManager(this.#kyselyConfig.db, namespace);\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\n\n const preprocessMigrationOperations = (operations: MigrationOperation[]) => {\n let preprocessed = preprocessOperations(operations, this.#kyselyConfig);\n\n if (this.#kyselyConfig.provider === \"mysql\") {\n preprocessed.unshift({ type: \"custom\", sql: \"SET FOREIGN_KEY_CHECKS = 0\" });\n preprocessed.push({ type: \"custom\", sql: \"SET FOREIGN_KEY_CHECKS = 1\" });\n }\n\n return preprocessed;\n };\n\n // Convert operations to executable nodes bound to specific db instance\n const toExecutableNodes = (operations: MigrationOperation[], db: KyselyAny) => {\n const onCustomNode = (node: CustomOperation, db: KyselyAny) => {\n const statement = sql.raw(node[\"sql\"] as string);\n\n return {\n compile() {\n return statement.compile(db);\n },\n execute() {\n return statement.execute(db);\n },\n };\n };\n\n const dbConfig: KyselyConfig = { db, provider: this.#kyselyConfig.provider };\n return operations.flatMap((op) =>\n execute(op, dbConfig, (node) => onCustomNode(node, db), mapper),\n );\n };\n\n const migrator = createMigrator({\n schema,\n executor: async (operations) => {\n // For SQLite, execute PRAGMA defer_foreign_keys BEFORE transaction\n if (this.#kyselyConfig.provider === \"sqlite\") {\n await sql.raw(\"PRAGMA defer_foreign_keys = ON\").execute(this.#kyselyConfig.db);\n }\n\n await this.#kyselyConfig.db.transaction().execute(async (tx) => {\n const preprocessed = preprocessMigrationOperations(operations);\n const nodes = toExecutableNodes(preprocessed, tx);\n for (const node of nodes) {\n try {\n await node.execute();\n } catch (e) {\n console.error(\"failed at\", node.compile(), e);\n throw e;\n }\n }\n });\n },\n sql: {\n toSql: (operations) => {\n const parts: string[] = [];\n\n // Add SQLite PRAGMA at the beginning\n if (this.#kyselyConfig.provider === \"sqlite\") {\n parts.push(\"PRAGMA defer_foreign_keys = ON;\");\n }\n\n const preprocessed = preprocessMigrationOperations(operations);\n const nodes = toExecutableNodes(preprocessed, this.#kyselyConfig.db);\n const compiled = nodes.map((node) => `${node.compile().sql};`);\n\n parts.push(...compiled);\n\n return parts.join(\"\\n\\n\");\n },\n },\n\n settings: {\n getVersion: async () => {\n const v = await manager.get(`schema_version`);\n return v ? parseInt(v) : 0;\n },\n updateSettingsInMigration: async (fromVersion, toVersion) => {\n return [\n {\n type: \"custom\",\n sql:\n fromVersion === 0\n ? manager.insert(`schema_version`, toVersion.toString())\n : manager.update(`schema_version`, toVersion.toString()),\n },\n ];\n },\n },\n });\n\n return migrator;\n }\n\n getSchemaVersion(namespace: string) {\n const manager = createSettingsManager(this.#kyselyConfig.db, namespace);\n\n return manager.get(`schema_version`);\n }\n}\n\nfunction createSettingsManager(db: KyselyAny, namespace: string) {\n // Settings table is never namespaced, but keys include namespace prefix\n const tableName = SETTINGS_TABLE_NAME;\n\n return {\n async get(key: string): Promise<string | undefined> {\n try {\n const result = await db\n .selectFrom(tableName)\n .where(\"key\", \"=\", sql.lit(`${namespace}.${key}`))\n .select([\"value\"])\n .executeTakeFirstOrThrow();\n return result.value as string;\n } catch {\n return;\n }\n },\n\n insert(key: string, value: string) {\n return db\n .insertInto(tableName)\n .values({\n id: sql.lit(\n createHash(\"md5\").update(`${namespace}.${key}`).digest(\"base64url\").replace(/=/g, \"\"),\n ),\n key: sql.lit(`${namespace}.${key}`),\n value: sql.lit(value),\n })\n .compile().sql;\n },\n\n update(key: string, value: string) {\n return db\n .updateTable(tableName)\n .set({\n value: sql.lit(value),\n })\n .where(\"key\", \"=\", sql.lit(`${namespace}.${key}`))\n .compile().sql;\n },\n };\n}\n"],"mappings":";;;;;;;;;AAqBA,IAAa,gBAAb,MAAsD;CACpD;CAEA,YAAY,QAAsB;AAChC,QAAKA,eAAgB;;CAGvB,kBAAuC,QAAW,WAAqC;EAErF,MAAM,SAAS,YAAY,sBAAsB,UAAU,GAAG;AAC9D,SAAO,WAAW,QAAQ,MAAKA,cAAe,OAAO;;CAGvD,MAAM,sBAAwC;AAC5C,MAAI;AAIF,WAHe,MAAM,MAAKA,aAAc,GAAG,aACzC,GAAG,sBAAsB,QAAQ,MAAKA,aAAc,GAAG,CACxD,EACc,KAAK,GAA+B,eAAe;UAC5D;AACN,UAAO;;;CAIX,sBAAsB,QAAmB,WAA6B;EACpE,MAAM,UAAU,sBAAsB,MAAKA,aAAc,IAAI,UAAU;EACvE,MAAM,SAAS,YAAY,sBAAsB,UAAU,GAAG;EAE9D,MAAM,iCAAiC,eAAqC;GAC1E,IAAI,eAAe,qBAAqB,YAAY,MAAKA,aAAc;AAEvE,OAAI,MAAKA,aAAc,aAAa,SAAS;AAC3C,iBAAa,QAAQ;KAAE,MAAM;KAAU,KAAK;KAA8B,CAAC;AAC3E,iBAAa,KAAK;KAAE,MAAM;KAAU,KAAK;KAA8B,CAAC;;AAG1E,UAAO;;EAIT,MAAM,qBAAqB,YAAkC,OAAkB;GAC7E,MAAM,gBAAgB,MAAuB,SAAkB;IAC7D,MAAM,YAAY,IAAI,IAAI,KAAK,OAAiB;AAEhD,WAAO;KACL,UAAU;AACR,aAAO,UAAU,QAAQC,KAAG;;KAE9B,UAAU;AACR,aAAO,UAAU,QAAQA,KAAG;;KAE/B;;GAGH,MAAMC,WAAyB;IAAE;IAAI,UAAU,MAAKF,aAAc;IAAU;AAC5E,UAAO,WAAW,SAAS,OACzB,QAAQ,IAAI,WAAW,SAAS,aAAa,MAAM,GAAG,EAAE,OAAO,CAChE;;AA8DH,SA3DiB,eAAe;GAC9B;GACA,UAAU,OAAO,eAAe;AAE9B,QAAI,MAAKA,aAAc,aAAa,SAClC,OAAM,IAAI,IAAI,iCAAiC,CAAC,QAAQ,MAAKA,aAAc,GAAG;AAGhF,UAAM,MAAKA,aAAc,GAAG,aAAa,CAAC,QAAQ,OAAO,OAAO;KAE9D,MAAM,QAAQ,kBADO,8BAA8B,WAAW,EAChB,GAAG;AACjD,UAAK,MAAM,QAAQ,MACjB,KAAI;AACF,YAAM,KAAK,SAAS;cACb,GAAG;AACV,cAAQ,MAAM,aAAa,KAAK,SAAS,EAAE,EAAE;AAC7C,YAAM;;MAGV;;GAEJ,KAAK,EACH,QAAQ,eAAe;IACrB,MAAMG,QAAkB,EAAE;AAG1B,QAAI,MAAKH,aAAc,aAAa,SAClC,OAAM,KAAK,kCAAkC;IAK/C,MAAM,WADQ,kBADO,8BAA8B,WAAW,EAChB,MAAKA,aAAc,GAAG,CAC7C,KAAK,SAAS,GAAG,KAAK,SAAS,CAAC,IAAI,GAAG;AAE9D,UAAM,KAAK,GAAG,SAAS;AAEvB,WAAO,MAAM,KAAK,OAAO;MAE5B;GAED,UAAU;IACR,YAAY,YAAY;KACtB,MAAM,IAAI,MAAM,QAAQ,IAAI,iBAAiB;AAC7C,YAAO,IAAI,SAAS,EAAE,GAAG;;IAE3B,2BAA2B,OAAO,aAAa,cAAc;AAC3D,YAAO,CACL;MACE,MAAM;MACN,KACE,gBAAgB,IACZ,QAAQ,OAAO,kBAAkB,UAAU,UAAU,CAAC,GACtD,QAAQ,OAAO,kBAAkB,UAAU,UAAU,CAAC;MAC7D,CACF;;IAEJ;GACF,CAAC;;CAKJ,iBAAiB,WAAmB;AAGlC,SAFgB,sBAAsB,MAAKA,aAAc,IAAI,UAAU,CAExD,IAAI,iBAAiB;;;AAIxC,SAAS,sBAAsB,IAAe,WAAmB;CAE/D,MAAM,YAAY;AAElB,QAAO;EACL,MAAM,IAAI,KAA0C;AAClD,OAAI;AAMF,YALe,MAAM,GAClB,WAAW,UAAU,CACrB,MAAM,OAAO,KAAK,IAAI,IAAI,GAAG,UAAU,GAAG,MAAM,CAAC,CACjD,OAAO,CAAC,QAAQ,CAAC,CACjB,yBAAyB,EACd;WACR;AACN;;;EAIJ,OAAO,KAAa,OAAe;AACjC,UAAO,GACJ,WAAW,UAAU,CACrB,OAAO;IACN,IAAI,IAAI,IACN,WAAW,MAAM,CAAC,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC,OAAO,YAAY,CAAC,QAAQ,MAAM,GAAG,CACtF;IACD,KAAK,IAAI,IAAI,GAAG,UAAU,GAAG,MAAM;IACnC,OAAO,IAAI,IAAI,MAAM;IACtB,CAAC,CACD,SAAS,CAAC;;EAGf,OAAO,KAAa,OAAe;AACjC,UAAO,GACJ,YAAY,UAAU,CACtB,IAAI,EACH,OAAO,IAAI,IAAI,MAAM,EACtB,CAAC,CACD,MAAM,OAAO,KAAK,IAAI,IAAI,GAAG,UAAU,GAAG,MAAM,CAAC,CACjD,SAAS,CAAC;;EAEhB"}
|