@nuraly/lumenjs 0.1.2 → 0.1.4

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 (337) hide show
  1. package/README.md +76 -235
  2. package/dist/auth/config.d.ts +23 -0
  3. package/dist/auth/config.js +115 -0
  4. package/dist/auth/guard.d.ts +12 -0
  5. package/dist/auth/guard.js +28 -0
  6. package/dist/auth/index.d.ts +3 -0
  7. package/dist/auth/index.js +1 -0
  8. package/dist/auth/middleware.d.ts +23 -0
  9. package/dist/auth/middleware.js +89 -0
  10. package/dist/auth/native-auth.d.ts +73 -0
  11. package/dist/auth/native-auth.js +293 -0
  12. package/dist/auth/oidc-client.d.ts +17 -0
  13. package/dist/auth/oidc-client.js +123 -0
  14. package/dist/auth/providers/google.d.ts +23 -0
  15. package/dist/auth/providers/google.js +25 -0
  16. package/dist/auth/providers/index.d.ts +2 -0
  17. package/dist/auth/providers/index.js +1 -0
  18. package/dist/auth/routes/login.d.ts +8 -0
  19. package/dist/auth/routes/login.js +98 -0
  20. package/dist/auth/routes/logout.d.ts +4 -0
  21. package/dist/auth/routes/logout.js +79 -0
  22. package/dist/auth/routes/oidc-callback.d.ts +3 -0
  23. package/dist/auth/routes/oidc-callback.js +70 -0
  24. package/dist/auth/routes/password.d.ts +5 -0
  25. package/dist/auth/routes/password.js +149 -0
  26. package/dist/auth/routes/signup.d.ts +3 -0
  27. package/dist/auth/routes/signup.js +81 -0
  28. package/dist/auth/routes/token.d.ts +4 -0
  29. package/dist/auth/routes/token.js +70 -0
  30. package/dist/auth/routes/utils.d.ts +7 -0
  31. package/dist/auth/routes/utils.js +35 -0
  32. package/dist/auth/routes/verify.d.ts +3 -0
  33. package/dist/auth/routes/verify.js +26 -0
  34. package/dist/auth/routes.d.ts +8 -0
  35. package/dist/auth/routes.js +110 -0
  36. package/dist/auth/session.d.ts +8 -0
  37. package/dist/auth/session.js +54 -0
  38. package/dist/auth/token.d.ts +33 -0
  39. package/dist/auth/token.js +90 -0
  40. package/dist/auth/types.d.ts +156 -0
  41. package/dist/auth/types.js +2 -0
  42. package/dist/build/build-client.d.ts +15 -0
  43. package/dist/build/build-client.js +45 -0
  44. package/dist/build/build-prerender.d.ts +11 -0
  45. package/dist/build/build-prerender.js +159 -0
  46. package/dist/build/build-server.d.ts +17 -0
  47. package/dist/build/build-server.js +98 -0
  48. package/dist/build/build.js +52 -120
  49. package/dist/build/scan.d.ts +19 -0
  50. package/dist/build/scan.js +77 -6
  51. package/dist/build/serve-api.js +8 -2
  52. package/dist/build/serve-loaders.d.ts +4 -2
  53. package/dist/build/serve-loaders.js +128 -10
  54. package/dist/build/serve-ssr.js +38 -11
  55. package/dist/build/serve-static.js +3 -3
  56. package/dist/build/serve.js +229 -14
  57. package/dist/cli.js +37 -6
  58. package/dist/communication/encryption.d.ts +35 -0
  59. package/dist/communication/encryption.js +90 -0
  60. package/dist/communication/handlers/context.d.ts +27 -0
  61. package/dist/communication/handlers/context.js +1 -0
  62. package/dist/communication/handlers/conversation.d.ts +24 -0
  63. package/dist/communication/handlers/conversation.js +113 -0
  64. package/dist/communication/handlers/file-upload.d.ts +17 -0
  65. package/dist/communication/handlers/file-upload.js +62 -0
  66. package/dist/communication/handlers/messaging.d.ts +30 -0
  67. package/dist/communication/handlers/messaging.js +237 -0
  68. package/dist/communication/handlers/presence.d.ts +15 -0
  69. package/dist/communication/handlers/presence.js +76 -0
  70. package/dist/communication/handlers.d.ts +5 -0
  71. package/dist/communication/handlers.js +5 -0
  72. package/dist/communication/index.d.ts +9 -0
  73. package/dist/communication/index.js +7 -0
  74. package/dist/communication/link-preview.d.ts +18 -0
  75. package/dist/communication/link-preview.js +115 -0
  76. package/dist/communication/schema.d.ts +10 -0
  77. package/dist/communication/schema.js +101 -0
  78. package/dist/communication/server.d.ts +86 -0
  79. package/dist/communication/server.js +212 -0
  80. package/dist/communication/signaling.d.ts +43 -0
  81. package/dist/communication/signaling.js +271 -0
  82. package/dist/communication/store.d.ts +71 -0
  83. package/dist/communication/store.js +289 -0
  84. package/dist/communication/types.d.ts +454 -0
  85. package/dist/communication/types.js +1 -0
  86. package/dist/create.d.ts +1 -0
  87. package/dist/create.js +55 -0
  88. package/dist/db/auto-migrate.d.ts +3 -0
  89. package/dist/db/auto-migrate.js +100 -0
  90. package/dist/db/client.d.ts +3 -0
  91. package/dist/db/client.js +18 -0
  92. package/dist/db/context.d.ts +2 -0
  93. package/dist/db/context.js +9 -0
  94. package/dist/db/index.d.ts +23 -0
  95. package/dist/db/index.js +258 -0
  96. package/dist/db/seed.d.ts +12 -0
  97. package/dist/db/seed.js +88 -0
  98. package/dist/db/table.d.ts +10 -0
  99. package/dist/db/table.js +12 -0
  100. package/dist/dev-server/config.d.ts +14 -0
  101. package/dist/dev-server/config.js +26 -9
  102. package/dist/dev-server/index-html.d.ts +3 -0
  103. package/dist/dev-server/index-html.js +18 -6
  104. package/dist/dev-server/nuralyui-aliases.d.ts +0 -4
  105. package/dist/dev-server/nuralyui-aliases.js +115 -94
  106. package/dist/dev-server/plugins/vite-plugin-api-routes.js +29 -5
  107. package/dist/dev-server/plugins/vite-plugin-auth.d.ts +6 -0
  108. package/dist/dev-server/plugins/vite-plugin-auth.js +223 -0
  109. package/dist/dev-server/plugins/vite-plugin-auto-define.d.ts +16 -0
  110. package/dist/dev-server/plugins/vite-plugin-auto-define.js +111 -0
  111. package/dist/dev-server/plugins/vite-plugin-communication.d.ts +6 -0
  112. package/dist/dev-server/plugins/vite-plugin-communication.js +205 -0
  113. package/dist/dev-server/plugins/vite-plugin-editor-api.d.ts +6 -0
  114. package/dist/dev-server/plugins/vite-plugin-editor-api.js +318 -0
  115. package/dist/dev-server/plugins/vite-plugin-i18n.js +69 -2
  116. package/dist/dev-server/plugins/vite-plugin-lit-dedup.d.ts +6 -0
  117. package/dist/dev-server/plugins/vite-plugin-lit-dedup.js +78 -34
  118. package/dist/dev-server/plugins/vite-plugin-lit-hmr.js +44 -2
  119. package/dist/dev-server/plugins/vite-plugin-llms.d.ts +2 -0
  120. package/dist/dev-server/plugins/vite-plugin-llms.js +92 -0
  121. package/dist/dev-server/plugins/vite-plugin-loaders.d.ts +0 -1
  122. package/dist/dev-server/plugins/vite-plugin-loaders.js +311 -42
  123. package/dist/dev-server/plugins/vite-plugin-routes.js +18 -6
  124. package/dist/dev-server/plugins/vite-plugin-socketio.d.ts +2 -0
  125. package/dist/dev-server/plugins/vite-plugin-socketio.js +51 -0
  126. package/dist/dev-server/plugins/vite-plugin-source-annotator.d.ts +2 -0
  127. package/dist/dev-server/plugins/vite-plugin-source-annotator.js +26 -3
  128. package/dist/dev-server/plugins/vite-plugin-storage.d.ts +10 -0
  129. package/dist/dev-server/plugins/vite-plugin-storage.js +126 -0
  130. package/dist/dev-server/plugins/vite-plugin-virtual-modules.js +111 -2
  131. package/dist/dev-server/server.js +128 -12
  132. package/dist/dev-server/ssr-render.d.ts +2 -1
  133. package/dist/dev-server/ssr-render.js +107 -48
  134. package/dist/editor/ai/backend.d.ts +20 -0
  135. package/dist/editor/ai/backend.js +104 -0
  136. package/dist/editor/ai/claude-code-client.d.ts +20 -0
  137. package/dist/editor/ai/claude-code-client.js +145 -0
  138. package/dist/editor/ai/opencode-client.d.ts +14 -0
  139. package/dist/editor/ai/opencode-client.js +125 -0
  140. package/dist/editor/ai/snapshot-store.d.ts +22 -0
  141. package/dist/editor/ai/snapshot-store.js +35 -0
  142. package/dist/editor/ai/types.d.ts +30 -0
  143. package/dist/editor/ai/types.js +136 -0
  144. package/dist/editor/ai-chat-panel.d.ts +13 -0
  145. package/dist/editor/ai-chat-panel.js +587 -0
  146. package/dist/editor/ai-markdown.d.ts +10 -0
  147. package/dist/editor/ai-markdown.js +70 -0
  148. package/dist/editor/ai-project-panel.d.ts +11 -0
  149. package/dist/editor/ai-project-panel.js +332 -0
  150. package/dist/editor/ast-modification.d.ts +11 -0
  151. package/dist/editor/ast-modification.js +1 -0
  152. package/dist/editor/ast-service.d.ts +30 -0
  153. package/dist/editor/ast-service.js +180 -0
  154. package/dist/editor/css-rules.d.ts +54 -0
  155. package/dist/editor/css-rules.js +423 -0
  156. package/dist/editor/editor-api-client.d.ts +51 -0
  157. package/dist/editor/editor-api-client.js +162 -0
  158. package/dist/editor/editor-bridge.d.ts +1 -0
  159. package/dist/editor/editor-bridge.js +17 -8
  160. package/dist/editor/editor-toolbar.d.ts +14 -0
  161. package/dist/editor/editor-toolbar.js +115 -0
  162. package/dist/editor/file-editor.d.ts +9 -0
  163. package/dist/editor/file-editor.js +236 -0
  164. package/dist/editor/file-service.d.ts +16 -0
  165. package/dist/editor/file-service.js +52 -0
  166. package/dist/editor/i18n-key-gen.d.ts +1 -0
  167. package/dist/editor/i18n-key-gen.js +7 -0
  168. package/dist/editor/inline-text-edit.d.ts +5 -0
  169. package/dist/editor/inline-text-edit.js +173 -92
  170. package/dist/editor/overlay-events.d.ts +5 -0
  171. package/dist/editor/overlay-events.js +364 -0
  172. package/dist/editor/overlay-hmr.d.ts +2 -0
  173. package/dist/editor/overlay-hmr.js +75 -0
  174. package/dist/editor/overlay-selection.d.ts +29 -0
  175. package/dist/editor/overlay-selection.js +148 -0
  176. package/dist/editor/overlay-utils.d.ts +12 -0
  177. package/dist/editor/overlay-utils.js +59 -0
  178. package/dist/editor/properties-panel-persist.d.ts +14 -0
  179. package/dist/editor/properties-panel-persist.js +70 -0
  180. package/dist/editor/properties-panel-rows.d.ts +10 -0
  181. package/dist/editor/properties-panel-rows.js +349 -0
  182. package/dist/editor/properties-panel-styles.d.ts +4 -0
  183. package/dist/editor/properties-panel-styles.js +174 -0
  184. package/dist/editor/properties-panel.d.ts +4 -0
  185. package/dist/editor/properties-panel.js +148 -0
  186. package/dist/editor/property-registry.d.ts +16 -0
  187. package/dist/editor/property-registry.js +303 -0
  188. package/dist/editor/standalone-file-panel.d.ts +0 -0
  189. package/dist/editor/standalone-file-panel.js +1 -0
  190. package/dist/editor/standalone-overlay-dom.d.ts +0 -0
  191. package/dist/editor/standalone-overlay-dom.js +1 -0
  192. package/dist/editor/standalone-overlay-styles.d.ts +0 -0
  193. package/dist/editor/standalone-overlay-styles.js +1 -0
  194. package/dist/editor/standalone-overlay.d.ts +1 -0
  195. package/dist/editor/standalone-overlay.js +76 -0
  196. package/dist/editor/syntax-highlighter.d.ts +4 -0
  197. package/dist/editor/syntax-highlighter.js +81 -0
  198. package/dist/editor/text-toolbar.d.ts +11 -0
  199. package/dist/editor/text-toolbar.js +327 -0
  200. package/dist/editor/toolbar-styles.d.ts +4 -0
  201. package/dist/editor/toolbar-styles.js +198 -0
  202. package/dist/email/index.d.ts +32 -0
  203. package/dist/email/index.js +154 -0
  204. package/dist/email/providers/resend.d.ts +2 -0
  205. package/dist/email/providers/resend.js +24 -0
  206. package/dist/email/providers/sendgrid.d.ts +2 -0
  207. package/dist/email/providers/sendgrid.js +31 -0
  208. package/dist/email/providers/smtp.d.ts +13 -0
  209. package/dist/email/providers/smtp.js +125 -0
  210. package/dist/email/template-engine.d.ts +18 -0
  211. package/dist/email/template-engine.js +116 -0
  212. package/dist/email/templates/base.d.ts +9 -0
  213. package/dist/email/templates/base.js +65 -0
  214. package/dist/email/templates/password-reset.d.ts +5 -0
  215. package/dist/email/templates/password-reset.js +15 -0
  216. package/dist/email/templates/verify-email.d.ts +5 -0
  217. package/dist/email/templates/verify-email.js +15 -0
  218. package/dist/email/templates/welcome.d.ts +5 -0
  219. package/dist/email/templates/welcome.js +13 -0
  220. package/dist/email/types.d.ts +49 -0
  221. package/dist/email/types.js +1 -0
  222. package/dist/llms/generate.d.ts +46 -0
  223. package/dist/llms/generate.js +185 -0
  224. package/dist/permissions/guard.d.ts +28 -0
  225. package/dist/permissions/guard.js +30 -0
  226. package/dist/permissions/index.d.ts +6 -0
  227. package/dist/permissions/index.js +3 -0
  228. package/dist/permissions/service.d.ts +80 -0
  229. package/dist/permissions/service.js +210 -0
  230. package/dist/permissions/tables.d.ts +5 -0
  231. package/dist/permissions/tables.js +68 -0
  232. package/dist/permissions/types.d.ts +33 -0
  233. package/dist/permissions/types.js +1 -0
  234. package/dist/runtime/app-shell.js +163 -0
  235. package/dist/runtime/auth.d.ts +10 -0
  236. package/dist/runtime/auth.js +30 -0
  237. package/dist/runtime/communication.d.ts +137 -0
  238. package/dist/runtime/communication.js +228 -0
  239. package/dist/runtime/error-boundary.d.ts +23 -0
  240. package/dist/runtime/error-boundary.js +120 -0
  241. package/dist/runtime/i18n.d.ts +6 -1
  242. package/dist/runtime/i18n.js +42 -21
  243. package/dist/runtime/router-data.d.ts +5 -0
  244. package/dist/runtime/router-data.js +121 -16
  245. package/dist/runtime/router-hydration.js +25 -0
  246. package/dist/runtime/router.d.ts +21 -1
  247. package/dist/runtime/router.js +221 -39
  248. package/dist/runtime/socket-client.d.ts +2 -0
  249. package/dist/runtime/socket-client.js +30 -0
  250. package/dist/runtime/webrtc.d.ts +47 -0
  251. package/dist/runtime/webrtc.js +178 -0
  252. package/dist/shared/graceful-shutdown.d.ts +8 -0
  253. package/dist/shared/graceful-shutdown.js +36 -0
  254. package/dist/shared/health.d.ts +8 -0
  255. package/dist/shared/health.js +25 -0
  256. package/dist/shared/llms-txt.d.ts +31 -0
  257. package/dist/shared/llms-txt.js +85 -0
  258. package/dist/shared/logger.d.ts +32 -0
  259. package/dist/shared/logger.js +93 -0
  260. package/dist/shared/meta.d.ts +27 -0
  261. package/dist/shared/meta.js +71 -0
  262. package/dist/shared/middleware-runner.d.ts +9 -0
  263. package/dist/shared/middleware-runner.js +29 -0
  264. package/dist/shared/rate-limit.d.ts +18 -0
  265. package/dist/shared/rate-limit.js +71 -0
  266. package/dist/shared/request-id.d.ts +5 -0
  267. package/dist/shared/request-id.js +18 -0
  268. package/dist/shared/route-matching.js +16 -1
  269. package/dist/shared/security-headers.d.ts +18 -0
  270. package/dist/shared/security-headers.js +38 -0
  271. package/dist/shared/socket-io-setup.d.ts +11 -0
  272. package/dist/shared/socket-io-setup.js +51 -0
  273. package/dist/shared/types.d.ts +16 -0
  274. package/dist/shared/utils.d.ts +37 -7
  275. package/dist/shared/utils.js +175 -26
  276. package/dist/storage/adapters/local.d.ts +44 -0
  277. package/dist/storage/adapters/local.js +85 -0
  278. package/dist/storage/adapters/s3.d.ts +32 -0
  279. package/dist/storage/adapters/s3.js +116 -0
  280. package/dist/storage/adapters/types.d.ts +53 -0
  281. package/dist/storage/adapters/types.js +1 -0
  282. package/dist/storage/index.d.ts +76 -0
  283. package/dist/storage/index.js +83 -0
  284. package/package.json +20 -1
  285. package/templates/blog/api/posts.ts +6 -0
  286. package/templates/blog/data/migrations/001_init.sql +13 -0
  287. package/templates/blog/lumenjs.config.ts +3 -0
  288. package/templates/blog/package.json +14 -0
  289. package/templates/blog/pages/_layout.ts +25 -0
  290. package/templates/blog/pages/index.ts +65 -0
  291. package/templates/blog/pages/posts/[slug].ts +60 -0
  292. package/templates/blog/pages/tag/[tag].ts +44 -0
  293. package/templates/dashboard/api/stats.ts +10 -0
  294. package/templates/dashboard/data/migrations/001_init.sql +13 -0
  295. package/templates/dashboard/lumenjs.config.ts +3 -0
  296. package/templates/dashboard/package.json +14 -0
  297. package/templates/dashboard/pages/_layout.ts +25 -0
  298. package/templates/dashboard/pages/index.ts +72 -0
  299. package/templates/dashboard/pages/settings/index.ts +29 -0
  300. package/templates/default/lumenjs.config.ts +3 -0
  301. package/templates/default/package.json +14 -0
  302. package/templates/default/pages/index.ts +24 -0
  303. package/templates/social/api/posts/[id].ts +14 -0
  304. package/templates/social/api/posts.ts +11 -0
  305. package/templates/social/api/profile/[username].ts +10 -0
  306. package/templates/social/api/upload.ts +19 -0
  307. package/templates/social/data/migrations/001_init.sql +78 -0
  308. package/templates/social/data/migrations/002_add_image_url.sql +1 -0
  309. package/templates/social/data/migrations/003_auth.sql +7 -0
  310. package/templates/social/docs/architecture.md +76 -0
  311. package/templates/social/docs/components.md +100 -0
  312. package/templates/social/docs/data.md +89 -0
  313. package/templates/social/docs/pages.md +96 -0
  314. package/templates/social/docs/theming.md +52 -0
  315. package/templates/social/lib/media.ts +130 -0
  316. package/templates/social/lumenjs.auth.ts +21 -0
  317. package/templates/social/lumenjs.config.ts +3 -0
  318. package/templates/social/package.json +5 -0
  319. package/templates/social/pages/_layout.ts +239 -0
  320. package/templates/social/pages/apps/[id].ts +173 -0
  321. package/templates/social/pages/apps/index.ts +116 -0
  322. package/templates/social/pages/auth/login.ts +92 -0
  323. package/templates/social/pages/bookmarks.ts +57 -0
  324. package/templates/social/pages/explore.ts +73 -0
  325. package/templates/social/pages/index.ts +351 -0
  326. package/templates/social/pages/messages.ts +298 -0
  327. package/templates/social/pages/new.ts +77 -0
  328. package/templates/social/pages/notifications.ts +73 -0
  329. package/templates/social/pages/post/[id].ts +124 -0
  330. package/templates/social/pages/profile/[username].ts +100 -0
  331. package/templates/social/pages/settings/accessibility.ts +153 -0
  332. package/templates/social/pages/settings/account.ts +260 -0
  333. package/templates/social/pages/settings/help.ts +141 -0
  334. package/templates/social/pages/settings/language.ts +103 -0
  335. package/templates/social/pages/settings/privacy.ts +183 -0
  336. package/templates/social/pages/settings/security.ts +133 -0
  337. package/templates/social/pages/settings.ts +185 -0
