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,13 @@
1
+ -- Migration: Add sidebar customization columns to site_settings
2
+
3
+ -- UP
4
+
5
+ ALTER TABLE `site_settings` ADD COLUMN `logo_url_dark` varchar(2048);
6
+ ALTER TABLE `site_settings` ADD COLUMN `custom_sidebar_groups` text;
7
+ ALTER TABLE `site_settings` ADD COLUMN `plugin_placements` text;
8
+
9
+ -- DOWN
10
+
11
+ ALTER TABLE `site_settings` DROP COLUMN `plugin_placements`;
12
+ ALTER TABLE `site_settings` DROP COLUMN `custom_sidebar_groups`;
13
+ ALTER TABLE `site_settings` DROP COLUMN `logo_url_dark`;
@@ -0,0 +1,54 @@
1
+ -- Migration 0011: Add missing tables and columns to bring MySQL schema up to date.
2
+ --
3
+ -- This migration fills gaps that existed because the MySQL base migration
4
+ -- (0000_eager_sentry.sql) was generated from an older Drizzle schema snapshot
5
+ -- that predated dynamic_collections and the users.is_active/created_at/updated_at
6
+ -- columns. PostgreSQL didn't have this gap because pushSchema() worked there
7
+ -- and created all tables from the live schema definition.
8
+ --
9
+ -- See findings/task-2-mysql-code-first-migration-gaps.md for the investigation.
10
+
11
+ -- 1. Add missing columns to `users` table
12
+ ALTER TABLE `users` ADD COLUMN `is_active` boolean NOT NULL DEFAULT false;
13
+ ALTER TABLE `users` ADD COLUMN `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP;
14
+ ALTER TABLE `users` ADD COLUMN `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
15
+
16
+ -- 2. Create `dynamic_collections` table (matches the Drizzle schema in mysql.ts)
17
+ CREATE TABLE IF NOT EXISTS `dynamic_collections` (
18
+ `id` varchar(191) NOT NULL,
19
+ `slug` varchar(100) NOT NULL,
20
+ `table_name` varchar(255) NOT NULL,
21
+ `description` text,
22
+ `labels` json NOT NULL,
23
+ `fields` json NOT NULL,
24
+ `timestamps` boolean NOT NULL DEFAULT true,
25
+ `admin` json,
26
+ `source` varchar(20) NOT NULL DEFAULT 'ui',
27
+ `locked` boolean NOT NULL DEFAULT false,
28
+ `config_path` varchar(500),
29
+ `schema_hash` varchar(64) NOT NULL,
30
+ `schema_version` int NOT NULL DEFAULT 1,
31
+ `migration_status` varchar(20) NOT NULL DEFAULT 'pending',
32
+ `last_migration_id` varchar(100),
33
+ `access_rules` json,
34
+ `hooks` json,
35
+ `created_by` varchar(191),
36
+ `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
37
+ `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
38
+ CONSTRAINT `dynamic_collections_id` PRIMARY KEY(`id`),
39
+ CONSTRAINT `dynamic_collections_slug_unique` UNIQUE(`slug`),
40
+ CONSTRAINT `dynamic_collections_table_name_unique` UNIQUE(`table_name`)
41
+ );
42
+
43
+ CREATE INDEX `dynamic_collections_source_idx` ON `dynamic_collections` (`source`);
44
+ CREATE INDEX `dynamic_collections_created_at_idx` ON `dynamic_collections` (`created_at`);
45
+ CREATE INDEX `dynamic_collections_updated_at_idx` ON `dynamic_collections` (`updated_at`);
46
+
47
+ -- 3. Create `system_migrations` tracking table if it doesn't exist
48
+ -- (this table tracks which migrations have been applied)
49
+ CREATE TABLE IF NOT EXISTS `system_migrations` (
50
+ `id` int NOT NULL AUTO_INCREMENT,
51
+ `name` varchar(255) NOT NULL,
52
+ `run_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
53
+ CONSTRAINT `system_migrations_id` PRIMARY KEY(`id`)
54
+ );
@@ -0,0 +1,30 @@
1
+ -- Migration: Add image_sizes table and focal point / sizes columns to media (MySQL)
2
+
3
+ -- UP
4
+
5
+ CREATE TABLE IF NOT EXISTS `image_sizes` (
6
+ `id` varchar(36) NOT NULL,
7
+ `name` varchar(50) NOT NULL,
8
+ `width` int,
9
+ `height` int,
10
+ `fit` varchar(20) NOT NULL DEFAULT 'inside',
11
+ `quality` int NOT NULL DEFAULT 80,
12
+ `format` varchar(10) NOT NULL DEFAULT 'auto',
13
+ `is_default` boolean NOT NULL DEFAULT true,
14
+ `sort_order` int NOT NULL DEFAULT 0,
15
+ `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
16
+ `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
17
+ PRIMARY KEY (`id`),
18
+ UNIQUE KEY `image_sizes_name_unique` (`name`)
19
+ );
20
+
21
+ ALTER TABLE `media` ADD COLUMN `focal_x` int;
22
+ ALTER TABLE `media` ADD COLUMN `focal_y` int;
23
+ ALTER TABLE `media` ADD COLUMN `sizes` json;
24
+
25
+ -- DOWN
26
+
27
+ ALTER TABLE `media` DROP COLUMN `sizes`;
28
+ ALTER TABLE `media` DROP COLUMN `focal_y`;
29
+ ALTER TABLE `media` DROP COLUMN `focal_x`;
30
+ DROP TABLE IF EXISTS `image_sizes`;
@@ -0,0 +1,43 @@
1
+ -- Migration 0012: Add media folder support for MySQL.
2
+ --
3
+ -- Adds media_folders hierarchy and media.folder_id linkage so folder APIs
4
+ -- work consistently across PostgreSQL/MySQL/SQLite.
5
+
6
+ CREATE TABLE IF NOT EXISTS `media_folders` (
7
+ `id` varchar(255) NOT NULL,
8
+ `name` varchar(255) NOT NULL,
9
+ `description` text,
10
+ `parent_id` varchar(255),
11
+ `created_by` varchar(191) NOT NULL,
12
+ `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
13
+ `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
14
+ CONSTRAINT `media_folders_id` PRIMARY KEY(`id`)
15
+ );
16
+ --> statement-breakpoint
17
+
18
+ ALTER TABLE `media_folders`
19
+ ADD CONSTRAINT `media_folders_parent_id_media_folders_id_fk`
20
+ FOREIGN KEY (`parent_id`) REFERENCES `media_folders`(`id`) ON DELETE cascade ON UPDATE no action;
21
+ --> statement-breakpoint
22
+
23
+ ALTER TABLE `media_folders`
24
+ ADD CONSTRAINT `media_folders_created_by_users_id_fk`
25
+ FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;
26
+ --> statement-breakpoint
27
+
28
+ CREATE INDEX `media_folders_parent_id_idx` ON `media_folders` (`parent_id`);
29
+ --> statement-breakpoint
30
+ CREATE INDEX `media_folders_created_by_idx` ON `media_folders` (`created_by`);
31
+ --> statement-breakpoint
32
+ CREATE INDEX `media_folders_created_at_idx` ON `media_folders` (`created_at`);
33
+ --> statement-breakpoint
34
+
35
+ ALTER TABLE `media` ADD COLUMN `folder_id` varchar(255);
36
+ --> statement-breakpoint
37
+
38
+ ALTER TABLE `media`
39
+ ADD CONSTRAINT `media_folder_id_media_folders_id_fk`
40
+ FOREIGN KEY (`folder_id`) REFERENCES `media_folders`(`id`) ON DELETE set null ON UPDATE no action;
41
+ --> statement-breakpoint
42
+
43
+ CREATE INDEX `media_folder_id_idx` ON `media` (`folder_id`);
@@ -0,0 +1,31 @@
1
+ -- Migration: Custom auth schema additions
2
+ -- Adds brute-force protection columns to users and creates refresh_tokens table.
3
+ -- These were added to the Drizzle schema when custom JWT auth replaced Auth.js
4
+ -- but never got corresponding migration SQL.
5
+
6
+ -- UP
7
+
8
+ ALTER TABLE `users` ADD COLUMN `failed_login_attempts` int NOT NULL DEFAULT 0;
9
+ ALTER TABLE `users` ADD COLUMN `locked_until` datetime;
10
+
11
+ CREATE TABLE IF NOT EXISTS `refresh_tokens` (
12
+ `id` varchar(191) NOT NULL,
13
+ `user_id` varchar(191) NOT NULL,
14
+ `token_hash` varchar(64) NOT NULL,
15
+ `user_agent` text,
16
+ `ip_address` varchar(45),
17
+ `expires_at` datetime NOT NULL,
18
+ `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
19
+ CONSTRAINT `refresh_tokens_id` PRIMARY KEY(`id`),
20
+ CONSTRAINT `refresh_tokens_user_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE
21
+ );
22
+
23
+ CREATE INDEX `refresh_tokens_token_hash_idx` ON `refresh_tokens` (`token_hash`);
24
+ CREATE INDEX `refresh_tokens_user_id_idx` ON `refresh_tokens` (`user_id`);
25
+ CREATE INDEX `refresh_tokens_expires_at_idx` ON `refresh_tokens` (`expires_at`);
26
+
27
+ -- DOWN
28
+
29
+ DROP TABLE IF EXISTS `refresh_tokens`;
30
+ ALTER TABLE `users` DROP COLUMN `locked_until`;
31
+ ALTER TABLE `users` DROP COLUMN `failed_login_attempts`;
@@ -0,0 +1,12 @@
1
+ -- Migration: Email template default attachments
2
+ -- Adds a nullable `attachments` JSON column to email_templates so that
3
+ -- templates can carry default media-library attachments that are merged
4
+ -- with per-send attachments at send time.
5
+
6
+ -- UP
7
+
8
+ ALTER TABLE `email_templates` ADD COLUMN `attachments` json;
9
+
10
+ -- DOWN
11
+
12
+ ALTER TABLE `email_templates` DROP COLUMN `attachments`;
@@ -0,0 +1,15 @@
1
+ -- Migration: Make media.uploaded_by nullable
2
+ -- CLI seeds, data imports, and other system-context uploads may not have a
3
+ -- user to attribute the upload to. Dropping NOT NULL lets these operations
4
+ -- record media without a synthetic "anonymous" user sentinel (which doesn't
5
+ -- exist as a row and broke the foreign-key constraint).
6
+
7
+ -- UP
8
+
9
+ ALTER TABLE `media` MODIFY COLUMN `uploaded_by` varchar(255) NULL;
10
+
11
+ -- DOWN
12
+ -- Restore NOT NULL. Rows with NULL uploaded_by must be backfilled before
13
+ -- running DOWN.
14
+
15
+ ALTER TABLE `media` MODIFY COLUMN `uploaded_by` varchar(255) NOT NULL;
@@ -0,0 +1,22 @@
1
+ -- Migration: initial_journal
2
+ -- Generated at: 2026-04-29T00:00:00.000Z
3
+ -- Dialect: MySQL
4
+ -- Source: F11 (file-based migration ledger). Bundled with the nextly package
5
+ -- so fresh production databases get the table on first `nextly migrate`.
6
+ -- Synthetic 000000_000 time component so this bundled file sorts BEFORE
7
+ -- any user-generated migration created on the same date.
8
+
9
+ -- UP
10
+
11
+ CREATE TABLE IF NOT EXISTS `nextly_migrations` (
12
+ `id` VARCHAR(36) PRIMARY KEY,
13
+ `filename` VARCHAR(512) NOT NULL UNIQUE,
14
+ `sha256` CHAR(64) NOT NULL,
15
+ `applied_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
16
+ `applied_by` VARCHAR(255),
17
+ `duration_ms` INTEGER,
18
+ `status` VARCHAR(20) NOT NULL CHECK (`status` IN ('applied', 'failed')),
19
+ `error_json` JSON,
20
+ `rollback_sql` TEXT,
21
+ INDEX `nextly_migrations_applied_at_idx` (`applied_at`)
22
+ );
@@ -0,0 +1,17 @@
1
+ -- Migration: journal_batch
2
+ -- Generated at: 2026-05-01T00:00:00.000Z
3
+ -- Dialect: MySQL
4
+ -- Source: Phase 5 (Task 24). Adds the `batch` sentinel column to
5
+ -- nextly_migration_journal so audit queries can distinguish HMR/dev
6
+ -- pushes (batch < 0) from production migrations (batch >= 0). The
7
+ -- pipeline sets -1 for source="code" and leaves the default 0 for
8
+ -- everything else. Synthetic 000000_000 time component sorts this
9
+ -- file before any user-generated migration on the same date.
10
+
11
+ -- UP
12
+
13
+ ALTER TABLE `nextly_migration_journal` ADD COLUMN `batch` INT NOT NULL DEFAULT 0;
14
+
15
+ -- DOWN
16
+
17
+ ALTER TABLE `nextly_migration_journal` DROP COLUMN `batch`;
@@ -0,0 +1,24 @@
1
+ -- Append-only event store for security-sensitive auth events.
2
+ -- See packages/nextly/src/domains/audit/ for the writer service.
3
+
4
+ -- UP
5
+
6
+ CREATE TABLE IF NOT EXISTS `audit_log` (
7
+ `id` varchar(191) PRIMARY KEY NOT NULL,
8
+ `kind` varchar(64) NOT NULL,
9
+ `actor_user_id` varchar(191),
10
+ `target_user_id` varchar(191),
11
+ `ip_address` varchar(45),
12
+ `user_agent` text,
13
+ `metadata` json,
14
+ `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
15
+ );
16
+
17
+ CREATE INDEX `audit_log_kind_idx` ON `audit_log` (`kind`);
18
+ CREATE INDEX `audit_log_actor_user_id_idx` ON `audit_log` (`actor_user_id`);
19
+ CREATE INDEX `audit_log_target_user_id_idx` ON `audit_log` (`target_user_id`);
20
+ CREATE INDEX `audit_log_created_at_idx` ON `audit_log` (`created_at`);
21
+
22
+ -- DOWN
23
+
24
+ DROP TABLE IF EXISTS `audit_log`;
@@ -0,0 +1,21 @@
1
+ -- Migration: nextly_meta runtime flags table
2
+ -- Generated at: 2026-05-04T00:00:00.000Z
3
+ -- Dialect: MySQL
4
+ -- Source: Sub-task 2A — dashboard seeding card.
5
+ -- A small key/value/timestamp store for runtime state that doesn't belong
6
+ -- in collection schemas (first consumer: seed.completedAt / seed.skippedAt
7
+ -- flags read by the admin dashboard's SeedDemoContentCard).
8
+
9
+ -- UP
10
+
11
+ CREATE TABLE IF NOT EXISTS `nextly_meta` (
12
+ `key` varchar(191) PRIMARY KEY NOT NULL,
13
+ `value` json,
14
+ `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
15
+ );
16
+
17
+ CREATE INDEX `nextly_meta_updated_at_idx` ON `nextly_meta` (`updated_at`);
18
+
19
+ -- DOWN
20
+
21
+ DROP TABLE IF EXISTS `nextly_meta`;