@nextsparkjs/core 0.1.0-beta.187 → 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 (414) 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.d.ts +10 -1
  27. package/dist/components/dashboard/mobile/MobileTopBar.d.ts.map +1 -1
  28. package/dist/components/dashboard/mobile/MobileTopBar.js +4 -3
  29. package/dist/components/dashboard/navigation/DynamicNavigation.js +5 -5
  30. package/dist/components/devtools/BlockDetailViewer.js +1 -1
  31. package/dist/components/devtools/BlocksViewer.js +1 -1
  32. package/dist/components/entities/EntityChildManager.js +5 -5
  33. package/dist/components/entities/EntityDetailPage.d.ts.map +1 -1
  34. package/dist/components/entities/EntityDetailPage.js +16 -15
  35. package/dist/components/entities/EntityFieldRenderer.d.ts.map +1 -1
  36. package/dist/components/entities/EntityFieldRenderer.js +12 -7
  37. package/dist/components/entities/EntityPageHeader.js +5 -5
  38. package/dist/components/entities/ErrorBoundary.d.ts.map +1 -1
  39. package/dist/components/entities/ErrorBoundary.js +20 -21
  40. package/dist/components/entities/wrappers/EntityDetailWrapper.js +5 -5
  41. package/dist/components/entities/wrappers/EntityFormWrapper.js +2 -2
  42. package/dist/components/entities/wrappers/EntityListWrapper.js +3 -3
  43. package/dist/components/permissions/NoPermission.js +10 -10
  44. package/dist/components/public/pageBuilder/PageRenderer.d.ts.map +1 -1
  45. package/dist/components/public/pageBuilder/PageRenderer.js +2 -1
  46. package/dist/components/settings/SettingsPageSkeleton.js +4 -4
  47. package/dist/components/settings/layouts/SettingsSidebar.js +6 -6
  48. package/dist/components/shared/MultiSelectFilter.d.ts +3 -1
  49. package/dist/components/shared/MultiSelectFilter.d.ts.map +1 -1
  50. package/dist/components/shared/MultiSelectFilter.js +7 -3
  51. package/dist/components/shared/SearchInput.d.ts +2 -0
  52. package/dist/components/shared/SearchInput.d.ts.map +1 -1
  53. package/dist/components/shared/SearchInput.js +64 -6
  54. package/dist/components/ui/address-input.js +18 -18
  55. package/dist/components/ui/audio-upload.js +9 -9
  56. package/dist/components/ui/combobox.d.ts.map +1 -1
  57. package/dist/components/ui/combobox.js +4 -4
  58. package/dist/components/ui/country-select.d.ts.map +1 -1
  59. package/dist/components/ui/country-select.js +3 -3
  60. package/dist/components/ui/currency-select.d.ts.map +1 -1
  61. package/dist/components/ui/currency-select.js +3 -3
  62. package/dist/components/ui/dynamic-icon.d.ts.map +1 -1
  63. package/dist/components/ui/dynamic-icon.js +3 -2
  64. package/dist/components/ui/file-upload.js +7 -7
  65. package/dist/components/ui/image-upload.js +8 -8
  66. package/dist/components/ui/multi-select.d.ts +2 -1
  67. package/dist/components/ui/multi-select.d.ts.map +1 -1
  68. package/dist/components/ui/multi-select.js +4 -3
  69. package/dist/components/ui/phone-input.d.ts.map +1 -1
  70. package/dist/components/ui/phone-input.js +3 -3
  71. package/dist/components/ui/relation-display.js +1 -1
  72. package/dist/components/ui/simple-relation-select.d.ts +2 -1
  73. package/dist/components/ui/simple-relation-select.d.ts.map +1 -1
  74. package/dist/components/ui/simple-relation-select.js +7 -6
  75. package/dist/components/ui/tags-input.d.ts.map +1 -1
  76. package/dist/components/ui/tags-input.js +1 -1
  77. package/dist/components/ui/timezone-select.d.ts.map +1 -1
  78. package/dist/components/ui/timezone-select.js +3 -3
  79. package/dist/components/ui/user-display.js +4 -4
  80. package/dist/components/ui/user-select.d.ts.map +1 -1
  81. package/dist/components/ui/user-select.js +9 -9
  82. package/dist/components/ui/video-upload.js +9 -9
  83. package/dist/contexts/SubscriptionContext.d.ts.map +1 -1
  84. package/dist/contexts/SubscriptionContext.js +5 -1
  85. package/dist/contexts/TeamContext.d.ts.map +1 -1
  86. package/dist/contexts/TeamContext.js +83 -26
  87. package/dist/emails/otp-verification.d.ts.map +1 -1
  88. package/dist/emails/otp-verification.js +3 -2
  89. package/dist/hooks/useAccountPreferencesSync.d.ts +13 -0
  90. package/dist/hooks/useAccountPreferencesSync.d.ts.map +1 -0
  91. package/dist/hooks/useAccountPreferencesSync.js +95 -0
  92. package/dist/hooks/useAuth.d.ts +202 -15
  93. package/dist/hooks/useAuth.d.ts.map +1 -1
  94. package/dist/hooks/useAuth.js +49 -13
  95. package/dist/hooks/useEntityConfig.js +2 -2
  96. package/dist/hooks/useEntitySearch.js +10 -10
  97. package/dist/hooks/useNotifications.js +12 -12
  98. package/dist/hooks/usePrefetch.d.ts.map +1 -1
  99. package/dist/hooks/usePrefetch.js +6 -2
  100. package/dist/hooks/useSearch.js +15 -15
  101. package/dist/hooks/useSessionCookieRefresh.d.ts +18 -1
  102. package/dist/hooks/useSessionCookieRefresh.d.ts.map +1 -1
  103. package/dist/hooks/useSessionCookieRefresh.js +17 -4
  104. package/dist/hooks/useSessionHint.d.ts +12 -0
  105. package/dist/hooks/useSessionHint.d.ts.map +1 -0
  106. package/dist/hooks/useSessionHint.js +15 -0
  107. package/dist/hooks/useTranslationPreload.js +6 -6
  108. package/dist/i18n.d.ts +13 -0
  109. package/dist/i18n.d.ts.map +1 -1
  110. package/dist/i18n.js +2 -27
  111. package/dist/lib/actions/entity.actions.d.ts.map +1 -1
  112. package/dist/lib/actions/entity.actions.js +3 -2
  113. package/dist/lib/api/auth/dual-auth.d.ts +4 -1
  114. package/dist/lib/api/auth/dual-auth.d.ts.map +1 -1
  115. package/dist/lib/api/auth/dual-auth.js +5 -16
  116. package/dist/lib/api/entities.js +33 -33
  117. package/dist/lib/api/keys.d.ts +27 -27
  118. package/dist/lib/api/keys.js +27 -27
  119. package/dist/lib/auth/callback-url.d.ts +11 -0
  120. package/dist/lib/auth/callback-url.d.ts.map +1 -0
  121. package/dist/lib/auth/callback-url.js +14 -0
  122. package/dist/lib/auth/otp-config.d.ts +55 -0
  123. package/dist/lib/auth/otp-config.d.ts.map +1 -0
  124. package/dist/lib/auth/otp-config.js +48 -0
  125. package/dist/lib/auth/registration-helpers.d.ts.map +1 -1
  126. package/dist/lib/auth/registration-helpers.js +3 -1
  127. package/dist/lib/auth/session-hint.d.ts +31 -0
  128. package/dist/lib/auth/session-hint.d.ts.map +1 -0
  129. package/dist/lib/auth/session-hint.js +37 -0
  130. package/dist/lib/auth.d.ts.map +1 -1
  131. package/dist/lib/auth.js +6 -4
  132. package/dist/lib/blocks/loader.d.ts +3 -11
  133. package/dist/lib/blocks/loader.d.ts.map +1 -1
  134. package/dist/lib/blocks/loader.js +1 -9
  135. package/dist/lib/blocks/loader.server.d.ts +18 -0
  136. package/dist/lib/blocks/loader.server.d.ts.map +1 -0
  137. package/dist/lib/blocks/loader.server.js +11 -0
  138. package/dist/lib/blocks/sanitize-html.d.ts +31 -0
  139. package/dist/lib/blocks/sanitize-html.d.ts.map +1 -0
  140. package/dist/lib/blocks/sanitize-html.js +60 -0
  141. package/dist/lib/config/config-sync.d.ts +1 -0
  142. package/dist/lib/config/config-sync.d.ts.map +1 -1
  143. package/dist/lib/config/config-sync.js +4 -1
  144. package/dist/lib/config/types.d.ts +48 -0
  145. package/dist/lib/config/types.d.ts.map +1 -1
  146. package/dist/lib/email/types.d.ts +6 -0
  147. package/dist/lib/email/types.d.ts.map +1 -1
  148. package/dist/lib/entities/serialization.d.ts.map +1 -1
  149. package/dist/lib/entities/serialization.js +3 -6
  150. package/dist/lib/icons.d.ts +12 -0
  151. package/dist/lib/icons.d.ts.map +1 -0
  152. package/dist/lib/icons.js +30 -0
  153. package/dist/lib/locale.d.ts +25 -1
  154. package/dist/lib/locale.d.ts.map +1 -1
  155. package/dist/lib/locale.js +49 -35
  156. package/dist/lib/mcp/engine.js +1 -1
  157. package/dist/lib/mcp/errors.js +17 -17
  158. package/dist/lib/mcp/schema-builder.js +16 -16
  159. package/dist/lib/mcp/tool-generator.js +18 -18
  160. package/dist/lib/search-highlighting.d.ts +7 -0
  161. package/dist/lib/search-highlighting.d.ts.map +1 -1
  162. package/dist/lib/search-highlighting.js +6 -2
  163. package/dist/lib/selectors/core-selectors.d.ts +2 -0
  164. package/dist/lib/selectors/core-selectors.d.ts.map +1 -1
  165. package/dist/lib/selectors/domains/auth.selectors.d.ts +1 -0
  166. package/dist/lib/selectors/domains/auth.selectors.d.ts.map +1 -1
  167. package/dist/lib/selectors/domains/auth.selectors.js +1 -0
  168. package/dist/lib/selectors/domains/entities.selectors.d.ts +2 -0
  169. package/dist/lib/selectors/domains/entities.selectors.d.ts.map +1 -1
  170. package/dist/lib/selectors/domains/entities.selectors.js +2 -0
  171. package/dist/lib/selectors/selectors.d.ts +4 -0
  172. package/dist/lib/selectors/selectors.d.ts.map +1 -1
  173. package/dist/lib/services/block.service.js +1 -1
  174. package/dist/lib/teams/active-team-cookie.d.ts +24 -0
  175. package/dist/lib/teams/active-team-cookie.d.ts.map +1 -0
  176. package/dist/lib/teams/active-team-cookie.js +17 -0
  177. package/dist/lib/teams/dashboard-team.d.ts +20 -0
  178. package/dist/lib/teams/dashboard-team.d.ts.map +1 -0
  179. package/dist/lib/teams/dashboard-team.js +38 -0
  180. package/dist/lib/teams/schema.d.ts.map +1 -1
  181. package/dist/lib/teams/schema.js +1 -1
  182. package/dist/lib/template-resolver.d.ts.map +1 -1
  183. package/dist/lib/template-resolver.js +0 -1
  184. package/dist/lib/theme/get-default-theme-mode.d.ts +7 -4
  185. package/dist/lib/theme/get-default-theme-mode.d.ts.map +1 -1
  186. package/dist/lib/theme/get-default-theme-mode.js +2 -44
  187. package/dist/messages/de/auth.json +4 -2
  188. package/dist/messages/de/common.json +83 -3
  189. package/dist/messages/de/email.json +1 -1
  190. package/dist/messages/de/index.d.ts +87 -0
  191. package/dist/messages/de/index.d.ts.map +1 -1
  192. package/dist/messages/de/settings.json +5 -0
  193. package/dist/messages/en/auth.json +4 -2
  194. package/dist/messages/en/common.json +83 -3
  195. package/dist/messages/en/email.json +1 -1
  196. package/dist/messages/en/index.d.ts +86 -0
  197. package/dist/messages/en/index.d.ts.map +1 -1
  198. package/dist/messages/en/settings.json +4 -0
  199. package/dist/messages/es/auth.json +4 -2
  200. package/dist/messages/es/common.json +83 -3
  201. package/dist/messages/es/email.json +1 -1
  202. package/dist/messages/es/index.d.ts +86 -0
  203. package/dist/messages/es/index.d.ts.map +1 -1
  204. package/dist/messages/es/settings.json +4 -0
  205. package/dist/messages/fr/auth.json +4 -2
  206. package/dist/messages/fr/common.json +83 -3
  207. package/dist/messages/fr/email.json +1 -1
  208. package/dist/messages/fr/index.d.ts +87 -0
  209. package/dist/messages/fr/index.d.ts.map +1 -1
  210. package/dist/messages/fr/settings.json +5 -0
  211. package/dist/messages/it/auth.json +4 -2
  212. package/dist/messages/it/common.json +83 -3
  213. package/dist/messages/it/email.json +1 -1
  214. package/dist/messages/it/index.d.ts +87 -0
  215. package/dist/messages/it/index.d.ts.map +1 -1
  216. package/dist/messages/it/settings.json +5 -0
  217. package/dist/messages/pt/auth.json +4 -2
  218. package/dist/messages/pt/common.json +83 -3
  219. package/dist/messages/pt/email.json +1 -1
  220. package/dist/messages/pt/index.d.ts +87 -0
  221. package/dist/messages/pt/index.d.ts.map +1 -1
  222. package/dist/messages/pt/settings.json +5 -0
  223. package/dist/nextspark-registries.d.ts +54 -0
  224. package/dist/providers/DashboardProviders.d.ts +13 -10
  225. package/dist/providers/DashboardProviders.d.ts.map +1 -1
  226. package/dist/providers/DashboardProviders.js +7 -1
  227. package/dist/templates/app/(auth)/forgot-password/page.tsx +2 -2
  228. package/dist/templates/app/(auth)/reset-password/page.tsx +6 -6
  229. package/dist/templates/app/403/page.tsx +6 -6
  230. package/dist/templates/app/api/v1/teams/switch/route.ts +24 -5
  231. package/dist/templates/app/dashboard/(main)/[entity]/layout.tsx +9 -7
  232. package/dist/templates/app/dashboard/(main)/layout.tsx +4 -3
  233. package/dist/templates/app/dashboard/settings/api-keys/page.tsx +36 -34
  234. package/dist/templates/app/dashboard/settings/profile/page.tsx +7 -6
  235. package/dist/templates/app/dashboard/settings/security/page.tsx +5 -4
  236. package/dist/templates/app/layout.ppr.tsx +8 -8
  237. package/dist/templates/app/layout.tsx +12 -17
  238. package/dist/templates/blocks/cta-section/component.tsx +5 -2
  239. package/dist/templates/blocks/cta-section/config.ts +3 -2
  240. package/dist/templates/blocks/cta-section/fields.ts +2 -2
  241. package/dist/templates/blocks/cta-section/schema.ts +2 -2
  242. package/dist/templates/blocks/features-grid/component.tsx +10 -2
  243. package/dist/templates/blocks/features-grid/config.ts +3 -2
  244. package/dist/templates/blocks/features-grid/fields.ts +2 -2
  245. package/dist/templates/blocks/features-grid/schema.ts +2 -2
  246. package/dist/templates/blocks/hero/component.tsx +6 -3
  247. package/dist/templates/blocks/hero/config.ts +3 -2
  248. package/dist/templates/blocks/hero/fields.ts +2 -2
  249. package/dist/templates/blocks/hero/schema.ts +2 -2
  250. package/dist/templates/blocks/testimonials/component.tsx +6 -3
  251. package/dist/templates/blocks/testimonials/config.ts +3 -2
  252. package/dist/templates/blocks/testimonials/fields.ts +2 -2
  253. package/dist/templates/blocks/testimonials/schema.ts +2 -2
  254. package/dist/templates/blocks/text-content/component.tsx +7 -3
  255. package/dist/templates/blocks/text-content/config.ts +3 -2
  256. package/dist/templates/blocks/text-content/fields.ts +2 -2
  257. package/dist/templates/blocks/text-content/schema.ts +2 -2
  258. package/dist/templates/contents/themes/starter/blocks/cta-section/component.tsx +102 -0
  259. package/dist/templates/contents/themes/starter/blocks/cta-section/config.ts +11 -0
  260. package/dist/templates/contents/themes/starter/blocks/cta-section/fields.ts +89 -0
  261. package/dist/templates/contents/themes/starter/blocks/cta-section/index.ts +6 -0
  262. package/dist/templates/contents/themes/starter/blocks/cta-section/schema.ts +32 -0
  263. package/dist/templates/contents/themes/starter/blocks/cta-section/thumbnail.png +0 -0
  264. package/dist/templates/contents/themes/starter/blocks/features-grid/component.tsx +119 -0
  265. package/dist/templates/contents/themes/starter/blocks/features-grid/config.ts +11 -0
  266. package/dist/templates/contents/themes/starter/blocks/features-grid/fields.ts +97 -0
  267. package/dist/templates/contents/themes/starter/blocks/features-grid/index.ts +6 -0
  268. package/dist/templates/contents/themes/starter/blocks/features-grid/schema.ts +40 -0
  269. package/dist/templates/contents/themes/starter/blocks/features-grid/thumbnail.png +0 -0
  270. package/dist/templates/contents/themes/starter/blocks/hero/component.tsx +105 -0
  271. package/dist/templates/contents/themes/starter/blocks/hero/config.ts +11 -0
  272. package/dist/templates/contents/themes/starter/blocks/hero/fields.ts +60 -0
  273. package/dist/templates/contents/themes/starter/blocks/hero/index.ts +6 -0
  274. package/dist/templates/contents/themes/starter/blocks/hero/schema.ts +33 -0
  275. package/dist/templates/contents/themes/starter/blocks/hero/thumbnail.png +0 -0
  276. package/dist/templates/contents/themes/starter/blocks/testimonials/component.tsx +116 -0
  277. package/dist/templates/contents/themes/starter/blocks/testimonials/config.ts +11 -0
  278. package/dist/templates/contents/themes/starter/blocks/testimonials/fields.ts +105 -0
  279. package/dist/templates/contents/themes/starter/blocks/testimonials/index.ts +6 -0
  280. package/dist/templates/contents/themes/starter/blocks/testimonials/schema.ts +41 -0
  281. package/dist/templates/contents/themes/starter/blocks/testimonials/thumbnail.png +0 -0
  282. package/dist/templates/contents/themes/starter/blocks/text-content/component.tsx +100 -0
  283. package/dist/templates/contents/themes/starter/blocks/text-content/config.ts +11 -0
  284. package/dist/templates/contents/themes/starter/blocks/text-content/fields.ts +88 -0
  285. package/dist/templates/contents/themes/starter/blocks/text-content/index.ts +6 -0
  286. package/dist/templates/contents/themes/starter/blocks/text-content/schema.ts +30 -0
  287. package/dist/templates/contents/themes/starter/blocks/text-content/thumbnail.png +0 -0
  288. package/dist/templates/contents/themes/starter/config/app.config.ts +8 -0
  289. package/dist/templates/contents/themes/starter/entities/tasks/tasks.config.ts +7 -0
  290. package/dist/templates/contents/themes/starter/tests/cypress/e2e/_utils/devtools/access.cy.ts +9 -1
  291. package/dist/templates/contents/themes/starter/tests/cypress/e2e/api/entities/tasks/TaskAPIController.js +2 -2
  292. package/dist/templates/contents/themes/starter/tests/cypress/e2e/uat/entities/tasks/tasks-crud.cy.ts +45 -38
  293. package/dist/templates/contents/themes/starter/tests/cypress/fixtures/entities.json +16 -0
  294. package/dist/templates/contents/themes/starter/tests/cypress/src/components/DevKeyringPOM.ts +3 -1
  295. package/dist/templates/contents/themes/starter/tests/cypress/src/core/BlockEditorBasePOM.ts +3 -3
  296. package/dist/templates/contents/themes/starter/tests/cypress/src/entities/PagesPOM.ts +137 -0
  297. package/dist/templates/contents/themes/starter/tests/cypress/src/entities/index.ts +2 -0
  298. package/dist/templates/contents/themes/starter/tests/cypress/src/index.ts +1 -0
  299. package/dist/templates/contents/themes/starter/tests/cypress/src/session-helpers.ts +42 -11
  300. package/dist/templates/contents/themes/starter/tests/cypress/support/commands.ts +29 -18
  301. package/dist/templates/features/blog/blocks/post-content/component.tsx +5 -1
  302. package/dist/templates/features/blog/blocks/post-content/schema.ts +1 -1
  303. package/dist/templates/features/pages/blocks/hero/component.tsx +3 -0
  304. package/dist/templates/features/pages/blocks/hero/schema.ts +1 -1
  305. package/dist/templates/proxy.ts +138 -53
  306. package/dist/types/blocks.d.ts.map +1 -1
  307. package/dist/types/blocks.js +1 -1
  308. package/dist/types/task.types.d.ts +1 -1
  309. package/dist/types/task.types.js +7 -7
  310. package/dist/utils/dev/TranslationDebugger.js +2 -2
  311. package/package.json +14 -5
  312. package/scripts/build/registry/__tests__/block-registry.test.mjs +73 -0
  313. package/scripts/build/registry/__tests__/icons-discovery.test.mjs +130 -0
  314. package/scripts/build/registry/__tests__/identifier.test.mjs +65 -0
  315. package/scripts/build/registry/__tests__/page-generator.test.mjs +430 -0
  316. package/scripts/build/registry/__tests__/scheduled-actions-registry.test.mjs +41 -0
  317. package/scripts/build/registry/__tests__/template-registry.test.mjs +89 -0
  318. package/scripts/build/registry/discovery/icons.mjs +275 -0
  319. package/scripts/build/registry/discovery/index.mjs +1 -0
  320. package/scripts/build/registry/generators/block-registry.mjs +203 -55
  321. package/scripts/build/registry/generators/feature-registry.mjs +9 -2
  322. package/scripts/build/registry/generators/icon-registry.mjs +56 -0
  323. package/scripts/build/registry/generators/identifier.mjs +28 -0
  324. package/scripts/build/registry/generators/index.mjs +1 -0
  325. package/scripts/build/registry/generators/plugin-registry.mjs +4 -3
  326. package/scripts/build/registry/generators/scheduled-actions-registry.mjs +4 -2
  327. package/scripts/build/registry/generators/template-registry.mjs +49 -41
  328. package/scripts/build/registry/generators/theme-registry.mjs +6 -7
  329. package/scripts/build/registry/post-build/page-generator.mjs +380 -59
  330. package/scripts/build/registry.mjs +9 -1
  331. package/templates/app/(auth)/forgot-password/page.tsx +2 -2
  332. package/templates/app/(auth)/reset-password/page.tsx +6 -6
  333. package/templates/app/403/page.tsx +6 -6
  334. package/templates/app/api/v1/teams/switch/route.ts +24 -5
  335. package/templates/app/dashboard/(main)/[entity]/layout.tsx +9 -7
  336. package/templates/app/dashboard/(main)/layout.tsx +4 -3
  337. package/templates/app/dashboard/settings/api-keys/page.tsx +36 -34
  338. package/templates/app/dashboard/settings/profile/page.tsx +7 -6
  339. package/templates/app/dashboard/settings/security/page.tsx +5 -4
  340. package/templates/app/layout.ppr.tsx +8 -8
  341. package/templates/app/layout.tsx +12 -17
  342. package/templates/blocks/cta-section/component.tsx +5 -2
  343. package/templates/blocks/cta-section/config.ts +3 -2
  344. package/templates/blocks/cta-section/fields.ts +2 -2
  345. package/templates/blocks/cta-section/schema.ts +2 -2
  346. package/templates/blocks/features-grid/component.tsx +10 -2
  347. package/templates/blocks/features-grid/config.ts +3 -2
  348. package/templates/blocks/features-grid/fields.ts +2 -2
  349. package/templates/blocks/features-grid/schema.ts +2 -2
  350. package/templates/blocks/hero/component.tsx +6 -3
  351. package/templates/blocks/hero/config.ts +3 -2
  352. package/templates/blocks/hero/fields.ts +2 -2
  353. package/templates/blocks/hero/schema.ts +2 -2
  354. package/templates/blocks/testimonials/component.tsx +6 -3
  355. package/templates/blocks/testimonials/config.ts +3 -2
  356. package/templates/blocks/testimonials/fields.ts +2 -2
  357. package/templates/blocks/testimonials/schema.ts +2 -2
  358. package/templates/blocks/text-content/component.tsx +7 -3
  359. package/templates/blocks/text-content/config.ts +3 -2
  360. package/templates/blocks/text-content/fields.ts +2 -2
  361. package/templates/blocks/text-content/schema.ts +2 -2
  362. package/templates/contents/themes/starter/blocks/cta-section/component.tsx +102 -0
  363. package/templates/contents/themes/starter/blocks/cta-section/config.ts +11 -0
  364. package/templates/contents/themes/starter/blocks/cta-section/fields.ts +89 -0
  365. package/templates/contents/themes/starter/blocks/cta-section/index.ts +6 -0
  366. package/templates/contents/themes/starter/blocks/cta-section/schema.ts +32 -0
  367. package/templates/contents/themes/starter/blocks/cta-section/thumbnail.png +0 -0
  368. package/templates/contents/themes/starter/blocks/features-grid/component.tsx +119 -0
  369. package/templates/contents/themes/starter/blocks/features-grid/config.ts +11 -0
  370. package/templates/contents/themes/starter/blocks/features-grid/fields.ts +97 -0
  371. package/templates/contents/themes/starter/blocks/features-grid/index.ts +6 -0
  372. package/templates/contents/themes/starter/blocks/features-grid/schema.ts +40 -0
  373. package/templates/contents/themes/starter/blocks/features-grid/thumbnail.png +0 -0
  374. package/templates/contents/themes/starter/blocks/hero/component.tsx +105 -0
  375. package/templates/contents/themes/starter/blocks/hero/config.ts +11 -0
  376. package/templates/contents/themes/starter/blocks/hero/fields.ts +60 -0
  377. package/templates/contents/themes/starter/blocks/hero/index.ts +6 -0
  378. package/templates/contents/themes/starter/blocks/hero/schema.ts +33 -0
  379. package/templates/contents/themes/starter/blocks/hero/thumbnail.png +0 -0
  380. package/templates/contents/themes/starter/blocks/testimonials/component.tsx +116 -0
  381. package/templates/contents/themes/starter/blocks/testimonials/config.ts +11 -0
  382. package/templates/contents/themes/starter/blocks/testimonials/fields.ts +105 -0
  383. package/templates/contents/themes/starter/blocks/testimonials/index.ts +6 -0
  384. package/templates/contents/themes/starter/blocks/testimonials/schema.ts +41 -0
  385. package/templates/contents/themes/starter/blocks/testimonials/thumbnail.png +0 -0
  386. package/templates/contents/themes/starter/blocks/text-content/component.tsx +100 -0
  387. package/templates/contents/themes/starter/blocks/text-content/config.ts +11 -0
  388. package/templates/contents/themes/starter/blocks/text-content/fields.ts +88 -0
  389. package/templates/contents/themes/starter/blocks/text-content/index.ts +6 -0
  390. package/templates/contents/themes/starter/blocks/text-content/schema.ts +30 -0
  391. package/templates/contents/themes/starter/blocks/text-content/thumbnail.png +0 -0
  392. package/templates/contents/themes/starter/config/app.config.ts +8 -0
  393. package/templates/contents/themes/starter/entities/tasks/tasks.config.ts +7 -0
  394. package/templates/contents/themes/starter/tests/cypress/e2e/_utils/devtools/access.cy.ts +9 -1
  395. package/templates/contents/themes/starter/tests/cypress/e2e/api/entities/tasks/TaskAPIController.js +2 -2
  396. package/templates/contents/themes/starter/tests/cypress/e2e/uat/entities/tasks/tasks-crud.cy.ts +45 -38
  397. package/templates/contents/themes/starter/tests/cypress/fixtures/entities.json +16 -0
  398. package/templates/contents/themes/starter/tests/cypress/src/components/DevKeyringPOM.ts +3 -1
  399. package/templates/contents/themes/starter/tests/cypress/src/core/BlockEditorBasePOM.ts +3 -3
  400. package/templates/contents/themes/starter/tests/cypress/src/entities/PagesPOM.ts +137 -0
  401. package/templates/contents/themes/starter/tests/cypress/src/entities/index.ts +2 -0
  402. package/templates/contents/themes/starter/tests/cypress/src/index.ts +1 -0
  403. package/templates/contents/themes/starter/tests/cypress/src/session-helpers.ts +42 -11
  404. package/templates/contents/themes/starter/tests/cypress/support/commands.ts +29 -18
  405. package/templates/features/blog/blocks/post-content/component.tsx +5 -1
  406. package/templates/features/blog/blocks/post-content/schema.ts +1 -1
  407. package/templates/features/pages/blocks/hero/component.tsx +3 -0
  408. package/templates/features/pages/blocks/hero/schema.ts +1 -1
  409. package/templates/proxy.ts +138 -53
  410. package/tests/jest/__mocks__/@nextsparkjs/registries/block-registry.client.ts +9 -0
  411. package/tests/jest/__mocks__/@nextsparkjs/registries/block-registry.lazy.ts +5 -0
  412. package/tests/jest/__mocks__/@nextsparkjs/registries/icon-registry.ts +42 -0
  413. package/tests/jest/__mocks__/next-intl-server.js +85 -5
  414. package/tests/jest/__mocks__/next-server.js +32 -0
