@nextsparkjs/core 0.1.0-beta.195 → 0.1.0-beta.197

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 (283) hide show
  1. package/README.md +2 -0
  2. package/dist/components/auth/forms/SignupForm.d.ts.map +1 -1
  3. package/dist/components/auth/forms/SignupForm.js +55 -45
  4. package/dist/components/billing/InvoicesPagination.js +2 -2
  5. package/dist/components/dashboard/block-editor/config-panel.d.ts.map +1 -1
  6. package/dist/components/dashboard/block-editor/config-panel.js +3 -2
  7. package/dist/components/dashboard/block-editor/entity-fields-sidebar.d.ts.map +1 -1
  8. package/dist/components/dashboard/block-editor/entity-fields-sidebar.js +3 -2
  9. package/dist/components/dashboard/navigation/DynamicNavigation.js +2 -2
  10. package/dist/components/settings/layouts/SettingsSidebar.d.ts.map +1 -1
  11. package/dist/components/settings/layouts/SettingsSidebar.js +0 -1
  12. package/dist/components/teams/CreateTeamButton.js +2 -2
  13. package/dist/components/teams/CreateTeamDialog.js +1 -1
  14. package/dist/components/teams/InviteMemberButton.js +3 -3
  15. package/dist/components/teams/InviteMemberDialog.js +1 -1
  16. package/dist/components/teams/TeamPendingInvitations.js +2 -2
  17. package/dist/components/users/tables/UsersTable.d.ts.map +1 -1
  18. package/dist/components/users/tables/UsersTable.js +3 -4
  19. package/dist/hooks/useAuthReadiness.d.ts +1 -0
  20. package/dist/hooks/useAuthReadiness.d.ts.map +1 -1
  21. package/dist/hooks/useAuthReadiness.js +3 -1
  22. package/dist/lib/actions/entity.actions.js +2 -2
  23. package/dist/lib/actions/team.actions.js +2 -2
  24. package/dist/lib/actions/user.actions.js +4 -4
  25. package/dist/lib/api/api-error.d.ts +2 -0
  26. package/dist/lib/api/api-error.d.ts.map +1 -1
  27. package/dist/lib/api/api-error.js +3 -1
  28. package/dist/lib/api/auth/dual-auth.d.ts +2 -1
  29. package/dist/lib/api/auth/dual-auth.d.ts.map +1 -1
  30. package/dist/lib/api/auth/dual-auth.js +25 -6
  31. package/dist/lib/api/auth/scope-policy.d.ts +6 -3
  32. package/dist/lib/api/auth/scope-policy.d.ts.map +1 -1
  33. package/dist/lib/api/auth.d.ts.map +1 -1
  34. package/dist/lib/api/auth.js +7 -0
  35. package/dist/lib/api/cors-response.d.ts +3 -2
  36. package/dist/lib/api/cors-response.d.ts.map +1 -1
  37. package/dist/lib/api/cors-response.js +8 -6
  38. package/dist/lib/api/entity/generic-handler.d.ts.map +1 -1
  39. package/dist/lib/api/entity/generic-handler.js +66 -15
  40. package/dist/lib/api/entity-handler.js +2 -2
  41. package/dist/lib/api/helpers.d.ts.map +1 -1
  42. package/dist/lib/api/helpers.js +9 -24
  43. package/dist/lib/api/permission-middleware.d.ts.map +1 -1
  44. package/dist/lib/api/permission-middleware.js +0 -2
  45. package/dist/lib/api/post-categories.d.ts +29 -0
  46. package/dist/lib/api/post-categories.d.ts.map +1 -0
  47. package/dist/lib/api/post-categories.js +33 -0
  48. package/dist/lib/api/rate-limit.d.ts +8 -0
  49. package/dist/lib/api/rate-limit.d.ts.map +1 -1
  50. package/dist/lib/api/rate-limit.js +34 -3
  51. package/dist/lib/api/request-origin.d.ts.map +1 -1
  52. package/dist/lib/api/request-origin.js +1 -1
  53. package/dist/lib/auth/auth-methods.d.ts +5 -2
  54. package/dist/lib/auth/auth-methods.d.ts.map +1 -1
  55. package/dist/lib/auth/auth-methods.js +4 -2
  56. package/dist/lib/auth/authorization-session.d.ts +14 -0
  57. package/dist/lib/auth/authorization-session.d.ts.map +1 -0
  58. package/dist/lib/auth/authorization-session.js +10 -0
  59. package/dist/lib/auth/request-session.d.ts +5 -0
  60. package/dist/lib/auth/request-session.d.ts.map +1 -1
  61. package/dist/lib/auth/request-session.js +3 -0
  62. package/dist/lib/auth/runtime-readiness.d.ts +7 -4
  63. package/dist/lib/auth/runtime-readiness.d.ts.map +1 -1
  64. package/dist/lib/auth/runtime-readiness.js +9 -6
  65. package/dist/lib/auth/sample-accounts.d.ts +18 -0
  66. package/dist/lib/auth/sample-accounts.d.ts.map +1 -0
  67. package/dist/lib/auth/sample-accounts.js +25 -0
  68. package/dist/lib/auth/suspension.d.ts +22 -0
  69. package/dist/lib/auth/suspension.d.ts.map +1 -0
  70. package/dist/lib/auth/suspension.js +43 -0
  71. package/dist/lib/auth.d.ts.map +1 -1
  72. package/dist/lib/auth.js +20 -17
  73. package/dist/lib/cache/public-entity-cache.d.ts +21 -0
  74. package/dist/lib/cache/public-entity-cache.d.ts.map +1 -0
  75. package/dist/lib/cache/public-entity-cache.js +25 -0
  76. package/dist/lib/config/app.config.d.ts.map +1 -1
  77. package/dist/lib/config/app.config.js +6 -7
  78. package/dist/lib/config/types.d.ts +8 -6
  79. package/dist/lib/config/types.d.ts.map +1 -1
  80. package/dist/lib/db-pool.d.ts +31 -0
  81. package/dist/lib/db-pool.d.ts.map +1 -0
  82. package/dist/lib/db-pool.js +75 -0
  83. package/dist/lib/db.d.ts +1 -1
  84. package/dist/lib/db.d.ts.map +1 -1
  85. package/dist/lib/db.js +11 -14
  86. package/dist/lib/entities/api-generator.js +5 -5
  87. package/dist/lib/entities/entity-hooks.d.ts.map +1 -1
  88. package/dist/lib/entities/entity-hooks.js +4 -0
  89. package/dist/lib/mcp/errors.d.ts +2 -0
  90. package/dist/lib/mcp/errors.d.ts.map +1 -1
  91. package/dist/lib/mcp/errors.js +3 -1
  92. package/dist/lib/mcp/index.d.ts +1 -1
  93. package/dist/lib/mcp/index.d.ts.map +1 -1
  94. package/dist/lib/mcp/index.js +2 -1
  95. package/dist/lib/oauth/token-refresh.d.ts.map +1 -1
  96. package/dist/lib/oauth/token-refresh.js +3 -6
  97. package/dist/lib/permissions/check.d.ts +9 -0
  98. package/dist/lib/permissions/check.d.ts.map +1 -1
  99. package/dist/lib/permissions/check.js +11 -1
  100. package/dist/lib/services/generic-entity.service.d.ts.map +1 -1
  101. package/dist/lib/services/generic-entity.service.js +41 -7
  102. package/dist/lib/services/transactional-meta.service.d.ts.map +1 -1
  103. package/dist/lib/services/transactional-meta.service.js +7 -8
  104. package/dist/lib/teams/actions.d.ts.map +1 -1
  105. package/dist/lib/teams/actions.js +0 -1
  106. package/dist/lib/validation.d.ts +5 -0
  107. package/dist/lib/validation.d.ts.map +1 -1
  108. package/dist/lib/validation.js +2 -0
  109. package/dist/messages/de/billing.json +12 -1
  110. package/dist/messages/de/common.json +2 -0
  111. package/dist/messages/de/docs.json +1 -0
  112. package/dist/messages/de/features.json +16 -4
  113. package/dist/messages/de/home.json +5 -0
  114. package/dist/messages/de/index.d.ts +68 -25
  115. package/dist/messages/de/index.d.ts.map +1 -1
  116. package/dist/messages/de/index.js +2 -0
  117. package/dist/messages/de/index.ts +2 -0
  118. package/dist/messages/de/settings.json +1 -0
  119. package/dist/messages/de/teams.json +3 -18
  120. package/dist/messages/en/billing.json +1 -1
  121. package/dist/messages/en/common.json +2 -0
  122. package/dist/messages/en/docs.json +1 -0
  123. package/dist/messages/en/features.json +16 -4
  124. package/dist/messages/en/home.json +5 -0
  125. package/dist/messages/en/index.d.ts +58 -25
  126. package/dist/messages/en/index.d.ts.map +1 -1
  127. package/dist/messages/en/index.js +2 -0
  128. package/dist/messages/en/index.ts +2 -0
  129. package/dist/messages/en/settings.json +1 -0
  130. package/dist/messages/en/teams.json +3 -18
  131. package/dist/messages/es/billing.json +1 -1
  132. package/dist/messages/es/common.json +2 -0
  133. package/dist/messages/es/docs.json +1 -0
  134. package/dist/messages/es/features.json +16 -4
  135. package/dist/messages/es/home.json +5 -0
  136. package/dist/messages/es/index.d.ts +41 -8
  137. package/dist/messages/es/index.d.ts.map +1 -1
  138. package/dist/messages/es/index.js +2 -0
  139. package/dist/messages/es/index.ts +2 -0
  140. package/dist/messages/es/settings.json +1 -0
  141. package/dist/messages/es/teams.json +3 -0
  142. package/dist/messages/fr/billing.json +12 -1
  143. package/dist/messages/fr/common.json +2 -0
  144. package/dist/messages/fr/docs.json +1 -0
  145. package/dist/messages/fr/features.json +16 -4
  146. package/dist/messages/fr/home.json +5 -0
  147. package/dist/messages/fr/index.d.ts +68 -25
  148. package/dist/messages/fr/index.d.ts.map +1 -1
  149. package/dist/messages/fr/index.js +2 -0
  150. package/dist/messages/fr/index.ts +2 -0
  151. package/dist/messages/fr/settings.json +1 -0
  152. package/dist/messages/fr/teams.json +3 -18
  153. package/dist/messages/it/billing.json +12 -1
  154. package/dist/messages/it/common.json +2 -0
  155. package/dist/messages/it/docs.json +1 -0
  156. package/dist/messages/it/features.json +16 -4
  157. package/dist/messages/it/home.json +5 -0
  158. package/dist/messages/it/index.d.ts +68 -25
  159. package/dist/messages/it/index.d.ts.map +1 -1
  160. package/dist/messages/it/index.js +2 -0
  161. package/dist/messages/it/index.ts +2 -0
  162. package/dist/messages/it/settings.json +1 -0
  163. package/dist/messages/it/teams.json +3 -18
  164. package/dist/messages/pt/billing.json +12 -1
  165. package/dist/messages/pt/common.json +2 -0
  166. package/dist/messages/pt/docs.json +1 -0
  167. package/dist/messages/pt/features.json +16 -4
  168. package/dist/messages/pt/home.json +5 -0
  169. package/dist/messages/pt/index.d.ts +68 -25
  170. package/dist/messages/pt/index.d.ts.map +1 -1
  171. package/dist/messages/pt/index.js +2 -0
  172. package/dist/messages/pt/index.ts +2 -0
  173. package/dist/messages/pt/settings.json +1 -0
  174. package/dist/messages/pt/teams.json +3 -18
  175. package/dist/migrations/029_sample_accounts_outside_development.sql +55 -0
  176. package/dist/migrations/030_taxonomies_team_writes.sql +29 -0
  177. package/dist/migrations/031_users_role_suspended.sql +41 -0
  178. package/dist/migrations/090_sample_data.sql +10 -0
  179. package/dist/routes/(auth)/signup/page.cc.d.ts +3 -1
  180. package/dist/routes/(auth)/signup/page.cc.d.ts.map +1 -1
  181. package/dist/routes/(auth)/signup/page.cc.js +2 -2
  182. package/dist/routes/(auth)/signup/page.d.ts +3 -1
  183. package/dist/routes/(auth)/signup/page.d.ts.map +1 -1
  184. package/dist/routes/(auth)/signup/page.js +4 -3
  185. package/dist/routes/_internal/area-access.js +2 -2
  186. package/dist/routes/_internal/entity-permission-layout.d.ts.map +1 -1
  187. package/dist/routes/_internal/entity-permission-layout.js +0 -7
  188. package/dist/routes/api/devtools/config/entities/route.js +2 -2
  189. package/dist/routes/api/devtools/config/theme/route.js +2 -2
  190. package/dist/routes/api/devtools/tests/[...path]/route.js +2 -2
  191. package/dist/routes/api/devtools/tests/route.js +2 -2
  192. package/dist/routes/api/mcp/route.d.ts.map +1 -1
  193. package/dist/routes/api/mcp/route.js +7 -1
  194. package/dist/routes/api/superadmin/subscriptions/route.js +2 -2
  195. package/dist/routes/api/superadmin/teams/[teamId]/route.js +2 -2
  196. package/dist/routes/api/superadmin/teams/route.js +2 -2
  197. package/dist/routes/api/superadmin/users/[userId]/route.d.ts +5 -3
  198. package/dist/routes/api/superadmin/users/[userId]/route.d.ts.map +1 -1
  199. package/dist/routes/api/superadmin/users/[userId]/route.js +46 -23
  200. package/dist/routes/api/superadmin/users/route.js +2 -2
  201. package/dist/routes/api/user/delete-account/route.d.ts.map +1 -1
  202. package/dist/routes/api/user/delete-account/route.js +2 -3
  203. package/dist/routes/api/user/plan-flags/route.d.ts.map +1 -1
  204. package/dist/routes/api/user/plan-flags/route.js +5 -5
  205. package/dist/routes/api/user/profile/route.js +3 -3
  206. package/dist/routes/api/v1/auth/signup-with-invite/route.d.ts.map +1 -1
  207. package/dist/routes/api/v1/auth/signup-with-invite/route.js +80 -44
  208. package/dist/routes/api/v1/media/upload/route.d.ts +2 -1
  209. package/dist/routes/api/v1/media/upload/route.d.ts.map +1 -1
  210. package/dist/routes/api/v1/media/upload/route.js +10 -2
  211. package/dist/routes/api/v1/post-categories/[id]/route.d.ts.map +1 -1
  212. package/dist/routes/api/v1/post-categories/[id]/route.js +39 -34
  213. package/dist/routes/api/v1/post-categories/route.d.ts.map +1 -1
  214. package/dist/routes/api/v1/post-categories/route.js +18 -14
  215. package/dist/routes/api/v1/team-invitations/route.d.ts.map +1 -1
  216. package/dist/routes/api/v1/team-invitations/route.js +12 -5
  217. package/dist/routes/api/v1/teams/[teamId]/members/route.d.ts.map +1 -1
  218. package/dist/routes/api/v1/teams/[teamId]/members/route.js +12 -10
  219. package/dist/routes/api/v1/teams/switch/route.d.ts.map +1 -1
  220. package/dist/routes/api/v1/teams/switch/route.js +4 -1
  221. package/dist/routes/dashboard/settings/password/page.d.ts.map +1 -1
  222. package/dist/routes/dashboard/settings/password/page.js +10 -12
  223. package/dist/routes/devtools/config/page.js +1 -1
  224. package/dist/routes/devtools/page.js +1 -1
  225. package/dist/routes/devtools/scheduled-actions/page.js +1 -1
  226. package/dist/routes/devtools/tests/[[...path]]/page.js +1 -1
  227. package/dist/routes/superadmin/users/page.js +2 -2
  228. package/dist/templates/ci-workflows/github/cypress-regression.yml +1 -1
  229. package/dist/templates/ci-workflows/github/cypress-smoke.yml +2 -1
  230. package/dist/templates/next.config.mjs +11 -31
  231. package/dist/templates/projects/blog/package.json +1 -1
  232. package/dist/templates/projects/crm/package.json +1 -1
  233. package/dist/templates/projects/productivity/package.json +1 -1
  234. package/dist/templates/projects/starter/README.md +2 -0
  235. package/dist/templates/projects/starter/config/app.config.ts +8 -0
  236. package/dist/templates/projects/starter/docs/public/01-overview/01-introduction.md +2 -0
  237. package/dist/templates/projects/starter/templates/dashboard/analytics/layout.tsx +14 -0
  238. package/dist/templates/proxy.ts +18 -8
  239. package/dist/templates/public/uploads/README.md +5 -94
  240. package/migrations/029_sample_accounts_outside_development.sql +55 -0
  241. package/migrations/030_taxonomies_team_writes.sql +29 -0
  242. package/migrations/031_users_role_suspended.sql +41 -0
  243. package/migrations/090_sample_data.sql +10 -0
  244. package/package.json +3 -3
  245. package/scripts/build/registry/__tests__/build-output.test.mjs +1 -1
  246. package/scripts/build/registry/__tests__/project-mode-root-first.test.mjs +6 -6
  247. package/scripts/build/registry/__tests__/write-places.test.mjs +1 -1
  248. package/scripts/build/registry/contracts/__tests__/contracts-wire.test.mjs +1 -1
  249. package/scripts/build/registry/contracts/__tests__/contracts.test.mjs +1 -1
  250. package/scripts/build/registry/host/README.md +2 -2
  251. package/scripts/build/registry/host/__tests__/facade-emitter.test.mjs +14 -13
  252. package/scripts/build/registry/host/__tests__/host-mode.test.mjs +1 -1
  253. package/scripts/build/registry/host/__tests__/host-project-composition.test.mjs +1 -1
  254. package/scripts/build/registry/host/__tests__/host-project.test.mjs +2 -2
  255. package/scripts/build/registry/host/__tests__/host-proxy-areas.test.mjs +99 -1
  256. package/scripts/build/registry/host/__tests__/host-robustness.test.mjs +1 -1
  257. package/scripts/build/registry/host/facade-emitter.mjs +1 -1
  258. package/scripts/build/registry/host/next-route-exports.json +2 -2
  259. package/scripts/build/registry/host/proxy-areas.mjs +92 -2
  260. package/scripts/db/run-migrations.mjs +30 -10
  261. package/scripts/db/sample-data.mjs +44 -0
  262. package/scripts/db/verify-theme-migrations.mjs +7 -1
  263. package/templates/ci-workflows/github/cypress-regression.yml +1 -1
  264. package/templates/ci-workflows/github/cypress-smoke.yml +2 -1
  265. package/templates/next.config.mjs +11 -31
  266. package/templates/projects/blog/package.json +1 -1
  267. package/templates/projects/crm/package.json +1 -1
  268. package/templates/projects/productivity/package.json +1 -1
  269. package/templates/projects/starter/README.md +2 -0
  270. package/templates/projects/starter/config/app.config.ts +8 -0
  271. package/templates/projects/starter/docs/public/01-overview/01-introduction.md +2 -0
  272. package/templates/projects/starter/templates/dashboard/analytics/layout.tsx +14 -0
  273. package/templates/proxy.ts +18 -8
  274. package/templates/public/uploads/README.md +5 -94
  275. package/tests/jest/__mocks__/@nextsparkjs/registries/api-presets-registry.ts +2 -0
  276. package/tests/jest/__mocks__/@nextsparkjs/registries/mcp-registry.ts +2 -0
  277. package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +5 -4
  278. package/dist/templates/projects/starter/public/brand/.gitkeep +0 -0
  279. package/dist/templates/public/uploads/.gitignore +0 -6
  280. package/dist/templates/public/uploads/temp/.gitkeep +0 -1
  281. package/templates/projects/starter/public/brand/.gitkeep +0 -0
  282. package/templates/public/uploads/.gitignore +0 -6
  283. package/templates/public/uploads/temp/.gitkeep +0 -1
