@jant/core 0.1.2 → 0.2.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 (288) hide show
  1. package/dist/app.d.ts +34 -0
  2. package/dist/app.d.ts.map +1 -0
  3. package/dist/app.js +474 -0
  4. package/dist/assets/datastar.min.js +1775 -0
  5. package/dist/auth.d.ts +23 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +34 -0
  8. package/{src/client.ts → dist/client.d.ts} +1 -1
  9. package/dist/client.d.ts.map +1 -0
  10. package/dist/client.js +4 -0
  11. package/dist/db/index.d.ts +10 -0
  12. package/dist/db/index.d.ts.map +1 -0
  13. package/dist/db/index.js +10 -0
  14. package/dist/db/schema.d.ts +1507 -0
  15. package/dist/db/schema.d.ts.map +1 -0
  16. package/dist/db/schema.js +183 -0
  17. package/{src/i18n/Trans.tsx → dist/i18n/Trans.d.ts} +4 -10
  18. package/dist/i18n/Trans.d.ts.map +1 -0
  19. package/dist/i18n/Trans.js +24 -0
  20. package/dist/i18n/context.d.ts +69 -0
  21. package/dist/i18n/context.d.ts.map +1 -0
  22. package/dist/i18n/context.js +61 -0
  23. package/dist/i18n/detect.d.ts +31 -0
  24. package/dist/i18n/detect.d.ts.map +1 -0
  25. package/dist/i18n/detect.js +77 -0
  26. package/{src/i18n/i18n.ts → dist/i18n/i18n.d.ts} +5 -25
  27. package/dist/i18n/i18n.d.ts.map +1 -0
  28. package/dist/i18n/i18n.js +55 -0
  29. package/dist/i18n/index.d.ts +41 -0
  30. package/dist/i18n/index.d.ts.map +1 -0
  31. package/{src/i18n/index.ts → dist/i18n/index.js} +3 -24
  32. package/dist/i18n/locales/en.d.ts +3 -0
  33. package/dist/i18n/locales/en.d.ts.map +1 -0
  34. package/dist/i18n/locales/en.js +1 -0
  35. package/dist/i18n/locales/zh-Hans.d.ts +3 -0
  36. package/dist/i18n/locales/zh-Hans.d.ts.map +1 -0
  37. package/dist/i18n/locales/zh-Hans.js +1 -0
  38. package/dist/i18n/locales/zh-Hant.d.ts +3 -0
  39. package/dist/i18n/locales/zh-Hant.d.ts.map +1 -0
  40. package/dist/i18n/locales/zh-Hant.js +1 -0
  41. package/dist/i18n/locales.d.ts +11 -0
  42. package/dist/i18n/locales.d.ts.map +1 -0
  43. package/dist/i18n/locales.js +13 -0
  44. package/dist/i18n/middleware.d.ts +24 -0
  45. package/dist/i18n/middleware.d.ts.map +1 -0
  46. package/dist/i18n/middleware.js +41 -0
  47. package/dist/index.d.ts +16 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/{src/index.ts → dist/index.js} +1 -28
  50. package/dist/lib/assets.d.ts +19 -0
  51. package/dist/lib/assets.d.ts.map +1 -0
  52. package/dist/lib/assets.js +33 -0
  53. package/dist/lib/constants.d.ts +36 -0
  54. package/dist/lib/constants.d.ts.map +1 -0
  55. package/dist/lib/constants.js +50 -0
  56. package/{src/lib/image.ts → dist/lib/image.d.ts} +13 -47
  57. package/dist/lib/image.d.ts.map +1 -0
  58. package/dist/lib/image.js +77 -0
  59. package/{src/lib/index.ts → dist/lib/index.d.ts} +1 -1
  60. package/dist/lib/index.d.ts.map +1 -0
  61. package/dist/lib/index.js +7 -0
  62. package/dist/lib/markdown.d.ts +60 -0
  63. package/dist/lib/markdown.d.ts.map +1 -0
  64. package/{src/lib/markdown.ts → dist/lib/markdown.js} +16 -26
  65. package/dist/lib/schemas.d.ts +113 -0
  66. package/dist/lib/schemas.d.ts.map +1 -0
  67. package/dist/lib/schemas.js +71 -0
  68. package/dist/lib/sqid.d.ts +60 -0
  69. package/dist/lib/sqid.d.ts.map +1 -0
  70. package/{src/lib/sqid.ts → dist/lib/sqid.js} +15 -22
  71. package/dist/lib/sse.d.ts +95 -0
  72. package/dist/lib/sse.d.ts.map +1 -0
  73. package/dist/lib/sse.js +81 -0
  74. package/dist/lib/time.d.ts +90 -0
  75. package/dist/lib/time.d.ts.map +1 -0
  76. package/{src/lib/time.ts → dist/lib/time.js} +20 -33
  77. package/{src/lib/url.ts → dist/lib/url.d.ts} +5 -30
  78. package/dist/lib/url.d.ts.map +1 -0
  79. package/dist/lib/url.js +89 -0
  80. package/dist/middleware/auth.d.ts +24 -0
  81. package/dist/middleware/auth.d.ts.map +1 -0
  82. package/dist/middleware/auth.js +52 -0
  83. package/dist/routes/api/posts.d.ts +13 -0
  84. package/dist/routes/api/posts.d.ts.map +1 -0
  85. package/dist/routes/api/posts.js +124 -0
  86. package/dist/routes/api/search.d.ts +13 -0
  87. package/dist/routes/api/search.d.ts.map +1 -0
  88. package/dist/routes/api/search.js +49 -0
  89. package/dist/routes/api/upload.d.ts +16 -0
  90. package/dist/routes/api/upload.d.ts.map +1 -0
  91. package/dist/routes/api/upload.js +227 -0
  92. package/dist/routes/dash/collections.d.ts +13 -0
  93. package/dist/routes/dash/collections.d.ts.map +1 -0
  94. package/dist/routes/dash/collections.js +512 -0
  95. package/dist/routes/dash/index.d.ts +15 -0
  96. package/dist/routes/dash/index.d.ts.map +1 -0
  97. package/dist/routes/dash/index.js +117 -0
  98. package/dist/routes/dash/media.d.ts +16 -0
  99. package/dist/routes/dash/media.d.ts.map +1 -0
  100. package/dist/routes/dash/media.js +589 -0
  101. package/dist/routes/dash/pages.d.ts +15 -0
  102. package/dist/routes/dash/pages.d.ts.map +1 -0
  103. package/dist/routes/dash/pages.js +290 -0
  104. package/dist/routes/dash/posts.d.ts +13 -0
  105. package/dist/routes/dash/posts.d.ts.map +1 -0
  106. package/dist/routes/dash/posts.js +226 -0
  107. package/dist/routes/dash/redirects.d.ts +13 -0
  108. package/dist/routes/dash/redirects.d.ts.map +1 -0
  109. package/dist/routes/dash/redirects.js +237 -0
  110. package/dist/routes/dash/settings.d.ts +13 -0
  111. package/dist/routes/dash/settings.d.ts.map +1 -0
  112. package/dist/routes/dash/settings.js +154 -0
  113. package/dist/routes/feed/rss.d.ts +13 -0
  114. package/dist/routes/feed/rss.d.ts.map +1 -0
  115. package/dist/routes/feed/rss.js +95 -0
  116. package/dist/routes/feed/sitemap.d.ts +13 -0
  117. package/dist/routes/feed/sitemap.d.ts.map +1 -0
  118. package/dist/routes/feed/sitemap.js +59 -0
  119. package/dist/routes/pages/archive.d.ts +15 -0
  120. package/dist/routes/pages/archive.d.ts.map +1 -0
  121. package/dist/routes/pages/archive.js +255 -0
  122. package/dist/routes/pages/collection.d.ts +13 -0
  123. package/dist/routes/pages/collection.d.ts.map +1 -0
  124. package/dist/routes/pages/collection.js +93 -0
  125. package/dist/routes/pages/home.d.ts +13 -0
  126. package/dist/routes/pages/home.d.ts.map +1 -0
  127. package/dist/routes/pages/home.js +122 -0
  128. package/dist/routes/pages/page.d.ts +15 -0
  129. package/dist/routes/pages/page.d.ts.map +1 -0
  130. package/dist/routes/pages/page.js +69 -0
  131. package/dist/routes/pages/post.d.ts +13 -0
  132. package/dist/routes/pages/post.d.ts.map +1 -0
  133. package/dist/routes/pages/post.js +90 -0
  134. package/dist/routes/pages/search.d.ts +13 -0
  135. package/dist/routes/pages/search.d.ts.map +1 -0
  136. package/dist/routes/pages/search.js +180 -0
  137. package/dist/services/collection.d.ts +31 -0
  138. package/dist/services/collection.d.ts.map +1 -0
  139. package/dist/services/collection.js +108 -0
  140. package/dist/services/index.d.ts +28 -0
  141. package/dist/services/index.d.ts.map +1 -0
  142. package/dist/services/index.js +20 -0
  143. package/dist/services/media.d.ts +27 -0
  144. package/dist/services/media.d.ts.map +1 -0
  145. package/dist/services/media.js +62 -0
  146. package/dist/services/post.d.ts +31 -0
  147. package/dist/services/post.d.ts.map +1 -0
  148. package/dist/services/post.js +191 -0
  149. package/dist/services/redirect.d.ts +15 -0
  150. package/dist/services/redirect.d.ts.map +1 -0
  151. package/dist/services/redirect.js +48 -0
  152. package/dist/services/search.d.ts +26 -0
  153. package/dist/services/search.d.ts.map +1 -0
  154. package/dist/services/search.js +61 -0
  155. package/dist/services/settings.d.ts +17 -0
  156. package/dist/services/settings.d.ts.map +1 -0
  157. package/dist/services/settings.js +65 -0
  158. package/dist/theme/components/ActionButtons.d.ts +43 -0
  159. package/dist/theme/components/ActionButtons.d.ts.map +1 -0
  160. package/dist/theme/components/ActionButtons.js +50 -0
  161. package/dist/theme/components/CrudPageHeader.d.ts +23 -0
  162. package/dist/theme/components/CrudPageHeader.d.ts.map +1 -0
  163. package/dist/theme/components/CrudPageHeader.js +22 -0
  164. package/dist/theme/components/DangerZone.d.ts +36 -0
  165. package/dist/theme/components/DangerZone.d.ts.map +1 -0
  166. package/dist/theme/components/DangerZone.js +39 -0
  167. package/dist/theme/components/EmptyState.d.ts +27 -0
  168. package/dist/theme/components/EmptyState.d.ts.map +1 -0
  169. package/dist/theme/components/EmptyState.js +27 -0
  170. package/dist/theme/components/ListItemRow.d.ts +15 -0
  171. package/dist/theme/components/ListItemRow.d.ts.map +1 -0
  172. package/dist/theme/components/ListItemRow.js +21 -0
  173. package/dist/theme/components/PageForm.d.ts +14 -0
  174. package/dist/theme/components/PageForm.d.ts.map +1 -0
  175. package/dist/theme/components/PageForm.js +173 -0
  176. package/dist/theme/components/Pagination.d.ts +46 -0
  177. package/dist/theme/components/Pagination.d.ts.map +1 -0
  178. package/dist/theme/components/Pagination.js +159 -0
  179. package/dist/theme/components/PostForm.d.ts +12 -0
  180. package/dist/theme/components/PostForm.d.ts.map +1 -0
  181. package/dist/theme/components/PostForm.js +230 -0
  182. package/dist/theme/components/PostList.d.ts +10 -0
  183. package/dist/theme/components/PostList.d.ts.map +1 -0
  184. package/dist/theme/components/PostList.js +73 -0
  185. package/dist/theme/components/ThreadView.d.ts +15 -0
  186. package/dist/theme/components/ThreadView.d.ts.map +1 -0
  187. package/dist/theme/components/ThreadView.js +111 -0
  188. package/dist/theme/components/TypeBadge.d.ts +12 -0
  189. package/dist/theme/components/TypeBadge.d.ts.map +1 -0
  190. package/dist/theme/components/TypeBadge.js +39 -0
  191. package/dist/theme/components/VisibilityBadge.d.ts +12 -0
  192. package/dist/theme/components/VisibilityBadge.d.ts.map +1 -0
  193. package/dist/theme/components/VisibilityBadge.js +37 -0
  194. package/{src/theme/components/index.ts → dist/theme/components/index.d.ts} +1 -0
  195. package/dist/theme/components/index.d.ts.map +1 -0
  196. package/dist/theme/components/index.js +12 -0
  197. package/dist/theme/index.d.ts +21 -0
  198. package/dist/theme/index.d.ts.map +1 -0
  199. package/{src/theme/index.ts → dist/theme/index.js} +1 -4
  200. package/dist/theme/layouts/BaseLayout.d.ts +16 -0
  201. package/dist/theme/layouts/BaseLayout.d.ts.map +1 -0
  202. package/dist/theme/layouts/BaseLayout.js +58 -0
  203. package/dist/theme/layouts/DashLayout.d.ts +15 -0
  204. package/dist/theme/layouts/DashLayout.d.ts.map +1 -0
  205. package/dist/theme/layouts/DashLayout.js +139 -0
  206. package/{src/theme/layouts/index.ts → dist/theme/layouts/index.d.ts} +1 -0
  207. package/dist/theme/layouts/index.d.ts.map +1 -0
  208. package/dist/theme/layouts/index.js +2 -0
  209. package/dist/theme/styles/main.css +2 -0
  210. package/dist/types.d.ts +179 -0
  211. package/dist/types.d.ts.map +1 -0
  212. package/dist/types.js +19 -0
  213. package/package.json +26 -26
  214. package/drizzle.config.ts +0 -10
  215. package/lingui.config.ts +0 -16
  216. package/src/app.tsx +0 -377
  217. package/src/assets/datastar.min.js +0 -8
  218. package/src/auth.ts +0 -38
  219. package/src/db/index.ts +0 -14
  220. package/src/db/migrations/0000_solid_moon_knight.sql +0 -118
  221. package/src/db/migrations/0001_add_search_fts.sql +0 -40
  222. package/src/db/migrations/0002_collection_path.sql +0 -2
  223. package/src/db/migrations/0003_collection_path_nullable.sql +0 -21
  224. package/src/db/migrations/0004_media_uuid.sql +0 -35
  225. package/src/db/migrations/meta/0000_snapshot.json +0 -784
  226. package/src/db/migrations/meta/_journal.json +0 -41
  227. package/src/db/schema.ts +0 -159
  228. package/src/i18n/EXAMPLES.md +0 -235
  229. package/src/i18n/README.md +0 -296
  230. package/src/i18n/context.tsx +0 -101
  231. package/src/i18n/detect.ts +0 -100
  232. package/src/i18n/locales/en.po +0 -875
  233. package/src/i18n/locales/en.ts +0 -1
  234. package/src/i18n/locales/zh-Hans.po +0 -875
  235. package/src/i18n/locales/zh-Hans.ts +0 -1
  236. package/src/i18n/locales/zh-Hant.po +0 -875
  237. package/src/i18n/locales/zh-Hant.ts +0 -1
  238. package/src/i18n/locales.ts +0 -14
  239. package/src/i18n/middleware.ts +0 -59
  240. package/src/lib/assets.ts +0 -47
  241. package/src/lib/constants.ts +0 -67
  242. package/src/lib/schemas.ts +0 -92
  243. package/src/lib/sse.ts +0 -152
  244. package/src/middleware/auth.ts +0 -59
  245. package/src/routes/api/posts.ts +0 -127
  246. package/src/routes/api/search.ts +0 -53
  247. package/src/routes/api/upload.ts +0 -240
  248. package/src/routes/dash/collections.tsx +0 -341
  249. package/src/routes/dash/index.tsx +0 -89
  250. package/src/routes/dash/media.tsx +0 -551
  251. package/src/routes/dash/pages.tsx +0 -245
  252. package/src/routes/dash/posts.tsx +0 -202
  253. package/src/routes/dash/redirects.tsx +0 -155
  254. package/src/routes/dash/settings.tsx +0 -93
  255. package/src/routes/feed/rss.ts +0 -119
  256. package/src/routes/feed/sitemap.ts +0 -75
  257. package/src/routes/pages/archive.tsx +0 -223
  258. package/src/routes/pages/collection.tsx +0 -79
  259. package/src/routes/pages/home.tsx +0 -93
  260. package/src/routes/pages/page.tsx +0 -64
  261. package/src/routes/pages/post.tsx +0 -81
  262. package/src/routes/pages/search.tsx +0 -162
  263. package/src/services/collection.ts +0 -180
  264. package/src/services/index.ts +0 -40
  265. package/src/services/media.ts +0 -97
  266. package/src/services/post.ts +0 -279
  267. package/src/services/redirect.ts +0 -74
  268. package/src/services/search.ts +0 -117
  269. package/src/services/settings.ts +0 -76
  270. package/src/theme/components/ActionButtons.tsx +0 -98
  271. package/src/theme/components/CrudPageHeader.tsx +0 -48
  272. package/src/theme/components/DangerZone.tsx +0 -77
  273. package/src/theme/components/EmptyState.tsx +0 -56
  274. package/src/theme/components/ListItemRow.tsx +0 -24
  275. package/src/theme/components/PageForm.tsx +0 -114
  276. package/src/theme/components/Pagination.tsx +0 -196
  277. package/src/theme/components/PostForm.tsx +0 -122
  278. package/src/theme/components/PostList.tsx +0 -68
  279. package/src/theme/components/ThreadView.tsx +0 -118
  280. package/src/theme/components/TypeBadge.tsx +0 -28
  281. package/src/theme/components/VisibilityBadge.tsx +0 -33
  282. package/src/theme/layouts/BaseLayout.tsx +0 -49
  283. package/src/theme/layouts/DashLayout.tsx +0 -108
  284. package/src/theme/styles/main.css +0 -52
  285. package/src/types.ts +0 -222
  286. package/tsconfig.json +0 -16
  287. package/vite.config.ts +0 -82
  288. package/wrangler.toml +0 -21