@@ -10,20 +10,33 @@ function useSessionCookieRefresh(options = {}) {
10
10
  } = options;
11
11
  const lastRefreshAtRef = useRef(0);
12
12
  const inFlightRef = useRef(false);
13
+ const generationRef = useRef(0);
14
+ const onRefreshRef = useRef(options.onRefresh);
15
+ onRefreshRef.current = options.onRefresh;
13
16
  useEffect(() => {
14
- if (!enabled || typeof window === "undefined") return;
17
+ if (typeof window === "undefined") return;
18
+ if (!enabled) {
19
+ generationRef.current++;
20
+ inFlightRef.current = false;
21
+ lastRefreshAtRef.current = 0;
22
+ return;
23
+ }
15
24
  const refresh = async () => {
25
+ var _a;
16
26
  if (inFlightRef.current) return;
17
27
  const now = Date.now();
18
28
  if (now - lastRefreshAtRef.current < minIntervalMs) return;
29
+ const generation = generationRef.current;
30
+ const current = () => generation === generationRef.current;
19
31
  inFlightRef.current = true;
20
32
  lastRefreshAtRef.current = now;
21
33
  try {
22
- await refreshSessionCookie();
34
+ const result = await refreshSessionCookie();
35
+ if (current()) (_a = onRefreshRef.current) == null ? void 0 : _a.call(onRefreshRef, result, { isCurrent: current });
23
36
  } catch {
24
- lastRefreshAtRef.current = 0;
37
+ if (current()) lastRefreshAtRef.current = 0;
25
38
  } finally {
26
- inFlightRef.current = false;
39
+ if (current()) inFlightRef.current = false;
27
40
  }
28
41
  };
29
42
  const onVisibilityChange = () => {
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Whether this browser is signed in, as the session hint says (see
3
+ * lib/auth/session-hint), following it as it changes: a sign-in or sign-out on
4
+ * the page, or the tab coming back into view. `ready` stays false through the
5
+ * server render and hydration, which cannot read the cookie, so both render the
6
+ * same thing until the effect runs.
7
+ */
8
+ export declare function useSessionHint(): {
9
+ ready: boolean;
10
+ signedIn: boolean;
11
+ };
12
+ //# sourceMappingURL=useSessionHint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSessionHint.d.ts","sourceRoot":"","sources":["../../src/hooks/useSessionHint.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAStE"}
@@ -0,0 +1,15 @@
1
+ "use client";
2
+ import { useEffect, useState, useSyncExternalStore } from "react";
3
+ import { hasSessionHint, subscribeSessionHint } from "../lib/auth/session-hint.js";
4
+ const signedOutOnServer = () => false;
5
+ function useSessionHint() {
6
+ const [ready, setReady] = useState(false);
7
+ const signedIn = useSyncExternalStore(subscribeSessionHint, hasSessionHint, signedOutOnServer);
8
+ useEffect(() => {
9
+ setReady(true);
10
+ }, []);
11
+ return { ready, signedIn: ready && signedIn };
12
+ }
13
+ export {
14
+ useSessionHint
15
+ };
@@ -8,14 +8,14 @@ function useTranslationPreload(context = "auto") {
8
8
  const locale = useLocale();
9
9
  useEffect(() => {
10
10
  const preloadNamespaces = async (namespaces, contextName) => {
11
- console.log(`[TranslationPreload] \u{1F680} Iniciando precarga ${contextName} para ${locale}:`, namespaces);
11
+ console.log(`[TranslationPreload] \u{1F680} Starting ${contextName} preload for ${locale}:`, namespaces);
12
12
  const promises = namespaces.map(async (namespace) => {
13
13
  try {
14
14
  await import(`../messages/${locale}/${namespace}.json`);
15
- console.log(`[TranslationPreload] \u2713 Precargado: ${namespace}`);
15
+ console.log(`[TranslationPreload] \u2713 Preloaded: ${namespace}`);
16
16
  return { namespace, success: true };
17
17
  } catch (error) {
18
- console.warn(`[TranslationPreload] \u26A0\uFE0F Error precargando ${namespace}:`, error);
18
+ console.warn(`[TranslationPreload] \u26A0\uFE0F Error preloading ${namespace}:`, error);
19
19
  return { namespace, success: false, error };
20
20
  }
21
21
  });
@@ -23,7 +23,7 @@ function useTranslationPreload(context = "auto") {
23
23
  const successful = results.filter(
24
24
  (result) => result.status === "fulfilled" && result.value.success
25
25
  ).length;
26
- console.log(`[TranslationPreload] \u2705 Precarga ${contextName} completa: ${successful}/${namespaces.length} namespaces`);
26
+ console.log(`[TranslationPreload] \u2705 ${contextName} preload complete: ${successful}/${namespaces.length} namespaces`);
27
27
  };
28
28
  const schedulePreload = () => {
29
29
  let namespacesToLoad = [];
@@ -76,7 +76,7 @@ function useNavigationPreload() {
76
76
  } else {
77
77
  namespacesToLoad = PUBLIC_NAMESPACES;
78
78
  }
79
- console.log(`[NavigationPreload] Precargando para ${pathname}:`, namespacesToLoad);
79
+ console.log(`[NavigationPreload] Preloading for ${pathname}:`, namespacesToLoad);
80
80
  const promises = namespacesToLoad.map(
81
81
  (namespace) => import(`../messages/${locale}/${namespace}.json`).catch((error) => {
82
82
  console.warn(`[NavigationPreload] Error: ${namespace}`, error);
@@ -84,7 +84,7 @@ function useNavigationPreload() {
84
84
  })
85
85
  );
86
86
  await Promise.all(promises);
87
- console.log(`[NavigationPreload] \u2705 Listo para navegar a ${pathname}`);
87
+ console.log(`[NavigationPreload] \u2705 Ready to navigate to ${pathname}`);
88
88
  };
89
89
  return { preloadForRoute };
90
90
  }
package/dist/i18n.d.ts CHANGED
@@ -1,10 +1,23 @@
1
+ /**
2
+ * @deprecated Not used to load translations: every request gets the merged
3
+ * catalog. Kept for code that imports it.
4
+ */
1
5
  declare const NAMESPACE_GROUPS: {
2
6
  PUBLIC_INITIAL: string[];
3
7
  DASHBOARD_AUTHENTICATED: string[];
4
8
  AUTH_ONLY: string[];
5
9
  ALL: string[];
6
10
  };
11
+ /**
12
+ * @deprecated Not used to load translations: every request gets the merged
13
+ * catalog. Kept for code that imports it.
14
+ */
7
15
  declare function getPageNamespaces(pathname: string): string[];
16
+ /**
17
+ * The request config next-intl builds translations from. It reads nothing from
18
+ * the request itself: a page rendered with request data is dynamic, and the
19
+ * locale already comes from getUserLocale, resolved once per request.
20
+ */
8
21
  declare const _default: (params: import("next-intl/server").GetRequestConfigParams) => import("next-intl/server").RequestConfig | Promise<import("next-intl/server").RequestConfig>;
9
22
  export default _default;
10
23
  export { getPageNamespaces, NAMESPACE_GROUPS };
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAYA,QAAA,MAAM,gBAAgB;;;;;CAYrB,CAAC;AAGF,iBAAS,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAsErD;;AAYD,wBA4DG;AAGH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC"}
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,QAAA,MAAM,gBAAgB;;;;;CAYrB,CAAC;AAEF;;;GAGG;AACH,iBAAS,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAsErD;AAYD;;;;GAIG;;AACH,wBA8BG;AAGH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC"}
package/dist/i18n.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import { getRequestConfig } from "next-intl/server";
2
2
  import { I18N_CONFIG } from "./lib/config/index.js";
3
- import { headers } from "next/headers";
4
3
  import { loadMergedTranslations } from "./lib/translations/registry.js";
5
4
  import { getUserLocale } from "./lib/locale.js";
6
5
  const DEBUG_I18N = process.env.NEXTSPARK_DEBUG_I18N === "true";
@@ -67,33 +66,9 @@ async function getServerLocale() {
67
66
  return I18N_CONFIG.defaultLocale;
68
67
  }
69
68
  }
70
- var i18n_default = getRequestConfig(async () => {
71
- let locale;
69
+ var i18n_default = getRequestConfig(async ({ locale: requestedLocale }) => {
70
+ const locale = I18N_CONFIG.supportedLocales.includes(requestedLocale) ? requestedLocale : await getServerLocale();
72
71
  try {
73
- locale = await getServerLocale();
74
- } catch {
75
- locale = I18N_CONFIG.defaultLocale;
76
- }
77
- try {
78
- let pathname = "";
79
- try {
80
- const headersList = await headers();
81
- pathname = headersList.get("x-pathname") || headersList.get("x-url") || "";
82
- if (!pathname) {
83
- const referer = headersList.get("referer") || "";
84
- if (referer) {
85
- try {
86
- const url = new URL(referer);
87
- pathname = url.pathname;
88
- if (DEBUG_I18N) {
89
- console.log(`[i18n] Extracted pathname from referer: "${pathname}"`);
90
- }
91
- } catch {
92
- }
93
- }
94
- }
95
- } catch {
96
- }
97
72
  const messages = await loadMergedTranslations(locale);
98
73
  if (DEBUG_I18N) {
99
74
  console.log(`[i18n] Loaded merged translations for ${locale} with ${Object.keys(messages).length} namespaces`);
@@ -1 +1 @@
1
- {"version":3,"file":"entity.actions.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/entity.actions.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EACV,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EAElB,MAAM,SAAS,CAAA;AAqChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,iBAAiB,EACvB,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAwDhC;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,iBAAiB,EACvB,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CA+DhC;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,sBAAsB,CAAC,CA4DjC;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,SAAS,CAAC,CAAC,GAAG,OAAO,EACzC,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAsCvC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5C,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAoClD;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EAAE,EACb,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CA0DhD;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAuCtC;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAkCrC"}
1
+ {"version":3,"file":"entity.actions.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/entity.actions.ts"],"names":[],"mappings":"AA6CA,OAAO,KAAK,EACV,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EAElB,MAAM,SAAS,CAAA;AAqChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,iBAAiB,EACvB,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAwDhC;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,iBAAiB,EACvB,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CA+DhC;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,sBAAsB,CAAC,CA4DjC;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,SAAS,CAAC,CAAC,GAAG,OAAO,EACzC,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAsCvC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5C,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAoClD;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EAAE,EACb,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CA0DhD;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAuCtC;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAkCrC"}
@@ -1,20 +1,21 @@
1
1
  "use server";
2
2
  import { revalidatePath, revalidateTag } from "next/cache";
3
3
  import { headers, cookies } from "next/headers";
4
+ import { ACTIVE_TEAM_COOKIE, activeTeamIdForSession } from "../teams/active-team-cookie.js";
4
5
  import { redirect } from "next/navigation";
5
6
  import { GenericEntityService } from "../services/generic-entity.service.js";
6
7
  import { entityRegistry } from "../entities/registry.js";
7
8
  import { getTypedSession } from "../auth.js";
8
9
  import { checkPermission } from "../permissions/check.js";
9
10
  async function getAuthContext() {
10
- var _a, _b;
11
+ var _a, _b, _c;
11
12
  const headersList = await headers();
12
13
  const session = await getTypedSession(headersList);
13
14
  if (!((_a = session == null ? void 0 : session.user) == null ? void 0 : _a.id)) {
14
15
  return { success: false, error: "Authentication required" };
15
16
  }
16
17
  const cookieStore = await cookies();
17
- const teamId = (_b = cookieStore.get("activeTeamId")) == null ? void 0 : _b.value;
18
+ const teamId = activeTeamIdForSession((_b = cookieStore.get(ACTIVE_TEAM_COOKIE)) == null ? void 0 : _b.value, (_c = session.session) == null ? void 0 : _c.id);
18
19
  if (!teamId) {
19
20
  return { success: false, error: "No active team selected" };
20
21
  }
@@ -45,6 +45,8 @@ export interface DualAuthResult {
45
45
  scopes?: string[];
46
46
  /** `api_key.id` of the key that authenticated the request (type 'api-key' only). Used for audit logging (#105). */
47
47
  keyId?: string;
48
+ /** The session's id (type 'session' only): the active team cookie counts only for it. */
49
+ sessionId?: string;
48
50
  rateLimitResponse?: Response;
49
51
  /** Set when a dev-only x-act-as-user override replaced the real caller. */
50
52
  actingAs?: {
@@ -88,7 +90,8 @@ export declare function hasRequiredScope(authResult: DualAuthResult, requiredSco
88
90
  /**
89
91
  * Resolve and validate team context from request.
90
92
  *
91
- * Resolution priority: x-team-id header > activeTeamId cookie > user's defaultTeamId
93
+ * Resolution priority: x-team-id header > the activeTeamId cookie this session wrote >
94
+ * user's defaultTeamId
92
95
  *
93
96
  * Returns the validated teamId string on success, or a NextResponse error if:
94
97
  * - No team context can be resolved (400)
@@ -1 +1 @@
1
- {"version":3,"file":"dual-auth.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/auth/dual-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAMvD,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EAKrB,MAAM,gBAAgB,CAAA;AAEvB,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAK/F;;;GAGG;AACH,eAAO,MAAM,oBAAoB,uBAAuB,CAAA;AAExD;;GAEG;AACH,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AACnD,eAAO,MAAM,kBAAkB,8BAA8B,CAAA;AAE7D;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,kBAAkB,CAAA;AAOjD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB;;;;OAIG;IACH,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAA;IACpC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,mHAAmH;IACnH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iBAAiB,CAAC,EAAE,QAAQ,CAAA;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3D,0EAA0E;IAC1E,KAAK,CAAC,EAAE,eAAe,CAAA;CACxB;AAqBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,cAAc,CAAC,CAsCzB;AAuKD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAUtG;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,CAsChC;AAMD;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AA2BD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,MAAkC,EAAE,MAAM,GAAE,MAAY;;;;GAShG;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,cAAc,GAAG,YAAY,CAUlF"}
1
+ {"version":3,"file":"dual-auth.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/auth/dual-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAMvD,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EAKrB,MAAM,gBAAgB,CAAA;AAEvB,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAK/F;;;GAGG;AACH,eAAO,MAAM,oBAAoB,uBAAuB,CAAA;AAExD;;GAEG;AACH,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AACnD,eAAO,MAAM,kBAAkB,8BAA8B,CAAA;AAE7D;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,kBAAkB,CAAA;AAOjD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB;;;;OAIG;IACH,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAA;IACpC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,mHAAmH;IACnH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,QAAQ,CAAA;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3D,0EAA0E;IAC1E,KAAK,CAAC,EAAE,eAAe,CAAA;CACxB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,cAAc,CAAC,CAsCzB;AAwKD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAUtG;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,CAsChC;AAMD;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AA2BD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,MAAkC,EAAE,MAAM,GAAE,MAAY;;;;GAShG;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,cAAc,GAAG,YAAY,CAUlF"}
@@ -1,3 +1,5 @@
1
+ import { ACTIVE_TEAM_COOKIE, activeTeamIdForSession } from "../../teams/active-team-cookie.js";
2
+ import { getUserDefaultTeamId } from "../../teams/dashboard-team.js";
1
3
  import { NextResponse } from "next/server";
2
4
  import { auth } from "../../auth.js";
3
5
  import { validateApiKey } from "../auth.js";
@@ -15,21 +17,6 @@ const ADMIN_BYPASS_HEADER = "x-admin-bypass";
15
17
  const ADMIN_BYPASS_VALUE = "confirm-cross-team-access";
16
18
  const ACT_AS_USER_HEADER = "x-act-as-user";
17
19
  const ELEVATED_ROLES = ["superadmin", "developer"];
18
- async function getUserDefaultTeamId(userId) {
19
- try {
20
- const result = await queryOne(
21
- `SELECT "teamId" FROM "team_members"
22
- WHERE "userId" = $1
23
- ORDER BY "joinedAt" ASC
24
- LIMIT 1`,
25
- [userId]
26
- );
27
- return result == null ? void 0 : result.teamId;
28
- } catch (error) {
29
- console.error("[dual-auth] Failed to get default team:", error);
30
- return void 0;
31
- }
32
- }
33
20
  async function authenticateRequest(request, options = {}) {
34
21
  const apiKeyResult = await tryApiKeyAuth(request);
35
22
  if (apiKeyResult.success) {
@@ -131,6 +118,7 @@ async function tryApiKeyAuth(request) {
131
118
  }
132
119
  }
133
120
  async function trySessionAuth(request) {
121
+ var _a;
134
122
  try {
135
123
  console.log("[dual-auth] Attempting session authentication...");
136
124
  const session = await auth.api.getSession({ headers: request.headers });
@@ -144,6 +132,7 @@ async function trySessionAuth(request) {
144
132
  return {
145
133
  success: true,
146
134
  type: "session",
135
+ sessionId: (_a = session.session) == null ? void 0 : _a.id,
147
136
  user: {
148
137
  id: session.user.id,
149
138
  email: session.user.email,
@@ -171,7 +160,7 @@ function hasRequiredScope(authResult, requiredScope) {
171
160
  }
172
161
  async function resolveTeamContext(request, authResult) {
173
162
  var _a;
174
- const teamId = request.headers.get("x-team-id") || ((_a = request.cookies.get("activeTeamId")) == null ? void 0 : _a.value) || authResult.user.defaultTeamId;
163
+ const teamId = request.headers.get("x-team-id") || activeTeamIdForSession((_a = request.cookies.get(ACTIVE_TEAM_COOKIE)) == null ? void 0 : _a.value, authResult.sessionId) || authResult.user.defaultTeamId;
175
164
  if (!teamId) {
176
165
  return NextResponse.json(
177
166
  { success: false, error: "Team context required. Include x-team-id header." },
@@ -79,13 +79,13 @@ class EntityApiClient {
79
79
  });
80
80
  if (!response.ok) {
81
81
  const errorData = await response.json().catch(() => ({}));
82
- let userMessage = `Error al cargar ${entityType}`;
82
+ let userMessage = `Failed to load ${entityType}`;
83
83
  if (response.status === 401) {
84
- userMessage = "No tienes permisos para acceder a estos datos. Por favor, inicia sesi\xF3n nuevamente.";
84
+ userMessage = "You do not have permission to access this data. Please sign in again.";
85
85
  } else if (response.status === 403) {
86
- userMessage = "No tienes los permisos necesarios para realizar esta acci\xF3n.";
86
+ userMessage = "You do not have the necessary permissions to perform this action.";
87
87
  } else if (response.status === 404) {
88
- userMessage = "Los datos solicitados no fueron encontrados.";
88
+ userMessage = "The requested data was not found.";
89
89
  } else if (response.status === 400 && errorData.code === "TEAM_CONTEXT_REQUIRED") {
90
90
  console.warn("[EntityApiClient] Team context not ready yet, returning empty list");
91
91
  return {
@@ -102,7 +102,7 @@ class EntityApiClient {
102
102
  }
103
103
  };
104
104
  } else if (response.status >= 500) {
105
- userMessage = "Error interno del servidor. Por favor, intenta m\xE1s tarde.";
105
+ userMessage = "Internal server error. Please try again later.";
106
106
  } else if (errorData.message && !errorData.message.includes("API key")) {
107
107
  userMessage = errorData.message;
108
108
  }
@@ -127,15 +127,15 @@ class EntityApiClient {
127
127
  });
128
128
  if (!response.ok) {
129
129
  const errorData = await response.json().catch(() => ({}));
130
- let userMessage = `Error al cargar ${entityType}`;
130
+ let userMessage = `Failed to load ${entityType}`;
131
131
  if (response.status === 401) {
132
- userMessage = "No tienes permisos para acceder a estos datos. Por favor, inicia sesi\xF3n nuevamente.";
132
+ userMessage = "You do not have permission to access this data. Please sign in again.";
133
133
  } else if (response.status === 403) {
134
- userMessage = "No tienes los permisos necesarios para realizar esta acci\xF3n.";
134
+ userMessage = "You do not have the necessary permissions to perform this action.";
135
135
  } else if (response.status === 404) {
136
- userMessage = "El elemento solicitado no fue encontrado.";
136
+ userMessage = "The requested item was not found.";
137
137
  } else if (response.status >= 500) {
138
- userMessage = "Error interno del servidor. Por favor, intenta m\xE1s tarde.";
138
+ userMessage = "Internal server error. Please try again later.";
139
139
  } else if (errorData.message && !errorData.message.includes("API key")) {
140
140
  userMessage = errorData.message;
141
141
  }
@@ -158,15 +158,15 @@ class EntityApiClient {
158
158
  });
159
159
  if (!response.ok) {
160
160
  const errorData = await response.json().catch(() => ({}));
161
- let userMessage = `Error al crear ${entityType}`;
161
+ let userMessage = `Failed to create ${entityType}`;
162
162
  if (response.status === 401) {
163
- userMessage = "No tienes permisos para crear este elemento. Por favor, inicia sesi\xF3n nuevamente.";
163
+ userMessage = "You do not have permission to create this item. Please sign in again.";
164
164
  } else if (response.status === 403) {
165
- userMessage = "No tienes los permisos necesarios para crear este elemento.";
165
+ userMessage = "You do not have the necessary permissions to create this item.";
166
166
  } else if (response.status === 400) {
167
- userMessage = "Los datos proporcionados no son v\xE1lidos. Por favor, revisa el formulario.";
167
+ userMessage = "The provided data is not valid. Please review the form.";
168
168
  } else if (response.status >= 500) {
169
- userMessage = "Error interno del servidor. Por favor, intenta m\xE1s tarde.";
169
+ userMessage = "Internal server error. Please try again later.";
170
170
  } else if (errorData.message && !errorData.message.includes("API key")) {
171
171
  userMessage = errorData.message;
172
172
  }
@@ -189,17 +189,17 @@ class EntityApiClient {
189
189
  });
190
190
  if (!response.ok) {
191
191
  const errorData = await response.json().catch(() => ({}));
192
- let userMessage = `Error al actualizar ${entityType}`;
192
+ let userMessage = `Failed to update ${entityType}`;
193
193
  if (response.status === 401) {
194
- userMessage = "No tienes permisos para actualizar este elemento. Por favor, inicia sesi\xF3n nuevamente.";
194
+ userMessage = "You do not have permission to update this item. Please sign in again.";
195
195
  } else if (response.status === 403) {
196
- userMessage = "No tienes los permisos necesarios para actualizar este elemento.";
196
+ userMessage = "You do not have the necessary permissions to update this item.";
197
197
  } else if (response.status === 404) {
198
- userMessage = "El elemento que intentas actualizar no fue encontrado.";
198
+ userMessage = "The item you are trying to update was not found.";
199
199
  } else if (response.status === 400) {
200
- userMessage = "Los datos proporcionados no son v\xE1lidos. Por favor, revisa el formulario.";
200
+ userMessage = "The provided data is not valid. Please review the form.";
201
201
  } else if (response.status >= 500) {
202
- userMessage = "Error interno del servidor. Por favor, intenta m\xE1s tarde.";
202
+ userMessage = "Internal server error. Please try again later.";
203
203
  } else if (errorData.message && !errorData.message.includes("API key")) {
204
204
  userMessage = errorData.message;
205
205
  }
@@ -221,15 +221,15 @@ class EntityApiClient {
221
221
  });
222
222
  if (!response.ok) {
223
223
  const errorData = await response.json().catch(() => ({}));
224
- let userMessage = `Error al eliminar ${entityType}`;
224
+ let userMessage = `Failed to delete ${entityType}`;
225
225
  if (response.status === 401) {
226
- userMessage = "No tienes permisos para eliminar este elemento. Por favor, inicia sesi\xF3n nuevamente.";
226
+ userMessage = "You do not have permission to delete this item. Please sign in again.";
227
227
  } else if (response.status === 403) {
228
- userMessage = "No tienes los permisos necesarios para eliminar este elemento.";
228
+ userMessage = "You do not have the necessary permissions to delete this item.";
229
229
  } else if (response.status === 404) {
230
- userMessage = "El elemento que intentas eliminar no fue encontrado.";
230
+ userMessage = "The item you are trying to delete was not found.";
231
231
  } else if (response.status >= 500) {
232
- userMessage = "Error interno del servidor. Por favor, intenta m\xE1s tarde.";
232
+ userMessage = "Internal server error. Please try again later.";
233
233
  } else if (errorData.message && !errorData.message.includes("API key")) {
234
234
  userMessage = errorData.message;
235
235
  }
@@ -333,8 +333,8 @@ class EntityApiClient {
333
333
  if (entityConfig.features.canDelete) {
334
334
  operations.push({
335
335
  id: "bulk-delete",
336
- name: "Eliminar Seleccionados",
337
- description: "Eliminar m\xFAltiples elementos a la vez",
336
+ name: "Delete Selected",
337
+ description: "Delete multiple items at once",
338
338
  icon: "trash",
339
339
  requiresConfirmation: true
340
340
  });
@@ -342,15 +342,15 @@ class EntityApiClient {
342
342
  if (entityConfig.features.canEdit) {
343
343
  operations.push({
344
344
  id: "bulk-edit",
345
- name: "Editar Seleccionados",
346
- description: "Actualizar m\xFAltiples elementos a la vez",
345
+ name: "Edit Selected",
346
+ description: "Update multiple items at once",
347
347
  icon: "edit"
348
348
  });
349
349
  }
350
350
  operations.push({
351
351
  id: "bulk-export",
352
- name: "Exportar",
353
- description: "Exportar datos seleccionados",
352
+ name: "Export",
353
+ description: "Export selected data",
354
354
  icon: "download"
355
355
  });
356
356
  return operations;
@@ -376,7 +376,7 @@ class EntityApiClient {
376
376
  });
377
377
  if (!response.ok) {
378
378
  const errorData = await response.json().catch(() => ({}));
379
- throw new Error(errorData.message || `Error ejecutando operaci\xF3n ${operationId}`);
379
+ throw new Error(errorData.message || `Error executing operation ${operationId}`);
380
380
  }
381
381
  const result = await response.json();
382
382
  return result.data;
@@ -39,24 +39,24 @@ export declare class ApiKeyManager {
39
39
  * Definición de scopes disponibles para API keys
40
40
  */
41
41
  export declare const API_SCOPES: {
42
- readonly 'users:read': "Leer información de usuarios";
43
- readonly 'users:write': "Crear y actualizar usuarios";
44
- readonly 'users:delete': "Eliminar usuarios";
45
- readonly 'tasks:read': "Leer tasks";
46
- readonly 'tasks:write': "Crear y actualizar tasks";
47
- readonly 'tasks:delete': "Eliminar tasks";
48
- readonly 'media:read': "Leer información de archivos y media";
49
- readonly 'media:write': "Subir y actualizar archivos";
50
- readonly 'media:delete': "Eliminar archivos";
51
- readonly 'teams:read': "Leer equipos, miembros e invitaciones";
52
- readonly 'teams:write': "Crear y actualizar equipos, miembros e invitaciones";
53
- readonly 'teams:delete': "Eliminar equipos";
54
- readonly 'billing:read': "Leer suscripciones, facturas y uso";
55
- readonly 'billing:write': "Gestionar suscripciones, checkout, cambios de plan y uso";
56
- readonly 'admin:api-keys': "Gestionar API keys";
57
- readonly 'admin:users': "Administración completa de usuarios";
58
- readonly 'admin:devtools': "Acceso a las APIs de DevTools (registries, testing, scheduled actions)";
59
- readonly '*': "Acceso completo (solo superadmin)";
42
+ readonly 'users:read': "Read user information";
43
+ readonly 'users:write': "Create and update users";
44
+ readonly 'users:delete': "Delete users";
45
+ readonly 'tasks:read': "Read tasks";
46
+ readonly 'tasks:write': "Create and update tasks";
47
+ readonly 'tasks:delete': "Delete tasks";
48
+ readonly 'media:read': "Read file and media information";
49
+ readonly 'media:write': "Upload and update files";
50
+ readonly 'media:delete': "Delete files";
51
+ readonly 'teams:read': "Read teams, members and invitations";
52
+ readonly 'teams:write': "Create and update teams, members and invitations";
53
+ readonly 'teams:delete': "Delete teams";
54
+ readonly 'billing:read': "Read subscriptions, invoices and usage";
55
+ readonly 'billing:write': "Manage subscriptions, checkout, plan changes and usage";
56
+ readonly 'admin:api-keys': "Manage API keys";
57
+ readonly 'admin:users': "Full user administration";
58
+ readonly 'admin:devtools': "Access to DevTools APIs (registries, testing, scheduled actions)";
59
+ readonly '*': "Full access (superadmin only)";
60
60
  };
61
61
  export type ApiScope = keyof typeof API_SCOPES;
62
62
  /**
@@ -79,33 +79,33 @@ export declare function getAppApiScopes(): Record<string, string>;
79
79
  */
80
80
  export declare const SCOPE_CATEGORIES: {
81
81
  readonly users: {
82
- readonly name: "Usuarios";
83
- readonly description: "Gestión de usuarios del sistema";
82
+ readonly name: "Users";
83
+ readonly description: "System user management";
84
84
  readonly scopes: ApiScope[];
85
85
  };
86
86
  readonly tasks: {
87
87
  readonly name: "Tasks";
88
- readonly description: "Gestión de tareas y TODOs";
88
+ readonly description: "Task and TODO management";
89
89
  readonly scopes: ApiScope[];
90
90
  };
91
91
  readonly teams: {
92
92
  readonly name: "Teams";
93
- readonly description: "Equipos, miembros e invitaciones";
93
+ readonly description: "Teams, members and invitations";
94
94
  readonly scopes: ApiScope[];
95
95
  };
96
96
  readonly billing: {
97
97
  readonly name: "Billing";
98
- readonly description: "Suscripciones, facturas, uso y planes";
98
+ readonly description: "Subscriptions, invoices, usage and plans";
99
99
  readonly scopes: ApiScope[];
100
100
  };
101
101
  readonly admin: {
102
- readonly name: "Administración";
103
- readonly description: "Funciones administrativas";
102
+ readonly name: "Administration";
103
+ readonly description: "Administrative functions";
104
104
  readonly scopes: ApiScope[];
105
105
  };
106
106
  readonly system: {
107
- readonly name: "Sistema";
108
- readonly description: "Acceso completo al sistema";
107
+ readonly name: "System";
108
+ readonly description: "Full system access";
109
109
  readonly scopes: ApiScope[];
110
110
  };
111
111
  };