nextly 0.0.1 → 0.0.2-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +122 -0
  3. package/dist/_dts-chunks/collections-handler.d-DjgO74Wt.d.ts +20540 -0
  4. package/dist/_dts-chunks/config.d-DNwsDnjs.d.ts +2589 -0
  5. package/dist/_dts-chunks/define-component.d-BUgTHmt3.d.ts +1149 -0
  6. package/dist/_dts-chunks/image-processor.d-OO1PmMrv.d.ts +335 -0
  7. package/dist/_dts-chunks/index.d-axCAzZ7m.d.ts +17842 -0
  8. package/dist/_dts-chunks/media.d-DjDOZo4B.d.ts +117 -0
  9. package/dist/_dts-chunks/on-error.d-CHIKWNxd.d.ts +38 -0
  10. package/dist/_dts-chunks/storage.d-BUhQ2we_.d.ts +404 -0
  11. package/dist/actions/index.d.ts +239 -0
  12. package/dist/actions/index.mjs +281 -0
  13. package/dist/api/auth-state.d.ts +5 -0
  14. package/dist/api/auth-state.mjs +131 -0
  15. package/dist/api/collections-schema-detail.d.ts +56 -0
  16. package/dist/api/collections-schema-detail.mjs +244 -0
  17. package/dist/api/collections-schema-export.d.ts +56 -0
  18. package/dist/api/collections-schema-export.mjs +129 -0
  19. package/dist/api/collections-schema.d.ts +59 -0
  20. package/dist/api/collections-schema.mjs +207 -0
  21. package/dist/api/components-detail.d.ts +50 -0
  22. package/dist/api/components-detail.mjs +132 -0
  23. package/dist/api/components.d.ts +69 -0
  24. package/dist/api/components.mjs +144 -0
  25. package/dist/api/email-providers-default.d.ts +40 -0
  26. package/dist/api/email-providers-default.mjs +75 -0
  27. package/dist/api/email-providers-detail.d.ts +81 -0
  28. package/dist/api/email-providers-detail.mjs +109 -0
  29. package/dist/api/email-providers-test.d.ts +43 -0
  30. package/dist/api/email-providers-test.mjs +114 -0
  31. package/dist/api/email-providers.d.ts +69 -0
  32. package/dist/api/email-providers.mjs +110 -0
  33. package/dist/api/email-send-template.d.ts +41 -0
  34. package/dist/api/email-send-template.mjs +58 -0
  35. package/dist/api/email-send.d.ts +42 -0
  36. package/dist/api/email-send.mjs +58 -0
  37. package/dist/api/email-templates-detail.d.ts +74 -0
  38. package/dist/api/email-templates-detail.mjs +112 -0
  39. package/dist/api/email-templates-layout.d.ts +55 -0
  40. package/dist/api/email-templates-layout.mjs +92 -0
  41. package/dist/api/email-templates-preview.d.ts +48 -0
  42. package/dist/api/email-templates-preview.mjs +93 -0
  43. package/dist/api/email-templates.d.ts +61 -0
  44. package/dist/api/email-templates.mjs +118 -0
  45. package/dist/api/health.d.ts +68 -0
  46. package/dist/api/health.mjs +67 -0
  47. package/dist/api/index.d.ts +54 -0
  48. package/dist/api/index.mjs +16 -0
  49. package/dist/api/media-bulk.d.ts +74 -0
  50. package/dist/api/media-bulk.mjs +196 -0
  51. package/dist/api/media-folders.d.ts +112 -0
  52. package/dist/api/media-folders.mjs +187 -0
  53. package/dist/api/media-handlers.d.ts +102 -0
  54. package/dist/api/media-handlers.mjs +437 -0
  55. package/dist/api/media.d.ts +117 -0
  56. package/dist/api/media.mjs +242 -0
  57. package/dist/api/singles-detail.d.ts +87 -0
  58. package/dist/api/singles-detail.mjs +170 -0
  59. package/dist/api/singles-schema-detail.d.ts +54 -0
  60. package/dist/api/singles-schema-detail.mjs +182 -0
  61. package/dist/api/singles.d.ts +34 -0
  62. package/dist/api/singles.mjs +94 -0
  63. package/dist/api/storage-upload-url.d.ts +48 -0
  64. package/dist/api/storage-upload-url.mjs +202 -0
  65. package/dist/api/uploads.d.ts +109 -0
  66. package/dist/api/uploads.mjs +359 -0
  67. package/dist/auth/index.d.ts +425 -0
  68. package/dist/auth/index.mjs +199 -0
  69. package/dist/boot-apply-PQSYLDIN.mjs +7 -0
  70. package/dist/chunk-2OALJTK6.mjs +489 -0
  71. package/dist/chunk-2Q2SX2CS.mjs +365 -0
  72. package/dist/chunk-2TFX4ND3.mjs +13 -0
  73. package/dist/chunk-2TWPDSYD.mjs +87 -0
  74. package/dist/chunk-2W3DVD7S.mjs +647 -0
  75. package/dist/chunk-2ZFKXPQM.mjs +88 -0
  76. package/dist/chunk-3FA7FKAV.mjs +832 -0
  77. package/dist/chunk-3NZ2KMBL.mjs +58 -0
  78. package/dist/chunk-4MJLT6PZ.mjs +0 -0
  79. package/dist/chunk-56WO4WX7.mjs +0 -0
  80. package/dist/chunk-5APFUGAD.mjs +89 -0
  81. package/dist/chunk-5HMZ644B.mjs +108 -0
  82. package/dist/chunk-67GXH6PR.mjs +32 -0
  83. package/dist/chunk-6JNEPWRW.mjs +14368 -0
  84. package/dist/chunk-6NFHQIJD.mjs +45 -0
  85. package/dist/chunk-7P6ASYW6.mjs +9 -0
  86. package/dist/chunk-A3WPLSDT.mjs +1364 -0
  87. package/dist/chunk-AGJ6F2T3.mjs +144 -0
  88. package/dist/chunk-AK6Z23OX.mjs +1464 -0
  89. package/dist/chunk-APKKRD2G.mjs +102 -0
  90. package/dist/chunk-B2GV2BWH.mjs +73 -0
  91. package/dist/chunk-D5HQBNUB.mjs +74 -0
  92. package/dist/chunk-DNNG377Z.mjs +204 -0
  93. package/dist/chunk-DP3G27G5.mjs +135 -0
  94. package/dist/chunk-DV6WVX2Q.mjs +0 -0
  95. package/dist/chunk-DXGGXIUZ.mjs +57 -0
  96. package/dist/chunk-EGXBZCGC.mjs +943 -0
  97. package/dist/chunk-ERCNLX3V.mjs +176 -0
  98. package/dist/chunk-FQULBZ53.mjs +850 -0
  99. package/dist/chunk-G2AA4QLC.mjs +262 -0
  100. package/dist/chunk-GDBJ5JCU.mjs +488 -0
  101. package/dist/chunk-GJNSJU4S.mjs +19 -0
  102. package/dist/chunk-GZ6DCQKC.mjs +69 -0
  103. package/dist/chunk-H26B4FYG.mjs +167 -0
  104. package/dist/chunk-I4JMR3UR.mjs +21 -0
  105. package/dist/chunk-INV7QKLG.mjs +508 -0
  106. package/dist/chunk-IUDOC7N7.mjs +46 -0
  107. package/dist/chunk-IZWPRDC3.mjs +206 -0
  108. package/dist/chunk-KIMNCZGV.mjs +15 -0
  109. package/dist/chunk-L6HW2DA7.mjs +15 -0
  110. package/dist/chunk-LAZXX4HR.mjs +100 -0
  111. package/dist/chunk-LDKCUMHK.mjs +95 -0
  112. package/dist/chunk-LRXMECUA.mjs +0 -0
  113. package/dist/chunk-M52VMPGA.mjs +119 -0
  114. package/dist/chunk-MGUWEEI6.mjs +160 -0
  115. package/dist/chunk-NRUWQ5Z7.mjs +419 -0
  116. package/dist/chunk-NSEFNNU4.mjs +25360 -0
  117. package/dist/chunk-NTHVDFGO.mjs +138 -0
  118. package/dist/chunk-O3QHXMOX.mjs +3166 -0
  119. package/dist/chunk-P7NH2OSC.mjs +2605 -0
  120. package/dist/chunk-PKMABBB5.mjs +184 -0
  121. package/dist/chunk-PWS6XGJK.mjs +76 -0
  122. package/dist/chunk-R6JJQHFC.mjs +20 -0
  123. package/dist/chunk-RJLLGGPG.mjs +0 -0
  124. package/dist/chunk-SBACDPNX.mjs +689 -0
  125. package/dist/chunk-TO5AFLVQ.mjs +124 -0
  126. package/dist/chunk-TS7GHTG2.mjs +5436 -0
  127. package/dist/chunk-UJ2IMJ4W.mjs +133 -0
  128. package/dist/chunk-UOP63Q54.mjs +102 -0
  129. package/dist/chunk-UUOFWCM6.mjs +78 -0
  130. package/dist/chunk-V4EQTOA4.mjs +893 -0
  131. package/dist/chunk-VJ66NCL4.mjs +193 -0
  132. package/dist/chunk-VQJQHVEV.mjs +29 -0
  133. package/dist/chunk-VTJADRO3.mjs +141 -0
  134. package/dist/chunk-VWF3JO32.mjs +0 -0
  135. package/dist/chunk-W4MGXIRR.mjs +27 -0
  136. package/dist/chunk-W5KKPZT5.mjs +1204 -0
  137. package/dist/chunk-WD34YQ6T.mjs +381 -0
  138. package/dist/chunk-WZBYMYVW.mjs +14 -0
  139. package/dist/chunk-X23WKS3Z.mjs +50 -0
  140. package/dist/chunk-X7TXCYYN.mjs +6496 -0
  141. package/dist/chunk-XGI4EMS3.mjs +140 -0
  142. package/dist/chunk-XZKLBMN6.mjs +1153 -0
  143. package/dist/chunk-YB7INWPY.mjs +0 -0
  144. package/dist/chunk-YV4Y7SDL.mjs +83 -0
  145. package/dist/chunk-YZNBLFIW.mjs +1688 -0
  146. package/dist/chunk-YZZCTONM.mjs +263 -0
  147. package/dist/chunk-ZE6A3FYH.mjs +289 -0
  148. package/dist/cli/nextly.mjs +68 -0
  149. package/dist/cli/utils/index.d.ts +449 -0
  150. package/dist/cli/utils/index.mjs +49 -0
  151. package/dist/component-schema-service-5577KVW6.mjs +11 -0
  152. package/dist/config-loader-23YEMC3Z.mjs +23 -0
  153. package/dist/config.d.ts +44 -0
  154. package/dist/config.mjs +109 -0
  155. package/dist/container-ORGFGYSZ.mjs +9 -0
  156. package/dist/database/index.d.ts +12 -0
  157. package/dist/database/index.mjs +40 -0
  158. package/dist/database/seeders/index.d.ts +93 -0
  159. package/dist/database/seeders/index.mjs +47 -0
  160. package/dist/db-sync-demote-LJGKLB3S.mjs +117 -0
  161. package/dist/db-sync-promote-B26VSYQF.mjs +113 -0
  162. package/dist/dev-reload-broadcaster-B73IQ53V.mjs +25 -0
  163. package/dist/dist-M2NOU37V.mjs +19 -0
  164. package/dist/drizzle-kit-lazy-D2M2PXR2.mjs +13 -0
  165. package/dist/dynamic-collection-schema-service-IEXTPIZ7.mjs +8 -0
  166. package/dist/errors/index.d.ts +159 -0
  167. package/dist/errors/index.mjs +10 -0
  168. package/dist/factory-IWMBKUJM.mjs +15 -0
  169. package/dist/first-run-QIVKWJIF.mjs +63 -0
  170. package/dist/fresh-push-NR67DC3R.mjs +8 -0
  171. package/dist/index.d.ts +4175 -0
  172. package/dist/index.mjs +1336 -0
  173. package/dist/local-plugin-PTET4NAT.mjs +7 -0
  174. package/dist/logger-NU46DXNY.mjs +15 -0
  175. package/dist/logger-YE4TC7ZN.mjs +9 -0
  176. package/dist/migration-journal-EP532Y4L.mjs +139 -0
  177. package/dist/migrations/mysql/0000_eager_sentry.sql +174 -0
  178. package/dist/migrations/mysql/0001_soft_giant_girl.sql +27 -0
  179. package/dist/migrations/mysql/0002_media_table.sql +24 -0
  180. package/dist/migrations/mysql/0003_dynamic_singles.sql +37 -0
  181. package/dist/migrations/mysql/0004_dynamic_components.sql +35 -0
  182. package/dist/migrations/mysql/0005_user_management_tables.sql +92 -0
  183. package/dist/migrations/mysql/0006_api_keys.sql +36 -0
  184. package/dist/migrations/mysql/0007_general_settings.sql +20 -0
  185. package/dist/migrations/mysql/0008_site_settings_logo_url.sql +9 -0
  186. package/dist/migrations/mysql/0009_activity_log.sql +30 -0
  187. package/dist/migrations/mysql/0010_site_settings_sidebar.sql +13 -0
  188. package/dist/migrations/mysql/0011_missing_tables_and_columns.sql +54 -0
  189. package/dist/migrations/mysql/0012_image_sizes_and_focal_point.sql +30 -0
  190. package/dist/migrations/mysql/0012_media_folders.sql +43 -0
  191. package/dist/migrations/mysql/0013_user_brute_force_protection.sql +31 -0
  192. package/dist/migrations/mysql/0014_email_template_attachments.sql +12 -0
  193. package/dist/migrations/mysql/0015_media_uploaded_by_nullable.sql +15 -0
  194. package/dist/migrations/mysql/20260429_000000_000_initial_journal.sql +22 -0
  195. package/dist/migrations/mysql/20260501_000000_journal_batch.sql +17 -0
  196. package/dist/migrations/mysql/20260501_000001_audit_log.sql +24 -0
  197. package/dist/migrations/mysql/20260504_000000_nextly_meta.sql +21 -0
  198. package/dist/migrations/mysql/meta/0000_snapshot.json +1005 -0
  199. package/dist/migrations/mysql/meta/0001_snapshot.json +1099 -0
  200. package/dist/migrations/mysql/meta/_journal.json +41 -0
  201. package/dist/migrations/postgresql/0000_misty_king_bedlam.sql +169 -0
  202. package/dist/migrations/postgresql/0001_perpetual_captain_marvel.sql +8 -0
  203. package/dist/migrations/postgresql/0002_sad_spectrum.sql +16 -0
  204. package/dist/migrations/postgresql/0003_hesitant_ultron.sql +17 -0
  205. package/dist/migrations/postgresql/0004_media_table.sql +24 -0
  206. package/dist/migrations/postgresql/0005_media_folders.sql +36 -0
  207. package/dist/migrations/postgresql/0006_dynamic_collections_update.sql +50 -0
  208. package/dist/migrations/postgresql/0007_dynamic_singles.sql +38 -0
  209. package/dist/migrations/postgresql/0008_dynamic_components.sql +37 -0
  210. package/dist/migrations/postgresql/0009_user_management_tables.sql +95 -0
  211. package/dist/migrations/postgresql/0010_api_keys.sql +34 -0
  212. package/dist/migrations/postgresql/0011_general_settings.sql +20 -0
  213. package/dist/migrations/postgresql/0012_site_settings_logo_url.sql +9 -0
  214. package/dist/migrations/postgresql/0013_activity_log.sql +29 -0
  215. package/dist/migrations/postgresql/0014_image_sizes_and_focal_point.sql +33 -0
  216. package/dist/migrations/postgresql/0014_site_settings_sidebar.sql +13 -0
  217. package/dist/migrations/postgresql/0015_user_brute_force_protection.sql +29 -0
  218. package/dist/migrations/postgresql/0016_email_template_attachments.sql +12 -0
  219. package/dist/migrations/postgresql/0017_media_uploaded_by_nullable.sql +15 -0
  220. package/dist/migrations/postgresql/20260429_000000_000_initial_journal.sql +24 -0
  221. package/dist/migrations/postgresql/20260501_000000_journal_batch.sql +17 -0
  222. package/dist/migrations/postgresql/20260501_000001_audit_log.sql +24 -0
  223. package/dist/migrations/postgresql/20260504_000000_nextly_meta.sql +22 -0
  224. package/dist/migrations/postgresql/meta/0000_snapshot.json +1286 -0
  225. package/dist/migrations/postgresql/meta/0001_snapshot.json +1407 -0
  226. package/dist/migrations/postgresql/meta/0002_snapshot.json +1552 -0
  227. package/dist/migrations/postgresql/meta/0003_snapshot.json +1695 -0
  228. package/dist/migrations/postgresql/meta/0010_snapshot.json +2345 -0
  229. package/dist/migrations/postgresql/meta/_journal.json +90 -0
  230. package/dist/migrations/sqlite/0000_api_keys.sql +34 -0
  231. package/dist/migrations/sqlite/0001_general_settings.sql +20 -0
  232. package/dist/migrations/sqlite/0002_site_settings_logo_url.sql +9 -0
  233. package/dist/migrations/sqlite/0003_activity_log.sql +29 -0
  234. package/dist/migrations/sqlite/0004_image_sizes_and_focal_point.sql +29 -0
  235. package/dist/migrations/sqlite/0004_site_settings_sidebar.sql +11 -0
  236. package/dist/migrations/sqlite/0005_user_brute_force_protection.sql +29 -0
  237. package/dist/migrations/sqlite/0006_email_template_attachments.sql +12 -0
  238. package/dist/migrations/sqlite/0007_media_uploaded_by_nullable.sql +111 -0
  239. package/dist/migrations/sqlite/20260429_000000_000_initial_journal.sql +24 -0
  240. package/dist/migrations/sqlite/20260501_000000_journal_batch.sql +19 -0
  241. package/dist/migrations/sqlite/20260501_000001_audit_log.sql +24 -0
  242. package/dist/migrations/sqlite/20260504_000000_nextly_meta.sql +21 -0
  243. package/dist/migrations/sqlite/20260505_000000_user_management_tables.sql +77 -0
  244. package/dist/next.d.ts +57 -0
  245. package/dist/next.mjs +55 -0
  246. package/dist/observability/index.d.ts +87 -0
  247. package/dist/observability/index.mjs +57 -0
  248. package/dist/permissions-3DZZQZMI.mjs +39 -0
  249. package/dist/pipeline-YOML7SWF.mjs +29 -0
  250. package/dist/preview-ZZTR3QGS.mjs +9 -0
  251. package/dist/program-PW6UB2ZC.mjs +5934 -0
  252. package/dist/reconcile-single-tables-7ENVXJGB.mjs +7 -0
  253. package/dist/register-SF6E6FVU.mjs +49 -0
  254. package/dist/reload-config-HWQ4G5MM.mjs +23 -0
  255. package/dist/resolve-single-table-name-JSOMUB3R.mjs +7 -0
  256. package/dist/routeHandler-UNMMJIBM.mjs +77 -0
  257. package/dist/runtime-schema-generator-NRA6A6Z6.mjs +8 -0
  258. package/dist/runtime.d.ts +120 -0
  259. package/dist/runtime.mjs +73 -0
  260. package/dist/schema-hash-FMMG6VPJ.mjs +13 -0
  261. package/dist/schema-registry-EQ36FZDP.mjs +7 -0
  262. package/dist/scripts/load-env.mjs +42 -0
  263. package/dist/storage/index.d.ts +566 -0
  264. package/dist/storage/index.mjs +45 -0
  265. package/dist/super-admin-G5ZK5F4T.mjs +39 -0
  266. package/dist/system-table-service-WGSRVEGT.mjs +17 -0
  267. package/dist/users-7KELGRYJ.mjs +38 -0
  268. package/package.json +308 -9