package/README.md CHANGED
@@ -19,6 +19,8 @@ pnpm db:migrate
19
19
  pnpm dev
20
20
  ```
21
21
 
22
+ With lifecycle scripts disabled (`pnpm install --frozen-lockfile --ignore-scripts`) nothing else is needed: `nextspark dev`, `build` and `prepare` generate `src/app` and the registries. Only Cypress needs `pnpm exec cypress install` before `pnpm cy:run`.
23
+
22
24
  Or initialize in an existing project:
23
25
 
24
26
  ```bash
@@ -1 +1 @@
1
- {"version":3,"file":"SignupForm.d.ts","sourceRoot":"","sources":["../../../../src/components/auth/forms/SignupForm.tsx"],"names":[],"mappings":"AA+BA,wBAAgB,UAAU,4CAsmBzB"}
1
+ {"version":3,"file":"SignupForm.d.ts","sourceRoot":"","sources":["../../../../src/components/auth/forms/SignupForm.tsx"],"names":[],"mappings":"AA+BA,wBAAgB,UAAU,4CAqnBzB"}
@@ -18,7 +18,7 @@ import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle }
18
18
  import { Separator } from "../../ui/separator.js";
19
19
  import { PasswordInput } from "../../ui/password-input.js";
20
20
  import { Mail, User, Loader2, AlertCircle, ArrowRight, MailCheck, CheckCircle2, Users } from "lucide-react";
