nextly 0.0.1 → 0.0.2-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,33 @@
1
+ -- Migration: Add image_sizes table and focal point / sizes columns to media
2
+ -- Supports named image sizes (like Payload/WordPress) and crop point for smart cropping.
3
+ -- Image sizes can be configured via code (nextly.config.ts) or admin UI (Settings).
4
+
5
+ -- UP
6
+
7
+ CREATE TABLE IF NOT EXISTS "image_sizes" (
8
+ "id" text PRIMARY KEY NOT NULL,
9
+ "name" varchar(50) NOT NULL,
10
+ "width" integer,
11
+ "height" integer,
12
+ "fit" varchar(20) NOT NULL DEFAULT 'inside',
13
+ "quality" integer NOT NULL DEFAULT 80,
14
+ "format" varchar(10) NOT NULL DEFAULT 'auto',
15
+ "is_default" boolean NOT NULL DEFAULT true,
16
+ "sort_order" integer NOT NULL DEFAULT 0,
17
+ "created_at" timestamp DEFAULT now() NOT NULL,
18
+ "updated_at" timestamp DEFAULT now() NOT NULL
19
+ );
20
+
21
+ CREATE UNIQUE INDEX IF NOT EXISTS "image_sizes_name_unique" ON "image_sizes" USING btree ("name");
22
+
23
+ ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "focal_x" integer;
24
+ ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "focal_y" integer;
25
+ ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes" jsonb;
26
+
27
+ -- DOWN
28
+
29
+ ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes";
30
+ ALTER TABLE "media" DROP COLUMN IF EXISTS "focal_y";
31
+ ALTER TABLE "media" DROP COLUMN IF EXISTS "focal_x";
32
+ DROP INDEX IF EXISTS "image_sizes_name_unique";
33
+ DROP TABLE IF EXISTS "image_sizes";
@@ -0,0 +1,13 @@
1
+ -- Migration: Add sidebar customization columns to site_settings
2
+
3
+ -- UP
4
+
5
+ ALTER TABLE "site_settings" ADD COLUMN IF NOT EXISTS "logo_url_dark" varchar(2048);
6
+ ALTER TABLE "site_settings" ADD COLUMN IF NOT EXISTS "custom_sidebar_groups" text;
7
+ ALTER TABLE "site_settings" ADD COLUMN IF NOT EXISTS "plugin_placements" text;
8
+
9
+ -- DOWN
10
+
11
+ ALTER TABLE "site_settings" DROP COLUMN IF EXISTS "plugin_placements";
12
+ ALTER TABLE "site_settings" DROP COLUMN IF EXISTS "custom_sidebar_groups";
13
+ ALTER TABLE "site_settings" DROP COLUMN IF EXISTS "logo_url_dark";
@@ -0,0 +1,29 @@
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 IF NOT EXISTS "failed_login_attempts" integer NOT NULL DEFAULT 0;
9
+ ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "locked_until" timestamp;
10
+
11
+ CREATE TABLE IF NOT EXISTS "refresh_tokens" (
12
+ "id" text PRIMARY KEY NOT NULL,
13
+ "user_id" text NOT NULL REFERENCES "users"("id") ON DELETE CASCADE,
14
+ "token_hash" varchar(64) NOT NULL,
15
+ "user_agent" text,
16
+ "ip_address" varchar(45),
17
+ "expires_at" timestamp NOT NULL,
18
+ "created_at" timestamp NOT NULL DEFAULT now()
19
+ );
20
+
21
+ CREATE INDEX IF NOT EXISTS "refresh_tokens_token_hash_idx" ON "refresh_tokens" ("token_hash");
22
+ CREATE INDEX IF NOT EXISTS "refresh_tokens_user_id_idx" ON "refresh_tokens" ("user_id");
23
+ CREATE INDEX IF NOT EXISTS "refresh_tokens_expires_at_idx" ON "refresh_tokens" ("expires_at");
24
+
25
+ -- DOWN
26
+
27
+ DROP TABLE IF EXISTS "refresh_tokens";
28
+ ALTER TABLE "users" DROP COLUMN IF EXISTS "locked_until";
29
+ ALTER TABLE "users" DROP COLUMN IF EXISTS "failed_login_attempts";
@@ -0,0 +1,12 @@
1
+ -- Migration: Email template default attachments
2
+ -- Adds a nullable `attachments` JSONB 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 IF NOT EXISTS "attachments" jsonb;
9
+
10
+ -- DOWN
11
+
12
+ ALTER TABLE "email_templates" DROP COLUMN IF EXISTS "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" ALTER COLUMN "uploaded_by" DROP NOT NULL;
10
+
11
+ -- DOWN
12
+ -- Restore NOT NULL. Rows with NULL uploaded_by must be backfilled before
13
+ -- running DOWN; ALTER ... SET NOT NULL fails if any nulls exist.
14
+
15
+ ALTER TABLE "media" ALTER COLUMN "uploaded_by" SET NOT NULL;
@@ -0,0 +1,24 @@
1
+ -- Migration: initial_journal
2
+ -- Generated at: 2026-04-29T00:00:00.000Z
3
+ -- Dialect: PostgreSQL
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" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
13
+ "filename" TEXT NOT NULL UNIQUE,
14
+ "sha256" CHAR(64) NOT NULL,
15
+ "applied_at" TIMESTAMPTZ NOT NULL DEFAULT NOW(),
16
+ "applied_by" TEXT,
17
+ "duration_ms" INTEGER,
18
+ "status" TEXT NOT NULL CHECK ("status" IN ('applied', 'failed')),
19
+ "error_json" JSONB,
20
+ "rollback_sql" TEXT
21
+ );
22
+
23
+ CREATE INDEX IF NOT EXISTS "nextly_migrations_applied_at_idx"
24
+ ON "nextly_migrations" ("applied_at");
@@ -0,0 +1,17 @@
1
+ -- Migration: journal_batch
2
+ -- Generated at: 2026-05-01T00:00:00.000Z
3
+ -- Dialect: PostgreSQL
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" integer NOT NULL DEFAULT 0;
14
+
15
+ -- DOWN
16
+
17
+ ALTER TABLE "nextly_migration_journal" DROP COLUMN IF EXISTS "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" text PRIMARY KEY NOT NULL,
8
+ "kind" varchar(64) NOT NULL,
9
+ "actor_user_id" text,
10
+ "target_user_id" text,
11
+ "ip_address" varchar(45),
12
+ "user_agent" text,
13
+ "metadata" jsonb,
14
+ "created_at" timestamp NOT NULL DEFAULT now()
15
+ );
16
+
17
+ CREATE INDEX IF NOT EXISTS "audit_log_kind_idx" ON "audit_log" ("kind");
18
+ CREATE INDEX IF NOT EXISTS "audit_log_actor_user_id_idx" ON "audit_log" ("actor_user_id");
19
+ CREATE INDEX IF NOT EXISTS "audit_log_target_user_id_idx" ON "audit_log" ("target_user_id");
20
+ CREATE INDEX IF NOT EXISTS "audit_log_created_at_idx" ON "audit_log" ("created_at");
21
+
22
+ -- DOWN
23
+
24
+ DROP TABLE IF EXISTS "audit_log";
@@ -0,0 +1,22 @@
1
+ -- Migration: nextly_meta runtime flags table
2
+ -- Generated at: 2026-05-04T00:00:00.000Z
3
+ -- Dialect: PostgreSQL
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" TEXT PRIMARY KEY NOT NULL,
13
+ "value" JSONB,
14
+ "updated_at" TIMESTAMPTZ NOT NULL DEFAULT NOW()
15
+ );
16
+
17
+ CREATE INDEX IF NOT EXISTS "nextly_meta_updated_at_idx"
18
+ ON "nextly_meta" ("updated_at");
19
+
20
+ -- DOWN
21
+
22
+ DROP TABLE IF EXISTS "nextly_meta";