@@ -0,0 +1,206 @@
1
+ import {
2
+ getColumnDescriptor,
3
+ getSystemColumnDescriptors
4
+ } from "./chunk-DNNG377Z.mjs";
5
+
6
+ // src/domains/schema/services/runtime-schema-generator.ts
7
+ import {
8
+ mysqlTable,
9
+ text as mysqlText,
10
+ boolean as mysqlBoolean,
11
+ timestamp as mysqlTimestamp,
12
+ json as mysqlJson,
13
+ varchar as mysqlVarchar,
14
+ double as mysqlDouble,
15
+ int as mysqlInt
16
+ } from "drizzle-orm/mysql-core";
17
+ import {
18
+ pgTable,
19
+ text as pgText,
20
+ boolean as pgBoolean,
21
+ timestamp as pgTimestamp,
22
+ jsonb as pgJsonb,
23
+ doublePrecision as pgDoublePrecision,
24
+ varchar as pgVarchar,
25
+ integer as pgInteger
26
+ } from "drizzle-orm/pg-core";
27
+ import {
28
+ sqliteTable,
29
+ text as sqliteText,
30
+ integer as sqliteInteger,
31
+ real as sqliteReal
32
+ } from "drizzle-orm/sqlite-core";
33
+ function generateRuntimeSchema(tableName, fields, dialect, options = {}) {
34
+ let table;
35
+ switch (dialect) {
36
+ case "postgresql":
37
+ table = generatePostgresSchema(tableName, fields, options);
38
+ break;
39
+ case "mysql":
40
+ table = generateMySQLSchema(tableName, fields, options);
41
+ break;
42
+ case "sqlite":
43
+ table = generateSQLiteSchema(tableName, fields, options);
44
+ break;
45
+ default:
46
+ throw new Error(`Unsupported dialect: ${String(dialect)}`);
47
+ }
48
+ return {
49
+ table,
50
+ schemaRecord: { [tableName]: table }
51
+ };
52
+ }
53
+ function generatePostgresSchema(tableName, fields, options) {
54
+ const columns = buildDrizzleColumnRecord(fields, "postgresql", options);
55
+ return pgTable(tableName, columns);
56
+ }
57
+ function generateMySQLSchema(tableName, fields, options) {
58
+ const columns = buildDrizzleColumnRecord(fields, "mysql", options);
59
+ return mysqlTable(tableName, columns);
60
+ }
61
+ function generateSQLiteSchema(tableName, fields, options) {
62
+ const columns = buildDrizzleColumnRecord(fields, "sqlite", options);
63
+ return sqliteTable(tableName, columns);
64
+ }
65
+ function buildDrizzleColumnRecord(fields, dialect, options = {}) {
66
+ const out = {};
67
+ const hasTitleField = fields.some((f) => f.name === "title");
68
+ const hasSlugField = fields.some((f) => f.name === "slug");
69
+ for (const sys of getSystemColumnDescriptors(dialect, {
70
+ hasTitleField,
71
+ hasSlugField,
72
+ hasStatus: options.status === true
73
+ })) {
74
+ out[sys.name] = buildSystemDrizzleColumn(sys, dialect);
75
+ }
76
+ for (const field of fields) {
77
+ const desc = getColumnDescriptor(field, dialect);
78
+ if (!desc) continue;
79
+ out[field.name] = buildUserDrizzleColumn(desc, dialect);
80
+ }
81
+ return out;
82
+ }
83
+ function buildSystemDrizzleColumn(sys, dialect) {
84
+ if (dialect === "postgresql") {
85
+ if (sys.name === "id") return pgText("id").primaryKey();
86
+ if (sys.name === "created_at") return pgTimestamp("created_at").defaultNow();
87
+ if (sys.name === "updated_at") return pgTimestamp("updated_at").defaultNow();
88
+ if (sys.name === "status") {
89
+ return pgVarchar("status", { length: 20 }).notNull().default("draft");
90
+ }
91
+ return pgText(sys.name).notNull();
92
+ }
93
+ if (dialect === "mysql") {
94
+ if (sys.name === "id") {
95
+ return mysqlVarchar("id", { length: 36 }).primaryKey();
96
+ }
97
+ if (sys.name === "created_at") {
98
+ return mysqlTimestamp("created_at").defaultNow();
99
+ }
100
+ if (sys.name === "updated_at") {
101
+ return mysqlTimestamp("updated_at").defaultNow();
102
+ }
103
+ if (sys.name === "status") {
104
+ return mysqlVarchar("status", { length: 20 }).notNull().default("draft");
105
+ }
106
+ return mysqlVarchar(sys.name, { length: 255 }).notNull();
107
+ }
108
+ if (sys.name === "id") return sqliteText("id").primaryKey();
109
+ if (sys.name === "created_at") {
110
+ return sqliteInteger("created_at", { mode: "timestamp" });
111
+ }
112
+ if (sys.name === "updated_at") {
113
+ return sqliteInteger("updated_at", { mode: "timestamp" });
114
+ }
115
+ if (sys.name === "status") {
116
+ return sqliteText("status").notNull().default("draft");
117
+ }
118
+ return sqliteText(sys.name).notNull();
119
+ }
120
+ function buildUserDrizzleColumn(desc, dialect) {
121
+ if (dialect === "postgresql") {
122
+ return buildPgColumnFromKind(desc.kind, desc.name, desc.nullable);
123
+ }
124
+ if (dialect === "mysql") {
125
+ return buildMysqlColumnFromKind(
126
+ desc.kind,
127
+ desc.name,
128
+ desc.nullable,
129
+ desc.length
130
+ );
131
+ }
132
+ return buildSqliteColumnFromKind(desc.kind, desc.name, desc.nullable);
133
+ }
134
+ function buildPgColumnFromKind(kind, name, nullable) {
135
+ switch (kind) {
136
+ case "text":
137
+ case "longText":
138
+ case "varchar":
139
+ return nullable ? pgText(name) : pgText(name).notNull();
140
+ case "boolean":
141
+ return nullable ? pgBoolean(name) : pgBoolean(name).notNull();
142
+ case "integer":
143
+ return nullable ? pgInteger(name) : pgInteger(name).notNull();
144
+ case "double":
145
+ return nullable ? pgDoublePrecision(name) : pgDoublePrecision(name).notNull();
146
+ case "timestamp":
147
+ return nullable ? pgTimestamp(name) : pgTimestamp(name).notNull();
148
+ case "json":
149
+ return nullable ? pgJsonb(name) : pgJsonb(name).notNull();
150
+ case "fkSingle":
151
+ return pgText(name);
152
+ case "skip":
153
+ return null;
154
+ }
155
+ }
156
+ function buildMysqlColumnFromKind(kind, name, nullable, length) {
157
+ switch (kind) {
158
+ case "text":
159
+ case "varchar": {
160
+ const col = mysqlVarchar(name, { length: length ?? 255 });
161
+ return nullable ? col : col.notNull();
162
+ }
163
+ case "longText":
164
+ return nullable ? mysqlText(name) : mysqlText(name).notNull();
165
+ case "boolean":
166
+ return nullable ? mysqlBoolean(name) : mysqlBoolean(name).notNull();
167
+ case "integer":
168
+ return nullable ? mysqlInt(name) : mysqlInt(name).notNull();
169
+ case "double":
170
+ return nullable ? mysqlDouble(name) : mysqlDouble(name).notNull();
171
+ case "timestamp":
172
+ return nullable ? mysqlTimestamp(name) : mysqlTimestamp(name).notNull();
173
+ case "json":
174
+ return nullable ? mysqlJson(name) : mysqlJson(name).notNull();
175
+ case "fkSingle":
176
+ return mysqlVarchar(name, { length: length ?? 36 });
177
+ case "skip":
178
+ return null;
179
+ }
180
+ }
181
+ function buildSqliteColumnFromKind(kind, name, nullable) {
182
+ switch (kind) {
183
+ case "text":
184
+ case "longText":
185
+ case "varchar":
186
+ return nullable ? sqliteText(name) : sqliteText(name).notNull();
187
+ case "boolean":
188
+ return nullable ? sqliteInteger(name, { mode: "boolean" }) : sqliteInteger(name, { mode: "boolean" }).notNull();
189
+ case "integer":
190
+ return nullable ? sqliteInteger(name) : sqliteInteger(name).notNull();
191
+ case "double":
192
+ return nullable ? sqliteReal(name) : sqliteReal(name).notNull();
193
+ case "timestamp":
194
+ return nullable ? sqliteInteger(name, { mode: "timestamp" }) : sqliteInteger(name, { mode: "timestamp" }).notNull();
195
+ case "json":
196
+ return nullable ? sqliteText(name) : sqliteText(name).notNull();
197
+ case "fkSingle":
198
+ return sqliteText(name);
199
+ case "skip":
200
+ return null;
201
+ }
202
+ }
203
+
204
+ export {
205
+ generateRuntimeSchema
206
+ };
@@ -0,0 +1,15 @@
1
+ // src/domains/schema/pipeline/database-url.ts
2
+ function extractDatabaseNameFromUrl(url) {
3
+ if (!url) return void 0;
4
+ try {
5
+ const parsed = new URL(url);
6
+ const name = parsed.pathname.replace(/^\//, "");
7
+ return name.length > 0 ? name : void 0;
8
+ } catch {
9
+ return void 0;
10
+ }
11
+ }
12
+
13
+ export {
14
+ extractDatabaseNameFromUrl
15
+ };
@@ -0,0 +1,15 @@
1
+ // src/domains/singles/services/reconcile-single-tables.ts
2
+ async function reconcileSingleTables(reconciler) {
3
+ const [registered, existing] = await Promise.all([
4
+ reconciler.registeredSingles(),
5
+ reconciler.existingTableNames()
6
+ ]);
7
+ for (const single of registered) {
8
+ if (existing.has(single.tableName)) continue;
9
+ await reconciler.createTable(single);
10
+ }
11
+ }
12
+
13
+ export {
14
+ reconcileSingleTables
15
+ };
@@ -0,0 +1,100 @@
1
+ import {
2
+ container
3
+ } from "./chunk-D5HQBNUB.mjs";
4
+
5
+ // src/shared/lib/logger.ts
6
+ var levelPriority = {
7
+ debug: 10,
8
+ info: 20,
9
+ warn: 30,
10
+ error: 40
11
+ };
12
+ var DB_LOG_ENABLED = false;
13
+ var DB_LOG_LEVEL = "warn";
14
+ function isEnabled(level) {
15
+ if (!DB_LOG_ENABLED) return false;
16
+ if (DB_LOG_LEVEL === "silent") return false;
17
+ if (level === "silent") return false;
18
+ const current = levelPriority[DB_LOG_LEVEL];
19
+ const req = levelPriority[level];
20
+ return req >= current;
21
+ }
22
+ var DefaultDbLogger = class {
23
+ log(level, event) {
24
+ if (!isEnabled(level)) return;
25
+ const timeIso = (/* @__PURE__ */ new Date()).toISOString();
26
+ const payload = { time: timeIso, level, ...event };
27
+ if (level === "error") console.error("[db]", JSON.stringify(payload));
28
+ else if (level === "warn") console.warn("[db]", JSON.stringify(payload));
29
+ else console.log("[db]", JSON.stringify(payload));
30
+ }
31
+ };
32
+ var activeLogger = new DefaultDbLogger();
33
+ function logDbConn(level, event) {
34
+ const full = {
35
+ ...event,
36
+ category: "connection"
37
+ };
38
+ activeLogger.log(level, full);
39
+ }
40
+ function nowMs() {
41
+ if (typeof process !== "undefined" && typeof process.hrtime === "function") {
42
+ const ns = process.hrtime.bigint();
43
+ return Number(ns / BigInt(1e6));
44
+ }
45
+ if (typeof performance !== "undefined" && typeof performance.now === "function") {
46
+ return performance.now();
47
+ }
48
+ return Date.now();
49
+ }
50
+ var DefaultAuthLogger = class {
51
+ log(level, event) {
52
+ const timeIso = (/* @__PURE__ */ new Date()).toISOString();
53
+ const payload = { time: timeIso, level, ...event };
54
+ if (level === "error") console.error("[auth]", JSON.stringify(payload));
55
+ else if (level === "warn") console.warn("[auth]", JSON.stringify(payload));
56
+ else console.log("[auth]", JSON.stringify(payload));
57
+ }
58
+ };
59
+ var activeAuthLogger = new DefaultAuthLogger();
60
+ function getAuthLogger() {
61
+ return activeAuthLogger;
62
+ }
63
+
64
+ // src/database/health.ts
65
+ async function healthCheck() {
66
+ const started = nowMs();
67
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
68
+ try {
69
+ const adapter = container.get("adapter");
70
+ const dialect = adapter.getCapabilities().dialect;
71
+ await adapter.executeQuery("SELECT 1");
72
+ const latencyMs = nowMs() - started;
73
+ logDbConn("info", { op: "health-ok", dialect, durationMs: latencyMs });
74
+ return {
75
+ ok: true,
76
+ timestamp,
77
+ database: { connected: true, dialect, latencyMs }
78
+ };
79
+ } catch (error) {
80
+ const latencyMs = nowMs() - started;
81
+ const errorMessage = error instanceof Error ? error.message : "Unknown database error";
82
+ logDbConn("error", {
83
+ op: "health-fail",
84
+ dialect: "unknown",
85
+ durationMs: latencyMs,
86
+ errorMessage
87
+ });
88
+ return {
89
+ ok: false,
90
+ timestamp,
91
+ database: { connected: false, dialect: "unknown", latencyMs },
92
+ error: errorMessage
93
+ };
94
+ }
95
+ }
96
+
97
+ export {
98
+ getAuthLogger,
99
+ healthCheck
100
+ };
@@ -0,0 +1,95 @@
1
+ import {
2
+ isErrorResponse,
3
+ requireAuthentication,
4
+ toNextlyAuthError
5
+ } from "./chunk-2Q2SX2CS.mjs";
6
+ import {
7
+ nextlyValidationFromZod
8
+ } from "./chunk-GJNSJU4S.mjs";
9
+ import {
10
+ withErrorHandler
11
+ } from "./chunk-TO5AFLVQ.mjs";
12
+ import {
13
+ getCachedNextly
14
+ } from "./chunk-P7NH2OSC.mjs";
15
+ import {
16
+ respondAction
17
+ } from "./chunk-IUDOC7N7.mjs";
18
+ import {
19
+ container
20
+ } from "./chunk-D5HQBNUB.mjs";
21
+ import {
22
+ NextlyError
23
+ } from "./chunk-NRUWQ5Z7.mjs";
24
+
25
+ // src/api/email-send-template.ts
26
+ import { z } from "zod";
27
+ async function getEmailService() {
28
+ await getCachedNextly();
29
+ return container.get("emailService");
30
+ }
31
+ var attachmentInputSchema = z.object({
32
+ mediaId: z.string().min(1, "mediaId is required"),
33
+ filename: z.string().min(1).optional()
34
+ });
35
+ var sendTemplateSchema = z.object({
36
+ to: z.string().email("A valid recipient email is required"),
37
+ template: z.string().min(1, "template slug is required"),
38
+ variables: z.record(z.string(), z.unknown()).optional(),
39
+ cc: z.array(z.string().email()).optional(),
40
+ bcc: z.array(z.string().email()).optional(),
41
+ providerId: z.string().optional(),
42
+ attachments: z.array(attachmentInputSchema).optional()
43
+ });
44
+ var POST = withErrorHandler(
45
+ async (request) => {
46
+ const authResult = await requireAuthentication(request);
47
+ if (isErrorResponse(authResult)) throw toNextlyAuthError(authResult);
48
+ let raw;
49
+ try {
50
+ raw = await request.json();
51
+ } catch {
52
+ throw new NextlyError({
53
+ code: "VALIDATION_ERROR",
54
+ publicMessage: "Validation failed.",
55
+ publicData: {
56
+ errors: [
57
+ {
58
+ path: "",
59
+ code: "invalid_json",
60
+ message: "Request body is not valid JSON."
61
+ }
62
+ ]
63
+ },
64
+ logContext: { reason: "invalid-json-body" }
65
+ });
66
+ }
67
+ let args;
68
+ try {
69
+ args = sendTemplateSchema.parse(raw);
70
+ } catch (err) {
71
+ if (err instanceof z.ZodError) throw nextlyValidationFromZod(err);
72
+ throw err;
73
+ }
74
+ const service = await getEmailService();
75
+ const result = await service.sendWithTemplate(
76
+ args.template,
77
+ args.to,
78
+ args.variables ?? {},
79
+ {
80
+ providerId: args.providerId,
81
+ cc: args.cc,
82
+ bcc: args.bcc,
83
+ attachments: args.attachments
84
+ }
85
+ );
86
+ return respondAction("Email queued.", {
87
+ ...result,
88
+ templateId: args.template
89
+ });
90
+ }
91
+ );
92
+
93
+ export {
94
+ POST
95
+ };
File without changes
@@ -0,0 +1,119 @@
1
+ // src/cli/utils/adapter.ts
2
+ function detectDialectFromUrl(url) {
3
+ if (url.startsWith("postgresql://") || url.startsWith("postgres://")) {
4
+ return "postgresql";
5
+ }
6
+ if (url.startsWith("mysql://")) {
7
+ return "mysql";
8
+ }
9
+ if (url.startsWith("file:") || url.endsWith(".db") || url.endsWith(".sqlite") || url.endsWith(".sqlite3")) {
10
+ return "sqlite";
11
+ }
12
+ return void 0;
13
+ }
14
+ function validateDatabaseEnv() {
15
+ const errors = [];
16
+ const databaseUrl = process.env.DATABASE_URL;
17
+ const dialectEnv = process.env.DB_DIALECT;
18
+ if (!databaseUrl) {
19
+ errors.push("DATABASE_URL environment variable is required");
20
+ }
21
+ let dialect = dialectEnv;
22
+ if (!dialect && databaseUrl) {
23
+ dialect = detectDialectFromUrl(databaseUrl);
24
+ }
25
+ if (!dialect) {
26
+ errors.push(
27
+ "Could not detect database dialect. Set DB_DIALECT to one of: postgresql, mysql, sqlite"
28
+ );
29
+ } else if (!["postgresql", "mysql", "sqlite"].includes(dialect)) {
30
+ errors.push(
31
+ `Invalid DB_DIALECT: ${dialect}. Must be one of: postgresql, mysql, sqlite`
32
+ );
33
+ }
34
+ return {
35
+ valid: errors.length === 0,
36
+ errors,
37
+ dialect: errors.length === 0 ? dialect : void 0,
38
+ databaseUrl: errors.length === 0 ? databaseUrl : void 0
39
+ };
40
+ }
41
+ async function createAdapter(options = {}) {
42
+ const { logger } = options;
43
+ const databaseUrl = options.databaseUrl ?? process.env.DATABASE_URL;
44
+ let dialect = options.dialect;
45
+ if (!dialect && databaseUrl) {
46
+ dialect = detectDialectFromUrl(databaseUrl);
47
+ }
48
+ if (!dialect) {
49
+ dialect = process.env.DB_DIALECT;
50
+ }
51
+ if (!databaseUrl) {
52
+ throw new Error("DATABASE_URL is required");
53
+ }
54
+ if (!dialect) {
55
+ throw new Error(
56
+ "Could not detect database dialect. Set DB_DIALECT environment variable."
57
+ );
58
+ }
59
+ logger?.debug(`Creating ${dialect} adapter...`);
60
+ const { createAdapterFromEnv } = await import("./factory-IWMBKUJM.mjs");
61
+ const originalDialect = process.env.DB_DIALECT;
62
+ const originalUrl = process.env.DATABASE_URL;
63
+ try {
64
+ process.env.DB_DIALECT = dialect;
65
+ process.env.DATABASE_URL = databaseUrl;
66
+ const adapter = await createAdapterFromEnv();
67
+ return adapter;
68
+ } finally {
69
+ if (originalDialect !== void 0) {
70
+ process.env.DB_DIALECT = originalDialect;
71
+ }
72
+ if (originalUrl !== void 0) {
73
+ process.env.DATABASE_URL = originalUrl;
74
+ }
75
+ }
76
+ }
77
+ async function withAdapter(fn, options = {}) {
78
+ const adapter = await createAdapter(options);
79
+ try {
80
+ return await fn(adapter);
81
+ } finally {
82
+ await adapter.disconnect();
83
+ }
84
+ }
85
+ function getDialectDisplayName(dialect) {
86
+ switch (dialect) {
87
+ case "postgresql":
88
+ return "PostgreSQL";
89
+ case "mysql":
90
+ return "MySQL";
91
+ case "sqlite":
92
+ return "SQLite";
93
+ default:
94
+ return dialect;
95
+ }
96
+ }
97
+ function dialectSupports(dialect, feature) {
98
+ switch (feature) {
99
+ case "transactions":
100
+ return true;
101
+ case "jsonb":
102
+ return dialect === "postgresql";
103
+ case "arrays":
104
+ return dialect === "postgresql";
105
+ case "uuids":
106
+ return dialect === "postgresql";
107
+ default:
108
+ return false;
109
+ }
110
+ }
111
+
112
+ export {
113
+ detectDialectFromUrl,
114
+ validateDatabaseEnv,
115
+ createAdapter,
116
+ withAdapter,
117
+ getDialectDisplayName,
118
+ dialectSupports
119
+ };