@@ -32,34 +32,13 @@
32
32
  * );
33
33
  * }
34
34
  * ```
35
- */
36
-
37
- // Core i18n runtime
38
- export {
39
- createI18n,
40
- getI18n,
41
- locales,
42
- baseLocale,
43
- isLocale,
44
- type Locale,
45
- type I18n,
46
- } from "./i18n.js";
47
-
35
+ */ // Core i18n runtime
36
+ export { createI18n, getI18n, locales, baseLocale, isLocale } from "./i18n.js";
48
37
  // I18nProvider and useLingui hook (custom implementation for Hono JSX, SSR-compatible)
49
38
  export { I18nProvider, useLingui } from "./context.js";
50
-
51
39
  // Trans component (simplified for Hono JSX)
52
40
  export { Trans } from "./Trans.js";
53
-
54
41
  // Language detection utilities
55
- export {
56
- detectLanguage,
57
- isValidLanguage,
58
- parseAcceptLanguage,
59
- getLanguageDisplayName,
60
- getSupportedLanguages,
61
- LANGUAGE_COOKIE_NAME,
62
- } from "./detect.js";
63
-
42
+ export { detectLanguage, isValidLanguage, parseAcceptLanguage, getLanguageDisplayName, getSupportedLanguages, LANGUAGE_COOKIE_NAME } from "./detect.js";
64
43
  // Hono middleware
65
44
  export { i18nMiddleware } from "./middleware.js";
@@ -0,0 +1,3 @@
1
+ import type { Messages } from "@lingui/core";
2
+ export declare const messages: Messages;
3
+ //# sourceMappingURL=en.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/en.ts"],"names":[],"mappings":"AAAkB,OAAO,KAAI,EAAC,QAAQ,EAAC,MAAI,cAAc,CAAC;AAAA,eAAO,MAAM,QAAQ,EAAg4I,QAAQ,CAAC"}
@@ -0,0 +1 @@
1
+ /*eslint-disable*/ export const messages = JSON.parse("{\"+7Wr2a\":[\"Edit: \",[\"title\"]],\"+MACwa\":[\"No collections yet.\"],\"+owNNn\":[\"Posts\"],\"+zy2Nq\":[\"Type\"],\"/0D1Xp\":[\"Edit Collection\"],\"/Rj5P4\":[\"Your Name\"],\"0JkyS7\":[\"Create your first page\"],\"0a6MpL\":[\"New Redirect\"],\"1CU1Td\":[\"URL-safe identifier (lowercase, numbers, hyphens)\"],\"1DBGsz\":[\"Notes\"],\"2N0qpv\":[\"Post title...\"],\"2q/Q7x\":[\"Visibility\"],\"2rJGtU\":[\"Page title...\"],\"3Yvsaz\":[\"302 (Temporary)\"],\"4/SFQS\":[\"View Site\"],\"40TVQj\":[\"Custom Path (optional)\"],\"4KzVT6\":[\"Delete Page\"],\"4b3oEV\":[\"Content\"],\"4mDPGp\":[\"The URL path for this page. Use lowercase letters, numbers, and hyphens.\"],\"6WdDG7\":[\"Page\"],\"7G4SBz\":[\"Page content (Markdown supported)...\"],\"7Mk+/h\":[\"Update Collection\"],\"7Q1KKN\":[\"From Path\"],\"7nGhhM\":[\"What's on your mind?\"],\"7p5kLi\":[\"Dashboard\"],\"8ZsakT\":[\"Password\"],\"90Luob\":[[\"count\"],\" replies\"],\"A1taO8\":[\"Search\"],\"AyHO4m\":[\"What's this collection about?\"],\"B373X+\":[\"Edit Post\"],\"B495Gs\":[\"Archive\"],\"BjF0Jv\":[\"Lowercase letters, numbers, and hyphens only\"],\"D9Oea+\":[\"Permalink\"],\"DHhJ7s\":[\"Previous\"],\"DoJzLz\":[\"Collections\"],\"E80cJw\":[\"Deleting this media will remove it permanently from storage.\"],\"EEYbdt\":[\"Publish\"],\"EGwzOK\":[\"Complete Setup\"],\"EkH9pt\":[\"Update\"],\"FGrimz\":[\"New Post\"],\"FkMol5\":[\"Featured\"],\"Fxf4jq\":[\"Description (optional)\"],\"GA5A5H\":[\"Delete Collection\"],\"GorKul\":[\"Welcome to Jant\"],\"GrZ6fH\":[\"New Page\"],\"HfyyXl\":[\"My Blog\"],\"HiETwV\":[\"Quiet (normal)\"],\"Hzi9AA\":[\"No posts found.\"],\"I6gXOa\":[\"Path\"],\"IagCbF\":[\"URL\"],\"J4FNfC\":[\"No posts in this collection.\"],\"JIBC/T\":[\"Supported formats: JPEG, PNG, GIF, WebP, SVG. Max size: 10MB.\"],\"JiP4aa\":[\"Published pages are accessible via their path. Drafts are not visible.\"],\"K9NcLu\":[\"Use this URL to embed the media in your posts.\"],\"KiJn9B\":[\"Note\"],\"L85WcV\":[\"Slug\"],\"LkvLQe\":[\"No pages yet.\"],\"M8kJqa\":[\"Drafts\"],\"M9xgHy\":[\"Redirects\"],\"MHrjPM\":[\"Title\"],\"MZbQHL\":[\"No results found.\"],\"Mhf/H/\":[\"Create Redirect\"],\"MqghUt\":[\"Search posts...\"],\"N40H+G\":[\"All\"],\"O3oNi5\":[\"Email\"],\"OCNZaU\":[\"The path to redirect from\"],\"ODiSoW\":[\"No posts yet.\"],\"ONWvwQ\":[\"Upload\"],\"Pbm2/N\":[\"Create Collection\"],\"RDjuBN\":[\"Setup\"],\"Rj01Fz\":[\"Links\"],\"RwGhWy\":[\"Thread with \",[\"count\"],\" posts\"],\"SJmfuf\":[\"Site Name\"],\"ST+lN2\":[\"No media uploaded yet.\"],\"Tt5T6+\":[\"Articles\"],\"TxE+Mj\":[\"1 reply\"],\"Tz0i8g\":[\"Settings\"],\"U5v6Gh\":[\"Edit Page\"],\"UDMjsP\":[\"Quick Actions\"],\"UGT5vp\":[\"Save Settings\"],\"VUSy8D\":[\"Search failed. Please try again.\"],\"WDcQq9\":[\"Unlisted\"],\"Weq9zb\":[\"General\"],\"WmZ/rP\":[\"To Path\"],\"Y+7JGK\":[\"Create Page\"],\"ZQKLI1\":[\"Danger Zone\"],\"ZhhOwV\":[\"Quote\"],\"an5hVd\":[\"Images\"],\"b+/jO6\":[\"301 (Permanent)\"],\"bHYIks\":[\"Sign Out\"],\"biOepV\":[\"← Back to home\"],\"cnGeoo\":[\"Delete\"],\"dEgA5A\":[\"Cancel\"],\"e6Jr7Q\":[\"← Back to Collections\"],\"ePK91l\":[\"Edit\"],\"eWLklq\":[\"Quotes\"],\"eneWvv\":[\"Draft\"],\"f6e0Ry\":[\"Article\"],\"fG7BxZ\":[\"Upload images via the API: POST /api/upload with a file form field.\"],\"fttd2R\":[\"My Collection\"],\"hG89Ed\":[\"Image\"],\"hXzOVo\":[\"Next\"],\"he3ygx\":[\"Copy\"],\"iH8pgl\":[\"Back\"],\"ig4hg2\":[\"Let's set up your site.\"],\"jpctdh\":[\"View\"],\"mTOYla\":[\"View all posts →\"],\"n1ekoW\":[\"Sign In\"],\"oYPBa0\":[\"Update Page\"],\"pRhYH2\":[\"Posts in Collection (\",[\"count\"],\")\"],\"qMyM2u\":[\"Source URL (optional)\"],\"r1MpXi\":[\"Quiet\"],\"rdUucN\":[\"Preview\"],\"rzNUSl\":[\"Thread with 1 post\"],\"sGajR7\":[\"Thread start\"],\"t/YqKh\":[\"Remove\"],\"tfrt7B\":[\"No redirects configured.\"],\"tiq7kl\":[\"Page \",[\"page\"]],\"u2f7vd\":[\"Site Description\"],\"u3wRF+\":[\"Published\"],\"u6Hp4N\":[\"Markdown\"],\"uAQUqI\":[\"Status\"],\"vXIe7J\":[\"Language\"],\"vzU4k9\":[\"New Collection\"],\"wEF6Ix\":[\"The destination path or URL\"],\"wK4OTM\":[\"Title (optional)\"],\"wM5UXj\":[\"Delete Media\"],\"wRR604\":[\"Pages\"],\"wja8aL\":[\"Untitled\"],\"x0mzE0\":[\"Create your first post\"],\"x4RuFo\":[\"Back to home\"],\"xYilR2\":[\"Media\"],\"y28hnO\":[\"Post\"],\"yQ2kGp\":[\"Load more\"],\"yzF66j\":[\"Link\"],\"z8ajIE\":[\"Found 1 result\"],\"zH6KqE\":[\"Found \",[\"count\"],\" results\"]}");
@@ -0,0 +1,3 @@
1
+ import type { Messages } from "@lingui/core";
2
+ export declare const messages: Messages;
3
+ //# sourceMappingURL=zh-Hans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zh-Hans.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/zh-Hans.ts"],"names":[],"mappings":"AAAkB,OAAO,KAAI,EAAC,QAAQ,EAAC,MAAI,cAAc,CAAC;AAAA,eAAO,MAAM,QAAQ,EAA+vG,QAAQ,CAAC"}
@@ -0,0 +1 @@
1
+ /*eslint-disable*/ export const messages = JSON.parse("{\"+7Wr2a\":[\"编辑: \",[\"title\"]],\"+MACwa\":[\"尚未有任何收藏。\"],\"+owNNn\":[\"帖子\"],\"+zy2Nq\":[\"类型\"],\"/0D1Xp\":[\"编辑集合\"],\"/Rj5P4\":[\"您的姓名\"],\"0JkyS7\":[\"创建您的第一页\"],\"0a6MpL\":[\"新重定向\"],\"1CU1Td\":[\"URL安全标识符(小写字母、数字、连字符)\"],\"1DBGsz\":[\"笔记\"],\"2N0qpv\":[\"帖子标题...\"],\"2q/Q7x\":[\"可见性\"],\"2rJGtU\":[\"页面标题...\"],\"3Yvsaz\":[\"302(临时)\"],\"4/SFQS\":[\"查看网站\"],\"40TVQj\":[\"自定义路径(可选)\"],\"4KzVT6\":[\"删除页面\"],\"4b3oEV\":[\"内容\"],\"4mDPGp\":[\"此页面的 URL 路径。使用小写字母、数字和连字符。\"],\"6WdDG7\":[\"页面\"],\"7G4SBz\":[\"页面内容(支持Markdown)...\"],\"7Mk+/h\":[\"更新收藏夹\"],\"7Q1KKN\":[\"来源路径\"],\"7nGhhM\":[\"你在想什么?\"],\"7p5kLi\":[\"仪表板\"],\"8ZsakT\":[\"密码\"],\"90Luob\":[[\"count\"],\" 条回复\"],\"A1taO8\":[\"搜索\"],\"AyHO4m\":[\"这个系列是关于什么的?\"],\"B373X+\":[\"编辑帖子\"],\"B495Gs\":[\"档案馆\"],\"BjF0Jv\":[\"仅允许小写字母、数字和连字符\"],\"D9Oea+\":[\"永久链接\"],\"DHhJ7s\":[\"上一页\"],\"DoJzLz\":[\"收藏夹\"],\"E80cJw\":[\"删除此媒体将永久从存储中移除。\"],\"EEYbdt\":[\"发布\"],\"EGwzOK\":[\"完成设置\"],\"EkH9pt\":[\"更新\"],\"FGrimz\":[\"新帖子\"],\"FkMol5\":[\"精选\"],\"Fxf4jq\":[\"描述(可选)\"],\"GA5A5H\":[\"删除收藏夹\"],\"GorKul\":[\"欢迎来到Jant\"],\"GrZ6fH\":[\"新页面\"],\"HfyyXl\":[\"我的博客\"],\"HiETwV\":[\"安静(正常)\"],\"Hzi9AA\":[\"未找到帖子。\"],\"I6gXOa\":[\"路径\"],\"IagCbF\":[\"网址\"],\"J4FNfC\":[\"此集合中没有帖子。\"],\"JIBC/T\":[\"支持的格式:JPEG、PNG、GIF、WebP、SVG。最大大小:10MB。\"],\"JiP4aa\":[\"已发布的页面可以通过其路径访问。草稿不可见。\"],\"K9NcLu\":[\"使用此 URL 将媒体嵌入到您的帖子中。\"],\"KiJn9B\":[\"注意\"],\"L85WcV\":[\"缩略名\"],\"LkvLQe\":[\"还没有页面。\"],\"M8kJqa\":[\"草稿\"],\"M9xgHy\":[\"重定向\"],\"MHrjPM\":[\"标题\"],\"MZbQHL\":[\"未找到结果。\"],\"Mhf/H/\":[\"创建重定向\"],\"MqghUt\":[\"搜索帖子...\"],\"N40H+G\":[\"所有\"],\"O3oNi5\":[\"电子邮件\"],\"OCNZaU\":[\"重定向的路径\"],\"ODiSoW\":[\"还没有帖子。\"],\"ONWvwQ\":[\"上传\"],\"Pbm2/N\":[\"创建集合\"],\"RDjuBN\":[\"设置\"],\"Rj01Fz\":[\"链接\"],\"RwGhWy\":[\"包含 \",[\"count\"],\" 条帖子的话题\"],\"SJmfuf\":[\"网站名称\"],\"ST+lN2\":[\"尚未上传任何媒体。\"],\"Tt5T6+\":[\"文章\"],\"TxE+Mj\":[\"1 条回复\"],\"Tz0i8g\":[\"设置\"],\"U5v6Gh\":[\"编辑页面\"],\"UDMjsP\":[\"快速操作\"],\"UGT5vp\":[\"保存设置\"],\"VUSy8D\":[\"搜索失败。请再试一次。\"],\"WDcQq9\":[\"未列出\"],\"Weq9zb\":[\"常规\"],\"WmZ/rP\":[\"到路径\"],\"Y+7JGK\":[\"创建页面\"],\"ZQKLI1\":[\"危险区域\"],\"ZhhOwV\":[\"引用\"],\"an5hVd\":[\"图片\"],\"b+/jO6\":[\"301(永久)\"],\"bHYIks\":[\"登出\"],\"biOepV\":[\"← 返回首页\"],\"cnGeoo\":[\"删除\"],\"dEgA5A\":[\"取消\"],\"e6Jr7Q\":[\"← 返回收藏夹\"],\"ePK91l\":[\"编辑\"],\"eWLklq\":[\"引用\"],\"eneWvv\":[\"草稿\"],\"f6e0Ry\":[\"文章\"],\"fG7BxZ\":[\"通过 API 上传图像:POST /api/upload,使用文件表单字段。\"],\"fttd2R\":[\"我的收藏\"],\"hG89Ed\":[\"图像\"],\"hXzOVo\":[\"下一页\"],\"he3ygx\":[\"复制\"],\"iH8pgl\":[\"返回\"],\"ig4hg2\":[\"让我们设置您的网站。\"],\"jpctdh\":[\"查看\"],\"mTOYla\":[\"查看所有帖子 →\"],\"n1ekoW\":[\"登录\"],\"oYPBa0\":[\"更新页面\"],\"pRhYH2\":[\"集合中的帖子 (\",[\"count\"],\")\"],\"qMyM2u\":[\"源网址(可选)\"],\"r1MpXi\":[\"安静\"],\"rdUucN\":[\"预览\"],\"rzNUSl\":[\"包含 1 条帖子的话题\"],\"sGajR7\":[\"线程开始\"],\"t/YqKh\":[\"移除\"],\"tfrt7B\":[\"未配置重定向。\"],\"tiq7kl\":[\"页面 \",[\"page\"]],\"u2f7vd\":[\"网站描述\"],\"u3wRF+\":[\"已发布\"],\"u6Hp4N\":[\"Markdown\"],\"uAQUqI\":[\"状态\"],\"vXIe7J\":[\"语言\"],\"vzU4k9\":[\"新收藏\"],\"wEF6Ix\":[\"目标路径或 URL\"],\"wK4OTM\":[\"标题(可选)\"],\"wM5UXj\":[\"删除媒体\"],\"wRR604\":[\"页面\"],\"wja8aL\":[\"无标题\"],\"x0mzE0\":[\"创建你的第一篇帖子\"],\"x4RuFo\":[\"返回首页\"],\"xYilR2\":[\"媒体\"],\"y28hnO\":[\"帖子\"],\"yQ2kGp\":[\"加载更多\"],\"yzF66j\":[\"链接\"],\"z8ajIE\":[\"找到 1 个结果\"],\"zH6KqE\":[\"找到 \",[\"count\"],\" 个结果\"]}");
@@ -0,0 +1,3 @@
1
+ import type { Messages } from "@lingui/core";
2
+ export declare const messages: Messages;
3
+ //# sourceMappingURL=zh-Hant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zh-Hant.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/zh-Hant.ts"],"names":[],"mappings":"AAAkB,OAAO,KAAI,EAAC,QAAQ,EAAC,MAAI,cAAc,CAAC;AAAA,eAAO,MAAM,QAAQ,EAA6wG,QAAQ,CAAC"}
@@ -0,0 +1 @@
1
+ /*eslint-disable*/ export const messages = JSON.parse("{\"+7Wr2a\":[\"編輯: \",[\"title\"]],\"+MACwa\":[\"尚未有任何收藏。\"],\"+owNNn\":[\"文章\"],\"+zy2Nq\":[\"類型\"],\"/0D1Xp\":[\"編輯收藏集\"],\"/Rj5P4\":[\"您的姓名\"],\"0JkyS7\":[\"建立您的第一個頁面\"],\"0a6MpL\":[\"新重定向\"],\"1CU1Td\":[\"網址安全識別碼(小寫、數字、連字符)\"],\"1DBGsz\":[\"筆記\"],\"2N0qpv\":[\"文章標題...\"],\"2q/Q7x\":[\"可見性\"],\"2rJGtU\":[\"頁面標題...\"],\"3Yvsaz\":[\"302(臨時)\"],\"4/SFQS\":[\"查看網站\"],\"40TVQj\":[\"自訂路徑(選填)\"],\"4KzVT6\":[\"刪除頁面\"],\"4b3oEV\":[\"內容\"],\"4mDPGp\":[\"此頁面的 URL 路徑。使用小寫字母、數字和連字符。\"],\"6WdDG7\":[\"頁面\"],\"7G4SBz\":[\"頁面內容(支持Markdown)...\"],\"7Mk+/h\":[\"更新收藏集\"],\"7Q1KKN\":[\"來源路徑\"],\"7nGhhM\":[\"你在想什麼?\"],\"7p5kLi\":[\"儀表板\"],\"8ZsakT\":[\"密碼\"],\"90Luob\":[[\"count\"],\" 條回覆\"],\"A1taO8\":[\"搜尋\"],\"AyHO4m\":[\"這個收藏是關於什麼的?\"],\"B373X+\":[\"編輯文章\"],\"B495Gs\":[\"檔案館\"],\"BjF0Jv\":[\"僅限小寫字母、數字和連字符\"],\"D9Oea+\":[\"永久鏈接\"],\"DHhJ7s\":[\"上一頁\"],\"DoJzLz\":[\"收藏夾\"],\"E80cJw\":[\"刪除此媒體將永久從存儲中移除它。\"],\"EEYbdt\":[\"發佈\"],\"EGwzOK\":[\"完成設置\"],\"EkH9pt\":[\"更新\"],\"FGrimz\":[\"新帖子\"],\"FkMol5\":[\"精選\"],\"Fxf4jq\":[\"描述(可選)\"],\"GA5A5H\":[\"刪除收藏夾\"],\"GorKul\":[\"歡迎來到 Jant\"],\"GrZ6fH\":[\"新頁面\"],\"HfyyXl\":[\"我的部落格\"],\"HiETwV\":[\"安靜(正常)\"],\"Hzi9AA\":[\"未找到任何帖子。\"],\"I6gXOa\":[\"路徑\"],\"IagCbF\":[\"網址\"],\"J4FNfC\":[\"此集合中沒有帖子。\"],\"JIBC/T\":[\"支援的格式:JPEG、PNG、GIF、WebP、SVG。最大大小:10MB。\"],\"JiP4aa\":[\"已發佈的頁面可以通過其路徑訪問。草稿不可見。\"],\"K9NcLu\":[\"使用此 URL 將媒體嵌入到您的帖子中。\"],\"KiJn9B\":[\"備註\"],\"L85WcV\":[\"縮略名\"],\"LkvLQe\":[\"尚未有頁面。\"],\"M8kJqa\":[\"草稿\"],\"M9xgHy\":[\"重定向\"],\"MHrjPM\":[\"標題\"],\"MZbQHL\":[\"未找到結果。\"],\"Mhf/H/\":[\"建立重定向\"],\"MqghUt\":[\"搜尋帖子...\"],\"N40H+G\":[\"所有\"],\"O3oNi5\":[\"電子郵件\"],\"OCNZaU\":[\"重定向來源的路徑\"],\"ODiSoW\":[\"尚未有帖子。\"],\"ONWvwQ\":[\"上傳\"],\"Pbm2/N\":[\"創建收藏夾\"],\"RDjuBN\":[\"設置\"],\"Rj01Fz\":[\"連結\"],\"RwGhWy\":[\"包含 \",[\"count\"],\" 則帖子的主題\"],\"SJmfuf\":[\"網站名稱\"],\"ST+lN2\":[\"尚未上傳任何媒體。\"],\"Tt5T6+\":[\"文章\"],\"TxE+Mj\":[\"1 條回覆\"],\"Tz0i8g\":[\"設定\"],\"U5v6Gh\":[\"編輯頁面\"],\"UDMjsP\":[\"快速操作\"],\"UGT5vp\":[\"保存設定\"],\"VUSy8D\":[\"搜尋失敗。請再試一次。\"],\"WDcQq9\":[\"不公開\"],\"Weq9zb\":[\"一般設定\"],\"WmZ/rP\":[\"到路徑\"],\"Y+7JGK\":[\"創建頁面\"],\"ZQKLI1\":[\"危險區域\"],\"ZhhOwV\":[\"引用\"],\"an5hVd\":[\"圖片\"],\"b+/jO6\":[\"301(永久)\"],\"bHYIks\":[\"登出\"],\"biOepV\":[\"← 返回首頁\"],\"cnGeoo\":[\"刪除\"],\"dEgA5A\":[\"取消\"],\"e6Jr7Q\":[\"← 返回收藏夾\"],\"ePK91l\":[\"編輯\"],\"eWLklq\":[\"引用\"],\"eneWvv\":[\"草稿\"],\"f6e0Ry\":[\"文章\"],\"fG7BxZ\":[\"透過 API 上傳圖片:POST /api/upload,並使用文件表單字段。\"],\"fttd2R\":[\"我的收藏\"],\"hG89Ed\":[\"圖片\"],\"hXzOVo\":[\"下一頁\"],\"he3ygx\":[\"複製\"],\"iH8pgl\":[\"返回\"],\"ig4hg2\":[\"讓我們設置您的網站。\"],\"jpctdh\":[\"查看\"],\"mTOYla\":[\"查看所有文章 →\"],\"n1ekoW\":[\"登入\"],\"oYPBa0\":[\"更新頁面\"],\"pRhYH2\":[\"收藏中的帖子 (\",[\"count\"],\")\"],\"qMyM2u\":[\"來源網址(選填)\"],\"r1MpXi\":[\"安靜\"],\"rdUucN\":[\"預覽\"],\"rzNUSl\":[\"包含 1 則貼文的主題\"],\"sGajR7\":[\"線程開始\"],\"t/YqKh\":[\"移除\"],\"tfrt7B\":[\"未配置任何重定向。\"],\"tiq7kl\":[\"頁面 \",[\"page\"]],\"u2f7vd\":[\"網站描述\"],\"u3wRF+\":[\"已發佈\"],\"u6Hp4N\":[\"Markdown\"],\"uAQUqI\":[\"狀態\"],\"vXIe7J\":[\"語言\"],\"vzU4k9\":[\"新收藏集\"],\"wEF6Ix\":[\"目的地路徑或 URL\"],\"wK4OTM\":[\"標題(選填)\"],\"wM5UXj\":[\"刪除媒體\"],\"wRR604\":[\"頁面\"],\"wja8aL\":[\"無標題\"],\"x0mzE0\":[\"創建你的第一篇帖子\"],\"x4RuFo\":[\"回到首頁\"],\"xYilR2\":[\"媒體\"],\"y28hnO\":[\"文章\"],\"yQ2kGp\":[\"載入更多\"],\"yzF66j\":[\"連結\"],\"z8ajIE\":[\"找到 1 個結果\"],\"zH6KqE\":[\"找到 \",[\"count\"],\" 個結果\"]}");
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Centralized locale configuration
3
+ */
4
+ export declare const locales: readonly ["en", "zh-Hans", "zh-Hant"];
5
+ export type Locale = (typeof locales)[number];
6
+ export declare const baseLocale: Locale;
7
+ /**
8
+ * Check if a value is a valid locale
9
+ */
10
+ export declare function isLocale(value: unknown): value is Locale;
11
+ //# sourceMappingURL=locales.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../src/i18n/locales.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,OAAO,uCAAwC,CAAC;AAC7D,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9C,eAAO,MAAM,UAAU,EAAE,MAAa,CAAC;AAEvC;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Centralized locale configuration
3
+ */ export const locales = [
4
+ "en",
5
+ "zh-Hans",
6
+ "zh-Hant"
7
+ ];
8
+ export const baseLocale = "en";
9
+ /**
10
+ * Check if a value is a valid locale
11
+ */ export function isLocale(value) {
12
+ return typeof value === "string" && locales.includes(value);
13
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * i18n Hono Middleware
3
+ */
4
+ import type { MiddlewareHandler } from "hono";
5
+ import type { I18n } from "@lingui/core";
6
+ import { type Locale } from "./i18n.js";
7
+ declare module "hono" {
8
+ interface ContextVariableMap {
9
+ lang: Locale;
10
+ i18n: I18n;
11
+ }
12
+ }
13
+ /**
14
+ * Hono middleware for internationalization.
15
+ * Creates a per-request i18n instance to avoid race conditions in concurrent environments.
16
+ *
17
+ * Language detection priority:
18
+ * 1. Cookie (user preference)
19
+ * 2. Database SITE_LANGUAGE setting (site default)
20
+ * 3. Accept-Language header
21
+ * 4. Default locale (en)
22
+ */
23
+ export declare function i18nMiddleware(): MiddlewareHandler;
24
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/i18n/middleware.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAwB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAG9D,OAAO,QAAQ,MAAM,CAAC;IACpB,UAAU,kBAAkB;QAC1B,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,IAAI,CAAC;KACZ;CACF;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,IAAI,iBAAiB,CA+BlD"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * i18n Hono Middleware
3
+ */ import { detectLanguage } from "./detect.js";
4
+ import { createI18n, isLocale } from "./i18n.js";
5
+ /**
6
+ * Hono middleware for internationalization.
7
+ * Creates a per-request i18n instance to avoid race conditions in concurrent environments.
8
+ *
9
+ * Language detection priority:
10
+ * 1. Cookie (user preference)
11
+ * 2. Database SITE_LANGUAGE setting (site default)
12
+ * 3. Accept-Language header
13
+ * 4. Default locale (en)
14
+ */ export function i18nMiddleware() {
15
+ return async (c, next)=>{
16
+ // First try cookie and Accept-Language header
17
+ let lang = detectLanguage(c);
18
+ // If no cookie is set, check database SITE_LANGUAGE setting
19
+ const cookies = c.req.raw.headers.get("Cookie") ?? "";
20
+ const hasCookie = cookies.includes("lang=");
21
+ if (!hasCookie) {
22
+ // Check database setting
23
+ const services = c.get("services");
24
+ if (services) {
25
+ try {
26
+ const siteLang = await services.settings.get("SITE_LANGUAGE");
27
+ if (siteLang && isLocale(siteLang)) {
28
+ lang = siteLang;
29
+ }
30
+ } catch {
31
+ // Ignore errors, fall back to detected language
32
+ }
33
+ }
34
+ }
35
+ // Create a new i18n instance for this request to avoid race conditions
36
+ const i18n = createI18n(lang);
37
+ c.set("lang", lang);
38
+ c.set("i18n", i18n);
39
+ await next();
40
+ };
41
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Jant - A microblog system
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ export { createApp } from "./app.js";
7
+ export type { App, AppVariables } from "./app.js";
8
+ export type { PostType, Visibility, Bindings, Post, Media, Collection, PostCollection, Redirect, Setting, CreatePost, UpdatePost, JantConfig, JantTheme, SiteConfig, FeatureConfig, ThemeComponents, } from "./types.js";
9
+ export { POST_TYPES, VISIBILITY_LEVELS } from "./types.js";
10
+ export * as time from "./lib/time.js";
11
+ export * as sqid from "./lib/sqid.js";
12
+ export * as url from "./lib/url.js";
13
+ export * as markdown from "./lib/markdown.js";
14
+ declare const _default: import("./app.js").App;
15
+ export default _default;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGlD,YAAY,EACV,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,UAAU,EACV,cAAc,EACd,QAAQ,EACR,OAAO,EACP,UAAU,EACV,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG3D,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;;AAG9C,wBAA4B"}
@@ -2,41 +2,14 @@
2
2
  * Jant - A microblog system
3
3
  *
4
4
  * @packageDocumentation
5
- */
6
-
7
- import { createApp as _createApp } from "./app.js";
8
-
5
+ */ import { createApp as _createApp } from "./app.js";
9
6
  // Main app factory
10
7
  export { createApp } from "./app.js";
11
- export type { App, AppVariables } from "./app.js";
12
-
13
- // Types (excluding component props to avoid conflicts with theme exports)
14
- export type {
15
- PostType,
16
- Visibility,
17
- Bindings,
18
- Post,
19
- Media,
20
- Collection,
21
- PostCollection,
22
- Redirect,
23
- Setting,
24
- CreatePost,
25
- UpdatePost,
26
- JantConfig,
27
- JantTheme,
28
- SiteConfig,
29
- FeatureConfig,
30
- ThemeComponents,
31
- } from "./types.js";
32
-
33
8
  export { POST_TYPES, VISIBILITY_LEVELS } from "./types.js";
34
-
35
9
  // Utilities (for theme authors)
36
10
  export * as time from "./lib/time.js";
37
11
  export * as sqid from "./lib/sqid.js";
38
12
  export * as url from "./lib/url.js";
39
13
  export * as markdown from "./lib/markdown.js";
40
-
41
14
  // Default export for running core directly (e.g., for development)
42
15
  export default _createApp();
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Asset paths for SSR
3
+ *
4
+ * Development: Uses source paths served by Vite dev server
5
+ * Production: Uses paths that get patched at build time with actual hashes
6
+ */
7
+ interface Assets {
8
+ styles: string;
9
+ client: string;
10
+ datastar: string;
11
+ imageProcessor: string;
12
+ }
13
+ /**
14
+ * Get assets based on environment
15
+ */
16
+ export declare function getAssets(): Assets;
17
+ export declare const ASSETS: Assets;
18
+ export {};
19
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/lib/assets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,UAAU,MAAM;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAmBD;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CASlC;AAGD,eAAO,MAAM,MAAM,QAAc,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Asset paths for SSR
3
+ *
4
+ * Development: Uses source paths served by Vite dev server
5
+ * Production: Uses paths that get patched at build time with actual hashes
6
+ */ // Development paths - use source files for HMR
7
+ const DEV_ASSETS = {
8
+ styles: "/node_modules/@jant/core/src/theme/styles/main.css",
9
+ client: "/node_modules/@jant/core/src/client.ts",
10
+ datastar: "/node_modules/@jant/core/static/assets/datastar.min.js",
11
+ imageProcessor: "/node_modules/@jant/core/static/assets/image-processor.js"
12
+ };
13
+ // Production paths - these unique placeholders get replaced at build time
14
+ // Format: __JANT_ASSET_<NAME>__ to avoid accidental matches
15
+ const PROD_ASSETS = {
16
+ styles: "__JANT_ASSET_STYLES__",
17
+ client: "__JANT_ASSET_CLIENT__",
18
+ datastar: "__JANT_ASSET_DATASTAR__",
19
+ imageProcessor: "__JANT_ASSET_IMAGE_PROCESSOR__"
20
+ };
21
+ /**
22
+ * Get assets based on environment
23
+ */ export function getAssets() {
24
+ try {
25
+ // import.meta.env is injected by Vite
26
+ if (import.meta.env?.DEV) return DEV_ASSETS;
27
+ } catch {
28
+ // import.meta.env may not exist in all environments
29
+ }
30
+ return PROD_ASSETS;
31
+ }
32
+ // For static imports
33
+ export const ASSETS = PROD_ASSETS;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Application Constants
3
+ */
4
+ /**
5
+ * Reserved URL paths that cannot be used for pages
6
+ */
7
+ export declare const RESERVED_PATHS: readonly ["featured", "signin", "signout", "setup", "dash", "api", "feed", "search", "archive", "notes", "articles", "links", "quotes", "media", "pages", "p", "c", "static", "assets", "health"];
8
+ export type ReservedPath = (typeof RESERVED_PATHS)[number];
9
+ /**
10
+ * Check if a path is reserved
11
+ */
12
+ export declare function isReservedPath(path: string): boolean;
13
+ /**
14
+ * Default pagination size
15
+ */
16
+ export declare const DEFAULT_PAGE_SIZE = 100;
17
+ /**
18
+ * Settings keys (match environment variable naming)
19
+ */
20
+ export declare const SETTINGS_KEYS: {
21
+ readonly ONBOARDING_STATUS: "ONBOARDING_STATUS";
22
+ readonly SITE_NAME: "SITE_NAME";
23
+ readonly SITE_DESCRIPTION: "SITE_DESCRIPTION";
24
+ readonly SITE_LANGUAGE: "SITE_LANGUAGE";
25
+ readonly THEME: "THEME";
26
+ };
27
+ export type SettingsKey = (typeof SETTINGS_KEYS)[keyof typeof SETTINGS_KEYS];
28
+ /**
29
+ * Onboarding status values
30
+ */
31
+ export declare const ONBOARDING_STATUS: {
32
+ readonly PENDING: "pending";
33
+ readonly COMPLETED: "completed";
34
+ };
35
+ export type OnboardingStatus = (typeof ONBOARDING_STATUS)[keyof typeof ONBOARDING_STATUS];
36
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,eAAO,MAAM,cAAc,mMAqBjB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGpD;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAE7E;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;CAGpB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Application Constants
3
+ */ /**
4
+ * Reserved URL paths that cannot be used for pages
5
+ */ export const RESERVED_PATHS = [
6
+ "featured",
7
+ "signin",
8
+ "signout",
9
+ "setup",
10
+ "dash",
11
+ "api",
12
+ "feed",
13
+ "search",
14
+ "archive",
15
+ "notes",
16
+ "articles",
17
+ "links",
18
+ "quotes",
19
+ "media",
20
+ "pages",
21
+ "p",
22
+ "c",
23
+ "static",
24
+ "assets",
25
+ "health"
26
+ ];
27
+ /**
28
+ * Check if a path is reserved
29
+ */ export function isReservedPath(path) {
30
+ const firstSegment = path.split("/")[0]?.toLowerCase();
31
+ return RESERVED_PATHS.includes(firstSegment);
32
+ }
33
+ /**
34
+ * Default pagination size
35
+ */ export const DEFAULT_PAGE_SIZE = 100;
36
+ /**
37
+ * Settings keys (match environment variable naming)
38
+ */ export const SETTINGS_KEYS = {
39
+ ONBOARDING_STATUS: "ONBOARDING_STATUS",
40
+ SITE_NAME: "SITE_NAME",
41
+ SITE_DESCRIPTION: "SITE_DESCRIPTION",
42
+ SITE_LANGUAGE: "SITE_LANGUAGE",
43
+ THEME: "THEME"
44
+ };
45
+ /**
46
+ * Onboarding status values
47
+ */ export const ONBOARDING_STATUS = {
48
+ PENDING: "pending",
49
+ COMPLETED: "completed"
50
+ };
@@ -3,23 +3,21 @@
3
3
  *
4
4
  * Provides helpers for generating image URLs with optional transformations.
5
5
  */
6
-
7
6
  /**
8
7
  * Options for image transformations
9
8
  */
10
9
  export interface ImageOptions {
11
- /** Target width in pixels */
12
- width?: number;
13
- /** Target height in pixels */
14
- height?: number;
15
- /** Quality (1-100) */
16
- quality?: number;
17
- /** Output format */
18
- format?: "webp" | "avif" | "auto";
19
- /** Fit mode for resizing */
20
- fit?: "cover" | "contain" | "scale-down";
10
+ /** Target width in pixels */
11
+ width?: number;
12
+ /** Target height in pixels */
13
+ height?: number;
14
+ /** Quality (1-100) */
15
+ quality?: number;
16
+ /** Output format */
17
+ format?: "webp" | "avif" | "auto";
18
+ /** Fit mode for resizing */
19
+ fit?: "cover" | "contain" | "scale-down";
21
20
  }
22
-
23
21
  /**
24
22
  * Generates an image URL with optional transformations.
25
23
  *
@@ -48,29 +46,7 @@ export interface ImageOptions {
48
46
  * // Returns: "https://example.com/cdn-cgi/image/width=200,quality=80/https://example.com/media/abc123"
49
47
  * ```