21
- import { signupSchema } from "../../../lib/validation.js";
21
+ import { inviteSignupSchema, signupSchema } from "../../../lib/validation.js";
22
22
  import { sel } from "../../../lib/selectors/auth-sel.js";
23
23
  import { useTranslations } from "next-intl";
24
24
  import { AuthTranslationPreloader } from "../../../lib/i18n/AuthTranslationPreloader.js";
@@ -43,6 +43,8 @@ function SignupForm() {
43
43
  const callbackUrl = safeCallbackPath(searchParams.get("callbackUrl"));
44
44
  const inviteToken = searchParams.get("inviteToken");
45
45
  const passwordAvailable = inviteToken ? readiness.capabilities.invitationPasswordSignup : readiness.availableMethods.includes("email-password");
46
+ const invitePasswordless = Boolean(inviteToken) && !passwordAvailable && readiness.capabilities.invitationSignup;
47
+ const formAvailable = passwordAvailable || invitePasswordless;
46
48
  const loginHref = callbackUrl ? `/login?callbackUrl=${encodeURIComponent(callbackUrl)}` : "/login";
47
49
  const {
48
50
  register,
@@ -50,7 +52,8 @@ function SignupForm() {
50
52
  watch,
51
53
  formState: { errors }
52
54
  } = useForm({
53
- resolver: zodResolver(signupSchema),
55
+ // Without a password field the form validates the rest only
56
+ resolver: zodResolver(invitePasswordless ? inviteSignupSchema : signupSchema),
54
57
  defaultValues: {
55
58
  email: inviteEmail || ""
56
59
  }
@@ -75,7 +78,7 @@ function SignupForm() {
75
78
  },
76
79
  body: JSON.stringify({
77
80
  email: data.email,
78
- password: data.password,
81
+ ...invitePasswordless ? {} : { password: data.password },
79
82
  firstName: data.firstName,
80
83
  lastName: data.lastName,
81
84
  inviteToken
@@ -100,7 +103,12 @@ function SignupForm() {
100
103
  toast.success(t("signup.messages.inviteSuccess"), {
101
104
  description: t("signup.messages.inviteJoinedTeam")
102
105
  });
103
- router.push(((_a = result.data) == null ? void 0 : _a.redirectTo) || "/dashboard/settings/teams");
106
+ const redirectTo = ((_a = result.data) == null ? void 0 : _a.redirectTo) || "/dashboard/settings/teams";
107
+ if (invitePasswordless) {
108
+ router.push(`/login?${new URLSearchParams({ email: data.email, fromInvite: "true", callbackUrl: redirectTo })}`);
109
+ return;
110
+ }
111
+ router.push(redirectTo);
104
112
  return;
105
113
  }
106
114
  await signUp({
@@ -119,7 +127,7 @@ function SignupForm() {
119
127
  } finally {
120
128
  setLoadingProvider(null);
121
129
  }
122
- }, [agreedToTerms, signUp, t, inviteToken, router]);
130
+ }, [agreedToTerms, signUp, t, inviteToken, invitePasswordless, router]);
123
131
  const handleGoogleSignUp = async () => {
124
132
  setLoadingProvider("google");
125
133
  setError(null);
@@ -147,7 +155,7 @@ function SignupForm() {
147
155
  setResendingEmail(false);
148
156
  }
149
157
  };
150
- if (readiness.state === "loading" || readiness.state === "error" || readiness.state === "unavailable" && !(inviteToken && passwordAvailable)) {
158
+ if (readiness.state === "loading" || readiness.state === "error" || readiness.state === "unavailable" && !(inviteToken && formAvailable)) {
151
159
  const isLoading = readiness.state === "loading";
152
160
  const isError = readiness.state === "error";
153
161
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -341,7 +349,7 @@ function SignupForm() {
341
349
  /* @__PURE__ */ jsx(Users, { className: "h-4 w-4" }),
342
350
  /* @__PURE__ */ jsx(AlertDescription, { children: t("signup.inviteBanner") })
343
351
  ] }),
344
- passwordAvailable && /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit(onSubmit), className: "space-y-4", children: [
352
+ formAvailable && /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit(onSubmit), className: "space-y-4", children: [
345
353
  /* @__PURE__ */ jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [
346
354
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
347
355
  /* @__PURE__ */ jsx(Label, { htmlFor: "firstName", children: t("signup.form.firstName") }),
@@ -402,41 +410,43 @@ function SignupForm() {
402
410
  ] }),
403
411
  errors.email && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: errors.email.message })
404
412
  ] }),