@@ -4,48 +4,48 @@ import { fileURLToPath } from 'url';
4
4
  const __filename = fileURLToPath(import.meta.url);
5
5
  const __dirname = path.dirname(__filename);
6
6
  export const tagToPackage = {
7
- 'nr-alert': '@nuralyui/alert',
8
- 'nr-badge': '@nuralyui/badge',
9
- 'nr-breadcrumb': '@nuralyui/breadcrumb',
10
- 'nr-button': '@nuralyui/button',
11
- 'nr-canvas': '@nuralyui/canvas',
12
- 'nr-card': '@nuralyui/card',
13
- 'nr-chatbot': '@nuralyui/chatbot',
14
- 'nr-checkbox': '@nuralyui/checkbox',
15
- 'nr-collapse': '@nuralyui/collapse',
16
- 'nr-color-picker': '@nuralyui/color-picker',
17
- 'nr-datepicker': '@nuralyui/datepicker',
18
- 'nr-divider': '@nuralyui/divider',
19
- 'nr-document': '@nuralyui/document',
20
- 'nr-dropdown': '@nuralyui/dropdown',
21
- 'nr-file-upload': '@nuralyui/file-upload',
22
- 'nr-flex': '@nuralyui/flex',
23
- 'nr-form': '@nuralyui/forms',
24
- 'nr-grid': '@nuralyui/grid',
25
- 'nr-icon': '@nuralyui/icon',
26
- 'nr-image': '@nuralyui/image',
27
- 'nr-input': '@nuralyui/input',
28
- 'nr-label': '@nuralyui/label',
29
- 'nr-layout': '@nuralyui/layout',
30
- 'nr-menu': '@nuralyui/menu',
31
- 'nr-modal': '@nuralyui/modal',
32
- 'nr-panel': '@nuralyui/panel',
33
- 'nr-popconfirm': '@nuralyui/popconfirm',
34
- 'nr-radio': '@nuralyui/radio',
35
- 'nr-select': '@nuralyui/select',
36
- 'nr-skeleton': '@nuralyui/skeleton',
37
- 'nr-slider-input': '@nuralyui/slider-input',
38
- 'nr-table': '@nuralyui/table',
39
- 'nr-tabs': '@nuralyui/tabs',
40
- 'nr-tag': '@nuralyui/tag',
41
- 'nr-textarea': '@nuralyui/textarea',
42
- 'nr-timeline': '@nuralyui/timeline',
43
- 'nr-toast': '@nuralyui/toast',
44
- 'nr-video': '@nuralyui/video',
45
- 'nr-radio-group': '@nuralyui/radio-group',
46
- 'nr-iconpicker': '@nuralyui/iconpicker',
47
- 'nr-container': '@nuralyui/container',
48
- 'nr-code-editor': '@nuralyui/code-editor',
7
+ 'nr-alert': '@nuraly/lumenui/alert',
8
+ 'nr-badge': '@nuraly/lumenui/badge',
9
+ 'nr-breadcrumb': '@nuraly/lumenui/breadcrumb',
10
+ 'nr-button': '@nuraly/lumenui/button',
11
+ 'nr-canvas': '@nuraly/lumenui/canvas',
12
+ 'nr-card': '@nuraly/lumenui/card',
13
+ 'nr-chatbot': '@nuraly/lumenui/chatbot',
14
+ 'nr-checkbox': '@nuraly/lumenui/checkbox',
15
+ 'nr-collapse': '@nuraly/lumenui/collapse',
16
+ 'nr-color-picker': '@nuraly/lumenui/color-picker',
17
+ 'nr-datepicker': '@nuraly/lumenui/datepicker',
18
+ 'nr-divider': '@nuraly/lumenui/divider',
19
+ 'nr-document': '@nuraly/lumenui/document',
20
+ 'nr-dropdown': '@nuraly/lumenui/dropdown',
21
+ 'nr-file-upload': '@nuraly/lumenui/file-upload',
22
+ 'nr-flex': '@nuraly/lumenui/flex',
23
+ 'nr-form': '@nuraly/lumenui/form',
24
+ 'nr-grid': '@nuraly/lumenui/grid',
25
+ 'nr-icon': '@nuraly/lumenui/icon',
26
+ 'nr-image': '@nuraly/lumenui/image',
27
+ 'nr-input': '@nuraly/lumenui/input',
28
+ 'nr-label': '@nuraly/lumenui/label',
29
+ 'nr-layout': '@nuraly/lumenui/layout',
30
+ 'nr-menu': '@nuraly/lumenui/menu',
31
+ 'nr-modal': '@nuraly/lumenui/modal',
32
+ 'nr-panel': '@nuraly/lumenui/panel',
33
+ 'nr-popconfirm': '@nuraly/lumenui/popconfirm',
34
+ 'nr-radio': '@nuraly/lumenui/radio',
35
+ 'nr-select': '@nuraly/lumenui/select',
36
+ 'nr-skeleton': '@nuraly/lumenui/skeleton',
37
+ 'nr-slider-input': '@nuraly/lumenui/slider-input',
38
+ 'nr-table': '@nuraly/lumenui/table',
39
+ 'nr-tabs': '@nuraly/lumenui/tabs',
40
+ 'nr-tag': '@nuraly/lumenui/tag',
41
+ 'nr-textarea': '@nuraly/lumenui/textarea',
42
+ 'nr-timeline': '@nuraly/lumenui/timeline',
43
+ 'nr-toast': '@nuraly/lumenui/toast',
44
+ 'nr-video': '@nuraly/lumenui/video',
45
+ 'nr-radio-group': '@nuraly/lumenui/radio-group',
46
+ 'nr-iconpicker': '@nuraly/lumenui/iconpicker',
47
+ 'nr-container': '@nuraly/lumenui/container',
48
+ 'nr-code-editor': '@nuraly/lumenui/code-editor',
49
49
  };