50
48
  */
51
- export function getImageUrl(
52
- originalUrl: string,
53
- transformUrl?: string,
54
- options?: ImageOptions
55
- ): string {
56
- if (!transformUrl || !options || Object.keys(options).length === 0) {
57
- return originalUrl;
58
- }
59
-
60
- const params: string[] = [];
61
- if (options.width) params.push(`width=${options.width}`);
62
- if (options.height) params.push(`height=${options.height}`);
63
- if (options.quality) params.push(`quality=${options.quality}`);
64
- if (options.format) params.push(`format=${options.format}`);
65
- if (options.fit) params.push(`fit=${options.fit}`);
66
-
67
- if (params.length === 0) {
68
- return originalUrl;
69
- }
70
-
71
- return `${transformUrl}/${params.join(",")}/${originalUrl}`;
72
- }
73
-
49
+ export declare function getImageUrl(originalUrl: string, transformUrl?: string, options?: ImageOptions): string;
74
50
  /**
75
51
  * Generates a media URL using UUIDv7-based paths.
76
52
  *
@@ -93,15 +69,5 @@ export function getImageUrl(
93
69
  * // Returns: "https://cdn.example.com/uploads/file.webp"
94
70
  * ```
95
71
  */
96
- export function getMediaUrl(
97
- mediaId: string,
98
- r2Key: string,
99
- r2PublicUrl?: string
100
- ): string {
101
- if (r2PublicUrl) {
102
- return `${r2PublicUrl}/${r2Key}`;
103
- }
104
- // Extract extension from r2Key
105
- const ext = r2Key.split(".").pop() || "bin";
106
- return `/media/${mediaId}.${ext}`;
107
- }
72
+ export declare function getMediaUrl(mediaId: string, r2Key: string, r2PublicUrl?: string): string;
73
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/lib/image.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,4BAA4B;IAC5B,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,YAAY,GACrB,MAAM,CAiBR;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAOR"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Image URL utilities
3
+ *
4
+ * Provides helpers for generating image URLs with optional transformations.
5
+ */ /**
6
+ * Options for image transformations
7
+ */ /**
8
+ * Generates an image URL with optional transformations.
9
+ *
10
+ * If `transformUrl` is provided and options are specified, returns a transformed image URL.
11
+ * Otherwise, returns the original URL unchanged.
12
+ *
13
+ * Compatible with:
14
+ * - Cloudflare Image Transformations (`/cdn-cgi/image/...`)
15
+ * - imgproxy
16
+ * - Cloudinary
17
+ * - Any service with similar URL-based transformation API
18
+ *
19
+ * @param originalUrl - The original image URL
20
+ * @param transformUrl - The base URL for transformations (e.g., `https://example.com/cdn-cgi/image`)
21
+ * @param options - Transformation options (width, height, quality, format, fit)
22
+ * @returns The transformed URL or original URL if transformations are not configured
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * // Without transform URL - returns original
27
+ * getImageUrl("/media/abc123", undefined, { width: 200 });
28
+ * // Returns: "/media/abc123"
29
+ *
30
+ * // With transform URL - returns transformed
31
+ * getImageUrl("/media/abc123", "https://example.com/cdn-cgi/image", { width: 200, quality: 80 });
32
+ * // Returns: "https://example.com/cdn-cgi/image/width=200,quality=80/https://example.com/media/abc123"
33
+ * ```
34
+ */ export function getImageUrl(originalUrl, transformUrl, options) {
35
+ if (!transformUrl || !options || Object.keys(options).length === 0) {
36
+ return originalUrl;
37
+ }
38
+ const params = [];
39
+ if (options.width) params.push(`width=${options.width}`);
40
+ if (options.height) params.push(`height=${options.height}`);
41
+ if (options.quality) params.push(`quality=${options.quality}`);
42
+ if (options.format) params.push(`format=${options.format}`);
43
+ if (options.fit) params.push(`fit=${options.fit}`);
44
+ if (params.length === 0) {
45
+ return originalUrl;
46
+ }
47
+ return `${transformUrl}/${params.join(",")}/${originalUrl}`;
48
+ }
49
+ /**
50
+ * Generates a media URL using UUIDv7-based paths.
51
+ *
52
+ * Returns a public URL for a media file. If `r2PublicUrl` is set, uses that directly
53
+ * with the r2Key. Otherwise, generates a `/media/{id}.{ext}` URL.
54
+ *
55
+ * @param mediaId - The UUIDv7 database ID of the media
56
+ * @param r2Key - The R2 storage key (used to extract extension)
57
+ * @param r2PublicUrl - Optional R2 public URL for direct CDN access
58
+ * @returns The public URL for the media file
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * // Without R2 public URL - uses UUID with extension
63
+ * getMediaUrl("01902a9f-1a2b-7c3d-8e4f-5a6b7c8d9e0f", "uploads/file.webp");
64
+ * // Returns: "/media/01902a9f-1a2b-7c3d-8e4f-5a6b7c8d9e0f.webp"
65
+ *
66
+ * // With R2 public URL - uses direct CDN
67
+ * getMediaUrl("01902a9f-1a2b-7c3d-8e4f-5a6b7c8d9e0f", "uploads/file.webp", "https://cdn.example.com");
68
+ * // Returns: "https://cdn.example.com/uploads/file.webp"
69
+ * ```
70
+ */ export function getMediaUrl(mediaId, r2Key, r2PublicUrl) {
71
+ if (r2PublicUrl) {
72
+ return `${r2PublicUrl}/${r2Key}`;
73
+ }
74
+ // Extract extension from r2Key
75
+ const ext = r2Key.split(".").pop() || "bin";
76
+ return `/media/${mediaId}.${ext}`;
77
+ }
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Utility Functions
3
3
  */
4
-
5
4
  export * from "./constants.js";
6
5
  export * as sqid from "./sqid.js";
7
6
  export * as time from "./time.js";
8
7
  export * as url from "./url.js";
9
8
  export * as markdown from "./markdown.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Utility Functions
3
+ */ export * from "./constants.js";
4
+ export * as sqid from "./sqid.js";
5
+ export * as time from "./time.js";
6
+ export * as url from "./url.js";
7
+ export * as markdown from "./markdown.js";