@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.
- package/README.md +2 -0
- package/dist/components/auth/forms/SignupForm.d.ts.map +1 -1
- package/dist/components/auth/forms/SignupForm.js +55 -45
- package/dist/components/billing/InvoicesPagination.js +2 -2
- package/dist/components/dashboard/block-editor/config-panel.d.ts.map +1 -1
- package/dist/components/dashboard/block-editor/config-panel.js +3 -2
- package/dist/components/dashboard/block-editor/entity-fields-sidebar.d.ts.map +1 -1
- package/dist/components/dashboard/block-editor/entity-fields-sidebar.js +3 -2
- package/dist/components/dashboard/navigation/DynamicNavigation.js +2 -2
- package/dist/components/settings/layouts/SettingsSidebar.d.ts.map +1 -1
- package/dist/components/settings/layouts/SettingsSidebar.js +0 -1
- package/dist/components/teams/CreateTeamButton.js +2 -2
- package/dist/components/teams/CreateTeamDialog.js +1 -1
- package/dist/components/teams/InviteMemberButton.js +3 -3
- package/dist/components/teams/InviteMemberDialog.js +1 -1
- package/dist/components/teams/TeamPendingInvitations.js +2 -2
- package/dist/components/users/tables/UsersTable.d.ts.map +1 -1
- package/dist/components/users/tables/UsersTable.js +3 -4
- package/dist/hooks/useAuthReadiness.d.ts +1 -0
- package/dist/hooks/useAuthReadiness.d.ts.map +1 -1
- package/dist/hooks/useAuthReadiness.js +3 -1
- package/dist/lib/actions/entity.actions.js +2 -2
- package/dist/lib/actions/team.actions.js +2 -2
- package/dist/lib/actions/user.actions.js +4 -4
- package/dist/lib/api/api-error.d.ts +2 -0
- package/dist/lib/api/api-error.d.ts.map +1 -1
- package/dist/lib/api/api-error.js +3 -1
- package/dist/lib/api/auth/dual-auth.d.ts +2 -1
- package/dist/lib/api/auth/dual-auth.d.ts.map +1 -1
- package/dist/lib/api/auth/dual-auth.js +25 -6
- package/dist/lib/api/auth/scope-policy.d.ts +6 -3
- package/dist/lib/api/auth/scope-policy.d.ts.map +1 -1
- package/dist/lib/api/auth.d.ts.map +1 -1
- package/dist/lib/api/auth.js +7 -0
- package/dist/lib/api/cors-response.d.ts +3 -2
- package/dist/lib/api/cors-response.d.ts.map +1 -1
- package/dist/lib/api/cors-response.js +8 -6
- package/dist/lib/api/entity/generic-handler.d.ts.map +1 -1
- package/dist/lib/api/entity/generic-handler.js +66 -15
- package/dist/lib/api/entity-handler.js +2 -2
- package/dist/lib/api/helpers.d.ts.map +1 -1
- package/dist/lib/api/helpers.js +9 -24
- package/dist/lib/api/permission-middleware.d.ts.map +1 -1
- package/dist/lib/api/permission-middleware.js +0 -2
- package/dist/lib/api/post-categories.d.ts +29 -0
- package/dist/lib/api/post-categories.d.ts.map +1 -0
- package/dist/lib/api/post-categories.js +33 -0
- package/dist/lib/api/rate-limit.d.ts +8 -0
- package/dist/lib/api/rate-limit.d.ts.map +1 -1
- package/dist/lib/api/rate-limit.js +34 -3
- package/dist/lib/api/request-origin.d.ts.map +1 -1
- package/dist/lib/api/request-origin.js +1 -1
- package/dist/lib/auth/auth-methods.d.ts +5 -2
- package/dist/lib/auth/auth-methods.d.ts.map +1 -1
- package/dist/lib/auth/auth-methods.js +4 -2
- package/dist/lib/auth/authorization-session.d.ts +14 -0
- package/dist/lib/auth/authorization-session.d.ts.map +1 -0
- package/dist/lib/auth/authorization-session.js +10 -0
- package/dist/lib/auth/request-session.d.ts +5 -0
- package/dist/lib/auth/request-session.d.ts.map +1 -1
- package/dist/lib/auth/request-session.js +3 -0
- package/dist/lib/auth/runtime-readiness.d.ts +7 -4
- package/dist/lib/auth/runtime-readiness.d.ts.map +1 -1
- package/dist/lib/auth/runtime-readiness.js +9 -6
- package/dist/lib/auth/sample-accounts.d.ts +18 -0
- package/dist/lib/auth/sample-accounts.d.ts.map +1 -0
- package/dist/lib/auth/sample-accounts.js +25 -0
- package/dist/lib/auth/suspension.d.ts +22 -0
- package/dist/lib/auth/suspension.d.ts.map +1 -0
- package/dist/lib/auth/suspension.js +43 -0
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +20 -17
- package/dist/lib/cache/public-entity-cache.d.ts +21 -0
- package/dist/lib/cache/public-entity-cache.d.ts.map +1 -0
- package/dist/lib/cache/public-entity-cache.js +25 -0
- package/dist/lib/config/app.config.d.ts.map +1 -1
- package/dist/lib/config/app.config.js +6 -7
- package/dist/lib/config/types.d.ts +8 -6
- package/dist/lib/config/types.d.ts.map +1 -1
- package/dist/lib/db-pool.d.ts +31 -0
- package/dist/lib/db-pool.d.ts.map +1 -0
- package/dist/lib/db-pool.js +75 -0
- package/dist/lib/db.d.ts +1 -1
- package/dist/lib/db.d.ts.map +1 -1
- package/dist/lib/db.js +11 -14
- package/dist/lib/entities/api-generator.js +5 -5
- package/dist/lib/entities/entity-hooks.d.ts.map +1 -1
- package/dist/lib/entities/entity-hooks.js +4 -0
- package/dist/lib/mcp/errors.d.ts +2 -0
- package/dist/lib/mcp/errors.d.ts.map +1 -1
- package/dist/lib/mcp/errors.js +3 -1
- package/dist/lib/mcp/index.d.ts +1 -1
- package/dist/lib/mcp/index.d.ts.map +1 -1
- package/dist/lib/mcp/index.js +2 -1
- package/dist/lib/oauth/token-refresh.d.ts.map +1 -1
- package/dist/lib/oauth/token-refresh.js +3 -6
- package/dist/lib/permissions/check.d.ts +9 -0
- package/dist/lib/permissions/check.d.ts.map +1 -1
- package/dist/lib/permissions/check.js +11 -1
- package/dist/lib/services/generic-entity.service.d.ts.map +1 -1
- package/dist/lib/services/generic-entity.service.js +41 -7
- package/dist/lib/services/transactional-meta.service.d.ts.map +1 -1
- package/dist/lib/services/transactional-meta.service.js +7 -8
- package/dist/lib/teams/actions.d.ts.map +1 -1
- package/dist/lib/teams/actions.js +0 -1
- package/dist/lib/validation.d.ts +5 -0
- package/dist/lib/validation.d.ts.map +1 -1
- package/dist/lib/validation.js +2 -0
- package/dist/messages/de/billing.json +12 -1
- package/dist/messages/de/common.json +2 -0
- package/dist/messages/de/docs.json +1 -0
- package/dist/messages/de/features.json +16 -4
- package/dist/messages/de/home.json +5 -0
- package/dist/messages/de/index.d.ts +68 -25
- package/dist/messages/de/index.d.ts.map +1 -1
- package/dist/messages/de/index.js +2 -0
- package/dist/messages/de/index.ts +2 -0
- package/dist/messages/de/settings.json +1 -0
- package/dist/messages/de/teams.json +3 -18
- package/dist/messages/en/billing.json +1 -1
- package/dist/messages/en/common.json +2 -0
- package/dist/messages/en/docs.json +1 -0
- package/dist/messages/en/features.json +16 -4
- package/dist/messages/en/home.json +5 -0
- package/dist/messages/en/index.d.ts +58 -25
- package/dist/messages/en/index.d.ts.map +1 -1
- package/dist/messages/en/index.js +2 -0
- package/dist/messages/en/index.ts +2 -0
- package/dist/messages/en/settings.json +1 -0
- package/dist/messages/en/teams.json +3 -18
- package/dist/messages/es/billing.json +1 -1
- package/dist/messages/es/common.json +2 -0
- package/dist/messages/es/docs.json +1 -0
- package/dist/messages/es/features.json +16 -4
- package/dist/messages/es/home.json +5 -0
- package/dist/messages/es/index.d.ts +41 -8
- package/dist/messages/es/index.d.ts.map +1 -1
- package/dist/messages/es/index.js +2 -0
- package/dist/messages/es/index.ts +2 -0
- package/dist/messages/es/settings.json +1 -0
- package/dist/messages/es/teams.json +3 -0
- package/dist/messages/fr/billing.json +12 -1
- package/dist/messages/fr/common.json +2 -0
- package/dist/messages/fr/docs.json +1 -0
- package/dist/messages/fr/features.json +16 -4
- package/dist/messages/fr/home.json +5 -0
- package/dist/messages/fr/index.d.ts +68 -25
- package/dist/messages/fr/index.d.ts.map +1 -1
- package/dist/messages/fr/index.js +2 -0
- package/dist/messages/fr/index.ts +2 -0
- package/dist/messages/fr/settings.json +1 -0
- package/dist/messages/fr/teams.json +3 -18
- package/dist/messages/it/billing.json +12 -1
- package/dist/messages/it/common.json +2 -0
- package/dist/messages/it/docs.json +1 -0
- package/dist/messages/it/features.json +16 -4
- package/dist/messages/it/home.json +5 -0
- package/dist/messages/it/index.d.ts +68 -25
- package/dist/messages/it/index.d.ts.map +1 -1
- package/dist/messages/it/index.js +2 -0
- package/dist/messages/it/index.ts +2 -0
- package/dist/messages/it/settings.json +1 -0
- package/dist/messages/it/teams.json +3 -18
- package/dist/messages/pt/billing.json +12 -1
- package/dist/messages/pt/common.json +2 -0
- package/dist/messages/pt/docs.json +1 -0
- package/dist/messages/pt/features.json +16 -4
- package/dist/messages/pt/home.json +5 -0
- package/dist/messages/pt/index.d.ts +68 -25
- package/dist/messages/pt/index.d.ts.map +1 -1
- package/dist/messages/pt/index.js +2 -0
- package/dist/messages/pt/index.ts +2 -0
- package/dist/messages/pt/settings.json +1 -0
- package/dist/messages/pt/teams.json +3 -18
- package/dist/migrations/029_sample_accounts_outside_development.sql +55 -0
- package/dist/migrations/030_taxonomies_team_writes.sql +29 -0
- package/dist/migrations/031_users_role_suspended.sql +41 -0
- package/dist/migrations/090_sample_data.sql +10 -0
- package/dist/routes/(auth)/signup/page.cc.d.ts +3 -1
- package/dist/routes/(auth)/signup/page.cc.d.ts.map +1 -1
- package/dist/routes/(auth)/signup/page.cc.js +2 -2
- package/dist/routes/(auth)/signup/page.d.ts +3 -1
- package/dist/routes/(auth)/signup/page.d.ts.map +1 -1
- package/dist/routes/(auth)/signup/page.js +4 -3
- package/dist/routes/_internal/area-access.js +2 -2
- package/dist/routes/_internal/entity-permission-layout.d.ts.map +1 -1
- package/dist/routes/_internal/entity-permission-layout.js +0 -7
- package/dist/routes/api/devtools/config/entities/route.js +2 -2
- package/dist/routes/api/devtools/config/theme/route.js +2 -2
- package/dist/routes/api/devtools/tests/[...path]/route.js +2 -2
- package/dist/routes/api/devtools/tests/route.js +2 -2
- package/dist/routes/api/mcp/route.d.ts.map +1 -1
- package/dist/routes/api/mcp/route.js +7 -1
- package/dist/routes/api/superadmin/subscriptions/route.js +2 -2
- package/dist/routes/api/superadmin/teams/[teamId]/route.js +2 -2
- package/dist/routes/api/superadmin/teams/route.js +2 -2
- package/dist/routes/api/superadmin/users/[userId]/route.d.ts +5 -3
- package/dist/routes/api/superadmin/users/[userId]/route.d.ts.map +1 -1
- package/dist/routes/api/superadmin/users/[userId]/route.js +46 -23
- package/dist/routes/api/superadmin/users/route.js +2 -2
- package/dist/routes/api/user/delete-account/route.d.ts.map +1 -1
- package/dist/routes/api/user/delete-account/route.js +2 -3
- package/dist/routes/api/user/plan-flags/route.d.ts.map +1 -1
- package/dist/routes/api/user/plan-flags/route.js +5 -5
- package/dist/routes/api/user/profile/route.js +3 -3
- package/dist/routes/api/v1/auth/signup-with-invite/route.d.ts.map +1 -1
- package/dist/routes/api/v1/auth/signup-with-invite/route.js +80 -44
- package/dist/routes/api/v1/media/upload/route.d.ts +2 -1
- package/dist/routes/api/v1/media/upload/route.d.ts.map +1 -1
- package/dist/routes/api/v1/media/upload/route.js +10 -2
- package/dist/routes/api/v1/post-categories/[id]/route.d.ts.map +1 -1
- package/dist/routes/api/v1/post-categories/[id]/route.js +39 -34
- package/dist/routes/api/v1/post-categories/route.d.ts.map +1 -1
- package/dist/routes/api/v1/post-categories/route.js +18 -14
- package/dist/routes/api/v1/team-invitations/route.d.ts.map +1 -1
- package/dist/routes/api/v1/team-invitations/route.js +12 -5
- package/dist/routes/api/v1/teams/[teamId]/members/route.d.ts.map +1 -1
- package/dist/routes/api/v1/teams/[teamId]/members/route.js +12 -10
- package/dist/routes/api/v1/teams/switch/route.d.ts.map +1 -1
- package/dist/routes/api/v1/teams/switch/route.js +4 -1
- package/dist/routes/dashboard/settings/password/page.d.ts.map +1 -1
- package/dist/routes/dashboard/settings/password/page.js +10 -12
- package/dist/routes/devtools/config/page.js +1 -1
- package/dist/routes/devtools/page.js +1 -1
- package/dist/routes/devtools/scheduled-actions/page.js +1 -1
- package/dist/routes/devtools/tests/[[...path]]/page.js +1 -1
- package/dist/routes/superadmin/users/page.js +2 -2
- package/dist/templates/ci-workflows/github/cypress-regression.yml +1 -1
- package/dist/templates/ci-workflows/github/cypress-smoke.yml +2 -1
- package/dist/templates/next.config.mjs +11 -31
- package/dist/templates/projects/blog/package.json +1 -1
- package/dist/templates/projects/crm/package.json +1 -1
- package/dist/templates/projects/productivity/package.json +1 -1
- package/dist/templates/projects/starter/README.md +2 -0
- package/dist/templates/projects/starter/config/app.config.ts +8 -0
- package/dist/templates/projects/starter/docs/public/01-overview/01-introduction.md +2 -0
- package/dist/templates/projects/starter/templates/dashboard/analytics/layout.tsx +14 -0
- package/dist/templates/proxy.ts +18 -8
- package/dist/templates/public/uploads/README.md +5 -94
- package/migrations/029_sample_accounts_outside_development.sql +55 -0
- package/migrations/030_taxonomies_team_writes.sql +29 -0
- package/migrations/031_users_role_suspended.sql +41 -0
- package/migrations/090_sample_data.sql +10 -0
- package/package.json +3 -3
- package/scripts/build/registry/__tests__/build-output.test.mjs +1 -1
- package/scripts/build/registry/__tests__/project-mode-root-first.test.mjs +6 -6
- package/scripts/build/registry/__tests__/write-places.test.mjs +1 -1
- package/scripts/build/registry/contracts/__tests__/contracts-wire.test.mjs +1 -1
- package/scripts/build/registry/contracts/__tests__/contracts.test.mjs +1 -1
- package/scripts/build/registry/host/README.md +2 -2
- package/scripts/build/registry/host/__tests__/facade-emitter.test.mjs +14 -13
- package/scripts/build/registry/host/__tests__/host-mode.test.mjs +1 -1
- package/scripts/build/registry/host/__tests__/host-project-composition.test.mjs +1 -1
- package/scripts/build/registry/host/__tests__/host-project.test.mjs +2 -2
- package/scripts/build/registry/host/__tests__/host-proxy-areas.test.mjs +99 -1
- package/scripts/build/registry/host/__tests__/host-robustness.test.mjs +1 -1
- package/scripts/build/registry/host/facade-emitter.mjs +1 -1
- package/scripts/build/registry/host/next-route-exports.json +2 -2
- package/scripts/build/registry/host/proxy-areas.mjs +92 -2
- package/scripts/db/run-migrations.mjs +30 -10
- package/scripts/db/sample-data.mjs +44 -0
- package/scripts/db/verify-theme-migrations.mjs +7 -1
- package/templates/ci-workflows/github/cypress-regression.yml +1 -1
- package/templates/ci-workflows/github/cypress-smoke.yml +2 -1
- package/templates/next.config.mjs +11 -31
- package/templates/projects/blog/package.json +1 -1
- package/templates/projects/crm/package.json +1 -1
- package/templates/projects/productivity/package.json +1 -1
- package/templates/projects/starter/README.md +2 -0
- package/templates/projects/starter/config/app.config.ts +8 -0
- package/templates/projects/starter/docs/public/01-overview/01-introduction.md +2 -0
- package/templates/projects/starter/templates/dashboard/analytics/layout.tsx +14 -0
- package/templates/proxy.ts +18 -8
- package/templates/public/uploads/README.md +5 -94
- package/tests/jest/__mocks__/@nextsparkjs/registries/api-presets-registry.ts +2 -0
- package/tests/jest/__mocks__/@nextsparkjs/registries/mcp-registry.ts +2 -0
- package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +5 -4
- package/dist/templates/projects/starter/public/brand/.gitkeep +0 -0
- package/dist/templates/public/uploads/.gitignore +0 -6
- package/dist/templates/public/uploads/temp/.gitkeep +0 -1
- package/templates/projects/starter/public/brand/.gitkeep +0 -0
- package/templates/public/uploads/.gitignore +0 -6
- 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,
|
|
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
|
-
|
|
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
|
-
|
|
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 &&
|
|
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
|
-
|
|
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(
|
|
406
|
-
/* @__PURE__ */
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
/* @__PURE__ */
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
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
|
-
!
|
|
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 && !
|
|
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
|
-
|
|
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", {
|
|
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", {
|
|
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;
|
|
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 {
|
|
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
|
|
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;
|
|
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 {
|
|
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
|
|
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("
|
|
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("
|
|
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,
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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("
|
|
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.
|
|
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,
|
|
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 "
|
|
186
|
+
case "suspended":
|
|
187
187
|
return "destructive";
|
|
188
|
-
case "
|
|
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: "
|
|
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;
|
|
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 {
|
|
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
|
|
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 {
|
|
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
|
|
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 {
|
|
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
|
|
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
|
|
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
|
|
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;;
|
|
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;
|
|
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"}
|