405
- /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
406
- /* @__PURE__ */ jsx(Label, { htmlFor: "password", children: t("signup.form.password") }),
407
- /* @__PURE__ */ jsx(
408
- PasswordInput,
409
- {
410
- ...register("password"),
411
- id: "password",
412
- autoComplete: "new-password",
413
- placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
414
- showRequirements: true,
415
- password,
416
- requirementLabels: {
417
- minChars: t("signup.form.passwordRequirements.minChars"),
418
- uppercase: t("signup.form.passwordRequirements.uppercase"),
419
- lowercase: t("signup.form.passwordRequirements.lowercase"),
420
- number: t("signup.form.passwordRequirements.number")
421
- },
422
- "data-cy": sel("auth.signup.password")
423
- }
424
- ),
425
- errors.password && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: errors.password.message })
426
- ] }),
427
- /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
428
- /* @__PURE__ */ jsx(Label, { htmlFor: "confirmPassword", children: t("signup.form.confirmPassword") }),
429
- /* @__PURE__ */ jsx(
430
- PasswordInput,
431
- {
432
- ...register("confirmPassword"),
433
- id: "confirmPassword",
434
- autoComplete: "new-password",
435
- placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
436
- "data-cy": sel("auth.signup.confirmPassword")
437
- }
438
- ),
439
- errors.confirmPassword && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: errors.confirmPassword.message })
413
+ !invitePasswordless && /* @__PURE__ */ jsxs(Fragment, { children: [
414
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
415
+ /* @__PURE__ */ jsx(Label, { htmlFor: "password", children: t("signup.form.password") }),
416
+ /* @__PURE__ */ jsx(
417
+ PasswordInput,
418
+ {
419
+ ...register("password"),
420
+ id: "password",
421
+ autoComplete: "new-password",
422
+ placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
423
+ showRequirements: true,
424
+ password,
425
+ requirementLabels: {
426
+ minChars: t("signup.form.passwordRequirements.minChars"),
427
+ uppercase: t("signup.form.passwordRequirements.uppercase"),
428
+ lowercase: t("signup.form.passwordRequirements.lowercase"),
429
+ number: t("signup.form.passwordRequirements.number")
430
+ },
431
+ "data-cy": sel("auth.signup.password")
432
+ }
433
+ ),
434
+ errors.password && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: errors.password.message })
435
+ ] }),
436
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
437
+ /* @__PURE__ */ jsx(Label, { htmlFor: "confirmPassword", children: t("signup.form.confirmPassword") }),
438
+ /* @__PURE__ */ jsx(
439
+ PasswordInput,
440
+ {
441
+ ...register("confirmPassword"),
442
+ id: "confirmPassword",
443
+ autoComplete: "new-password",
444
+ placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
445
+ "data-cy": sel("auth.signup.confirmPassword")
446
+ }
447
+ ),
448
+ errors.confirmPassword && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: errors.confirmPassword.message })
449
+ ] })
440
450
  ] }),
