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,133 @@
1
+ // src/shared/lib/env.ts
2
+ import { z } from "zod";
3
+ var _envSchema = z.object({
4
+ // Runtime
5
+ NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
6
+ // Database
7
+ DB_DIALECT: z.enum(["postgresql", "mysql", "sqlite"]).default("postgresql"),
8
+ // Optional by default to allow sqlite file paths; validated conditionally below
9
+ DATABASE_URL: z.string().optional(),
10
+ // SQLite-specific path (alternative to DATABASE_URL for SQLite)
11
+ SQLITE_PATH: z.string().optional(),
12
+ // Pooling & timeouts
13
+ DB_POOL_MAX: z.coerce.number().int().min(1).default(20),
14
+ DB_POOL_MIN: z.coerce.number().int().min(0).default(2),
15
+ DB_POOL_IDLE_TIMEOUT: z.coerce.number().int().min(1e3).default(3e4),
16
+ DB_QUERY_TIMEOUT: z.coerce.number().int().min(1e3).default(15e3),
17
+ DB_HEALTHCHECK_INTERVAL_MS: z.coerce.number().int().min(1e3).default(3e4),
18
+ DB_SNAKE_CASE: z.coerce.boolean().default(false),
19
+ // URLs
20
+ NEXT_PUBLIC_APP_URL: z.string().url().optional(),
21
+ API_BASE_URL: z.string().url().default("http://localhost:3000/api"),
22
+ // Nextly auth secret (required in production, min 32 chars)
23
+ NEXTLY_SECRET: z.string().optional(),
24
+ // Additional allowed origins for CSRF validation (comma-separated)
25
+ NEXTLY_ALLOWED_ORIGINS: z.string().optional(),
26
+ // SMTP (Email provider)
27
+ SMTP_HOST: z.string().optional(),
28
+ SMTP_PORT: z.coerce.number().int().min(1).max(65535).default(587),
29
+ SMTP_USER: z.string().optional(),
30
+ SMTP_PASS: z.string().optional(),
31
+ SMTP_FROM: z.string().email().optional()
32
+ }).superRefine((val, ctx) => {
33
+ const isProd = val.NODE_ENV === "production";
34
+ if (isProd) {
35
+ if (!val.NEXTLY_SECRET || val.NEXTLY_SECRET.length < 32) {
36
+ ctx.addIssue({
37
+ code: z.ZodIssueCode.custom,
38
+ path: ["NEXTLY_SECRET"],
39
+ message: "In production, NEXTLY_SECRET of at least 32 characters is required."
40
+ });
41
+ }
42
+ if (!val.NEXT_PUBLIC_APP_URL) {
43
+ ctx.addIssue({
44
+ code: z.ZodIssueCode.custom,
45
+ path: ["NEXT_PUBLIC_APP_URL"],
46
+ message: "In production, NEXT_PUBLIC_APP_URL is required."
47
+ });
48
+ }
49
+ const anySmtpProvided = Boolean(
50
+ val.SMTP_HOST || val.SMTP_USER || val.SMTP_PASS || val.SMTP_FROM
51
+ );
52
+ if (anySmtpProvided) {
53
+ const missingSmtp = !val.SMTP_HOST || !val.SMTP_USER || !val.SMTP_PASS || !val.SMTP_FROM;
54
+ if (missingSmtp) {
55
+ ctx.addIssue({
56
+ code: z.ZodIssueCode.custom,
57
+ path: ["SMTP_FROM"],
58
+ message: "SMTP configuration is partially provided. When using Email in production, set SMTP_HOST, SMTP_USER, SMTP_PASS, and SMTP_FROM."
59
+ });
60
+ }
61
+ }
62
+ }
63
+ const dialect = val.DB_DIALECT;
64
+ if (dialect !== "sqlite") {
65
+ if (!val.DATABASE_URL) {
66
+ ctx.addIssue({
67
+ code: z.ZodIssueCode.custom,
68
+ path: ["DATABASE_URL"],
69
+ message: `DATABASE_URL is required for ${dialect} dialect.`
70
+ });
71
+ }
72
+ }
73
+ if (val.DATABASE_URL) {
74
+ try {
75
+ new URL(val.DATABASE_URL);
76
+ } catch {
77
+ ctx.addIssue({
78
+ code: z.ZodIssueCode.custom,
79
+ path: ["DATABASE_URL"],
80
+ message: "DATABASE_URL must be a valid URL."
81
+ });
82
+ }
83
+ }
84
+ if (dialect === "sqlite" && !val.DATABASE_URL && !val.SQLITE_PATH) {
85
+ if (!isProd) {
86
+ console.warn(
87
+ "\u26A0\uFE0F Neither DATABASE_URL nor SQLITE_PATH set for SQLite. Defaulting to file:./data/nextly.db"
88
+ );
89
+ }
90
+ }
91
+ });
92
+ function validateEnv() {
93
+ const parsed = _envSchema.safeParse(process.env);
94
+ if (!parsed.success) {
95
+ console.error("Environment validation failed:");
96
+ parsed.error.issues.forEach((issue) => {
97
+ console.error(` ${issue.path.join(".")}: ${issue.message}`);
98
+ });
99
+ throw new Error("Invalid environment configuration");
100
+ }
101
+ const data = parsed.data;
102
+ const allowedOrigins = data.NEXTLY_ALLOWED_ORIGINS ? data.NEXTLY_ALLOWED_ORIGINS.split(",").map((s) => s.trim()).filter(Boolean) : [];
103
+ const normalized = Object.freeze({
104
+ ...data,
105
+ NEXTLY_ALLOWED_ORIGINS_PARSED: allowedOrigins
106
+ });
107
+ return normalized;
108
+ }
109
+ var _cachedEnv = null;
110
+ function getValidatedEnv() {
111
+ if (!_cachedEnv) {
112
+ _cachedEnv = validateEnv();
113
+ }
114
+ return _cachedEnv;
115
+ }
116
+ var env = new Proxy({}, {
117
+ get(_, prop, receiver) {
118
+ return Reflect.get(getValidatedEnv(), prop, receiver);
119
+ },
120
+ has(_, prop) {
121
+ return Reflect.has(getValidatedEnv(), prop);
122
+ },
123
+ ownKeys() {
124
+ return Reflect.ownKeys(getValidatedEnv());
125
+ },
126
+ getOwnPropertyDescriptor(_, prop) {
127
+ return Reflect.getOwnPropertyDescriptor(getValidatedEnv(), prop);
128
+ }
129
+ });
130
+
131
+ export {
132
+ env
133
+ };
@@ -0,0 +1,102 @@
1
+ import {
2
+ CreatePermissionSchema,
3
+ ServiceContainer
4
+ } from "./chunk-NSEFNNU4.mjs";
5
+
6
+ // src/database/seeders/permissions.ts
7
+ var RESOURCES = ["users", "roles", "permissions"];
8
+ var ACTIONS = ["create", "read", "update", "delete"];
9
+ async function seedPermissions(adapter, options) {
10
+ const {
11
+ resources = RESOURCES,
12
+ actions = ACTIONS,
13
+ silent = false
14
+ } = options || {};
15
+ const log = silent ? () => {
16
+ } : console.log;
17
+ const errorLog = silent ? () => {
18
+ } : console.error;
19
+ log("\u{1F331} Starting permission seeding...\n");
20
+ if (typeof adapter.getDrizzle !== "function") {
21
+ throw new Error(
22
+ `Seeding not supported for adapter. Adapter must have getDrizzle() method.`
23
+ );
24
+ }
25
+ const container = new ServiceContainer(adapter);
26
+ const permissionService = container.permissions;
27
+ let created = 0;
28
+ let skipped = 0;
29
+ let errors = 0;
30
+ const errorMessages = [];
31
+ for (const resource of resources) {
32
+ log(`\u{1F4E6} Processing resource: ${resource}`);
33
+ for (const action of actions) {
34
+ const name = `${action.charAt(0).toUpperCase() + action.slice(1)} ${resource.charAt(0).toUpperCase() + resource.slice(1)}`;
35
+ const slug = `${action}-${resource}`;
36
+ const description = `Permission to ${action} ${resource}`;
37
+ try {
38
+ const validation = CreatePermissionSchema.safeParse({
39
+ name,
40
+ slug,
41
+ action,
42
+ resource,
43
+ description
44
+ });
45
+ if (!validation.success) {
46
+ const errorMsg = `Schema validation failed for ${resource}:${action}: ${validation.error.issues.map((i) => i.message).join(", ")}`;
47
+ errorLog(` \u274C ${errorMsg}`);
48
+ errorMessages.push(errorMsg);
49
+ errors++;
50
+ continue;
51
+ }
52
+ const result = await permissionService.ensurePermission(
53
+ action,
54
+ resource,
55
+ name,
56
+ slug,
57
+ description
58
+ );
59
+ if (result.created) {
60
+ log(` \u2705 Created: ${resource}:${action}`);
61
+ created++;
62
+ } else {
63
+ log(` \u23ED\uFE0F Skipped (exists): ${resource}:${action}`);
64
+ skipped++;
65
+ }
66
+ } catch (error) {
67
+ const errorMsg = `Error creating ${resource}:${action}: ${error instanceof Error ? error.message : String(error)}`;
68
+ errorLog(` \u274C ${errorMsg}`);
69
+ errorMessages.push(errorMsg);
70
+ errors++;
71
+ }
72
+ }
73
+ log("");
74
+ }
75
+ log("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501");
76
+ log("\u{1F4CA} Seeding Summary:");
77
+ log(` \u2705 Created: ${created}`);
78
+ log(` \u23ED\uFE0F Skipped: ${skipped}`);
79
+ log(` \u274C Errors: ${errors}`);
80
+ log(` \u{1F4DD} Total: ${created + skipped + errors}`);
81
+ log("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n");
82
+ const success = errors === 0;
83
+ if (success) {
84
+ log("\u2728 Permission seeding completed successfully!");
85
+ } else {
86
+ errorLog(
87
+ "\u26A0\uFE0F Some permissions failed to seed. Please check the errors above."
88
+ );
89
+ }
90
+ return {
91
+ success,
92
+ created,
93
+ skipped,
94
+ errors,
95
+ total: created + skipped + errors,
96
+ errorMessages: errorMessages.length > 0 ? errorMessages : void 0
97
+ };
98
+ }
99
+
100
+ export {
101
+ seedPermissions
102
+ };
@@ -0,0 +1,78 @@
1
+ import {
2
+ readAccessTokenCookie,
3
+ verifyAccessToken
4
+ } from "./chunk-2ZFKXPQM.mjs";
5
+ import {
6
+ JWT_INTERNAL_CLAIMS
7
+ } from "./chunk-X23WKS3Z.mjs";
8
+
9
+ // src/auth/session/get-session.ts
10
+ async function getSession(request, secret) {
11
+ const token = readAccessTokenCookie(request);
12
+ if (!token) {
13
+ return { authenticated: false, reason: "no_token" };
14
+ }
15
+ const result = await verifyAccessToken(token, secret);
16
+ if (!result.valid) {
17
+ return {
18
+ authenticated: false,
19
+ reason: result.reason === "expired" ? "expired" : "invalid"
20
+ };
21
+ }
22
+ const user = payloadToSessionUser(result.payload);
23
+ return { authenticated: true, user };
24
+ }
25
+ function payloadToSessionUser(payload) {
26
+ const user = {
27
+ id: payload.sub,
28
+ email: payload.email,
29
+ name: payload.name,
30
+ image: payload.image,
31
+ roleIds: payload.roleIds || []
32
+ };
33
+ const knownClaims = /* @__PURE__ */ new Set([
34
+ ...JWT_INTERNAL_CLAIMS,
35
+ "sub",
36
+ "email",
37
+ "name",
38
+ "image",
39
+ "roleIds"
40
+ ]);
41
+ for (const [key, value] of Object.entries(payload)) {
42
+ if (!knownClaims.has(key)) {
43
+ user[key] = value;
44
+ }
45
+ }
46
+ return user;
47
+ }
48
+ function hasRole(user, roleSlug) {
49
+ return user.roleIds.includes(roleSlug);
50
+ }
51
+ function hasAnyRole(user, roleSlugs) {
52
+ return roleSlugs.some((slug) => user.roleIds.includes(slug));
53
+ }
54
+ function hasAllRoles(user, roleSlugs) {
55
+ return roleSlugs.every((slug) => user.roleIds.includes(slug));
56
+ }
57
+
58
+ // src/auth/session/refresh.ts
59
+ import { randomBytes, createHash } from "crypto";
60
+ function generateRefreshToken() {
61
+ return randomBytes(64).toString("hex");
62
+ }
63
+ function hashRefreshToken(token) {
64
+ return createHash("sha256").update(token).digest("hex");
65
+ }
66
+ function generateRefreshTokenId() {
67
+ return `rt_${randomBytes(16).toString("hex")}`;
68
+ }
69
+
70
+ export {
71
+ getSession,
72
+ hasRole,
73
+ hasAnyRole,
74
+ hasAllRoles,
75
+ generateRefreshToken,
76
+ hashRefreshToken,
77
+ generateRefreshTokenId
78
+ };