@nextsparkjs/core 0.1.0-beta.188 → 0.1.0-beta.189

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 (412) hide show
  1. package/dist/components/api/keys/ApiKeyDisplay.js +19 -19
  2. package/dist/components/api/keys/CreateApiKeyDialog.js +21 -21
  3. package/dist/components/app/layouts/PublicNavbar.d.ts.map +1 -1
  4. package/dist/components/app/layouts/PublicNavbar.js +34 -16
  5. package/dist/components/app/misc/ThemeToggle.d.ts.map +1 -1
  6. package/dist/components/app/misc/ThemeToggle.js +3 -4
  7. package/dist/components/auth/SessionCookieRefresher.d.ts +5 -0
  8. package/dist/components/auth/SessionCookieRefresher.d.ts.map +1 -1
  9. package/dist/components/auth/SessionCookieRefresher.js +7 -1
  10. package/dist/components/auth/forms/LoginForm.d.ts.map +1 -1
  11. package/dist/components/auth/forms/LoginForm.js +49 -12
  12. package/dist/components/auth/forms/SignupForm.d.ts.map +1 -1
  13. package/dist/components/auth/forms/SignupForm.js +4 -3
  14. package/dist/components/dashboard/block-editor/block-settings-panel.js +1 -1
  15. package/dist/components/dashboard/block-editor/floating-block-toolbar.js +1 -1
  16. package/dist/components/dashboard/block-editor/sortable-block.js +1 -1
  17. package/dist/components/dashboard/layouts/Sidebar.d.ts.map +1 -1
  18. package/dist/components/dashboard/layouts/Sidebar.js +8 -6
  19. package/dist/components/dashboard/layouts/TopNavbar.d.ts.map +1 -1
  20. package/dist/components/dashboard/layouts/TopNavbar.js +51 -54
  21. package/dist/components/dashboard/misc/NotificationsDropdown.d.ts.map +1 -1
  22. package/dist/components/dashboard/misc/NotificationsDropdown.js +17 -15
  23. package/dist/components/dashboard/misc/SearchDropdown.d.ts.map +1 -1
  24. package/dist/components/dashboard/misc/SearchDropdown.js +19 -22
  25. package/dist/components/dashboard/mobile/MobileBottomNav.js +1 -1
  26. package/dist/components/dashboard/mobile/MobileTopBar.js +2 -2
  27. package/dist/components/dashboard/navigation/DynamicNavigation.js +5 -5
  28. package/dist/components/devtools/BlockDetailViewer.js +1 -1
  29. package/dist/components/devtools/BlocksViewer.js +1 -1
  30. package/dist/components/entities/EntityChildManager.js +5 -5
  31. package/dist/components/entities/EntityDetailPage.d.ts.map +1 -1
  32. package/dist/components/entities/EntityDetailPage.js +16 -15
  33. package/dist/components/entities/EntityFieldRenderer.d.ts.map +1 -1
  34. package/dist/components/entities/EntityFieldRenderer.js +12 -7
  35. package/dist/components/entities/EntityPageHeader.js +5 -5
  36. package/dist/components/entities/ErrorBoundary.d.ts.map +1 -1
  37. package/dist/components/entities/ErrorBoundary.js +20 -21
  38. package/dist/components/entities/wrappers/EntityDetailWrapper.js +5 -5
  39. package/dist/components/entities/wrappers/EntityFormWrapper.js +2 -2
  40. package/dist/components/entities/wrappers/EntityListWrapper.js +3 -3
  41. package/dist/components/permissions/NoPermission.js +10 -10
  42. package/dist/components/public/pageBuilder/PageRenderer.d.ts.map +1 -1
  43. package/dist/components/public/pageBuilder/PageRenderer.js +2 -1
  44. package/dist/components/settings/SettingsPageSkeleton.js +4 -4
  45. package/dist/components/settings/layouts/SettingsSidebar.js +6 -6
  46. package/dist/components/shared/MultiSelectFilter.d.ts +3 -1
  47. package/dist/components/shared/MultiSelectFilter.d.ts.map +1 -1
  48. package/dist/components/shared/MultiSelectFilter.js +7 -3
  49. package/dist/components/shared/SearchInput.d.ts +2 -0
  50. package/dist/components/shared/SearchInput.d.ts.map +1 -1
  51. package/dist/components/shared/SearchInput.js +64 -6
  52. package/dist/components/ui/address-input.js +18 -18
  53. package/dist/components/ui/audio-upload.js +9 -9
  54. package/dist/components/ui/combobox.d.ts.map +1 -1
  55. package/dist/components/ui/combobox.js +4 -4
  56. package/dist/components/ui/country-select.d.ts.map +1 -1
  57. package/dist/components/ui/country-select.js +3 -3
  58. package/dist/components/ui/currency-select.d.ts.map +1 -1
  59. package/dist/components/ui/currency-select.js +3 -3
  60. package/dist/components/ui/dynamic-icon.d.ts.map +1 -1
  61. package/dist/components/ui/dynamic-icon.js +3 -2
  62. package/dist/components/ui/file-upload.js +7 -7
  63. package/dist/components/ui/image-upload.js +8 -8
  64. package/dist/components/ui/multi-select.d.ts +2 -1
  65. package/dist/components/ui/multi-select.d.ts.map +1 -1
  66. package/dist/components/ui/multi-select.js +4 -3
  67. package/dist/components/ui/phone-input.d.ts.map +1 -1
  68. package/dist/components/ui/phone-input.js +3 -3
  69. package/dist/components/ui/relation-display.js +1 -1
  70. package/dist/components/ui/simple-relation-select.d.ts +2 -1
  71. package/dist/components/ui/simple-relation-select.d.ts.map +1 -1
  72. package/dist/components/ui/simple-relation-select.js +7 -6
  73. package/dist/components/ui/tags-input.d.ts.map +1 -1
  74. package/dist/components/ui/tags-input.js +1 -1
  75. package/dist/components/ui/timezone-select.d.ts.map +1 -1
  76. package/dist/components/ui/timezone-select.js +3 -3
  77. package/dist/components/ui/user-display.js +4 -4
  78. package/dist/components/ui/user-select.d.ts.map +1 -1
  79. package/dist/components/ui/user-select.js +9 -9
  80. package/dist/components/ui/video-upload.js +9 -9
  81. package/dist/contexts/SubscriptionContext.d.ts.map +1 -1
  82. package/dist/contexts/SubscriptionContext.js +5 -1
  83. package/dist/contexts/TeamContext.d.ts.map +1 -1
  84. package/dist/contexts/TeamContext.js +83 -26
  85. package/dist/emails/otp-verification.d.ts.map +1 -1
  86. package/dist/emails/otp-verification.js +3 -2
  87. package/dist/hooks/useAccountPreferencesSync.d.ts +13 -0
  88. package/dist/hooks/useAccountPreferencesSync.d.ts.map +1 -0
  89. package/dist/hooks/useAccountPreferencesSync.js +95 -0
  90. package/dist/hooks/useAuth.d.ts +202 -15
  91. package/dist/hooks/useAuth.d.ts.map +1 -1
  92. package/dist/hooks/useAuth.js +49 -13
  93. package/dist/hooks/useEntityConfig.js +2 -2
  94. package/dist/hooks/useEntitySearch.js +10 -10
  95. package/dist/hooks/useNotifications.js +12 -12
  96. package/dist/hooks/usePrefetch.d.ts.map +1 -1
  97. package/dist/hooks/usePrefetch.js +6 -2
  98. package/dist/hooks/useSearch.js +15 -15
  99. package/dist/hooks/useSessionCookieRefresh.d.ts +18 -1
  100. package/dist/hooks/useSessionCookieRefresh.d.ts.map +1 -1
  101. package/dist/hooks/useSessionCookieRefresh.js +17 -4
  102. package/dist/hooks/useSessionHint.d.ts +12 -0
  103. package/dist/hooks/useSessionHint.d.ts.map +1 -0
  104. package/dist/hooks/useSessionHint.js +15 -0
  105. package/dist/hooks/useTranslationPreload.js +6 -6
  106. package/dist/i18n.d.ts +13 -0
  107. package/dist/i18n.d.ts.map +1 -1
  108. package/dist/i18n.js +2 -27
  109. package/dist/lib/actions/entity.actions.d.ts.map +1 -1
  110. package/dist/lib/actions/entity.actions.js +3 -2
  111. package/dist/lib/api/auth/dual-auth.d.ts +4 -1
  112. package/dist/lib/api/auth/dual-auth.d.ts.map +1 -1
  113. package/dist/lib/api/auth/dual-auth.js +5 -16
  114. package/dist/lib/api/entities.js +33 -33
  115. package/dist/lib/api/keys.d.ts +27 -27
  116. package/dist/lib/api/keys.js +27 -27
  117. package/dist/lib/auth/callback-url.d.ts +11 -0
  118. package/dist/lib/auth/callback-url.d.ts.map +1 -0
  119. package/dist/lib/auth/callback-url.js +14 -0
  120. package/dist/lib/auth/otp-config.d.ts +55 -0
  121. package/dist/lib/auth/otp-config.d.ts.map +1 -0
  122. package/dist/lib/auth/otp-config.js +48 -0
  123. package/dist/lib/auth/registration-helpers.d.ts.map +1 -1
  124. package/dist/lib/auth/registration-helpers.js +3 -1
  125. package/dist/lib/auth/session-hint.d.ts +31 -0
  126. package/dist/lib/auth/session-hint.d.ts.map +1 -0
  127. package/dist/lib/auth/session-hint.js +37 -0
  128. package/dist/lib/auth.d.ts.map +1 -1
  129. package/dist/lib/auth.js +6 -4
  130. package/dist/lib/blocks/loader.d.ts +3 -11
  131. package/dist/lib/blocks/loader.d.ts.map +1 -1
  132. package/dist/lib/blocks/loader.js +1 -9
  133. package/dist/lib/blocks/loader.server.d.ts +18 -0
  134. package/dist/lib/blocks/loader.server.d.ts.map +1 -0
  135. package/dist/lib/blocks/loader.server.js +11 -0
  136. package/dist/lib/blocks/sanitize-html.d.ts +31 -0
  137. package/dist/lib/blocks/sanitize-html.d.ts.map +1 -0
  138. package/dist/lib/blocks/sanitize-html.js +60 -0
  139. package/dist/lib/config/config-sync.d.ts +1 -0
  140. package/dist/lib/config/config-sync.d.ts.map +1 -1
  141. package/dist/lib/config/config-sync.js +4 -1
  142. package/dist/lib/config/types.d.ts +48 -0
  143. package/dist/lib/config/types.d.ts.map +1 -1
  144. package/dist/lib/email/types.d.ts +6 -0
  145. package/dist/lib/email/types.d.ts.map +1 -1
  146. package/dist/lib/entities/serialization.d.ts.map +1 -1
  147. package/dist/lib/entities/serialization.js +3 -6
  148. package/dist/lib/icons.d.ts +12 -0
  149. package/dist/lib/icons.d.ts.map +1 -0
  150. package/dist/lib/icons.js +30 -0
  151. package/dist/lib/locale.d.ts +25 -1
  152. package/dist/lib/locale.d.ts.map +1 -1
  153. package/dist/lib/locale.js +49 -35
  154. package/dist/lib/mcp/engine.js +1 -1
  155. package/dist/lib/mcp/errors.js +17 -17
  156. package/dist/lib/mcp/schema-builder.js +16 -16
  157. package/dist/lib/mcp/tool-generator.js +18 -18
  158. package/dist/lib/search-highlighting.d.ts +7 -0
  159. package/dist/lib/search-highlighting.d.ts.map +1 -1
  160. package/dist/lib/search-highlighting.js +6 -2
  161. package/dist/lib/selectors/core-selectors.d.ts +2 -0
  162. package/dist/lib/selectors/core-selectors.d.ts.map +1 -1
  163. package/dist/lib/selectors/domains/auth.selectors.d.ts +1 -0
  164. package/dist/lib/selectors/domains/auth.selectors.d.ts.map +1 -1
  165. package/dist/lib/selectors/domains/auth.selectors.js +1 -0
  166. package/dist/lib/selectors/domains/entities.selectors.d.ts +2 -0
  167. package/dist/lib/selectors/domains/entities.selectors.d.ts.map +1 -1
  168. package/dist/lib/selectors/domains/entities.selectors.js +2 -0
  169. package/dist/lib/selectors/selectors.d.ts +4 -0
  170. package/dist/lib/selectors/selectors.d.ts.map +1 -1
  171. package/dist/lib/services/block.service.js +1 -1
  172. package/dist/lib/teams/active-team-cookie.d.ts +24 -0
  173. package/dist/lib/teams/active-team-cookie.d.ts.map +1 -0
  174. package/dist/lib/teams/active-team-cookie.js +17 -0
  175. package/dist/lib/teams/dashboard-team.d.ts +20 -0
  176. package/dist/lib/teams/dashboard-team.d.ts.map +1 -0
  177. package/dist/lib/teams/dashboard-team.js +38 -0
  178. package/dist/lib/teams/schema.d.ts.map +1 -1
  179. package/dist/lib/teams/schema.js +1 -1
  180. package/dist/lib/template-resolver.d.ts.map +1 -1
  181. package/dist/lib/template-resolver.js +0 -1
  182. package/dist/lib/theme/get-default-theme-mode.d.ts +7 -4
  183. package/dist/lib/theme/get-default-theme-mode.d.ts.map +1 -1
  184. package/dist/lib/theme/get-default-theme-mode.js +2 -44
  185. package/dist/messages/de/auth.json +4 -2
  186. package/dist/messages/de/common.json +83 -3
  187. package/dist/messages/de/email.json +1 -1
  188. package/dist/messages/de/index.d.ts +87 -0
  189. package/dist/messages/de/index.d.ts.map +1 -1
  190. package/dist/messages/de/settings.json +5 -0
  191. package/dist/messages/en/auth.json +4 -2
  192. package/dist/messages/en/common.json +83 -3
  193. package/dist/messages/en/email.json +1 -1
  194. package/dist/messages/en/index.d.ts +86 -0
  195. package/dist/messages/en/index.d.ts.map +1 -1
  196. package/dist/messages/en/settings.json +4 -0
  197. package/dist/messages/es/auth.json +4 -2
  198. package/dist/messages/es/common.json +83 -3
  199. package/dist/messages/es/email.json +1 -1
  200. package/dist/messages/es/index.d.ts +86 -0
  201. package/dist/messages/es/index.d.ts.map +1 -1
  202. package/dist/messages/es/settings.json +4 -0
  203. package/dist/messages/fr/auth.json +4 -2
  204. package/dist/messages/fr/common.json +83 -3
  205. package/dist/messages/fr/email.json +1 -1
  206. package/dist/messages/fr/index.d.ts +87 -0
  207. package/dist/messages/fr/index.d.ts.map +1 -1
  208. package/dist/messages/fr/settings.json +5 -0
  209. package/dist/messages/it/auth.json +4 -2
  210. package/dist/messages/it/common.json +83 -3
  211. package/dist/messages/it/email.json +1 -1
  212. package/dist/messages/it/index.d.ts +87 -0
  213. package/dist/messages/it/index.d.ts.map +1 -1
  214. package/dist/messages/it/settings.json +5 -0
  215. package/dist/messages/pt/auth.json +4 -2
  216. package/dist/messages/pt/common.json +83 -3
  217. package/dist/messages/pt/email.json +1 -1
  218. package/dist/messages/pt/index.d.ts +87 -0
  219. package/dist/messages/pt/index.d.ts.map +1 -1
  220. package/dist/messages/pt/settings.json +5 -0
  221. package/dist/nextspark-registries.d.ts +54 -0
  222. package/dist/providers/DashboardProviders.d.ts +13 -10
  223. package/dist/providers/DashboardProviders.d.ts.map +1 -1
  224. package/dist/providers/DashboardProviders.js +7 -1
  225. package/dist/templates/app/(auth)/forgot-password/page.tsx +2 -2
  226. package/dist/templates/app/(auth)/reset-password/page.tsx +6 -6
  227. package/dist/templates/app/403/page.tsx +6 -6
  228. package/dist/templates/app/api/v1/teams/switch/route.ts +24 -5
  229. package/dist/templates/app/dashboard/(main)/[entity]/layout.tsx +9 -7
  230. package/dist/templates/app/dashboard/(main)/layout.tsx +4 -3
  231. package/dist/templates/app/dashboard/settings/api-keys/page.tsx +36 -34
  232. package/dist/templates/app/dashboard/settings/profile/page.tsx +7 -6
  233. package/dist/templates/app/dashboard/settings/security/page.tsx +5 -4
  234. package/dist/templates/app/layout.ppr.tsx +8 -8
  235. package/dist/templates/app/layout.tsx +12 -17
  236. package/dist/templates/blocks/cta-section/component.tsx +5 -2
  237. package/dist/templates/blocks/cta-section/config.ts +3 -2
  238. package/dist/templates/blocks/cta-section/fields.ts +2 -2
  239. package/dist/templates/blocks/cta-section/schema.ts +2 -2
  240. package/dist/templates/blocks/features-grid/component.tsx +10 -2
  241. package/dist/templates/blocks/features-grid/config.ts +3 -2
  242. package/dist/templates/blocks/features-grid/fields.ts +2 -2
  243. package/dist/templates/blocks/features-grid/schema.ts +2 -2
  244. package/dist/templates/blocks/hero/component.tsx +6 -3
  245. package/dist/templates/blocks/hero/config.ts +3 -2
  246. package/dist/templates/blocks/hero/fields.ts +2 -2
  247. package/dist/templates/blocks/hero/schema.ts +2 -2
  248. package/dist/templates/blocks/testimonials/component.tsx +6 -3
  249. package/dist/templates/blocks/testimonials/config.ts +3 -2
  250. package/dist/templates/blocks/testimonials/fields.ts +2 -2
  251. package/dist/templates/blocks/testimonials/schema.ts +2 -2
  252. package/dist/templates/blocks/text-content/component.tsx +7 -3
  253. package/dist/templates/blocks/text-content/config.ts +3 -2
  254. package/dist/templates/blocks/text-content/fields.ts +2 -2
  255. package/dist/templates/blocks/text-content/schema.ts +2 -2
  256. package/dist/templates/contents/themes/starter/blocks/cta-section/component.tsx +102 -0
  257. package/dist/templates/contents/themes/starter/blocks/cta-section/config.ts +11 -0
  258. package/dist/templates/contents/themes/starter/blocks/cta-section/fields.ts +89 -0
  259. package/dist/templates/contents/themes/starter/blocks/cta-section/index.ts +6 -0
  260. package/dist/templates/contents/themes/starter/blocks/cta-section/schema.ts +32 -0
  261. package/dist/templates/contents/themes/starter/blocks/cta-section/thumbnail.png +0 -0
  262. package/dist/templates/contents/themes/starter/blocks/features-grid/component.tsx +119 -0
  263. package/dist/templates/contents/themes/starter/blocks/features-grid/config.ts +11 -0
  264. package/dist/templates/contents/themes/starter/blocks/features-grid/fields.ts +97 -0
  265. package/dist/templates/contents/themes/starter/blocks/features-grid/index.ts +6 -0
  266. package/dist/templates/contents/themes/starter/blocks/features-grid/schema.ts +40 -0
  267. package/dist/templates/contents/themes/starter/blocks/features-grid/thumbnail.png +0 -0
  268. package/dist/templates/contents/themes/starter/blocks/hero/component.tsx +105 -0
  269. package/dist/templates/contents/themes/starter/blocks/hero/config.ts +11 -0
  270. package/dist/templates/contents/themes/starter/blocks/hero/fields.ts +60 -0
  271. package/dist/templates/contents/themes/starter/blocks/hero/index.ts +6 -0
  272. package/dist/templates/contents/themes/starter/blocks/hero/schema.ts +33 -0
  273. package/dist/templates/contents/themes/starter/blocks/hero/thumbnail.png +0 -0
  274. package/dist/templates/contents/themes/starter/blocks/testimonials/component.tsx +116 -0
  275. package/dist/templates/contents/themes/starter/blocks/testimonials/config.ts +11 -0
  276. package/dist/templates/contents/themes/starter/blocks/testimonials/fields.ts +105 -0
  277. package/dist/templates/contents/themes/starter/blocks/testimonials/index.ts +6 -0
  278. package/dist/templates/contents/themes/starter/blocks/testimonials/schema.ts +41 -0
  279. package/dist/templates/contents/themes/starter/blocks/testimonials/thumbnail.png +0 -0
  280. package/dist/templates/contents/themes/starter/blocks/text-content/component.tsx +100 -0
  281. package/dist/templates/contents/themes/starter/blocks/text-content/config.ts +11 -0
  282. package/dist/templates/contents/themes/starter/blocks/text-content/fields.ts +88 -0
  283. package/dist/templates/contents/themes/starter/blocks/text-content/index.ts +6 -0
  284. package/dist/templates/contents/themes/starter/blocks/text-content/schema.ts +30 -0
  285. package/dist/templates/contents/themes/starter/blocks/text-content/thumbnail.png +0 -0
  286. package/dist/templates/contents/themes/starter/config/app.config.ts +8 -0
  287. package/dist/templates/contents/themes/starter/entities/tasks/tasks.config.ts +7 -0
  288. package/dist/templates/contents/themes/starter/tests/cypress/e2e/_utils/devtools/access.cy.ts +9 -1
  289. package/dist/templates/contents/themes/starter/tests/cypress/e2e/api/entities/tasks/TaskAPIController.js +2 -2
  290. package/dist/templates/contents/themes/starter/tests/cypress/e2e/uat/entities/tasks/tasks-crud.cy.ts +45 -38
  291. package/dist/templates/contents/themes/starter/tests/cypress/fixtures/entities.json +16 -0
  292. package/dist/templates/contents/themes/starter/tests/cypress/src/components/DevKeyringPOM.ts +3 -1
  293. package/dist/templates/contents/themes/starter/tests/cypress/src/core/BlockEditorBasePOM.ts +3 -3
  294. package/dist/templates/contents/themes/starter/tests/cypress/src/entities/PagesPOM.ts +137 -0
  295. package/dist/templates/contents/themes/starter/tests/cypress/src/entities/index.ts +2 -0
  296. package/dist/templates/contents/themes/starter/tests/cypress/src/index.ts +1 -0
  297. package/dist/templates/contents/themes/starter/tests/cypress/src/session-helpers.ts +42 -11
  298. package/dist/templates/contents/themes/starter/tests/cypress/support/commands.ts +29 -18
  299. package/dist/templates/features/blog/blocks/post-content/component.tsx +5 -1
  300. package/dist/templates/features/blog/blocks/post-content/schema.ts +1 -1
  301. package/dist/templates/features/pages/blocks/hero/component.tsx +3 -0
  302. package/dist/templates/features/pages/blocks/hero/schema.ts +1 -1
  303. package/dist/templates/proxy.ts +138 -53
  304. package/dist/types/blocks.d.ts.map +1 -1
  305. package/dist/types/blocks.js +1 -1
  306. package/dist/types/task.types.d.ts +1 -1
  307. package/dist/types/task.types.js +7 -7
  308. package/dist/utils/dev/TranslationDebugger.js +2 -2
  309. package/package.json +14 -5
  310. package/scripts/build/registry/__tests__/block-registry.test.mjs +73 -0
  311. package/scripts/build/registry/__tests__/icons-discovery.test.mjs +130 -0
  312. package/scripts/build/registry/__tests__/identifier.test.mjs +65 -0
  313. package/scripts/build/registry/__tests__/page-generator.test.mjs +430 -0
  314. package/scripts/build/registry/__tests__/scheduled-actions-registry.test.mjs +41 -0
  315. package/scripts/build/registry/__tests__/template-registry.test.mjs +89 -0
  316. package/scripts/build/registry/discovery/icons.mjs +275 -0
  317. package/scripts/build/registry/discovery/index.mjs +1 -0
  318. package/scripts/build/registry/generators/block-registry.mjs +203 -55
  319. package/scripts/build/registry/generators/feature-registry.mjs +9 -2
  320. package/scripts/build/registry/generators/icon-registry.mjs +56 -0
  321. package/scripts/build/registry/generators/identifier.mjs +28 -0
  322. package/scripts/build/registry/generators/index.mjs +1 -0
  323. package/scripts/build/registry/generators/plugin-registry.mjs +4 -3
  324. package/scripts/build/registry/generators/scheduled-actions-registry.mjs +4 -2
  325. package/scripts/build/registry/generators/template-registry.mjs +49 -41
  326. package/scripts/build/registry/generators/theme-registry.mjs +6 -7
  327. package/scripts/build/registry/post-build/page-generator.mjs +380 -59
  328. package/scripts/build/registry.mjs +9 -1
  329. package/templates/app/(auth)/forgot-password/page.tsx +2 -2
  330. package/templates/app/(auth)/reset-password/page.tsx +6 -6
  331. package/templates/app/403/page.tsx +6 -6
  332. package/templates/app/api/v1/teams/switch/route.ts +24 -5
  333. package/templates/app/dashboard/(main)/[entity]/layout.tsx +9 -7
  334. package/templates/app/dashboard/(main)/layout.tsx +4 -3
  335. package/templates/app/dashboard/settings/api-keys/page.tsx +36 -34
  336. package/templates/app/dashboard/settings/profile/page.tsx +7 -6
  337. package/templates/app/dashboard/settings/security/page.tsx +5 -4
  338. package/templates/app/layout.ppr.tsx +8 -8
  339. package/templates/app/layout.tsx +12 -17
  340. package/templates/blocks/cta-section/component.tsx +5 -2
  341. package/templates/blocks/cta-section/config.ts +3 -2
  342. package/templates/blocks/cta-section/fields.ts +2 -2
  343. package/templates/blocks/cta-section/schema.ts +2 -2
  344. package/templates/blocks/features-grid/component.tsx +10 -2
  345. package/templates/blocks/features-grid/config.ts +3 -2
  346. package/templates/blocks/features-grid/fields.ts +2 -2
  347. package/templates/blocks/features-grid/schema.ts +2 -2
  348. package/templates/blocks/hero/component.tsx +6 -3
  349. package/templates/blocks/hero/config.ts +3 -2
  350. package/templates/blocks/hero/fields.ts +2 -2
  351. package/templates/blocks/hero/schema.ts +2 -2
  352. package/templates/blocks/testimonials/component.tsx +6 -3
  353. package/templates/blocks/testimonials/config.ts +3 -2
  354. package/templates/blocks/testimonials/fields.ts +2 -2
  355. package/templates/blocks/testimonials/schema.ts +2 -2
  356. package/templates/blocks/text-content/component.tsx +7 -3
  357. package/templates/blocks/text-content/config.ts +3 -2
  358. package/templates/blocks/text-content/fields.ts +2 -2
  359. package/templates/blocks/text-content/schema.ts +2 -2
  360. package/templates/contents/themes/starter/blocks/cta-section/component.tsx +102 -0
  361. package/templates/contents/themes/starter/blocks/cta-section/config.ts +11 -0
  362. package/templates/contents/themes/starter/blocks/cta-section/fields.ts +89 -0
  363. package/templates/contents/themes/starter/blocks/cta-section/index.ts +6 -0
  364. package/templates/contents/themes/starter/blocks/cta-section/schema.ts +32 -0
  365. package/templates/contents/themes/starter/blocks/cta-section/thumbnail.png +0 -0
  366. package/templates/contents/themes/starter/blocks/features-grid/component.tsx +119 -0
  367. package/templates/contents/themes/starter/blocks/features-grid/config.ts +11 -0
  368. package/templates/contents/themes/starter/blocks/features-grid/fields.ts +97 -0
  369. package/templates/contents/themes/starter/blocks/features-grid/index.ts +6 -0
  370. package/templates/contents/themes/starter/blocks/features-grid/schema.ts +40 -0
  371. package/templates/contents/themes/starter/blocks/features-grid/thumbnail.png +0 -0
  372. package/templates/contents/themes/starter/blocks/hero/component.tsx +105 -0
  373. package/templates/contents/themes/starter/blocks/hero/config.ts +11 -0
  374. package/templates/contents/themes/starter/blocks/hero/fields.ts +60 -0
  375. package/templates/contents/themes/starter/blocks/hero/index.ts +6 -0
  376. package/templates/contents/themes/starter/blocks/hero/schema.ts +33 -0
  377. package/templates/contents/themes/starter/blocks/hero/thumbnail.png +0 -0
  378. package/templates/contents/themes/starter/blocks/testimonials/component.tsx +116 -0
  379. package/templates/contents/themes/starter/blocks/testimonials/config.ts +11 -0
  380. package/templates/contents/themes/starter/blocks/testimonials/fields.ts +105 -0
  381. package/templates/contents/themes/starter/blocks/testimonials/index.ts +6 -0
  382. package/templates/contents/themes/starter/blocks/testimonials/schema.ts +41 -0
  383. package/templates/contents/themes/starter/blocks/testimonials/thumbnail.png +0 -0
  384. package/templates/contents/themes/starter/blocks/text-content/component.tsx +100 -0
  385. package/templates/contents/themes/starter/blocks/text-content/config.ts +11 -0
  386. package/templates/contents/themes/starter/blocks/text-content/fields.ts +88 -0
  387. package/templates/contents/themes/starter/blocks/text-content/index.ts +6 -0
  388. package/templates/contents/themes/starter/blocks/text-content/schema.ts +30 -0
  389. package/templates/contents/themes/starter/blocks/text-content/thumbnail.png +0 -0
  390. package/templates/contents/themes/starter/config/app.config.ts +8 -0
  391. package/templates/contents/themes/starter/entities/tasks/tasks.config.ts +7 -0
  392. package/templates/contents/themes/starter/tests/cypress/e2e/_utils/devtools/access.cy.ts +9 -1
  393. package/templates/contents/themes/starter/tests/cypress/e2e/api/entities/tasks/TaskAPIController.js +2 -2
  394. package/templates/contents/themes/starter/tests/cypress/e2e/uat/entities/tasks/tasks-crud.cy.ts +45 -38
  395. package/templates/contents/themes/starter/tests/cypress/fixtures/entities.json +16 -0
  396. package/templates/contents/themes/starter/tests/cypress/src/components/DevKeyringPOM.ts +3 -1
  397. package/templates/contents/themes/starter/tests/cypress/src/core/BlockEditorBasePOM.ts +3 -3
  398. package/templates/contents/themes/starter/tests/cypress/src/entities/PagesPOM.ts +137 -0
  399. package/templates/contents/themes/starter/tests/cypress/src/entities/index.ts +2 -0
  400. package/templates/contents/themes/starter/tests/cypress/src/index.ts +1 -0
  401. package/templates/contents/themes/starter/tests/cypress/src/session-helpers.ts +42 -11
  402. package/templates/contents/themes/starter/tests/cypress/support/commands.ts +29 -18
  403. package/templates/features/blog/blocks/post-content/component.tsx +5 -1
  404. package/templates/features/blog/blocks/post-content/schema.ts +1 -1
  405. package/templates/features/pages/blocks/hero/component.tsx +3 -0
  406. package/templates/features/pages/blocks/hero/schema.ts +1 -1
  407. package/templates/proxy.ts +138 -53
  408. package/tests/jest/__mocks__/@nextsparkjs/registries/block-registry.client.ts +9 -0
  409. package/tests/jest/__mocks__/@nextsparkjs/registries/block-registry.lazy.ts +5 -0
  410. package/tests/jest/__mocks__/@nextsparkjs/registries/icon-registry.ts +42 -0
  411. package/tests/jest/__mocks__/next-intl-server.js +85 -5
  412. package/tests/jest/__mocks__/next-server.js +32 -0