441
451
  error && /* @__PURE__ */ jsxs(Alert, { variant: "destructive", "data-cy": sel("auth.signup.error"), children: [
442
452
  /* @__PURE__ */ jsx(AlertCircle, { className: "h-4 w-4" }),
@@ -479,7 +489,7 @@ function SignupForm() {
479
489
  }
480
490
  )
481
491
  ] }),
482
- !passwordAvailable && !googleAvailable && /* @__PURE__ */ jsxs(
492
+ !formAvailable && !googleAvailable && /* @__PURE__ */ jsxs(
483
493
  Alert,
484
494
  {
485
495
  role: "alert",
@@ -495,12 +505,12 @@ function SignupForm() {
495
505
  ]
496
506
  }
497
507
  ),
498
- inviteToken && !passwordAvailable && googleAvailable && /* @__PURE__ */ jsxs(Alert, { role: "alert", className: "mb-4", "data-cy": sel("auth.signup.inviteUnavailable"), children: [
508
+ inviteToken && !formAvailable && googleAvailable && /* @__PURE__ */ jsxs(Alert, { role: "alert", className: "mb-4", "data-cy": sel("auth.signup.inviteUnavailable"), children: [
499
509
  /* @__PURE__ */ jsx(AlertCircle, { className: "h-4 w-4", "aria-hidden": "true" }),
500
510
  /* @__PURE__ */ jsx(AlertDescription, { children: t("signup.inviteUnavailable") })
501
511
  ] }),
502
512
  googleAvailable && /* @__PURE__ */ jsxs(Fragment, { children: [
503
- passwordAvailable && /* @__PURE__ */ jsxs("div", { className: "relative my-4", children: [
513
+ formAvailable && /* @__PURE__ */ jsxs("div", { className: "relative my-4", children: [
504
514
  /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center", children: /* @__PURE__ */ jsx(Separator, { className: "w-full" }) }),
505
515
  /* @__PURE__ */ jsx("div", { className: "relative flex justify-center text-xs uppercase", children: /* @__PURE__ */ jsx("span", { className: "bg-background px-2 text-muted-foreground", children: t("signup.form.orContinueWith") }) })
506
516
  ] }),
@@ -32,9 +32,9 @@ function InvoicesPagination({
32
32
  {
33
33
  className: "flex items-center justify-between pt-4 border-t",
34
34
  "data-cy": "invoices-pagination",
35
- "aria-label": t("showing", { from: showingFrom, to: showingTo, total: totalInvoices }),
35
+ "aria-label": t("showing", { start: showingFrom, end: showingTo, total: totalInvoices }),
36
36
  children: [
37
- /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("showing", { from: showingFrom, to: showingTo, total: totalInvoices }) }),
37
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("showing", { start: showingFrom, end: showingTo, total: totalInvoices }) }),
38
38
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
39
39
  /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: t("page", { current: currentPage, total: totalPages }) }),
40
40
  /* @__PURE__ */ jsxs("div", { className: "flex gap-1", children: [
@@ -1 +1 @@
1
- {"version":3,"file":"config-panel.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/block-editor/config-panel.tsx"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAA;AACxF,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,uBAAuB,CAAA;AAkB1E,UAAU,gBAAgB;IACxB,YAAY,EAAE,kBAAkB,CAAA;IAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAC5D,YAAY,EAAE,YAAY,CAAA;IAC1B,oBAAoB,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAA;CACvD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACrB,EAAE,gBAAgB,2CA6elB"}
1
+ {"version":3,"file":"config-panel.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/block-editor/config-panel.tsx"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAA;AACxF,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,uBAAuB,CAAA;AAmB1E,UAAU,gBAAgB;IACxB,YAAY,EAAE,kBAAkB,CAAA;IAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAC5D,YAAY,EAAE,YAAY,CAAA;IAC1B,oBAAoB,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAA;CACvD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACrB,EAAE,gBAAgB,2CA6elB"}
@@ -36,7 +36,8 @@ import {
36
36
  SelectTrigger,
37
37
  SelectValue
38
38
  } from "../../ui/select.js";
39
- import { withBasePath, withBasePathIfInApp } from "../../../lib/base-path.js";
39
+ import { withBasePathIfInApp } from "../../../lib/base-path.js";
40
+ import { fetchWithTeam } from "../../../lib/api/entities.js";
40
41
  function ConfigPanel({
41
42
  entityConfig,
42
43
  entityFields,
@@ -59,7 +60,7 @@ function ConfigPanel({
59
60
  queryKey: ["taxonomies", taxonomyApiPath],
60
61
  queryFn: async () => {
61
62
  if (!taxonomyApiPath) return { data: [] };
62
- const response = await fetch(withBasePath(`/api/v1/${taxonomyApiPath}`));
63
+ const response = await fetchWithTeam(`/api/v1/${taxonomyApiPath}`);
63
64
  if (!response.ok) return { data: [] };
64
65
  return response.json();
65
66
  },
@@ -1 +1 @@
1
- {"version":3,"file":"entity-fields-sidebar.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/block-editor/entity-fields-sidebar.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAA;AAkBxF,UAAU,wBAAwB;IAChC,YAAY,EAAE,kBAAkB,CAAA;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACjD,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;CAChD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,kBAAuB,EACvB,gBAAgB,EACjB,EAAE,wBAAwB,2CAmS1B"}
1
+ {"version":3,"file":"entity-fields-sidebar.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/block-editor/entity-fields-sidebar.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAA;AAmBxF,UAAU,wBAAwB;IAChC,YAAY,EAAE,kBAAkB,CAAA;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACjD,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;CAChD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,kBAAuB,EACvB,gBAAgB,EACjB,EAAE,wBAAwB,2CAmS1B"}
@@ -18,7 +18,8 @@ import {
18
18
  SelectTrigger,
19
19
  SelectValue
20
20
  } from "../../ui/select.js";
21
- import { withBasePath, withBasePathIfInApp } from "../../../lib/base-path.js";
21
+ import { withBasePathIfInApp } from "../../../lib/base-path.js";
22
+ import { fetchWithTeam } from "../../../lib/api/entities.js";
22
23
  function EntityFieldsSidebar({
23
24
  entityConfig,
24
25
  fields,
@@ -37,7 +38,7 @@ function EntityFieldsSidebar({
37
38
  queryKey: ["taxonomies", taxonomyApiPath],
38
39
  queryFn: async () => {
39
40
  if (!taxonomyApiPath) return { data: [] };
40
- const response = await fetch(withBasePath(`/api/v1/${taxonomyApiPath}`));
41
+ const response = await fetchWithTeam(`/api/v1/${taxonomyApiPath}`);
41
42
  if (!response.ok) return { data: [] };
42
43
  return response.json();
43
44
  },
@@ -167,11 +167,11 @@ function DynamicNavigation({
167
167
  isMobile && "w-full"
168
168
  ),
169
169
  "aria-current": pathname === "/dashboard" ? "page" : void 0,
170
- title: isCollapsed ? t("navigation.dashboard") : void 0,
170
+ title: isCollapsed ? t("dashboard") : void 0,
171
171
  "data-cy": sel("dashboard.navigation.dashboardLink"),
172
172
  children: [
173
173
  /* @__PURE__ */ jsx(Home, { className: "h-4 w-4 shrink-0", "aria-hidden": "true" }),
174
- !isCollapsed && /* @__PURE__ */ jsx("span", { className: "truncate", children: t("navigation.dashboard") })
174
+ !isCollapsed && /* @__PURE__ */ jsx("span", { className: "truncate", children: t("dashboard") })
175
175
  ]
176
176
  }
177
177
  ),
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsSidebar.d.ts","sourceRoot":"","sources":["../../../../src/components/settings/layouts/SettingsSidebar.tsx"],"names":[],"mappings":"AAoCA,UAAU,oBAAoB;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CAkKlE"}
1
+ {"version":3,"file":"SettingsSidebar.d.ts","sourceRoot":"","sources":["../../../../src/components/settings/layouts/SettingsSidebar.tsx"],"names":[],"mappings":"AAoCA,UAAU,oBAAoB;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CAiKlE"}
@@ -50,7 +50,6 @@ function SettingsSidebar({ className }) {
50
50
  }, [prefetchProfile, prefetchTeams]);
51
51
  const filteredNavigation = useMemo(() => {
52
52
  const enabledPages = getEnabledSettingsPages();
53
- if (process.env.NODE_ENV === "development") console.log("[SettingsSidebar] enabledPages:", enabledPages);
54
53
  return enabledPages.filter((page) => {
55
54
  if (page.key === "password" && !hasPassword) {
56
55
  return false;
@@ -30,10 +30,10 @@ function CreateTeamButton({
30
30
  className,
31
31
  onClick,
32
32
  "data-cy": "create-team-button",
33
- "aria-label": t("create.createTeam"),
33
+ "aria-label": t("actions.create"),
34
34
  children: [
35
35
  showIcon && /* @__PURE__ */ jsx(Plus, { className: "h-4 w-4 mr-2", "aria-hidden": "true" }),
36
- children || t("create.createTeam")
36
+ children || t("actions.create")
37
37
  ]
38
38
  }
39
39
  );
@@ -39,7 +39,7 @@ function CreateTeamDialog({ open, onOpenChange }) {
39
39
  setSlug("");
40
40
  setDescription("");
41
41
  } catch (error) {
42
- toast.error(error instanceof Error ? error.message : t("errors.unauthorized"));
42
+ toast.error(error instanceof Error ? error.message : t("errors.permissionDenied"));
43
43
  }
44
44
  };
45
45
  const handleNameChange = (value) => {
@@ -39,7 +39,7 @@ function InviteMemberButton({
39
39
  "aria-label": t("invite.limitReached", { limit: maxMembersPerTeam }),
40
40
  children: [
41
41
  showIcon && /* @__PURE__ */ jsx(UserPlus, { className: "h-4 w-4 mr-2", "aria-hidden": "true" }),
42
- children || t("invite.inviteMember")
42
+ children || t("actions.invite")
43
43
  ]
44
44
  }
45
45
  ) }),
@@ -54,10 +54,10 @@ function InviteMemberButton({
54
54
  className,
55
55
  onClick,
56
56
  "data-cy": "invite-member-button",
57
- "aria-label": t("invite.inviteMember"),
57
+ "aria-label": t("actions.invite"),
58
58
  children: [
59
59
  showIcon && /* @__PURE__ */ jsx(UserPlus, { className: "h-4 w-4 mr-2", "aria-hidden": "true" }),
60
- children || t("invite.inviteMember")
60
+ children || t("actions.invite")
61
61
  ]
62
62
  }
63
63
  );
@@ -49,7 +49,7 @@ function InviteMemberDialog({ open, onOpenChange, teamId, currentUserRole = "own
49
49
  setEmail("");
50
50
  setRole(defaultRole);
51
51
  } catch (error) {
52
- toast.error(error instanceof Error ? error.message : t("errors.unauthorized"));
52
+ toast.error(error instanceof Error ? error.message : t("errors.permissionDenied"));
53
53
  }
54
54
  };
55
55
  return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsx(DialogContent, { "data-cy": "invite-member-dialog", children: /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, children: [
@@ -73,11 +73,11 @@ function TeamPendingInvitations({ teamId }) {
73
73
  },
74
74
  onSuccess: () => {
75
75
  queryClient.invalidateQueries({ queryKey: ["team-invitations", teamId] });
76
- toast.success(t("messages.invitationCancelled"));
76
+ toast.success(t("invitations.cancelSuccess"));
77
77
  setCancellingId(null);
78
78
  },
79
79
  onError: (error) => {
80
- toast.error(error instanceof Error ? error.message : t("errors.unauthorized"));
80
+ toast.error(error instanceof Error ? error.message : t("errors.permissionDenied"));
81
81
  setCancellingId(null);
82
82
  }
83
83
  });
@@ -1 +1 @@
1
- {"version":3,"file":"UsersTable.d.ts","sourceRoot":"","sources":["../../../../src/components/users/tables/UsersTable.tsx"],"names":[],"mappings":"AAsCA,OAAO,EAEL,IAAI,EAUL,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAM1D,UAAU,IAAI;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AASD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,eAAe,2CA2Y1E"}
1
+ {"version":3,"file":"UsersTable.d.ts","sourceRoot":"","sources":["../../../../src/components/users/tables/UsersTable.tsx"],"names":[],"mappings":"AAsCA,OAAO,EAEL,IAAI,EAUL,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAM1D,UAAU,IAAI;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AASD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,eAAe,2CAwY1E"}
@@ -183,9 +183,9 @@ function UsersTable({ users, isLoading, onRefresh }) {
183
183
  };
184
184
  const getRoleBadgeVariant = (role) => {
185
185
  switch (role) {
186
- case "admin":
186
+ case "suspended":
187
187
  return "destructive";
188
- case "colaborator":
188
+ case "developer":
189
189
  return "default";
190
190
  case "member":
191
191
  return "secondary";
@@ -284,8 +284,7 @@ function UsersTable({ users, isLoading, onRefresh }) {
284
284
  onValueChange: (value) => handleRoleChange(user, value),
285
285
  children: [
286
286
  /* @__PURE__ */ jsx(DropdownMenuRadioItem, { value: "member", children: "Member" }),
287
- /* @__PURE__ */ jsx(DropdownMenuRadioItem, { value: "colaborator", children: "Colaborator" }),
288
- /* @__PURE__ */ jsx(DropdownMenuRadioItem, { value: "admin", children: "Admin" })
287
+ /* @__PURE__ */ jsx(DropdownMenuRadioItem, { value: "developer", children: "Developer" })
289
288
  ]
290
289
  }
291
290
  ) })
@@ -2,6 +2,7 @@ import type { AuthLoginMethod } from '../lib/config/types';
2
2
  export type AuthReadinessState = 'loading' | 'ready' | 'unavailable' | 'error';
3
3
  /** Server-derived flows independent of the login UI methods; see runtime-readiness. */
4
4
  export interface ClientAuthCapabilities {
5
+ invitationSignup: boolean;
5
6
  invitationPasswordSignup: boolean;
6
7
  passwordRecovery: boolean;
7
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthReadiness.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuthReadiness.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAE1D,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,OAAO,CAAA;AAE9E,uFAAuF;AACvF,MAAM,WAAW,sBAAsB;IACrC,wBAAwB,EAAE,OAAO,CAAA;IACjC,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,kBAAkB,CAAA;IACzB,gBAAgB,EAAE,eAAe,EAAE,CAAA;IACnC,YAAY,EAAE,sBAAsB,CAAA;CACrC;AAsCD,qFAAqF;AACrF,wBAAgB,gBAAgB,IAAI,mBAAmB,CA8BtD"}
1
+ {"version":3,"file":"useAuthReadiness.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuthReadiness.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAE1D,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,OAAO,CAAA;AAE9E,uFAAuF;AACvF,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,OAAO,CAAA;IACzB,wBAAwB,EAAE,OAAO,CAAA;IACjC,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,kBAAkB,CAAA;IACzB,gBAAgB,EAAE,eAAe,EAAE,CAAA;IACnC,YAAY,EAAE,sBAAsB,CAAA;CACrC;AAyCD,qFAAqF;AACrF,wBAAgB,gBAAgB,IAAI,mBAAmB,CA8BtD"}
@@ -3,6 +3,7 @@ import { useEffect, useState } from "react";
3
3
  import { withBasePath } from "../lib/base-path.js";
4
4
  import { isAuthLoginMethod } from "../lib/auth/auth-methods.js";
5
5
  const NO_CAPABILITIES = {
6
+ invitationSignup: false,
6
7
  invitationPasswordSignup: false,
7
8
  passwordRecovery: false
8
9
  };
@@ -19,13 +20,14 @@ function parseReadiness(value) {
19
20
  throw new Error("Ready auth response has no available method");
20
21
  }
21
22
  const capabilities = candidate.capabilities;
22
- if (!capabilities || typeof capabilities !== "object" || typeof capabilities.invitationPasswordSignup !== "boolean" || typeof capabilities.passwordRecovery !== "boolean") {
23
+ if (!capabilities || typeof capabilities !== "object" || typeof capabilities.invitationSignup !== "boolean" || typeof capabilities.invitationPasswordSignup !== "boolean" || typeof capabilities.passwordRecovery !== "boolean") {
23
24
  throw new Error("Invalid auth readiness capabilities");
24
25
  }
25
26
  return {
26
27
  state: candidate.status,
27
28
  availableMethods: [...new Set(candidate.availableMethods)],
28
29
  capabilities: {
30
+ invitationSignup: capabilities.invitationSignup,
29
31
  invitationPasswordSignup: capabilities.invitationPasswordSignup,
30
32
  passwordRecovery: capabilities.passwordRecovery
31
33
  }
@@ -6,12 +6,12 @@ import { ACTIVE_TEAM_COOKIE, activeTeamIdForSession } from "../teams/active-team
6
6
  import { redirect } from "next/navigation";
7
7
  import { GenericEntityService } from "../services/generic-entity.service.js";
8
8
  import { entityRegistry } from "../entities/registry.js";
9
- import { getTypedSession } from "../auth.js";
9
+ import { getAuthorizationSession } from "../auth/authorization-session.js";
10
10
  import { checkPermission } from "../permissions/check.js";
11
11
  async function getAuthContext() {
12
12
  var _a, _b, _c;
13
13
  const headersList = await headers();
14
- const session = await getTypedSession(headersList);
14
+ const session = await getAuthorizationSession(headersList);
15
15
  if (!((_a = session == null ? void 0 : session.user) == null ? void 0 : _a.id)) {
16
16
  return { success: false, error: "Authentication required" };
17
17
  }
@@ -1,7 +1,7 @@
1
1
  "use server";
2
2
  import { revalidatePath } from "next/cache";
3
3
  import { headers } from "next/headers";
4
- import { getTypedSession } from "../auth.js";
4
+ import { getAuthorizationSession } from "../auth/authorization-session.js";
5
5
  import { TeamService } from "../services/team.service.js";
6
6
  import { TeamMemberService } from "../services/team-member.service.js";
7
7
  import { getInvitableRoles } from "../teams/permissions.js";
@@ -9,7 +9,7 @@ import { APP_CONFIG_MERGED } from "../config/config-sync.js";
9
9
  async function getAuthUser() {
10
10
  var _a;
11
11
  const headersList = await headers();
12
- const session = await getTypedSession(headersList);
12
+ const session = await getAuthorizationSession(headersList);
13
13
  if (!((_a = session == null ? void 0 : session.user) == null ? void 0 : _a.id)) {
14
14
  return { success: false, error: "Authentication required" };
15
15
  }
@@ -1,13 +1,13 @@
1
1
  "use server";
2
2
  import { revalidatePath } from "next/cache";
3
3
  import { headers } from "next/headers";
4
- import { getTypedSession } from "../auth.js";
4
+ import { getAuthorizationSession } from "../auth/authorization-session.js";
5
5
  import { UserService } from "../services/user.service.js";
6
6
  async function updateProfile(data) {
7
7
  var _a;
8
8
  try {
9
9
  const headersList = await headers();
10
- const session = await getTypedSession(headersList);
10
+ const session = await getAuthorizationSession(headersList);
11
11
  if (!((_a = session == null ? void 0 : session.user) == null ? void 0 : _a.id)) {
12
12
  return { success: false, error: "Authentication required" };
13
13
  }
@@ -54,7 +54,7 @@ async function updateAvatar(formData) {
54
54
  var _a;
55
55
  try {
56
56
  const headersList = await headers();
57
- const session = await getTypedSession(headersList);
57
+ const session = await getAuthorizationSession(headersList);
58
58
  if (!((_a = session == null ? void 0 : session.user) == null ? void 0 : _a.id)) {
59
59
  return { success: false, error: "Authentication required" };
60
60
  }
@@ -109,7 +109,7 @@ async function deleteAccount() {
109
109
  var _a;
110
110
  try {
111
111
  const headersList = await headers();
112
- const session = await getTypedSession(headersList);
112
+ const session = await getAuthorizationSession(headersList);
113
113
  if (!((_a = session == null ? void 0 : session.user) == null ? void 0 : _a.id)) {
114
114
  return { success: false, error: "Authentication required" };
115
115
  }
@@ -11,6 +11,8 @@ export declare const API_ERROR_CODES: {
11
11
  readonly INSUFFICIENT_SCOPE: "INSUFFICIENT_SCOPE";
12
12
  /** Route declared no required API key scope, so API keys are rejected (fail closed, #93) */
13
13
  readonly SCOPE_NOT_DECLARED: "SCOPE_NOT_DECLARED";
14
+ /** Production upload with no media storage provider configured (BLOB_READ_WRITE_TOKEN) */
15
+ readonly STORAGE_NOT_CONFIGURED: "STORAGE_NOT_CONFIGURED";
14
16
  };
15
17
  export type ApiErrorCode = typeof API_ERROR_CODES[keyof typeof API_ERROR_CODES];
16
18
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"api-error.d.ts","sourceRoot":"","sources":["../../../src/lib/api/api-error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,eAAe;IAC1B,2DAA2D;;IAE3D,0FAA0F;;IAE1F,4FAA4F;;CAEpF,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,OAAO,eAAe,CAAC,MAAM,OAAO,eAAe,CAAC,CAAA;AAE/E;;;;;GAKG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;gBAEL,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;IAa5F;;OAEG;IACH,kBAAkB,IAAI,OAAO;IAI7B;;;;;OAKG;WACU,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;CAqC1F"}
1
+ {"version":3,"file":"api-error.d.ts","sourceRoot":"","sources":["../../../src/lib/api/api-error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,eAAe;IAC1B,2DAA2D;;IAE3D,0FAA0F;;IAE1F,4FAA4F;;IAE5F,0FAA0F;;CAElF,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,OAAO,eAAe,CAAC,MAAM,OAAO,eAAe,CAAC,CAAA;AAE/E;;;;;GAKG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;gBAEL,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;IAa5F;;OAEG;IACH,kBAAkB,IAAI,OAAO;IAI7B;;;;;OAKG;WACU,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;CAqC1F"}
@@ -4,7 +4,9 @@ const API_ERROR_CODES = {
4
4
  /** API key lacks the scope the route declared (authenticateRequest / hasRequiredScope) */
5
5
  INSUFFICIENT_SCOPE: "INSUFFICIENT_SCOPE",
6
6
  /** Route declared no required API key scope, so API keys are rejected (fail closed, #93) */
7
- SCOPE_NOT_DECLARED: "SCOPE_NOT_DECLARED"
7
+ SCOPE_NOT_DECLARED: "SCOPE_NOT_DECLARED",
8
+ /** Production upload with no media storage provider configured (BLOB_READ_WRITE_TOKEN) */
9
+ STORAGE_NOT_CONFIGURED: "STORAGE_NOT_CONFIGURED"
8
10
  };
9
11
  class ApiError extends Error {
10
12
  code;
@@ -47,6 +47,7 @@ export interface DualAuthResult {
47
47
  keyId?: string;
48
48
  /** The session's id (type 'session' only): the active team cookie counts only for it. */
49
49
  sessionId?: string;
50
+ /** The 429 to return when a valid API key is over its per-key limit (`success` is false, `error` says 429). */
50
51
  rateLimitResponse?: Response;
51
52
  /** Set when a dev-only x-act-as-user override replaced the real caller. */
52
53
  actingAs?: {
@@ -126,7 +127,7 @@ export declare function createAuthError(message?: string, status?: number): Next
126
127
  * Turn a failed `authenticateRequest` result into the right HTTP response:
127
128
  * 401 `AUTHENTICATION_FAILED` when nothing usable was presented, 403
128
129
  * `INSUFFICIENT_SCOPE` / `SCOPE_NOT_DECLARED` when a valid API key was
129
- * rejected by scope enforcement. Use it in the `!authResult.success` branch
130
+ * rejected by scope enforcement, the 429 when the key is over its limit. Use it in the `!authResult.success` branch
130
131
  * instead of a hand-written 401, so scope rejections are not mislabeled.
131
132
  */
132
133
  export declare function createAuthFailureResponse(authResult: DualAuthResult): NextResponse;
@@ -1 +1 @@
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
+ {"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;AAQvD,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,+GAA+G;IAC/G,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,CA2DzB;AAsKD;;;;;;;;;;;;;;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,CAWlF"}