50
50
  export const implicitDeps = {
51
51
  'nr-button': ['nr-icon'],
@@ -67,59 +67,80 @@ export const implicitDeps = {
67
67
  'nr-iconpicker': ['nr-icon'],
68
68
  };
69
69
  /**
70
- * NuralyUI component alias map — mirrors the studio astro.config.mjs aliases.
71
- * Points to the component source directories within the studio service.
70
+ * NuralyUI component alias map.
71
+ * Maps @nuraly/lumenui/* imports to component source directories.
72
72
  */
73
+ /**
74
+ * Resolve a component directory to its entry file.
75
+ * Prefers index.ts, falls back to <dirname>.component.ts.
76
+ */
77
+ function resolveComponentEntry(dirPath) {
78
+ const indexPath = path.join(dirPath, 'index.ts');
79
+ if (fs.existsSync(indexPath))
80
+ return indexPath;
81
+ const name = path.basename(dirPath);
82
+ const componentPath = path.join(dirPath, `${name}.component.ts`);
83
+ if (fs.existsSync(componentPath))
84
+ return componentPath;
85
+ return dirPath;
86
+ }
73
87
  export function getNuralyUIAliases(nuralyUIPath, nuralyCommonPath) {
74
- return {
75
- '@nuralyui/alert': path.join(nuralyUIPath, 'alert'),
76
- '@nuralyui/badge': path.join(nuralyUIPath, 'badge'),
77
- '@nuralyui/breadcrumb': path.join(nuralyUIPath, 'breadcrumb'),
78
- '@nuralyui/button': path.join(nuralyUIPath, 'button'),
79
- '@nuralyui/canvas': path.join(nuralyUIPath, 'canvas'),
80
- '@nuralyui/card': path.join(nuralyUIPath, 'card'),
81
- '@nuralyui/chatbot': path.join(nuralyUIPath, 'chatbot'),
82
- '@nuralyui/checkbox': path.join(nuralyUIPath, 'checkbox'),
83
- '@nuralyui/collapse': path.join(nuralyUIPath, 'collapse'),
84
- '@nuralyui/color-picker': path.join(nuralyUIPath, 'colorpicker'),
85
- '@nuralyui/datepicker': path.join(nuralyUIPath, 'datepicker'),
86
- '@nuralyui/divider': path.join(nuralyUIPath, 'divider'),
87
- '@nuralyui/document': path.join(nuralyUIPath, 'document'),
88
- '@nuralyui/dropdown': path.join(nuralyUIPath, 'dropdown'),
89
- '@nuralyui/file-upload': path.join(nuralyUIPath, 'file-upload'),
90
- '@nuralyui/flex': path.join(nuralyUIPath, 'flex'),
91
- '@nuralyui/forms': path.join(nuralyUIPath, 'form'),
92
- '@nuralyui/grid': path.join(nuralyUIPath, 'grid'),
93
- '@nuralyui/icon': path.join(nuralyUIPath, 'icon'),
94
- '@nuralyui/image': path.join(nuralyUIPath, 'image'),
95
- '@nuralyui/input': path.join(nuralyUIPath, 'input'),
96
- '@nuralyui/label': path.join(nuralyUIPath, 'label'),
97
- '@nuralyui/layout': path.join(nuralyUIPath, 'layout'),
98
- '@nuralyui/menu': path.join(nuralyUIPath, 'menu'),
99
- '@nuralyui/modal': path.join(nuralyUIPath, 'modal'),
100
- '@nuralyui/panel': path.join(nuralyUIPath, 'panel'),
101
- '@nuralyui/popconfirm': path.join(nuralyUIPath, 'popconfirm'),
102
- '@nuralyui/radio': path.join(nuralyUIPath, 'radio'),
103
- '@nuralyui/select': path.join(nuralyUIPath, 'select'),
104
- '@nuralyui/skeleton': path.join(nuralyUIPath, 'skeleton'),
105
- '@nuralyui/slider-input': path.join(nuralyUIPath, 'slider-input'),
106
- '@nuralyui/table': path.join(nuralyUIPath, 'table'),
107
- '@nuralyui/tabs': path.join(nuralyUIPath, 'tabs'),
108
- '@nuralyui/tag': path.join(nuralyUIPath, 'tag'),
109
- '@nuralyui/textarea': path.join(nuralyUIPath, 'textarea'),
110
- '@nuralyui/timeline': path.join(nuralyUIPath, 'timeline'),
111
- '@nuralyui/toast': path.join(nuralyUIPath, 'toast'),
112
- '@nuralyui/video': path.join(nuralyUIPath, 'video'),
113
- '@nuralyui/radio-group': path.join(nuralyUIPath, 'radio-group'),
114
- '@nuralyui/iconpicker': path.join(nuralyUIPath, 'iconpicker'),
115
- '@nuralyui/container': path.join(nuralyUIPath, 'container'),
116
- '@nuralyui/code-editor': path.join(nuralyUIPath, 'code-editor'),
117
- '@nuralyui/common/controllers': path.join(nuralyCommonPath, 'controllers.ts'),
118
- '@nuralyui/common/mixins': path.join(nuralyCommonPath, 'mixins.ts'),
119
- '@nuralyui/common/utils': path.join(nuralyCommonPath, 'utils.ts'),
120
- '@nuralyui/common/themes': path.join(nuralyCommonPath, 'themes.ts'),
121
- '@nuralyui/common': path.join(nuralyCommonPath, 'index.ts'),
88
+ const componentNames = {
89
+ '@nuraly/lumenui/alert': 'alert',
90
+ '@nuraly/lumenui/badge': 'badge',
91
+ '@nuraly/lumenui/breadcrumb': 'breadcrumb',
92
+ '@nuraly/lumenui/button': 'button',
93
+ '@nuraly/lumenui/canvas': 'canvas',
94
+ '@nuraly/lumenui/card': 'card',
95
+ '@nuraly/lumenui/chatbot': 'chatbot',
96
+ '@nuraly/lumenui/checkbox': 'checkbox',
97
+ '@nuraly/lumenui/collapse': 'collapse',
98
+ '@nuraly/lumenui/color-picker': 'colorpicker',
99
+ '@nuraly/lumenui/datepicker': 'datepicker',
100
+ '@nuraly/lumenui/divider': 'divider',
101
+ '@nuraly/lumenui/document': 'document',
102
+ '@nuraly/lumenui/dropdown': 'dropdown',
103
+ '@nuraly/lumenui/file-upload': 'file-upload',
104
+ '@nuraly/lumenui/flex': 'flex',
105
+ '@nuraly/lumenui/form': 'form',
106
+ '@nuraly/lumenui/grid': 'grid',
107
+ '@nuraly/lumenui/icon': 'icon',
108
+ '@nuraly/lumenui/image': 'image',
109
+ '@nuraly/lumenui/input': 'input',
110
+ '@nuraly/lumenui/label': 'label',
111
+ '@nuraly/lumenui/layout': 'layout',
112
+ '@nuraly/lumenui/menu': 'menu',
113
+ '@nuraly/lumenui/modal': 'modal',
114
+ '@nuraly/lumenui/panel': 'panel',
115
+ '@nuraly/lumenui/popconfirm': 'popconfirm',
116
+ '@nuraly/lumenui/radio': 'radio',
117
+ '@nuraly/lumenui/select': 'select',
118
+ '@nuraly/lumenui/skeleton': 'skeleton',
119
+ '@nuraly/lumenui/slider-input': 'slider-input',
120
+ '@nuraly/lumenui/table': 'table',
121
+ '@nuraly/lumenui/tabs': 'tabs',
122
+ '@nuraly/lumenui/tag': 'tag',
123
+ '@nuraly/lumenui/textarea': 'textarea',
124
+ '@nuraly/lumenui/timeline': 'timeline',
125
+ '@nuraly/lumenui/toast': 'toast',
126
+ '@nuraly/lumenui/video': 'video',
127
+ '@nuraly/lumenui/radio-group': 'radio-group',
128
+ '@nuraly/lumenui/iconpicker': 'iconpicker',
129
+ '@nuraly/lumenui/container': 'container',
130
+ '@nuraly/lumenui/code-editor': 'code-editor',
122
131
  };
132
+ const aliases = {};
133
+ for (const [pkg, dir] of Object.entries(componentNames)) {
134
+ aliases[pkg] = resolveComponentEntry(path.join(nuralyUIPath, dir));
135
+ }
136
+ // Workflow canvas only — excludes whiteboard/mermaid for environments without mermaid
137
+ aliases['@nuraly/lumenui/workflow-canvas'] = path.join(nuralyUIPath, 'canvas/workflow-canvas-only.ts');
138
+ aliases['@nuralyui/common/controllers'] = path.join(nuralyCommonPath, 'controllers.ts');
139
+ aliases['@nuralyui/common/mixins'] = path.join(nuralyCommonPath, 'mixins.ts');
140
+ aliases['@nuralyui/common/utils'] = path.join(nuralyCommonPath, 'utils.ts');
141
+ aliases['@nuralyui/common/themes'] = path.join(nuralyCommonPath, 'themes.ts');
142
+ aliases['@nuralyui/common'] = path.join(nuralyCommonPath, 'index.ts');
143
+ return aliases;
123
144
  }
124
145
  /**
125
146
  * Resolves the NuralyUI source path dynamically.
@@ -127,9 +148,9 @@ export function getNuralyUIAliases(nuralyUIPath, nuralyCommonPath) {
127
148
  * then falls back to well-known paths and environment variable.
128
149
  */
129
150
  export function resolveNuralyUIPaths(projectDir) {
130
- const nuralyUIRelPath = 'services/studio/src/features/runtime/components/ui/nuraly-ui';
151
+ const nuralyUIRelPath = 'libs/nuraly-ui';
131
152
  const candidates = [
132
- // Walk up from project dir to find the monorepo root containing services/
153
+ // Walk up from project dir to find the monorepo root containing libs/
133
154
  findMonorepoRoot(projectDir, nuralyUIRelPath),
134
155
  // Relative to lumenjs lib (in-repo: libs/lumenjs → repo root)
135
156
  path.resolve(__dirname, '../../..', nuralyUIRelPath),
@@ -1,6 +1,7 @@
1
1
  import path from 'path';
2
2
  import fs from 'fs';
3
3
  import { readBody } from '../../shared/utils.js';
4
+ import { useStorage } from '../../storage/index.js';
4
5
  /**
5
6
  * LumenJS API Routes plugin.
6
7
  *
@@ -42,6 +43,9 @@ export function lumenApiRoutesPlugin(apiDir, projectDir) {
42
43
  // Map /api/foo/bar → api/foo/bar.ts
43
44
  const routePath = pathname.replace(/^\//, '');
44
45
  const filePath = findApiFile(apiDir, routePath);
46
+ if (filePath && !filePath.startsWith(path.resolve(apiDir) + path.sep)) {
47
+ return next();
48
+ }
45
49
  if (!filePath) {
46
50
  return next();
47
51
  }
@@ -78,11 +82,21 @@ export function lumenApiRoutesPlugin(apiDir, projectDir) {
78
82
  files,
79
83
  headers: req.headers,
80
84
  projectDir: projectDir || path.dirname(apiDir),
85
+ nkAuth: req.nkAuth || null,
86
+ storage: useStorage(),
81
87
  };
82
88
  const result = await handler(nkRequest);
83
- res.statusCode = 200;
84
- res.setHeader('Content-Type', 'application/json');
85
- res.end(JSON.stringify(result));
89
+ if (result && result.__nk_binary && Buffer.isBuffer(result.body)) {
90
+ res.statusCode = result.status || 200;
91
+ for (const [k, v] of Object.entries(result.headers || {}))
92
+ res.setHeader(k, v);
93
+ res.end(result.body);
94
+ }
95
+ else {
96
+ res.statusCode = 200;
97
+ res.setHeader('Content-Type', 'application/json');
98
+ res.end(JSON.stringify(result));
99
+ }
86
100
  }
87
101
  catch (err) {
88
102
  const status = err?.status || 500;
@@ -167,10 +181,20 @@ function extractParams(apiDir, routePath, filePath) {
167
181
  }
168
182
  return params;
169
183
  }
170
- function readRawBody(req) {
184
+ const MAX_API_BODY = 10 * 1024 * 1024; // 10 MB
185
+ function readRawBody(req, maxSize = MAX_API_BODY) {
171
186
  return new Promise((resolve, reject) => {
172
187
  const chunks = [];
173
- req.on('data', (chunk) => chunks.push(chunk));
188
+ let size = 0;
189
+ req.on('data', (chunk) => {
190
+ size += chunk.length;
191
+ if (size > maxSize) {
192
+ req.destroy();
193
+ reject(new Error('Request body too large'));
194
+ return;
195
+ }
196
+ chunks.push(chunk);
197
+ });
174
198
  req.on('end', () => resolve(Buffer.concat(chunks)));
175
199
  req.on('error', reject);
176
200
  });
@@ -0,0 +1,6 @@
1
+ import { Plugin } from 'vite';
2
+ /**
3
+ * Vite dev plugin for authentication.
4
+ * Registers auth session middleware, auth route handlers, and guard enforcement.
5
+ */
6
+ export declare function authPlugin(projectDir: string): Plugin;
@@ -0,0 +1,223 @@
1
+ import path from 'path';
2
+ import { loadAuthConfig } from '../../auth/config.js';
3
+ import { createAuthMiddleware } from '../../auth/middleware.js';
4
+ import { handleAuthRoutes } from '../../auth/routes.js';
5
+ import { enforceGuard } from '../../auth/guard.js';
6
+ import { hasNativeAuth } from '../../auth/config.js';
7
+ import { enforcePermissionGuard, isPermissionGuard } from '../../permissions/guard.js';
8
+ import { ensurePermissionTables } from '../../permissions/tables.js';
9
+ import { PermissionService } from '../../permissions/service.js';
10
+ import { loadEmailConfig, sendEmail, renderEmailTemplate } from '../../email/index.js';
11
+ import { setProjectDir } from '../../db/context.js';
12
+ import { useDb, waitForMigrations } from '../../db/index.js';
13
+ import { ensureUsersTable } from '../../auth/native-auth.js';
14
+ import fs from 'fs';
15
+ /** Run seed.ts via Vite ssrLoadModule so TypeScript is handled. Only runs once per DB. */
16
+ async function runPgSeedIfNeeded(server, db, projectDir) {
17
+ const seedPath = path.join(projectDir, 'data', 'seed.ts');
18
+ if (!fs.existsSync(seedPath))
19
+ return;
20
+ try {
21
+ await db.exec(`CREATE TABLE IF NOT EXISTS _lumen_seed_applied (
22
+ name TEXT PRIMARY KEY,
23
+ applied_at TIMESTAMP NOT NULL DEFAULT NOW()
24
+ )`);
25
+ const row = await db.get('SELECT 1 FROM _lumen_seed_applied WHERE name = $1', 'data/seed.ts');
26
+ if (row)
27
+ return;
28
+ await db.run('INSERT INTO _lumen_seed_applied (name) VALUES ($1) ON CONFLICT DO NOTHING', 'data/seed.ts');
29
+ console.log('[LumenJS] Running seed file (PG)...');
30
+ const mod = await server.ssrLoadModule(seedPath);
31
+ const seedFn = mod.default || mod;
32
+ if (typeof seedFn === 'function')
33
+ await seedFn();
34
+ console.log('[LumenJS] Seed applied (PG).');
35
+ }
36
+ catch (err) {
37
+ try {
38
+ await db.run('DELETE FROM _lumen_seed_applied WHERE name = $1', 'data/seed.ts');
39
+ }
40
+ catch { }
41
+ console.error('[LumenJS] PG seed failed:', err.message);
42
+ }
43
+ }
44
+ /**
45
+ * Extract URL params by matching a route pattern against a path.
46
+ * Pattern: /apps/workflows/:workflowId → { workflowId: 'abc-123' }
47
+ */
48
+ function matchRouteParams(pattern, pathname) {
49
+ const params = {};
50
+ const patternParts = pattern.split('/');
51
+ const pathParts = pathname.split('/');
52
+ for (let i = 0; i < patternParts.length; i++) {
53
+ if (patternParts[i].startsWith(':')) {
54
+ const key = patternParts[i].slice(1);
55
+ if (pathParts[i])
56
+ params[key] = decodeURIComponent(pathParts[i]);
57
+ }
58
+ }
59
+ return params;
60
+ }
61
+ /**
62
+ * Vite dev plugin for authentication.
63
+ * Registers auth session middleware, auth route handlers, and guard enforcement.
64
+ */
65
+ export function authPlugin(projectDir) {
66
+ let authConfig = null;
67
+ let db = null;
68
+ let permissionService = null;
69
+ return {
70
+ name: 'lumenjs-auth',
71
+ configureServer(server) {
72
+ // 1. Auth session middleware — parse cookie, attach req.nkAuth
73
+ server.middlewares.use(async (req, res, next) => {
74
+ if (!authConfig) {
75
+ try {
76
+ authConfig = await loadAuthConfig(projectDir, server.ssrLoadModule.bind(server));
77
+ // Auto-wire email sending if email plugin is configured and auth has no custom onEvent
78
+ if (authConfig && !authConfig.onEvent) {
79
+ try {
80
+ const emailConfig = await loadEmailConfig(projectDir, server.ssrLoadModule.bind(server));
81
+ if (emailConfig) {
82
+ const { readProjectConfig } = await import('../../dev-server/config.js');
83
+ const appName = readProjectConfig(projectDir).title;
84
+ authConfig.onEvent = async (event) => {
85
+ try {
86
+ const data = { appName, url: event.type === 'password-changed' ? '' : event.url, email: event.email };
87
+ if (event.type === 'verification-email') {
88
+ const html = renderEmailTemplate(emailConfig, 'verify-email', data);
89
+ if (html)
90
+ await sendEmail(emailConfig, { to: event.email, subject: `Verify your email - ${appName}`, html });
91
+ }
92
+ else if (event.type === 'password-reset') {
93
+ const html = renderEmailTemplate(emailConfig, 'password-reset', data);
94
+ if (html)
95
+ await sendEmail(emailConfig, { to: event.email, subject: `Reset your password - ${appName}`, html });
96
+ }
97
+ }
98
+ catch (emailErr) {
99
+ console.error('[LumenJS Email] Failed to send:', emailErr?.message);
100
+ }
101
+ };
102
+ console.log('[LumenJS] Email auto-wired with auth module');
103
+ }
104
+ }
105
+ catch { }
106
+ }
107
+ // Initialize DB for native auth
108
+ if (authConfig && hasNativeAuth(authConfig) && !db) {
109
+ try {
110
+ setProjectDir(projectDir);
111
+ db = useDb();
112
+ await waitForMigrations();
113
+ // Run PG seed via ssrLoadModule so TypeScript is handled
114
+ if (db.isPg) {
115
+ await runPgSeedIfNeeded(server, db, projectDir);
116
+ }
117
+ await ensureUsersTable(db);
118
+ if (authConfig.permissions.enabled) {
119
+ await ensurePermissionTables(db);
120
+ permissionService = new PermissionService(db, authConfig.permissions);
121
+ console.log('[LumenJS] Permission module initialized');
122
+ }
123
+ }
124
+ catch (dbErr) {
125
+ console.warn('[LumenJS Auth] DB init failed, native auth disabled:', dbErr?.message);
126
+ }
127
+ }
128
+ }
129
+ catch (err) {
130
+ console.error('[LumenJS Auth] Failed to load config:', err);
131
+ return next();
132
+ }
133
+ }
134
+ if (!authConfig)
135
+ return next();
136
+ const middleware = createAuthMiddleware(authConfig, db);
137
+ middleware(req, res, next);
138
+ });
139
+ // 2. Auth route handlers — login, callback, logout, me
140
+ server.middlewares.use(async (req, res, next) => {
141
+ if (!authConfig)
142
+ return next();
143
+ const url = req.url || '';
144
+ if (!url.startsWith('/__nk_auth/'))
145
+ return next();
146
+ try {
147
+ const handled = await handleAuthRoutes(authConfig, req, res, db);
148
+ if (!handled)
149
+ next();
150
+ }
151
+ catch (err) {
152
+ console.error('[LumenJS Auth] Route handler error:', err);
153
+ next();
154
+ }
155
+ });
156
+ // 3. Guard enforcement — check page auth export, redirect/403
157
+ server.middlewares.use(async (req, res, next) => {
158
+ if (!authConfig)
159
+ return next();
160
+ const url = req.url || '';
161
+ // Only enforce on page requests (no static files, no API, no internal)
162
+ const lastSegment = url.split('?')[0].split('/').pop() || '';
163
+ const isStaticFile = lastSegment.includes('.') && /\.\w{1,10}$/.test(lastSegment);
164
+ if (isStaticFile || url.startsWith('/@') || url.startsWith('/__nk_') || url.startsWith('/api/') || url.startsWith('/node_modules')) {
165
+ return next();
166
+ }
167
+ try {
168
+ const pagesDir = path.join(projectDir, 'pages');
169
+ const { resolvePageFile } = await import('./vite-plugin-loaders.js');
170
+ const pageFile = resolvePageFile(pagesDir, url.split('?')[0]);
171
+ if (!pageFile)
172
+ return next();
173
+ const mod = await server.ssrLoadModule(pageFile);
174
+ const authExport = mod.auth ?? (authConfig.guards.defaultAuth ? true : null);
175
+ if (!authExport)
176
+ return next();
177
+ // Permission guard: { permission: 'workflow:read', resourceParam: 'workflowId' }
178
+ let result;
179
+ if (isPermissionGuard(authExport) && permissionService) {
180
+ // Extract URL params from the page file path pattern
181
+ const { filePathToRoute } = await import('../../shared/utils.js');
182
+ const routePattern = filePathToRoute(path.relative(pagesDir, pageFile));
183
+ const urlParams = matchRouteParams(routePattern, url.split('?')[0]);
184
+ result = await enforcePermissionGuard(authExport, req.nkAuth?.user, authConfig.routes.loginPage, url, urlParams, permissionService);
185
+ }
186
+ else {
187
+ result = enforceGuard(authExport, req.nkAuth, authConfig.routes.loginPage, url);
188
+ }
189
+ if ('redirect' in result) {
190
+ res.writeHead(302, { Location: result.redirect });
191
+ res.end();
192
+ return;
193
+ }
194
+ if ('forbidden' in result) {
195
+ res.writeHead(403, { 'Content-Type': 'text/plain' });
196
+ res.end('Forbidden');
197
+ return;
198
+ }
199
+ next();
200
+ }
201
+ catch (guardErr) {
202
+ console.error('[LumenJS Auth] Guard error:', guardErr?.message);
203
+ next();
204
+ }
205
+ });
206
+ },
207
+ // Strip `export const auth = ...` from client code and add __nk_has_auth flag
208
+ transform(code, id, options) {
209
+ if (options?.ssr)
210
+ return;
211
+ const pagesDir = path.join(projectDir, 'pages');
212
+ if (!id.startsWith(pagesDir))
213
+ return;
214
+ if (!/export\s+const\s+auth\s*=/.test(code))
215
+ return;
216
+ // Strip the auth export statement
217
+ let transformed = code.replace(/export\s+const\s+auth\s*=\s*[^;]+;/g, '');
218
+ // Add client-side flags
219
+ transformed += '\nexport const __nk_has_auth = true;\n';
220
+ return { code: transformed, map: null };
221
+ },
222
+ };
223
+ }
@@ -0,0 +1,16 @@
1
+ import { Plugin } from 'vite';
2
+ /**
3
+ * Auto-registers custom elements for page and layout files.
4
+ *
5
+ * Scans for the exported class that extends LitElement and appends a
6
+ * `customElements.define('tag-name', ClassName)` call. The tag name is
7
+ * derived from the file path using the same convention the router uses:
8
+ *
9
+ * pages/index.ts → page-index
10
+ * pages/docs/routing.ts → page-docs-routing
11
+ * pages/_layout.ts → layout-root
12
+ * pages/docs/_layout.ts → layout-docs
13
+ *
14
+ * This removes the need for `@customElement('...')` in page/layout files.
15
+ */
16
+ export declare function autoDefinePlugin(pagesDir: string): Plugin;