@@ -5,39 +5,39 @@ function translateApiError(result, context) {
5
5
  const detail = body.error ? ` (API: ${body.error})` : "";
6
6
  switch (code) {
7
7
  case "AUTHENTICATION_FAILED":
8
- return "API key inv\xE1lida, expirada o revocada. Gener\xE1 una nueva en Settings \u2192 API Keys y actualiz\xE1 la configuraci\xF3n del cliente MCP.";
8
+ return "API key invalid, expired, or revoked. Generate a new one in Settings \u2192 API Keys and update the MCP client configuration.";
9
9
  case "TEAM_CONTEXT_REQUIRED":
10
- return "Falta el contexto de equipo (team). Verific\xE1 que tu API key pertenezca a un usuario con un team activo, o envi\xE1 el header x-team-id.";
10
+ return "Missing team context. Verify that your API key belongs to a user with an active team, or send the x-team-id header.";
11
11
  case "TEAM_ACCESS_DENIED":
12
- return "El usuario de la API key no es miembro del team indicado. Verific\xE1 el x-team-id o us\xE1 el team por defecto.";
12
+ return "The API key user is not a member of the specified team. Check x-team-id or use the default team.";
13
13
  case "VALIDATION_ERROR":
14
- return `Datos inv\xE1lidos para ${context.slug}.${formatDetails(body.details)} Correg\xED los campos y reintent\xE1.`;
14
+ return `Invalid data for ${context.slug}.${formatDetails(body.details)} Fix the fields and retry.`;
15
15
  case "INVALID_FIELD_VALUE":
16
- return `Un campo tiene un valor no permitido${detail}. Revis\xE1 los valores del schema de la tool y reintent\xE1.`;
16
+ return `A field has a value that is not allowed${detail}. Check the tool's schema values and retry.`;
17
17
  case "UNIQUE_CONSTRAINT_VIOLATION":
18
- return `Ya existe un registro de ${context.slug} con ese valor \xFAnico${detail}. Buscalo con la tool de list y actualizalo en vez de crearlo.`;
18
+ return `A record for ${context.slug} already exists with that unique value${detail}. Look it up with the list tool and update it instead of creating it.`;
19
19
  case "RATE_LIMIT_EXCEEDED":
20
- return "L\xEDmite de requests alcanzado. Esper\xE1 un minuto antes de reintentar; para cargas grandes us\xE1 las tools de batch si el entity las expone.";
20
+ return "Request limit reached. Wait a minute before retrying; for large loads use the batch tools if the entity exposes them.";
21
21
  default:
22
22
  break;
23
23
  }
24
24
  switch (status) {
25
25
  case 401:
26
- return "No autenticado: la API key no fue aceptada. Gener\xE1 una nueva en Settings \u2192 API Keys.";
26
+ return "Not authenticated: the API key was not accepted. Generate a new one in Settings \u2192 API Keys.";
27
27
  case 403:
28
- return `Sin permiso para ${context.operation} en ${context.slug}. Si es un problema de scope, tu API key necesita el scope ${context.slug}:${scopeFor(context.operation)}. Si es un problema de rol, tu rol en el team no permite esta acci\xF3n.`;
28
+ return `No permission for ${context.operation} on ${context.slug}. If it's a scope issue, your API key needs the ${context.slug}:${scopeFor(context.operation)} scope. If it's a role issue, your role in the team does not allow this action.`;
29
29
  case 404:
30
- return `No se encontr\xF3 el registro de ${context.slug}. El ID puede ser incorrecto o el registro fue eliminado \u2014 us\xE1 la tool de list para encontrar el ID correcto.`;
30
+ return `Record for ${context.slug} not found. The ID may be incorrect or the record may have been deleted \u2014 use the list tool to find the correct ID.`;
31
31
  case 409:
32
- return `No se puede completar: el registro de ${context.slug} tiene registros relacionados que dependen de \xE9l${detail}. Elimin\xE1 o reasign\xE1 los registros dependientes primero.`;
32
+ return `Cannot complete: the record for ${context.slug} has related records that depend on it${detail}. Delete or reassign the dependent records first.`;
33
33
  case 429:
34
- return "L\xEDmite de requests alcanzado. Esper\xE1 un minuto antes de reintentar.";
34
+ return "Request limit reached. Wait a minute before retrying.";
35
35
  case 500: {
36
- const hints = ((_a = context.hints) == null ? void 0 : _a.length) ? ` Posibles causas conocidas: ${context.hints.join(" \xB7 ")}.` : "";
37
- return `Error interno de la API al ejecutar ${context.operation} en ${context.slug}.${hints} Si persiste, reportalo.`;
36
+ const hints = ((_a = context.hints) == null ? void 0 : _a.length) ? ` Known possible causes: ${context.hints.join(" \xB7 ")}.` : "";
37
+ return `Internal API error while executing ${context.operation} on ${context.slug}.${hints} If it persists, report it.`;
38
38
  }
39
39
  default:
40
- return `Error ${status} (${code}) al ejecutar ${context.operation} en ${context.slug}${detail}.`;
40
+ return `Error ${status} (${code}) while executing ${context.operation} on ${context.slug}${detail}.`;
41
41
  }
42
42
  }
43
43
  function scopeFor(operation) {
@@ -57,9 +57,9 @@ function formatDetails(details) {
57
57
  }
58
58
  return String(issue);
59
59
  }).slice(0, 8);
60
- return ` Problemas: ${lines.join(" \xB7 ")}.`;
60
+ return ` Issues: ${lines.join(" \xB7 ")}.`;
61
61
  }
62
- return ` Detalle: ${JSON.stringify(details).slice(0, 300)}.`;
62
+ return ` Detail: ${JSON.stringify(details).slice(0, 300)}.`;
63
63
  }
64
64
  export {
65
65
  translateApiError
@@ -14,7 +14,7 @@ function buildEntitySchemas(entityConfig, context = {}) {
14
14
  const updateShape = buildInputShape(entityConfig, "update", context);
15
15
  const listShape = buildListShape(entityConfig, context);
16
16
  const getShape = {
17
- id: z.string().min(1).describe(`ID del registro de ${entityConfig.names.singular} (uuid)`)
17
+ id: z.string().min(1).describe(`ID of the ${entityConfig.names.singular} record (uuid)`)
18
18
  };
19
19
  const dateFields = entityConfig.fields.filter((f) => f.type === "date").map((f) => f.name);
20
20
  const searchField = SEARCHED_FIELDS.find((name) => entityConfig.fields.some((f) => f.name === name)) ?? null;
@@ -112,21 +112,21 @@ function buildListShape(entityConfig, context) {
112
112
  const sortableValues = [...sortable, "createdAt", "updatedAt"];
113
113
  const dateFieldNames = entityConfig.fields.filter((f) => f.type === "date" || f.type === "datetime").map((f) => f.name);
114
114
  const shape = {
115
- page: z.number().int().min(1).optional().describe("P\xE1gina (1)"),
116
- limit: z.number().int().min(1).max(100).optional().describe("Por p\xE1gina (10, m\xE1x 100)"),
117
- sortBy: z.enum(sortableValues).optional().describe("Ordenar por"),
118
- sortOrder: z.enum(["ASC", "DESC"]).optional().describe("Orden (DESC)")
115
+ page: z.number().int().min(1).optional().describe("Page (1)"),
116
+ limit: z.number().int().min(1).max(100).optional().describe("Per page (10, max 100)"),
117
+ sortBy: z.enum(sortableValues).optional().describe("Sort by"),
118
+ sortOrder: z.enum(["ASC", "DESC"]).optional().describe("Order (DESC)")
119
119
  };
120
120
  const searchField = SEARCHED_FIELDS.find(
121
121
  (name) => entityConfig.fields.some((f) => f.name === name)
122
122
  );
123
123
  if (searchField) {
124
- shape.search = z.string().min(1).optional().describe(`Busca SOLO en "${searchField}"`);
124
+ shape.search = z.string().min(1).optional().describe(`Searches ONLY in "${searchField}"`);
125
125
  }
126
126
  if (dateFieldNames.length) {
127
- shape.dateField = z.enum(dateFieldNames).optional().describe("Campo de fecha del rango (obligatorio con from/to)");
128
- shape.from = z.string().optional().describe("Desde (YYYY-MM-DD)");
129
- shape.to = z.string().optional().describe("Hasta (YYYY-MM-DD)");
127
+ shape.dateField = z.enum(dateFieldNames).optional().describe("Date field for the range (required with from/to)");
128
+ shape.from = z.string().optional().describe("From (YYYY-MM-DD)");
129
+ shape.to = z.string().optional().describe("To (YYYY-MM-DD)");
130
130
  }
131
131
  const filterShape = {};
132
132
  for (const field of entityConfig.fields) {
@@ -136,11 +136,11 @@ function buildListShape(entityConfig, context) {
136
136
  filterShape[field.name] = presentationType(field).optional().describe(describeField(entityConfig, field, field.name, context, true));
137
137
  }
138
138
  if (Object.keys(filterShape).length) {
139
- shape.filters = z.object(filterShape).strict().optional().describe("Filtros exactos. Fechas NO ac\xE1: us\xE1 dateField/from/to.");
139
+ shape.filters = z.object(filterShape).strict().optional().describe("Exact filters. Dates NOT here: use dateField/from/to.");
140
140
  }
141
141
  const projectable = entityConfig.fields.map((f) => f.name);
142
142
  if (projectable.length) {
143
- shape.fields = z.array(z.enum(projectable)).min(1).optional().describe("Devolver solo estos campos (achica la respuesta)");
143
+ shape.fields = z.array(z.enum(projectable)).min(1).optional().describe("Return only these fields (shrinks the response)");
144
144
  }
145
145
  return shape;
146
146
  }
@@ -151,7 +151,7 @@ function buildListStrict(listShape) {
151
151
  ctx.addIssue({
152
152
  code: "custom",
153
153
  path: ["dateField"],
154
- message: "from/to requieren dateField \u2014 sin \xE9l la API los ignora en silencio"
154
+ message: "from/to require dateField \u2014 without it the API silently ignores them"
155
155
  });
156
156
  }
157
157
  });
@@ -184,20 +184,20 @@ function describeField(entityConfig, field, name, context, compact = false) {
184
184
  }
185
185
  case "relation":
186
186
  if ((_f = field.relation) == null ? void 0 : _f.entity) {
187
- parts.push(`uuid de ${field.relation.entity} (us\xE1 su tool de list)`);
187
+ parts.push(`uuid of ${field.relation.entity} (use its list tool)`);
188
188
  }
189
189
  break;
190
190
  case "user":
191
- parts.push("uuid de un miembro del team");
191
+ parts.push("uuid of a team member");
192
192
  break;
193
193
  case "date":
194
194
  parts.push("YYYY-MM-DD");
195
195
  break;
196
196
  case "datetime":
197
- parts.push("ISO 8601 con offset, ej. 2026-08-05T10:00:00-03:00");
197
+ parts.push("ISO 8601 with offset, e.g. 2026-08-05T10:00:00-03:00");
198
198
  break;
199
199
  case "boolean":
200
- parts.push("true/false (booleano, no string)");
200
+ parts.push("true/false (boolean, not string)");
201
201
  break;
202
202
  default:
203
203
  break;
@@ -28,7 +28,7 @@ function generateEntityTools(entityConfig, operations, override, deps) {
28
28
  const parsed = strictSchema.safeParse(rawArgs ?? {});
29
29
  if (!parsed.success) {
30
30
  return errorResult(
31
- `Argumentos inv\xE1lidos para ${name}: ${formatZodIssues(parsed.error)}. Revis\xE1 el schema de la tool.`
31
+ `Invalid arguments for ${name}: ${formatZodIssues(parsed.error)}. Check the tool's schema.`
32
32
  );
33
33
  }
34
34
  try {
@@ -37,7 +37,7 @@ function generateEntityTools(entityConfig, operations, override, deps) {
37
37
  if (error instanceof McpToolError) return errorResult(error.message);
38
38
  console.error(`[mcp] unexpected error in ${name}:`, error);
39
39
  return errorResult(
40
- `Error inesperado ejecutando ${name}: ${error instanceof Error ? error.message : String(error)}`
40
+ `Unexpected error executing ${name}: ${error instanceof Error ? error.message : String(error)}`
41
41
  );
42
42
  }
43
43
  }
@@ -52,7 +52,7 @@ function generateEntityTools(entityConfig, operations, override, deps) {
52
52
  "list",
53
53
  `${deps.toolPrefix}_list_${plural}`,
54
54
  `List ${entityConfig.names.plural}`,
55
- `Lista ${entityConfig.names.plural} con paginaci\xF3n, orden y filtros. ${entityDescription}${presetExamples(deps.presets, "GET")}`,
55
+ `Lists ${entityConfig.names.plural} with pagination, sorting and filters. ${entityDescription}${presetExamples(deps.presets, "GET")}`,
56
56
  schemas.listShape,
57
57
  schemas.listStrict,
58
58
  { readOnlyHint: true },
@@ -69,7 +69,7 @@ function generateEntityTools(entityConfig, operations, override, deps) {
69
69
  content: [
70
70
  {
71
71
  type: "text",
72
- text: `${String(total)} ${entityConfig.names.plural} (p\xE1gina ${String(page)}/${String(totalPages)})`
72
+ text: `${String(total)} ${entityConfig.names.plural} (page ${String(page)}/${String(totalPages)})`
73
73
  }
74
74
  ],
75
75
  structuredContent: { data, info }
@@ -84,7 +84,7 @@ function generateEntityTools(entityConfig, operations, override, deps) {
84
84
  "get",
85
85
  `${deps.toolPrefix}_get_${singular}`,
86
86
  `Get ${entityConfig.names.singular}`,
87
- `Obtiene un registro de ${entityConfig.names.singular} por ID. ${entityDescription}`,
87
+ `Gets a ${entityConfig.names.singular} record by ID. ${entityDescription}`,
88
88
  schemas.getShape,
89
89
  schemas.getStrict,
90
90
  { readOnlyHint: true },
@@ -96,7 +96,7 @@ function generateEntityTools(entityConfig, operations, override, deps) {
96
96
  if (!result.body.success) return apiError(result, "get");
97
97
  const data = normalizeOutput(result.body.data);
98
98
  return {
99
- content: [{ type: "text", text: `${entityConfig.names.singular} encontrado.` }],
99
+ content: [{ type: "text", text: `${entityConfig.names.singular} found.` }],
100
100
  structuredContent: { data }
101
101
  };
102
102
  }
@@ -109,7 +109,7 @@ function generateEntityTools(entityConfig, operations, override, deps) {
109
109
  "create",
110
110
  `${deps.toolPrefix}_create_${singular}`,
111
111
  `Create ${entityConfig.names.singular}`,
112
- `Crea un registro de ${entityConfig.names.singular}. ${entityDescription}${presetExamples(deps.presets, "POST")}`,
112
+ `Creates a ${entityConfig.names.singular} record. ${entityDescription}${presetExamples(deps.presets, "POST")}`,
113
113
  schemas.createShape,
114
114
  schemas.createStrict,
115
115
  {},
@@ -121,7 +121,7 @@ function generateEntityTools(entityConfig, operations, override, deps) {
121
121
  const id = extractId(data);
122
122
  return {
123
123
  content: [
124
- { type: "text", text: `${entityConfig.names.singular} creado${id ? ` (id: ${id})` : ""}.` }
124
+ { type: "text", text: `${entityConfig.names.singular} created${id ? ` (id: ${id})` : ""}.` }
125
125
  ],
126
126
  structuredContent: { data }
127
127
  };
@@ -131,7 +131,7 @@ function generateEntityTools(entityConfig, operations, override, deps) {
131
131
  }
132
132
  if (operations.includes("update")) {
133
133
  const updateShape = {
134
- id: z.string().min(1).describe(`ID del registro de ${entityConfig.names.singular} a modificar (uuid)`),
134
+ id: z.string().min(1).describe(`ID of the ${entityConfig.names.singular} record to modify (uuid)`),
135
135
  ...schemas.updateShape
136
136
  };
137
137
  tools.push(
@@ -139,14 +139,14 @@ function generateEntityTools(entityConfig, operations, override, deps) {
139
139
  "update",
140
140
  `${deps.toolPrefix}_update_${singular}`,
141
141
  `Update ${entityConfig.names.singular}`,
142
- `Modifica campos de un registro de ${entityConfig.names.singular} (PATCH parcial: solo envi\xE1 los campos a cambiar). ${entityDescription}`,
142
+ `Modifies fields of a ${entityConfig.names.singular} record (partial PATCH: only send the fields to change). ${entityDescription}`,
143
143
  updateShape,
144
144
  z.object(updateShape).strict(),
145
145
  { idempotentHint: true },
146
146
  async (args, ctx) => {
147
147
  const { id, ...fields } = args;
148
148
  if (!Object.keys(fields).length) {
149
- return errorResult("No enviaste ning\xFAn campo a modificar.");
149
+ return errorResult("No fields to modify were sent.");
150
150
  }
151
151
  const input = (override == null ? void 0 : override.transformInput) ? await override.transformInput("update", fields, ctx) : fields;
152
152
  const result = await deps.executor(
@@ -156,7 +156,7 @@ function generateEntityTools(entityConfig, operations, override, deps) {
156
156
  if (!result.body.success) return apiError(result, "update");
157
157
  const data = normalizeOutput(result.body.data);
158
158
  return {
159
- content: [{ type: "text", text: `${entityConfig.names.singular} actualizado.` }],
159
+ content: [{ type: "text", text: `${entityConfig.names.singular} updated.` }],
160
160
  structuredContent: { data }
161
161
  };
162
162
  }
@@ -165,22 +165,22 @@ function generateEntityTools(entityConfig, operations, override, deps) {
165
165
  }
166
166
  if (operations.includes("delete")) {
167
167
  const deleteShape = {
168
- id: z.string().min(1).describe(`ID del registro de ${entityConfig.names.singular} a eliminar (uuid)`),
169
- confirm: z.boolean().describe("true SOLO tras confirmaci\xF3n expl\xEDcita del usuario")
168
+ id: z.string().min(1).describe(`ID of the ${entityConfig.names.singular} record to delete (uuid)`),
169
+ confirm: z.boolean().describe("true ONLY after explicit user confirmation")
170
170
  };
171
171
  tools.push(
172
172
  make(
173
173
  "delete",
174
174
  `${deps.toolPrefix}_delete_${singular}`,
175
175
  `Delete ${entityConfig.names.singular}`,
176
- `Elimina un ${entityConfig.names.singular}. DESTRUCTIVO: mostrale al usuario qu\xE9 vas a borrar y pedile confirmaci\xF3n antes.${deleteWarning(override)}`,
176
+ `Deletes a ${entityConfig.names.singular}. DESTRUCTIVE: show the user what you're about to delete and ask for confirmation first.${deleteWarning(override)}`,
177
177
  deleteShape,
178
178
  z.object(deleteShape).strict(),
179
179
  { destructiveHint: true },
180
180
  async (args, ctx) => {
181
181
  if (args.confirm !== true) {
182
182
  return errorResult(
183
- "Eliminaci\xF3n no confirmada: pedile al usuario confirmaci\xF3n expl\xEDcita y reintent\xE1 con confirm: true."
183
+ "Deletion not confirmed: ask the user for explicit confirmation and retry with confirm: true."
184
184
  );
185
185
  }
186
186
  const result = await deps.executor(
@@ -189,7 +189,7 @@ function generateEntityTools(entityConfig, operations, override, deps) {
189
189
  );
190
190
  if (!result.body.success) return apiError(result, "delete");
191
191
  return {
192
- content: [{ type: "text", text: `${entityConfig.names.singular} eliminado (id: ${String(args.id)}).` }]
192
+ content: [{ type: "text", text: `${entityConfig.names.singular} deleted (id: ${String(args.id)}).` }]
193
193
  };
194
194
  }
195
195
  )
@@ -212,7 +212,7 @@ function presetExamples(presets, method) {
212
212
  if (!example) return "";
213
213
  const body = method === "POST" ? example.payload : example.params;
214
214
  const label = example.description || example.title || example.id;
215
- return ` Ejemplo (${label}): ${JSON.stringify(body)}`;
215
+ return ` Example (${label}): ${JSON.stringify(body)}`;
216
216
  }
217
217
  function deleteWarning(override) {
218
218
  var _a, _b;
@@ -24,6 +24,13 @@ export interface HighlightedTextProps {
24
24
  searchQuery: string;
25
25
  className?: string;
26
26
  }
27
+ /**
28
+ * Escapes HTML so that text carrying markup is shown rather than rendered.
29
+ *
30
+ * Exported because a caller that skips highlighting still hands its string to
31
+ * dangerouslySetInnerHTML, and needs the same escaping.
32
+ */
33
+ export declare function escapeHtml(text: string | undefined | null): string;
27
34
  /**
28
35
  * Escapes HTML in text before highlighting
29
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"search-highlighting.d.ts","sourceRoot":"","sources":["../../src/lib/search-highlighting.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA8ChF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBlF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAY,GACtB,MAAM,CA6BR;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAUpF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAoBvE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,EAAE,MAAM,GAClB,MAAM,CAqCR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,EAAE,MAAM,EACnB,aAAa,GAAE,MAAY,GAC1B;IACD,gBAAgB,EAAE,MAAM,CAAA;IACxB,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1C,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAC5B,CAoBA"}
1
+ {"version":3,"file":"search-highlighting.d.ts","sourceRoot":"","sources":["../../src/lib/search-highlighting.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA8ChF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBlF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAY,GACtB,MAAM,CA6BR;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CASlE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAoBvE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,EAAE,MAAM,GAClB,MAAM,CAqCR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,EAAE,MAAM,EACnB,aAAa,GAAE,MAAY,GAC1B;IACD,gBAAgB,EAAE,MAAM,CAAA;IACxB,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1C,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAC5B,CAoBA"}
@@ -61,9 +61,12 @@ function getSearchSnippet(text, searchQuery, maxLength = 150) {
61
61
  }
62
62
  return snippet;
63
63
  }
64
+ function escapeHtml(text) {
65
+ if (!text) return "";
66
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
67
+ }
64
68
  function highlightSearchMatchesSafe(text, searchQuery) {
65
- const escapedText = text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
66
- return highlightSearchMatches(escapedText, searchQuery);
69
+ return highlightSearchMatches(escapeHtml(text), searchQuery);
67
70
  }
68
71
  function getMatchCount(text, searchQuery) {
69
72
  if (!text || !searchQuery.trim()) {
@@ -130,6 +133,7 @@ function formatSearchResult(title, description, searchQuery, maxDescLength = 100
130
133
  }
131
134
  export {
132
135
  calculateRelevanceScore,
136
+ escapeHtml,
133
137
  formatSearchResult,
134
138
  getMatchCount,
135
139
  getSearchSnippet,
@@ -67,6 +67,7 @@ export declare const CORE_SELECTORS: {
67
67
  readonly otpEmailError: "login-otp-email-error";
68
68
  readonly otpSend: "login-otp-send";
69
69
  readonly otpSentNotice: "login-otp-sent-notice";
70
+ readonly otpCountdown: "login-otp-countdown";
70
71
  readonly otpCodeInput: "login-otp-code-input";
71
72
  readonly otpCodeError: "login-otp-code-error";
72
73
  readonly otpSubmit: "login-otp-submit";
@@ -304,6 +305,7 @@ export declare const CORE_SELECTORS: {
304
305
  readonly form: {
305
306
  readonly container: "{slug}-form";
306
307
  readonly field: "{slug}-field-{name}";
308
+ readonly fieldOption: "{slug}-field-{name}-option-{value}";
307
309
  readonly submitButton: "{slug}-form-submit";
308
310
  };
309
311
  readonly childEntity: {
@@ -1 +1 @@
1
- {"version":3,"file":"core-selectors.d.ts","sourceRoot":"","sources":["../../../src/lib/selectors/core-selectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAiBH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAejB,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,cAAc,CAAA;AAGrD,cAAc,WAAW,CAAA"}
1
+ {"version":3,"file":"core-selectors.d.ts","sourceRoot":"","sources":["../../../src/lib/selectors/core-selectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAiBH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAejB,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,cAAc,CAAA;AAGrD,cAAc,WAAW,CAAA"}
@@ -35,6 +35,7 @@ export declare const AUTH_SELECTORS: {
35
35
  readonly otpEmailError: "login-otp-email-error";
36
36
  readonly otpSend: "login-otp-send";
37
37
  readonly otpSentNotice: "login-otp-sent-notice";
38
+ readonly otpCountdown: "login-otp-countdown";
38
39
  readonly otpCodeInput: "login-otp-code-input";
39
40
  readonly otpCodeError: "login-otp-code-error";
40
41
  readonly otpSubmit: "login-otp-submit";
@@ -1 +1 @@
1
- {"version":3,"file":"auth.selectors.d.ts","sourceRoot":"","sources":["../../../../src/lib/selectors/domains/auth.selectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFjB,CAAA;AAEV,MAAM,MAAM,iBAAiB,GAAG,OAAO,cAAc,CAAA"}
1
+ {"version":3,"file":"auth.selectors.d.ts","sourceRoot":"","sources":["../../../../src/lib/selectors/domains/auth.selectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuFjB,CAAA;AAEV,MAAM,MAAM,iBAAiB,GAAG,OAAO,cAAc,CAAA"}
@@ -31,6 +31,7 @@ const AUTH_SELECTORS = {
31
31
  otpEmailError: "login-otp-email-error",
32
32
  otpSend: "login-otp-send",
33
33
  otpSentNotice: "login-otp-sent-notice",
34
+ otpCountdown: "login-otp-countdown",
34
35
  otpCodeInput: "login-otp-code-input",
35
36
  otpCodeError: "login-otp-code-error",
36
37
  otpSubmit: "login-otp-submit",
@@ -257,6 +257,8 @@ export declare const ENTITIES_SELECTORS: {
257
257
  readonly form: {
258
258
  readonly container: "{slug}-form";
259
259
  readonly field: "{slug}-field-{name}";
260
+ /** One choice of a select / radio field, once its list is open. */
261
+ readonly fieldOption: "{slug}-field-{name}-option-{value}";
260
262
  readonly submitButton: "{slug}-form-submit";
261
263
  };
262
264
  readonly childEntity: {
@@ -1 +1 @@
1
- {"version":3,"file":"entities.selectors.d.ts","sourceRoot":"","sources":["../../../../src/lib/selectors/domains/entities.selectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoKG;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8JrB,CAAA;AAEV,MAAM,MAAM,qBAAqB,GAAG,OAAO,kBAAkB,CAAA"}
1
+ {"version":3,"file":"entities.selectors.d.ts","sourceRoot":"","sources":["../../../../src/lib/selectors/domains/entities.selectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoKG;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAoJ3B,mEAAmE;;;;;;;;CAY7D,CAAA;AAEV,MAAM,MAAM,qBAAqB,GAAG,OAAO,kBAAkB,CAAA"}
@@ -133,6 +133,8 @@ const ENTITIES_SELECTORS = {
133
133
  form: {
134
134
  container: "{slug}-form",
135
135
  field: "{slug}-field-{name}",
136
+ /** One choice of a select / radio field, once its list is open. */
137
+ fieldOption: "{slug}-field-{name}-option-{value}",
136
138
  submitButton: "{slug}-form-submit"
137
139
  },
138
140
  // =========================================================================
@@ -66,6 +66,7 @@ export declare const SELECTORS: {
66
66
  readonly otpEmailError: "login-otp-email-error";
67
67
  readonly otpSend: "login-otp-send";
68
68
  readonly otpSentNotice: "login-otp-sent-notice";
69
+ readonly otpCountdown: "login-otp-countdown";
69
70
  readonly otpCodeInput: "login-otp-code-input";
70
71
  readonly otpCodeError: "login-otp-code-error";
71
72
  readonly otpSubmit: "login-otp-submit";
@@ -303,6 +304,7 @@ export declare const SELECTORS: {
303
304
  readonly form: {
304
305
  readonly container: "{slug}-form";
305
306
  readonly field: "{slug}-field-{name}";
307
+ readonly fieldOption: "{slug}-field-{name}-option-{value}";
306
308
  readonly submitButton: "{slug}-form-submit";
307
309
  };
308
310
  readonly childEntity: {
@@ -1662,6 +1664,7 @@ declare const _default: {
1662
1664
  readonly otpEmailError: "login-otp-email-error";
1663
1665
  readonly otpSend: "login-otp-send";
1664
1666
  readonly otpSentNotice: "login-otp-sent-notice";
1667
+ readonly otpCountdown: "login-otp-countdown";
1665
1668
  readonly otpCodeInput: "login-otp-code-input";
1666
1669
  readonly otpCodeError: "login-otp-code-error";
1667
1670
  readonly otpSubmit: "login-otp-submit";
@@ -1899,6 +1902,7 @@ declare const _default: {
1899
1902
  readonly form: {
1900
1903
  readonly container: "{slug}-form";
1901
1904
  readonly field: "{slug}-field-{name}";
1905
+ readonly fieldOption: "{slug}-field-{name}-option-{value}";
1902
1906
  readonly submitButton: "{slug}-form-submit";
1903
1907
  };
1904
1908
  readonly childEntity: {
@@ -1 +1 @@
1
- {"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../../src/lib/selectors/selectors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../../src/lib/selectors/selectors.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { BLOCK_REGISTRY } from "@nextsparkjs/registries/block-registry";
1
+ import { BLOCK_REGISTRY } from "@nextsparkjs/registries/block-registry.client";
2
2
  class BlockService {
3
3
  /**
4
4
  * Get all registered blocks
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Active Team Cookie
3
+ *
4
+ * `activeTeamId` tells server code which team a signed-in request acts in: the
5
+ * dashboard layouts (through the proxy), server actions and resolveTeamContext.
6
+ * POST /api/v1/teams/switch writes it, host-only and for a year, as
7
+ * `<session id>:<team id>`. Readers take the team only for the session that
8
+ * wrote it, so a cookie left on the same browser by an earlier session, another
9
+ * user's or one since rotated, names no team instead of the wrong one;
10
+ * TeamProvider writes the current session's team as soon as it mounts. Being
11
+ * host-only, each subdomain of a multi-tenant app keeps its own team.
12
+ */
13
+ export declare const ACTIVE_TEAM_COOKIE = "activeTeamId";
14
+ /** How long the browser keeps the cookie, in seconds. */
15
+ export declare const ACTIVE_TEAM_COOKIE_MAX_AGE: number;
16
+ /** The cookie value that makes `teamId` the active team of session `sessionId`. */
17
+ export declare function activeTeamCookieValue(sessionId: string, teamId: string): string;
18
+ /**
19
+ * The team a cookie value names for `sessionId`, or null when the value belongs
20
+ * to another session, carries no session (it was written before values were
21
+ * bound to one) or there is no session to compare it with.
22
+ */
23
+ export declare function activeTeamIdForSession(value: string | null | undefined, sessionId: string | null | undefined): string | null;
24
+ //# sourceMappingURL=active-team-cookie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active-team-cookie.d.ts","sourceRoot":"","sources":["../../../src/lib/teams/active-team-cookie.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,kBAAkB,iBAAiB,CAAA;AAEhD,yDAAyD;AACzD,eAAO,MAAM,0BAA0B,QAAqB,CAAA;AAE5D,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACnC,MAAM,GAAG,IAAI,CAKf"}
@@ -0,0 +1,17 @@
1
+ const ACTIVE_TEAM_COOKIE = "activeTeamId";
2
+ const ACTIVE_TEAM_COOKIE_MAX_AGE = 60 * 60 * 24 * 365;
3
+ function activeTeamCookieValue(sessionId, teamId) {
4
+ return `${sessionId}:${teamId}`;
5
+ }
6
+ function activeTeamIdForSession(value, sessionId) {
7
+ if (!value || !sessionId) return null;
8
+ const separator = value.indexOf(":");
9
+ if (separator === -1 || value.slice(0, separator) !== sessionId) return null;
10
+ return value.slice(separator + 1) || null;
11
+ }
12
+ export {
13
+ ACTIVE_TEAM_COOKIE,
14
+ ACTIVE_TEAM_COOKIE_MAX_AGE,
15
+ activeTeamCookieValue,
16
+ activeTeamIdForSession
17
+ };
@@ -0,0 +1,20 @@
1
+ /** The header the proxy forwards the session's active team in. */
2
+ export declare const ACTIVE_TEAM_HEADER = "x-active-team-id";
3
+ /**
4
+ * The team a user joined first, among teams that still exist: the default that
5
+ * resolveTeamContext and TeamProvider also fall back to.
6
+ */
7
+ export declare function getUserDefaultTeamId(userId: string): Promise<string | undefined>;
8
+ /**
9
+ * The team to check a dashboard request's permissions in, or null when the user
10
+ * belongs to none. The team the session chose counts only while the user is
11
+ * still a member and the team still exists: someone else may have removed them
12
+ * or deleted it since, and then the default team is used, as when there is no
13
+ * choice at all. One query answers both.
14
+ *
15
+ * A failed query rejects instead of answering null: the layouts skip the
16
+ * permission check for a user in no team, so an error read as "no team" would
17
+ * let the request through unchecked.
18
+ */
19
+ export declare function getDashboardTeamId(headers: Pick<Headers, 'get'>, userId: string): Promise<string | null>;
20
+ //# sourceMappingURL=dashboard-team.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-team.d.ts","sourceRoot":"","sources":["../../../src/lib/teams/dashboard-team.ts"],"names":[],"mappings":"AAYA,kEAAkE;AAClE,eAAO,MAAM,kBAAkB,qBAAqB,CAAA;AAEpD;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAetF;AAmBD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAExG"}
@@ -0,0 +1,38 @@
1
+ import { cache } from "react";
2
+ import { queryOne } from "../db.js";
3
+ const ACTIVE_TEAM_HEADER = "x-active-team-id";
4
+ async function getUserDefaultTeamId(userId) {
5
+ try {
6
+ const result = await queryOne(
7
+ `SELECT tm."teamId" FROM "team_members" tm
8
+ INNER JOIN "teams" t ON t.id = tm."teamId"
9
+ WHERE tm."userId" = $1 AND t."deletedAt" IS NULL
10
+ ORDER BY tm."joinedAt" ASC
11
+ LIMIT 1`,
12
+ [userId]
13
+ );
14
+ return result == null ? void 0 : result.teamId;
15
+ } catch (error) {
16
+ console.error("[teams] Failed to get default team:", error);
17
+ return void 0;
18
+ }
19
+ }
20
+ const findDashboardTeamId = cache(async (userId, chosenTeamId) => {
21
+ const result = await queryOne(
22
+ `SELECT tm."teamId" FROM "team_members" tm
23
+ INNER JOIN "teams" t ON t.id = tm."teamId"
24
+ WHERE tm."userId" = $1 AND t."deletedAt" IS NULL
25
+ ORDER BY (tm."teamId" = $2) IS TRUE DESC, tm."joinedAt" ASC
26
+ LIMIT 1`,
27
+ [userId, chosenTeamId]
28
+ );
29
+ return (result == null ? void 0 : result.teamId) ?? null;
30
+ });
31
+ function getDashboardTeamId(headers, userId) {
32
+ return findDashboardTeamId(userId, headers.get(ACTIVE_TEAM_HEADER));
33
+ }
34
+ export {
35
+ ACTIVE_TEAM_HEADER,
36
+ getDashboardTeamId,
37
+ getUserDefaultTeamId
38
+ };