@nebulr-group/bridge-auth-core 0.4.6 → 0.5.0
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/dist/i18n/messages.d.ts +168 -0
- package/dist/i18n/messages.d.ts.map +1 -0
- package/dist/i18n/messages.js +269 -0
- package/dist/i18n/messages.js.map +1 -0
- package/dist/i18n/resolver.d.ts +62 -0
- package/dist/i18n/resolver.d.ts.map +1 -0
- package/dist/i18n/resolver.js +46 -0
- package/dist/i18n/resolver.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/return-to.d.ts +105 -0
- package/dist/return-to.d.ts.map +1 -0
- package/dist/return-to.js +182 -0
- package/dist/return-to.js.map +1 -0
- package/dist/route-guard.d.ts.map +1 -1
- package/dist/route-guard.js +46 -2
- package/dist/route-guard.js.map +1 -1
- package/dist/types.d.ts +49 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message catalogue for the SDK auth components (TBP-630).
|
|
3
|
+
*
|
|
4
|
+
* Lives in auth-core, not in a framework package, so bridge-svelte, -react,
|
|
5
|
+
* -angular and -nextjs resolve identical copy instead of drifting into four
|
|
6
|
+
* slightly different logins. The strings are framework-agnostic; only the
|
|
7
|
+
* rendering is not.
|
|
8
|
+
*
|
|
9
|
+
* ## Where the line sits
|
|
10
|
+
*
|
|
11
|
+
* Bridge owns the MECHANICS and translates them: what a field is, what a button
|
|
12
|
+
* does, what went wrong, what succeeded. Those are facts about how the auth flow
|
|
13
|
+
* works, identical for every tenant, and no consuming app should be rewriting
|
|
14
|
+
* them.
|
|
15
|
+
*
|
|
16
|
+
* The consuming app owns VOICE and CONTEXT: the page title, the subtitle,
|
|
17
|
+
* anything naming the product or explaining why the user is on this screen.
|
|
18
|
+
* Bridge cannot know those — hence `heading={null}` / `description={null}`
|
|
19
|
+
* (TBP-631) rather than catalogue entries.
|
|
20
|
+
*
|
|
21
|
+
* ## Keys are flat and dotted
|
|
22
|
+
*
|
|
23
|
+
* `login.email`, not a nested object. A flat map makes the override prop a
|
|
24
|
+
* plain `Partial<Messages>`, keeps lookup a single property access with no
|
|
25
|
+
* traversal, and means a typo in a key is a TypeScript error rather than a
|
|
26
|
+
* silent `undefined` at render time.
|
|
27
|
+
*/
|
|
28
|
+
/** Every user-facing string the SDK auth components render. */
|
|
29
|
+
export interface Messages {
|
|
30
|
+
'field.email': string;
|
|
31
|
+
'field.password': string;
|
|
32
|
+
'field.newPassword': string;
|
|
33
|
+
'field.confirmPassword': string;
|
|
34
|
+
'field.firstName': string;
|
|
35
|
+
'field.lastName': string;
|
|
36
|
+
'field.phoneNumber': string;
|
|
37
|
+
'field.verificationCode': string;
|
|
38
|
+
'field.authenticationCode': string;
|
|
39
|
+
'field.recoveryCode': string;
|
|
40
|
+
'placeholder.email': string;
|
|
41
|
+
'placeholder.password': string;
|
|
42
|
+
'placeholder.newPassword': string;
|
|
43
|
+
'placeholder.confirmPassword': string;
|
|
44
|
+
'placeholder.firstName': string;
|
|
45
|
+
'placeholder.lastName': string;
|
|
46
|
+
'placeholder.phoneNumber': string;
|
|
47
|
+
'placeholder.sixDigitCode': string;
|
|
48
|
+
'placeholder.recoveryCode': string;
|
|
49
|
+
'action.showPassword': string;
|
|
50
|
+
'action.hidePassword': string;
|
|
51
|
+
'action.showPasswords': string;
|
|
52
|
+
'action.hidePasswords': string;
|
|
53
|
+
'action.backToLogin': string;
|
|
54
|
+
'action.backToSignIn': string;
|
|
55
|
+
'action.resendCode': string;
|
|
56
|
+
'action.copy': string;
|
|
57
|
+
'action.copied': string;
|
|
58
|
+
'action.tryAgain': string;
|
|
59
|
+
'action.done': string;
|
|
60
|
+
/** The "or" rule between the password form and the alternative methods. */
|
|
61
|
+
'divider.or': string;
|
|
62
|
+
'login.heading': string;
|
|
63
|
+
'login.submit': string;
|
|
64
|
+
/** In-flight label on the login button. */
|
|
65
|
+
'login.submitting': string;
|
|
66
|
+
'login.forgotPassword': string;
|
|
67
|
+
'login.magicLink': string;
|
|
68
|
+
'login.signupPrompt': string;
|
|
69
|
+
'login.signupLink': string;
|
|
70
|
+
'login.error.invalidCredentials': string;
|
|
71
|
+
'forgot.headingRequest': string;
|
|
72
|
+
'forgot.headingSet': string;
|
|
73
|
+
'forgot.description': string;
|
|
74
|
+
'forgot.submit': string;
|
|
75
|
+
'forgot.setSubmit': string;
|
|
76
|
+
'forgot.emailSent': string;
|
|
77
|
+
'forgot.successHeading': string;
|
|
78
|
+
'forgot.error.send': string;
|
|
79
|
+
'forgot.error.update': string;
|
|
80
|
+
'forgot.error.mismatch': string;
|
|
81
|
+
'forgot.error.tooShort': string;
|
|
82
|
+
'magicLink.heading': string;
|
|
83
|
+
'magicLink.description': string;
|
|
84
|
+
'magicLink.submit': string;
|
|
85
|
+
/** Interpolates {expiry}, already formatted by the four keys below. */
|
|
86
|
+
'magicLink.sent': string;
|
|
87
|
+
/** Interpolates {count}. Split singular/plural because English needs both. */
|
|
88
|
+
'magicLink.expiryMinute': string;
|
|
89
|
+
'magicLink.expiryMinutes': string;
|
|
90
|
+
'magicLink.expirySeconds': string;
|
|
91
|
+
'magicLink.error.send': string;
|
|
92
|
+
'magicLink.error.auth': string;
|
|
93
|
+
'signup.heading': string;
|
|
94
|
+
'signup.submit': string;
|
|
95
|
+
'signup.successHeading': string;
|
|
96
|
+
/** Interpolates {email}. */
|
|
97
|
+
'signup.successDescription': string;
|
|
98
|
+
'signup.loginPrompt': string;
|
|
99
|
+
'signup.loginLink': string;
|
|
100
|
+
'signup.error.create': string;
|
|
101
|
+
'passkey.loginButton': string;
|
|
102
|
+
'passkey.createHeading': string;
|
|
103
|
+
'passkey.createPrompt': string;
|
|
104
|
+
'passkey.createLink': string;
|
|
105
|
+
'passkey.requestDescription': string;
|
|
106
|
+
'passkey.requestSubmit': string;
|
|
107
|
+
'passkey.sentHeading': string;
|
|
108
|
+
/** Interpolates {email}. */
|
|
109
|
+
'passkey.sentDescription': string;
|
|
110
|
+
/** Heading while the browser ceremony is in flight. */
|
|
111
|
+
'passkey.settingUpHeading': string;
|
|
112
|
+
/** Heading once the ceremony has failed. */
|
|
113
|
+
'passkey.setupHeading': string;
|
|
114
|
+
'passkey.signInNow': string;
|
|
115
|
+
'passkey.requestNewLink': string;
|
|
116
|
+
'passkey.setupDescription': string;
|
|
117
|
+
'passkey.setupSuccessHeading': string;
|
|
118
|
+
'passkey.setupSuccessDescription': string;
|
|
119
|
+
'passkey.error.cancelled': string;
|
|
120
|
+
/** Login ceremony aborted — distinct from `cancelled`, which is setup. */
|
|
121
|
+
'passkey.error.authCancelled': string;
|
|
122
|
+
'passkey.error.setupFailed': string;
|
|
123
|
+
'passkey.error.expired': string;
|
|
124
|
+
'passkey.error.unsupported': string;
|
|
125
|
+
'passkey.error.auth': string;
|
|
126
|
+
'passkey.error.setup': string;
|
|
127
|
+
'passkey.error.verify': string;
|
|
128
|
+
'passkey.error.sendLink': string;
|
|
129
|
+
'mfa.challengeHeading': string;
|
|
130
|
+
'mfa.submit': string;
|
|
131
|
+
'mfa.useRecoveryCode': string;
|
|
132
|
+
'mfa.useAuthenticationCode': string;
|
|
133
|
+
'mfa.recoverSubmit': string;
|
|
134
|
+
'mfa.resendPrompt': string;
|
|
135
|
+
/** Interpolates {seconds}. Carries the prompt too, so word order stays free. */
|
|
136
|
+
'mfa.resendCountdown': string;
|
|
137
|
+
'mfa.error.invalidCode': string;
|
|
138
|
+
'mfa.error.invalidRecoveryCode': string;
|
|
139
|
+
'mfa.error.resend': string;
|
|
140
|
+
'mfaSetup.heading': string;
|
|
141
|
+
'mfaSetup.phoneDescription': string;
|
|
142
|
+
'mfaSetup.sendCode': string;
|
|
143
|
+
'mfaSetup.verifyDescription': string;
|
|
144
|
+
'mfaSetup.verify': string;
|
|
145
|
+
'mfaSetup.changePhone': string;
|
|
146
|
+
'mfaSetup.backupDescription': string;
|
|
147
|
+
'mfaSetup.successHeading': string;
|
|
148
|
+
'mfaSetup.error.sendCode': string;
|
|
149
|
+
'mfaSetup.error.resend': string;
|
|
150
|
+
}
|
|
151
|
+
export type MessageKey = keyof Messages;
|
|
152
|
+
/**
|
|
153
|
+
* English. This is the fallback for everything: an unknown locale, and an
|
|
154
|
+
* unknown key within a known locale, both land here. A raw key must never
|
|
155
|
+
* reach the screen.
|
|
156
|
+
*/
|
|
157
|
+
export declare const en: Messages;
|
|
158
|
+
/**
|
|
159
|
+
* Swedish. Reviewed-locale status: this and `en` are the two locales shipping
|
|
160
|
+
* in v1 (owner decision 2026-09-11) precisely because they can be checked here.
|
|
161
|
+
* The remaining ten NorthWhistle needs — da, de, es, fi, fr, it, nb, nl, pl, pt
|
|
162
|
+
* — are a data-only follow-up requiring no code change: drop another `Messages`
|
|
163
|
+
* object into `LOCALES` below.
|
|
164
|
+
*/
|
|
165
|
+
export declare const sv: Messages;
|
|
166
|
+
/** Locales shipping with the package. Adding one is data-only. */
|
|
167
|
+
export declare const LOCALES: Record<string, Messages>;
|
|
168
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/i18n/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message catalogue for the SDK auth components (TBP-630).
|
|
3
|
+
*
|
|
4
|
+
* Lives in auth-core, not in a framework package, so bridge-svelte, -react,
|
|
5
|
+
* -angular and -nextjs resolve identical copy instead of drifting into four
|
|
6
|
+
* slightly different logins. The strings are framework-agnostic; only the
|
|
7
|
+
* rendering is not.
|
|
8
|
+
*
|
|
9
|
+
* ## Where the line sits
|
|
10
|
+
*
|
|
11
|
+
* Bridge owns the MECHANICS and translates them: what a field is, what a button
|
|
12
|
+
* does, what went wrong, what succeeded. Those are facts about how the auth flow
|
|
13
|
+
* works, identical for every tenant, and no consuming app should be rewriting
|
|
14
|
+
* them.
|
|
15
|
+
*
|
|
16
|
+
* The consuming app owns VOICE and CONTEXT: the page title, the subtitle,
|
|
17
|
+
* anything naming the product or explaining why the user is on this screen.
|
|
18
|
+
* Bridge cannot know those — hence `heading={null}` / `description={null}`
|
|
19
|
+
* (TBP-631) rather than catalogue entries.
|
|
20
|
+
*
|
|
21
|
+
* ## Keys are flat and dotted
|
|
22
|
+
*
|
|
23
|
+
* `login.email`, not a nested object. A flat map makes the override prop a
|
|
24
|
+
* plain `Partial<Messages>`, keeps lookup a single property access with no
|
|
25
|
+
* traversal, and means a typo in a key is a TypeScript error rather than a
|
|
26
|
+
* silent `undefined` at render time.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* English. This is the fallback for everything: an unknown locale, and an
|
|
30
|
+
* unknown key within a known locale, both land here. A raw key must never
|
|
31
|
+
* reach the screen.
|
|
32
|
+
*/
|
|
33
|
+
export const en = {
|
|
34
|
+
'field.email': 'Email',
|
|
35
|
+
'field.password': 'Password',
|
|
36
|
+
'field.newPassword': 'New password',
|
|
37
|
+
'field.confirmPassword': 'Confirm password',
|
|
38
|
+
'field.firstName': 'First name',
|
|
39
|
+
'field.lastName': 'Last name',
|
|
40
|
+
'field.phoneNumber': 'Phone number',
|
|
41
|
+
'field.verificationCode': 'Verification code',
|
|
42
|
+
'field.authenticationCode': 'Authentication code',
|
|
43
|
+
'field.recoveryCode': 'Recovery code',
|
|
44
|
+
'placeholder.email': 'you@example.com',
|
|
45
|
+
'placeholder.password': 'Enter your password',
|
|
46
|
+
'placeholder.newPassword': 'At least 8 characters',
|
|
47
|
+
'placeholder.confirmPassword': 'Repeat password',
|
|
48
|
+
'placeholder.firstName': 'First name',
|
|
49
|
+
'placeholder.lastName': 'Last name',
|
|
50
|
+
// TBP-630 — was the US-format `+1 (555) 000-0000`, shown to every European
|
|
51
|
+
// workspace. A format hint that is wrong for most of the audience is worse
|
|
52
|
+
// than none, and the field already has a label.
|
|
53
|
+
'placeholder.phoneNumber': '',
|
|
54
|
+
'placeholder.sixDigitCode': 'Enter 6-digit code',
|
|
55
|
+
'placeholder.recoveryCode': 'Enter recovery code',
|
|
56
|
+
'action.showPassword': 'Show password',
|
|
57
|
+
'action.hidePassword': 'Hide password',
|
|
58
|
+
'action.showPasswords': 'Show passwords',
|
|
59
|
+
'action.hidePasswords': 'Hide passwords',
|
|
60
|
+
'action.backToLogin': 'Back to login',
|
|
61
|
+
'action.backToSignIn': 'Back to sign in',
|
|
62
|
+
'action.resendCode': 'Resend code',
|
|
63
|
+
'action.copy': 'Copy',
|
|
64
|
+
'action.copied': 'Copied!',
|
|
65
|
+
'action.tryAgain': 'Try again',
|
|
66
|
+
'action.done': 'Done',
|
|
67
|
+
'divider.or': 'or',
|
|
68
|
+
'login.heading': 'Log in to your account',
|
|
69
|
+
'login.submit': 'Sign in',
|
|
70
|
+
'login.submitting': 'Signing in…',
|
|
71
|
+
'login.forgotPassword': 'Forgot password?',
|
|
72
|
+
'login.magicLink': 'Sign in with Magic Link',
|
|
73
|
+
'login.signupPrompt': "Don't have an account?",
|
|
74
|
+
'login.signupLink': 'Sign up',
|
|
75
|
+
'login.error.invalidCredentials': 'Invalid email or password.',
|
|
76
|
+
'forgot.headingRequest': 'Reset your password',
|
|
77
|
+
'forgot.headingSet': 'Set new password',
|
|
78
|
+
'forgot.description': "Enter your email and we'll send you a link to reset your password.",
|
|
79
|
+
'forgot.submit': 'Send reset link',
|
|
80
|
+
'forgot.setSubmit': 'Set a password',
|
|
81
|
+
'forgot.emailSent': 'Check your email for a password reset link.',
|
|
82
|
+
'forgot.successHeading': 'Password set',
|
|
83
|
+
'forgot.error.send': 'Failed to send reset link.',
|
|
84
|
+
'forgot.error.update': 'Failed to update password.',
|
|
85
|
+
'forgot.error.mismatch': 'Passwords do not match.',
|
|
86
|
+
'forgot.error.tooShort': 'Password must be at least 8 characters.',
|
|
87
|
+
'magicLink.heading': 'Sign in with email link',
|
|
88
|
+
'magicLink.description': "Enter your email and we'll send you a sign-in link. No password needed.",
|
|
89
|
+
'magicLink.submit': 'Send magic link',
|
|
90
|
+
'magicLink.sent': 'Check your email — link expires in {expiry}.',
|
|
91
|
+
'magicLink.expiryMinute': '{count} minute',
|
|
92
|
+
'magicLink.expiryMinutes': '{count} minutes',
|
|
93
|
+
'magicLink.expirySeconds': '{count} seconds',
|
|
94
|
+
'magicLink.error.send': 'Failed to send magic link.',
|
|
95
|
+
'magicLink.error.auth': 'Magic link authentication failed.',
|
|
96
|
+
'signup.heading': 'Create your account',
|
|
97
|
+
'signup.submit': 'Sign up',
|
|
98
|
+
'signup.successHeading': 'Check your email',
|
|
99
|
+
'signup.successDescription': 'We sent a verification link to {email}. Check your inbox to activate your account.',
|
|
100
|
+
'signup.loginPrompt': 'Already have an account?',
|
|
101
|
+
'signup.loginLink': 'Log in',
|
|
102
|
+
'signup.error.create': 'Failed to create account.',
|
|
103
|
+
'passkey.loginButton': 'Sign in with Passkeys',
|
|
104
|
+
'passkey.createHeading': 'Create a passkey',
|
|
105
|
+
'passkey.createPrompt': "Don't have a passkey?",
|
|
106
|
+
'passkey.createLink': 'Create one.',
|
|
107
|
+
'passkey.requestDescription': 'Enter your email and we will send a link to create your passkey.',
|
|
108
|
+
'passkey.requestSubmit': 'Send setup link',
|
|
109
|
+
'passkey.sentHeading': 'Check your email',
|
|
110
|
+
'passkey.sentDescription': 'We sent a passkey setup link to {email}. Please check your inbox and click the link to create your passkey and finish signing in.',
|
|
111
|
+
'passkey.settingUpHeading': 'Setting up passkey',
|
|
112
|
+
'passkey.setupHeading': 'Passkey setup',
|
|
113
|
+
'passkey.signInNow': 'Sign in now',
|
|
114
|
+
'passkey.requestNewLink': 'Request new setup link',
|
|
115
|
+
'passkey.setupDescription': 'Follow the prompt from your browser or device to complete passkey setup.',
|
|
116
|
+
'passkey.setupSuccessHeading': 'Passkey created',
|
|
117
|
+
'passkey.setupSuccessDescription': 'Your passkey has been created.',
|
|
118
|
+
'passkey.error.cancelled': 'Passkey setup was cancelled.',
|
|
119
|
+
'passkey.error.authCancelled': 'Passkey authentication was cancelled.',
|
|
120
|
+
'passkey.error.setupFailed': 'Passkey setup failed.',
|
|
121
|
+
'passkey.error.expired': 'This setup link has expired or is invalid.',
|
|
122
|
+
'passkey.error.unsupported': 'Your browser does not support passkeys.',
|
|
123
|
+
'passkey.error.auth': 'Passkey authentication failed.',
|
|
124
|
+
'passkey.error.setup': 'An error occurred during passkey setup.',
|
|
125
|
+
'passkey.error.verify': 'Passkey registration could not be verified.',
|
|
126
|
+
'passkey.error.sendLink': 'Failed to send setup link.',
|
|
127
|
+
'mfa.challengeHeading': 'Two-factor authentication',
|
|
128
|
+
'mfa.submit': 'Verify',
|
|
129
|
+
'mfa.useRecoveryCode': 'Use recovery code',
|
|
130
|
+
'mfa.useAuthenticationCode': 'Use authentication code',
|
|
131
|
+
'mfa.recoverSubmit': 'Recover',
|
|
132
|
+
'mfa.resendPrompt': "Didn't get your text message?",
|
|
133
|
+
'mfa.resendCountdown': "Didn't get your text message? You can resend in {seconds}s.",
|
|
134
|
+
'mfa.error.invalidCode': 'Invalid code. Please try again.',
|
|
135
|
+
'mfa.error.invalidRecoveryCode': 'Invalid recovery code.',
|
|
136
|
+
'mfa.error.resend': 'Failed to resend code.',
|
|
137
|
+
'mfaSetup.heading': 'Set up two-factor authentication',
|
|
138
|
+
'mfaSetup.phoneDescription': 'Enter your phone number to receive a verification code via SMS.',
|
|
139
|
+
'mfaSetup.sendCode': 'Send code',
|
|
140
|
+
'mfaSetup.verifyDescription': 'Enter the 6-digit code sent to your phone.',
|
|
141
|
+
'mfaSetup.verify': 'Verify',
|
|
142
|
+
'mfaSetup.changePhone': 'Change phone number',
|
|
143
|
+
'mfaSetup.backupDescription': 'Save this recovery code in a safe place. You can use it to access your account if you lose your phone.',
|
|
144
|
+
'mfaSetup.successHeading': 'Two-factor authentication enabled!',
|
|
145
|
+
'mfaSetup.error.sendCode': 'Failed to send verification code.',
|
|
146
|
+
'mfaSetup.error.resend': 'Failed to resend verification code.',
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* Swedish. Reviewed-locale status: this and `en` are the two locales shipping
|
|
150
|
+
* in v1 (owner decision 2026-09-11) precisely because they can be checked here.
|
|
151
|
+
* The remaining ten NorthWhistle needs — da, de, es, fi, fr, it, nb, nl, pl, pt
|
|
152
|
+
* — are a data-only follow-up requiring no code change: drop another `Messages`
|
|
153
|
+
* object into `LOCALES` below.
|
|
154
|
+
*/
|
|
155
|
+
export const sv = {
|
|
156
|
+
'field.email': 'E-post',
|
|
157
|
+
'field.password': 'Lösenord',
|
|
158
|
+
'field.newPassword': 'Nytt lösenord',
|
|
159
|
+
'field.confirmPassword': 'Bekräfta lösenord',
|
|
160
|
+
'field.firstName': 'Förnamn',
|
|
161
|
+
'field.lastName': 'Efternamn',
|
|
162
|
+
'field.phoneNumber': 'Telefonnummer',
|
|
163
|
+
'field.verificationCode': 'Verifieringskod',
|
|
164
|
+
'field.authenticationCode': 'Autentiseringskod',
|
|
165
|
+
'field.recoveryCode': 'Återställningskod',
|
|
166
|
+
'placeholder.email': 'du@exempel.se',
|
|
167
|
+
'placeholder.password': 'Ange ditt lösenord',
|
|
168
|
+
'placeholder.newPassword': 'Minst 8 tecken',
|
|
169
|
+
'placeholder.confirmPassword': 'Upprepa lösenordet',
|
|
170
|
+
'placeholder.firstName': 'Förnamn',
|
|
171
|
+
'placeholder.lastName': 'Efternamn',
|
|
172
|
+
'placeholder.phoneNumber': '',
|
|
173
|
+
'placeholder.sixDigitCode': 'Ange 6-siffrig kod',
|
|
174
|
+
'placeholder.recoveryCode': 'Ange återställningskod',
|
|
175
|
+
'action.showPassword': 'Visa lösenord',
|
|
176
|
+
'action.hidePassword': 'Dölj lösenord',
|
|
177
|
+
'action.showPasswords': 'Visa lösenord',
|
|
178
|
+
'action.hidePasswords': 'Dölj lösenord',
|
|
179
|
+
'action.backToLogin': 'Tillbaka till inloggningen',
|
|
180
|
+
'action.backToSignIn': 'Tillbaka till inloggningen',
|
|
181
|
+
'action.resendCode': 'Skicka koden igen',
|
|
182
|
+
'action.copy': 'Kopiera',
|
|
183
|
+
'action.copied': 'Kopierad!',
|
|
184
|
+
'action.tryAgain': 'Försök igen',
|
|
185
|
+
'action.done': 'Klar',
|
|
186
|
+
'divider.or': 'eller',
|
|
187
|
+
'login.heading': 'Logga in på ditt konto',
|
|
188
|
+
'login.submit': 'Logga in',
|
|
189
|
+
'login.submitting': 'Loggar in…',
|
|
190
|
+
'login.forgotPassword': 'Glömt lösenordet?',
|
|
191
|
+
'login.magicLink': 'Logga in med magisk länk',
|
|
192
|
+
'login.signupPrompt': 'Har du inget konto?',
|
|
193
|
+
'login.signupLink': 'Skapa konto',
|
|
194
|
+
'login.error.invalidCredentials': 'Fel e-postadress eller lösenord.',
|
|
195
|
+
'forgot.headingRequest': 'Återställ ditt lösenord',
|
|
196
|
+
'forgot.headingSet': 'Ange nytt lösenord',
|
|
197
|
+
'forgot.description': 'Ange din e-postadress så skickar vi en länk för att återställa lösenordet.',
|
|
198
|
+
'forgot.submit': 'Skicka återställningslänk',
|
|
199
|
+
'forgot.setSubmit': 'Ange ett lösenord',
|
|
200
|
+
'forgot.emailSent': 'Kolla din e-post för en länk att återställa lösenordet.',
|
|
201
|
+
'forgot.successHeading': 'Lösenordet är sparat',
|
|
202
|
+
'forgot.error.send': 'Det gick inte att skicka återställningslänken.',
|
|
203
|
+
'forgot.error.update': 'Det gick inte att uppdatera lösenordet.',
|
|
204
|
+
'forgot.error.mismatch': 'Lösenorden stämmer inte överens.',
|
|
205
|
+
'forgot.error.tooShort': 'Lösenordet måste vara minst 8 tecken.',
|
|
206
|
+
'magicLink.heading': 'Logga in med e-postlänk',
|
|
207
|
+
'magicLink.description': 'Ange din e-postadress så skickar vi en inloggningslänk. Inget lösenord behövs.',
|
|
208
|
+
'magicLink.submit': 'Skicka magisk länk',
|
|
209
|
+
'magicLink.sent': 'Kolla din e-post — länken går ut om {expiry}.',
|
|
210
|
+
'magicLink.expiryMinute': '{count} minut',
|
|
211
|
+
'magicLink.expiryMinutes': '{count} minuter',
|
|
212
|
+
'magicLink.expirySeconds': '{count} sekunder',
|
|
213
|
+
'magicLink.error.send': 'Det gick inte att skicka den magiska länken.',
|
|
214
|
+
'magicLink.error.auth': 'Inloggningen med magisk länk misslyckades.',
|
|
215
|
+
'signup.heading': 'Skapa ditt konto',
|
|
216
|
+
'signup.submit': 'Skapa konto',
|
|
217
|
+
'signup.successHeading': 'Kolla din e-post',
|
|
218
|
+
'signup.successDescription': 'Vi har skickat en verifieringslänk till {email}. Kolla inkorgen för att aktivera ditt konto.',
|
|
219
|
+
'signup.loginPrompt': 'Har du redan ett konto?',
|
|
220
|
+
'signup.loginLink': 'Logga in',
|
|
221
|
+
'signup.error.create': 'Det gick inte att skapa kontot.',
|
|
222
|
+
'passkey.loginButton': 'Logga in med passkey',
|
|
223
|
+
'passkey.createHeading': 'Skapa en passkey',
|
|
224
|
+
'passkey.createPrompt': 'Har du ingen passkey än?',
|
|
225
|
+
'passkey.createLink': 'Skapa en.',
|
|
226
|
+
'passkey.requestDescription': 'Ange din e-postadress så skickar vi en länk för att skapa din passkey.',
|
|
227
|
+
'passkey.requestSubmit': 'Skicka länk',
|
|
228
|
+
'passkey.sentHeading': 'Kolla din e-post',
|
|
229
|
+
'passkey.sentDescription': 'Vi har skickat en länk till {email} för att skapa din passkey. Kolla inkorgen och klicka på länken för att skapa din passkey och slutföra inloggningen.',
|
|
230
|
+
'passkey.settingUpHeading': 'Skapar din passkey',
|
|
231
|
+
'passkey.setupHeading': 'Skapa passkey',
|
|
232
|
+
'passkey.signInNow': 'Logga in nu',
|
|
233
|
+
'passkey.requestNewLink': 'Begär en ny länk',
|
|
234
|
+
'passkey.setupDescription': 'Följ anvisningarna från din webbläsare eller enhet för att slutföra skapandet av din passkey.',
|
|
235
|
+
'passkey.setupSuccessHeading': 'Passkey skapad',
|
|
236
|
+
'passkey.setupSuccessDescription': 'Din passkey har skapats.',
|
|
237
|
+
'passkey.error.cancelled': 'Skapandet av passkey avbröts.',
|
|
238
|
+
'passkey.error.authCancelled': 'Inloggningen med passkey avbröts.',
|
|
239
|
+
'passkey.error.setupFailed': 'Det gick inte att skapa din passkey.',
|
|
240
|
+
'passkey.error.expired': 'Länken har upphört att gälla eller är ogiltig.',
|
|
241
|
+
'passkey.error.unsupported': 'Din webbläsare har inte stöd för passkeys.',
|
|
242
|
+
'passkey.error.auth': 'Inloggningen med passkey misslyckades.',
|
|
243
|
+
'passkey.error.setup': 'Ett fel uppstod när din passkey skulle skapas.',
|
|
244
|
+
'passkey.error.verify': 'Din passkey kunde inte verifieras.',
|
|
245
|
+
'passkey.error.sendLink': 'Det gick inte att skicka länken.',
|
|
246
|
+
'mfa.challengeHeading': 'Tvåfaktorsautentisering',
|
|
247
|
+
'mfa.submit': 'Verifiera',
|
|
248
|
+
'mfa.useRecoveryCode': 'Använd återställningskod',
|
|
249
|
+
'mfa.useAuthenticationCode': 'Använd autentiseringskod',
|
|
250
|
+
'mfa.recoverSubmit': 'Återställ',
|
|
251
|
+
'mfa.resendPrompt': 'Fick du inget SMS?',
|
|
252
|
+
'mfa.resendCountdown': 'Fick du inget SMS? Du kan skicka igen om {seconds} s.',
|
|
253
|
+
'mfa.error.invalidCode': 'Ogiltig kod. Försök igen.',
|
|
254
|
+
'mfa.error.invalidRecoveryCode': 'Ogiltig återställningskod.',
|
|
255
|
+
'mfa.error.resend': 'Det gick inte att skicka koden igen.',
|
|
256
|
+
'mfaSetup.heading': 'Aktivera tvåfaktorsautentisering',
|
|
257
|
+
'mfaSetup.phoneDescription': 'Ange ditt telefonnummer för att få en verifieringskod via SMS.',
|
|
258
|
+
'mfaSetup.sendCode': 'Skicka kod',
|
|
259
|
+
'mfaSetup.verifyDescription': 'Ange den 6-siffriga koden som skickades till din telefon.',
|
|
260
|
+
'mfaSetup.verify': 'Verifiera',
|
|
261
|
+
'mfaSetup.changePhone': 'Byt telefonnummer',
|
|
262
|
+
'mfaSetup.backupDescription': 'Spara den här återställningskoden på ett säkert ställe. Du kan använda den för att komma åt ditt konto om du förlorar din telefon.',
|
|
263
|
+
'mfaSetup.successHeading': 'Tvåfaktorsautentisering aktiverad!',
|
|
264
|
+
'mfaSetup.error.sendCode': 'Det gick inte att skicka verifieringskoden.',
|
|
265
|
+
'mfaSetup.error.resend': 'Det gick inte att skicka verifieringskoden igen.',
|
|
266
|
+
};
|
|
267
|
+
/** Locales shipping with the package. Adding one is data-only. */
|
|
268
|
+
export const LOCALES = { en, sv };
|
|
269
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/i18n/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type MessageKey, type Messages } from './messages.js';
|
|
2
|
+
/**
|
|
3
|
+
* Message resolution for the SDK auth components (TBP-630).
|
|
4
|
+
*
|
|
5
|
+
* ## Synchronous, deliberately
|
|
6
|
+
*
|
|
7
|
+
* These components render during an auth redirect. An async catalogue load
|
|
8
|
+
* would paint English first and then swap — a visible flash on the one screen
|
|
9
|
+
* where the user is already waiting and already unsure. So every locale is
|
|
10
|
+
* bundled and lookup is a property access. The catalogue is small enough that
|
|
11
|
+
* this is cheaper than the machinery to avoid it.
|
|
12
|
+
*
|
|
13
|
+
* ## Resolution order
|
|
14
|
+
*
|
|
15
|
+
* 1. explicit per-key `messages` override
|
|
16
|
+
* 2. requested `locale`
|
|
17
|
+
* 3. English
|
|
18
|
+
*
|
|
19
|
+
* A missing key falls through to English, and a raw key NEVER renders. If the
|
|
20
|
+
* catalogue is wrong, the user sees the wrong language; if it rendered keys,
|
|
21
|
+
* they would see `login.submit` on a button. The first is a defect, the second
|
|
22
|
+
* is a broken product.
|
|
23
|
+
*/
|
|
24
|
+
export type MessageOverrides = Partial<Record<MessageKey, string>>;
|
|
25
|
+
export interface Translator {
|
|
26
|
+
/** Resolve a key, substituting `{name}` placeholders from `vars`. */
|
|
27
|
+
(key: MessageKey, vars?: Record<string, string | number>): string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Substitute `{name}` placeholders.
|
|
31
|
+
*
|
|
32
|
+
* A variable with no matching value is left as its literal placeholder rather
|
|
33
|
+
* than rendered as `undefined`. Neither is good, but `{email}` reads as
|
|
34
|
+
* obviously-missing data while `undefined` reads as a crash.
|
|
35
|
+
*
|
|
36
|
+
* Word order is the translator's business: the whole string is translated with
|
|
37
|
+
* the placeholder in it, so a locale that needs the variable first simply moves
|
|
38
|
+
* it. Nothing here concatenates fragments.
|
|
39
|
+
*/
|
|
40
|
+
export declare function interpolate(template: string, vars?: Record<string, string | number>): string;
|
|
41
|
+
/** True when the locale has a catalogue. Consumers can use this to warn early. */
|
|
42
|
+
export declare function hasLocale(locale: string | null | undefined): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* `sv-SE` → `sv`. Region variants share a catalogue until somebody has a reason
|
|
45
|
+
* to split them; matching `navigator.language` exactly would mean `en-GB` users
|
|
46
|
+
* falling back to... English, and `sv-SE` users falling back to English too,
|
|
47
|
+
* which is the bug.
|
|
48
|
+
*/
|
|
49
|
+
export declare function normalizeLocale(locale: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Build a translator.
|
|
52
|
+
*
|
|
53
|
+
* `locale` unknown → English, no throw. That is a deliberate silent fallback:
|
|
54
|
+
* an app passing `locale="klingon"` should still render a usable login form,
|
|
55
|
+
* and a hard failure on the auth screen locks everybody out over a typo.
|
|
56
|
+
*/
|
|
57
|
+
export declare function createTranslator(args?: {
|
|
58
|
+
locale?: string | null;
|
|
59
|
+
messages?: MessageOverrides;
|
|
60
|
+
}): Translator;
|
|
61
|
+
export type { MessageKey, Messages };
|
|
62
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/i18n/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AAEnE,MAAM,WAAW,UAAU;IACzB,qEAAqE;IACrE,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;CACnE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GACrC,MAAM,CAKR;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B,GAAG,UAAU,CASb;AAED,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { en, LOCALES } from './messages.js';
|
|
2
|
+
/**
|
|
3
|
+
* Substitute `{name}` placeholders.
|
|
4
|
+
*
|
|
5
|
+
* A variable with no matching value is left as its literal placeholder rather
|
|
6
|
+
* than rendered as `undefined`. Neither is good, but `{email}` reads as
|
|
7
|
+
* obviously-missing data while `undefined` reads as a crash.
|
|
8
|
+
*
|
|
9
|
+
* Word order is the translator's business: the whole string is translated with
|
|
10
|
+
* the placeholder in it, so a locale that needs the variable first simply moves
|
|
11
|
+
* it. Nothing here concatenates fragments.
|
|
12
|
+
*/
|
|
13
|
+
export function interpolate(template, vars) {
|
|
14
|
+
if (!vars)
|
|
15
|
+
return template;
|
|
16
|
+
return template.replace(/\{(\w+)\}/g, (match, name) => name in vars ? String(vars[name]) : match);
|
|
17
|
+
}
|
|
18
|
+
/** True when the locale has a catalogue. Consumers can use this to warn early. */
|
|
19
|
+
export function hasLocale(locale) {
|
|
20
|
+
return !!locale && !!LOCALES[normalizeLocale(locale)];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* `sv-SE` → `sv`. Region variants share a catalogue until somebody has a reason
|
|
24
|
+
* to split them; matching `navigator.language` exactly would mean `en-GB` users
|
|
25
|
+
* falling back to... English, and `sv-SE` users falling back to English too,
|
|
26
|
+
* which is the bug.
|
|
27
|
+
*/
|
|
28
|
+
export function normalizeLocale(locale) {
|
|
29
|
+
return locale.toLowerCase().split(/[-_]/)[0];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Build a translator.
|
|
33
|
+
*
|
|
34
|
+
* `locale` unknown → English, no throw. That is a deliberate silent fallback:
|
|
35
|
+
* an app passing `locale="klingon"` should still render a usable login form,
|
|
36
|
+
* and a hard failure on the auth screen locks everybody out over a typo.
|
|
37
|
+
*/
|
|
38
|
+
export function createTranslator(args) {
|
|
39
|
+
const { locale, messages } = args ?? {};
|
|
40
|
+
const catalogue = (locale && LOCALES[normalizeLocale(locale)]) || en;
|
|
41
|
+
return (key, vars) => {
|
|
42
|
+
const template = messages?.[key] ?? catalogue[key] ?? en[key];
|
|
43
|
+
return interpolate(template, vars);
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/i18n/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,OAAO,EAAkC,MAAM,eAAe,CAAC;AA+B5E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,IAAsC;IAEtC,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAC;IAC3B,OAAO,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CAC5D,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAC1C,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,SAAS,CAAC,MAAiC;IACzD,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAGhC;IACC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IACxC,MAAM,SAAS,GACb,CAAC,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAErD,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACnB,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;QAC9D,OAAO,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { loadedInstanceCount, __resetInstanceRegistryForTests, } from './instance-guard.js';
|
|
2
2
|
export { BridgeAuth } from './bridge-auth.js';
|
|
3
|
-
export type { AppConfig, AuthConfigResponse, AuthResult, AuthState, BridgeAuthConfig, BridgeAuthEventName, BridgeAuthEvents, CheckoutSession, CurrentUser, FederationConnection, FlagRequirement, IDToken, MagicLinkResult, MfaResult, NavigationDecision, PasskeyAuthOptions, PasskeyRegistrationOptions, PasskeyVerificationResult, PaymentClaims, Plan, PriceOfferSdk, Profile, ResolvedConfig, RouteGuard, RouteGuardConfig, RouteRule, SessionStalePayload, SignupResult, SsoOptions, SsoResult, SubscriptionStatus, TenantUser, TokenSet, TokenStorage, Workspace, } from './types.js';
|
|
3
|
+
export type { AppConfig, AuthConfigResponse, AuthResult, AuthState, BridgeAuthConfig, BridgeAuthEventName, BridgeAuthEvents, CheckoutSession, CurrentUser, FederationConnection, FlagRequirement, IDToken, MagicLinkResult, MfaResult, NavigationDecision, PasskeyAuthOptions, PasskeyRegistrationOptions, PasskeyVerificationResult, PaymentClaims, Plan, PriceOfferSdk, Profile, ResolvedConfig, ReturnToConfig, RouteGuard, RouteGuardConfig, RouteRule, SessionStalePayload, SignupResult, SsoOptions, SsoResult, SubscriptionStatus, TenantUser, TokenSet, TokenStorage, Workspace, } from './types.js';
|
|
4
4
|
export { TeamService } from './team-service.js';
|
|
5
5
|
export type { TeamProfile, TeamProfileUpdateInput, TeamUser, TeamUserListResult, TeamUserUpdateInput, TeamWorkspace, TeamWorkspaceUpdateInput, } from './team-types.js';
|
|
6
6
|
export { ApiTokenService } from './api-token-service.js';
|
|
@@ -34,4 +34,9 @@ export { EntitlementsStore } from './billing/entitlements-store.js';
|
|
|
34
34
|
export type { EntitlementSnapshot } from './billing/entitlements-store.js';
|
|
35
35
|
export { deriveNoticeState, deriveSeverity } from './billing/types.js';
|
|
36
36
|
export type { BillingSubscriptionStatus, BillingSeverity, PastDueReason, BillingPlanRef, BillingSubscriptionState, BillingSubscriptionSnapshot, BillingNoticeState, BillingLockedPayload, MountOptions, } from './billing/types.js';
|
|
37
|
+
export { DEFAULT_RETURN_TO_PARAM, RETURN_TO_STORAGE_KEY, readReturnTo, sanitizeReturnTo, stashReturnTo, takeReturnTo, withReturnTo, } from './return-to.js';
|
|
38
|
+
export { createTranslator, hasLocale, interpolate, normalizeLocale, } from './i18n/resolver.js';
|
|
39
|
+
export type { MessageOverrides, Translator } from './i18n/resolver.js';
|
|
40
|
+
export { LOCALES, en, sv } from './i18n/messages.js';
|
|
41
|
+
export type { MessageKey, Messages } from './i18n/messages.js';
|
|
37
42
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -48,4 +48,13 @@ export { QuotaStore } from './billing/quota-store.js';
|
|
|
48
48
|
// Billing 2.0 US-12 — entitlement cache + types.
|
|
49
49
|
export { EntitlementsStore } from './billing/entitlements-store.js';
|
|
50
50
|
export { deriveNoticeState, deriveSeverity } from './billing/types.js';
|
|
51
|
+
// TBP-629 — deep-link preservation for SDK-mode route guards. Exported so a
|
|
52
|
+
// consumer's login page can read the return target back with the validation
|
|
53
|
+
// already applied, rather than each app reinventing the open-redirect check.
|
|
54
|
+
export { DEFAULT_RETURN_TO_PARAM, RETURN_TO_STORAGE_KEY, readReturnTo, sanitizeReturnTo, stashReturnTo, takeReturnTo, withReturnTo, } from './return-to.js';
|
|
55
|
+
// TBP-630 — SDK auth message catalogue. Lives in core so bridge-svelte,
|
|
56
|
+
// -react, -angular and -nextjs resolve identical copy rather than drifting
|
|
57
|
+
// into four slightly different logins.
|
|
58
|
+
export { createTranslator, hasLocale, interpolate, normalizeLocale, } from './i18n/resolver.js';
|
|
59
|
+
export { LOCALES, en, sv } from './i18n/messages.js';
|
|
51
60
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,gBAAgB,EAAE,CAAC;AAEnB,OAAO,EACL,mBAAmB,EACnB,+BAA+B,GAChC,MAAM,qBAAqB,CAAC;AAE7B,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,gBAAgB,EAAE,CAAC;AAEnB,OAAO,EACL,mBAAmB,EACnB,+BAA+B,GAChC,MAAM,qBAAqB,CAAC;AAE7B,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AA0C9C,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAWhD,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAQzD,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE7E,8CAA8C;AAC9C,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExE,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEtG,yCAAyC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAgC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,+EAA+E;AAC/E,6EAA6E;AAC7E,0EAA0E;AAC1E,iEAAiE;AACjE,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,uBAAuB,EACvB,UAAU,EACV,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,MAAM,EACN,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAoD1B,+EAA+E;AAC/E,2EAA2E;AAC3E,4DAA4D;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAOpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,iDAAiD;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAavE,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,YAAY,GACb,MAAM,gBAAgB,CAAC;AAExB,wEAAwE;AACxE,2EAA2E;AAC3E,uCAAuC;AACvC,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Return-to handling for the SDK-mode route guard (TBP-629).
|
|
3
|
+
*
|
|
4
|
+
* When the guard turns an unauthenticated visitor away from a protected route,
|
|
5
|
+
* the path they asked for has to survive the trip through the login page or the
|
|
6
|
+
* deep link is lost. In SDK mode that means carrying it as a query parameter on
|
|
7
|
+
* the consumer's own login route.
|
|
8
|
+
*
|
|
9
|
+
* A query parameter is the deliberate choice over sessionStorage. Storage has a
|
|
10
|
+
* smaller attack surface — nothing attacker-controllable ever enters the URL —
|
|
11
|
+
* but it does not survive a cross-tab click, and a link mailed to somebody and
|
|
12
|
+
* opened in a fresh tab is the exact case that prompted this. Storage would
|
|
13
|
+
* silently fail at the only job it was hired for.
|
|
14
|
+
*
|
|
15
|
+
* The cost of that choice is that the value is attacker-controllable, so it is
|
|
16
|
+
* untrusted input and this module treats it as such. Consumers should not have
|
|
17
|
+
* to know that: {@link sanitizeReturnTo} is applied on the way in AND on the way
|
|
18
|
+
* out, so a hostile value cannot reach a navigation call even if a consumer
|
|
19
|
+
* forgets to check.
|
|
20
|
+
*/
|
|
21
|
+
/** Query parameter carrying the return target. Matches hosted mode's `redirectUri`
|
|
22
|
+
* vocabulary on purpose, so consumers do not learn a second name for one idea. */
|
|
23
|
+
export declare const DEFAULT_RETURN_TO_PARAM = "redirectUri";
|
|
24
|
+
/**
|
|
25
|
+
* Reduce an untrusted return target to a same-origin path, or null.
|
|
26
|
+
*
|
|
27
|
+
* Only same-origin, path-absolute targets survive. Everything else is rejected
|
|
28
|
+
* rather than repaired — a value we have to fix up is a value we do not
|
|
29
|
+
* understand, and "understood well enough to edit" is how open redirects get
|
|
30
|
+
* shipped.
|
|
31
|
+
*
|
|
32
|
+
* Rejected, and why each one matters:
|
|
33
|
+
*
|
|
34
|
+
* | Input | Why |
|
|
35
|
+
* |---|---|
|
|
36
|
+
* | `https://evil.test/x` | absolute URL — classic open redirect |
|
|
37
|
+
* | `//evil.test/x` | protocol-relative; browsers treat it as absolute |
|
|
38
|
+
* | `/\evil.test` , `\\evil.test` | browsers normalise `\` to `/`, so this IS protocol-relative |
|
|
39
|
+
* | `javascript:alert(1)` | scheme payload; no leading `/` so it fails anyway, rejected explicitly for clarity |
|
|
40
|
+
* | `x/y` | relative — resolves against whatever page it lands on, so the destination is not knowable here |
|
|
41
|
+
* | anything with CR/LF/TAB/NUL | header and URL smuggling |
|
|
42
|
+
*
|
|
43
|
+
* Note `/\` and `\\` are checked on the RAW string before any normalisation.
|
|
44
|
+
* Checking after normalising would be checking the wrong string, which is the
|
|
45
|
+
* usual way this validation is written wrong.
|
|
46
|
+
*/
|
|
47
|
+
export declare function sanitizeReturnTo(value: string | null | undefined): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* Build the login route with the return target attached.
|
|
50
|
+
*
|
|
51
|
+
* Returns `loginRoute` untouched when there is nothing safe to carry, so the
|
|
52
|
+
* caller never has to branch on it. Preserves any query string the consumer
|
|
53
|
+
* already put on their `loginRoute`.
|
|
54
|
+
*/
|
|
55
|
+
export declare function withReturnTo(loginRoute: string, returnTo: string | null | undefined, param?: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Read the return target back off the login page's URL, validated.
|
|
58
|
+
*
|
|
59
|
+
* This is the half consumers would otherwise have to write themselves, and the
|
|
60
|
+
* half where forgetting the validation is an open redirect. Accepts a `URL`, a
|
|
61
|
+
* `URLSearchParams`, or a raw query/href string so it can be called from a load
|
|
62
|
+
* function, a component, or a plain browser context without ceremony.
|
|
63
|
+
*
|
|
64
|
+
* Returns null when absent or unsafe — callers should fall back to their own
|
|
65
|
+
* default route, never navigate to null.
|
|
66
|
+
*/
|
|
67
|
+
export declare function readReturnTo(source: URL | URLSearchParams | string | null | undefined, param?: string): string | null;
|
|
68
|
+
/**
|
|
69
|
+
* Storage key for the hosted-mode return target. Namespaced like the other
|
|
70
|
+
* Bridge-owned sessionStorage entries (`bridge_checkout_session_id`).
|
|
71
|
+
*/
|
|
72
|
+
export declare const RETURN_TO_STORAGE_KEY = "bridge_return_to";
|
|
73
|
+
/**
|
|
74
|
+
* Hosted mode carries the return target in sessionStorage, NOT in the URL
|
|
75
|
+
* (TBP-629).
|
|
76
|
+
*
|
|
77
|
+
* This is not a stylistic difference from SDK mode — it is forced. Hosted login
|
|
78
|
+
* hands `redirectUri` to the OAuth authorize call, and bridge-api validates it
|
|
79
|
+
* with `appConfig.allowedRedirectUris.includes(redirect_uri)`: an exact string
|
|
80
|
+
* match. Appending `?redirectUri=/deep/link` to the callback URL would fail that
|
|
81
|
+
* check and break login outright, so the OAuth contract has to stay byte-for-byte
|
|
82
|
+
* what it is today.
|
|
83
|
+
*
|
|
84
|
+
* sessionStorage is sound here for a reason that does NOT hold in general: the
|
|
85
|
+
* whole round-trip happens in one tab and returns to the origin that wrote the
|
|
86
|
+
* value. The visitor opens the deep link (tab A), we stash and redirect tab A to
|
|
87
|
+
* the hosted portal, they sign in, the portal returns tab A to our callback on
|
|
88
|
+
* our origin — where the value is still sitting.
|
|
89
|
+
*
|
|
90
|
+
* Every failure mode here is "fall back to the default route", never "throw":
|
|
91
|
+
* Safari in private mode throws on setItem, and SSR has no sessionStorage at all.
|
|
92
|
+
* Losing a deep link is the bug we are fixing; breaking login would be worse.
|
|
93
|
+
*/
|
|
94
|
+
export declare function stashReturnTo(value: string | null | undefined): void;
|
|
95
|
+
/**
|
|
96
|
+
* Read and CLEAR the stashed return target. One-shot by design: a value left
|
|
97
|
+
* behind would hijack the next login in this tab, sending somebody to a page
|
|
98
|
+
* they asked for ten minutes ago.
|
|
99
|
+
*
|
|
100
|
+
* Re-sanitized on the way out. The value is same-origin and was sanitized on the
|
|
101
|
+
* way in, so this is belt-and-braces — but it is the difference between "storage
|
|
102
|
+
* was tampered with" being a routing oddity and being an open redirect.
|
|
103
|
+
*/
|
|
104
|
+
export declare function takeReturnTo(): string | null;
|
|
105
|
+
//# sourceMappingURL=return-to.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"return-to.d.ts","sourceRoot":"","sources":["../src/return-to.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;mFACmF;AACnF,eAAO,MAAM,uBAAuB,gBAAgB,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CA0BhF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,KAAK,GAAE,MAAgC,GACtC,MAAM,CAMR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,GAAG,GAAG,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACzD,KAAK,GAAE,MAAgC,GACtC,MAAM,GAAG,IAAI,CAoBf;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CASpE;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAS5C"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Return-to handling for the SDK-mode route guard (TBP-629).
|
|
3
|
+
*
|
|
4
|
+
* When the guard turns an unauthenticated visitor away from a protected route,
|
|
5
|
+
* the path they asked for has to survive the trip through the login page or the
|
|
6
|
+
* deep link is lost. In SDK mode that means carrying it as a query parameter on
|
|
7
|
+
* the consumer's own login route.
|
|
8
|
+
*
|
|
9
|
+
* A query parameter is the deliberate choice over sessionStorage. Storage has a
|
|
10
|
+
* smaller attack surface — nothing attacker-controllable ever enters the URL —
|
|
11
|
+
* but it does not survive a cross-tab click, and a link mailed to somebody and
|
|
12
|
+
* opened in a fresh tab is the exact case that prompted this. Storage would
|
|
13
|
+
* silently fail at the only job it was hired for.
|
|
14
|
+
*
|
|
15
|
+
* The cost of that choice is that the value is attacker-controllable, so it is
|
|
16
|
+
* untrusted input and this module treats it as such. Consumers should not have
|
|
17
|
+
* to know that: {@link sanitizeReturnTo} is applied on the way in AND on the way
|
|
18
|
+
* out, so a hostile value cannot reach a navigation call even if a consumer
|
|
19
|
+
* forgets to check.
|
|
20
|
+
*/
|
|
21
|
+
/** Query parameter carrying the return target. Matches hosted mode's `redirectUri`
|
|
22
|
+
* vocabulary on purpose, so consumers do not learn a second name for one idea. */
|
|
23
|
+
export const DEFAULT_RETURN_TO_PARAM = 'redirectUri';
|
|
24
|
+
/**
|
|
25
|
+
* Reduce an untrusted return target to a same-origin path, or null.
|
|
26
|
+
*
|
|
27
|
+
* Only same-origin, path-absolute targets survive. Everything else is rejected
|
|
28
|
+
* rather than repaired — a value we have to fix up is a value we do not
|
|
29
|
+
* understand, and "understood well enough to edit" is how open redirects get
|
|
30
|
+
* shipped.
|
|
31
|
+
*
|
|
32
|
+
* Rejected, and why each one matters:
|
|
33
|
+
*
|
|
34
|
+
* | Input | Why |
|
|
35
|
+
* |---|---|
|
|
36
|
+
* | `https://evil.test/x` | absolute URL — classic open redirect |
|
|
37
|
+
* | `//evil.test/x` | protocol-relative; browsers treat it as absolute |
|
|
38
|
+
* | `/\evil.test` , `\\evil.test` | browsers normalise `\` to `/`, so this IS protocol-relative |
|
|
39
|
+
* | `javascript:alert(1)` | scheme payload; no leading `/` so it fails anyway, rejected explicitly for clarity |
|
|
40
|
+
* | `x/y` | relative — resolves against whatever page it lands on, so the destination is not knowable here |
|
|
41
|
+
* | anything with CR/LF/TAB/NUL | header and URL smuggling |
|
|
42
|
+
*
|
|
43
|
+
* Note `/\` and `\\` are checked on the RAW string before any normalisation.
|
|
44
|
+
* Checking after normalising would be checking the wrong string, which is the
|
|
45
|
+
* usual way this validation is written wrong.
|
|
46
|
+
*/
|
|
47
|
+
export function sanitizeReturnTo(value) {
|
|
48
|
+
if (typeof value !== 'string')
|
|
49
|
+
return null;
|
|
50
|
+
const raw = value.trim();
|
|
51
|
+
if (raw.length === 0)
|
|
52
|
+
return null;
|
|
53
|
+
// Control characters anywhere — smuggling vectors, never legitimate in a path.
|
|
54
|
+
// Written as escapes, not literal bytes: a raw NUL in a source file is a hazard
|
|
55
|
+
// in its own right.
|
|
56
|
+
// eslint-disable-next-line no-control-regex
|
|
57
|
+
if (/[\u0000-\u001f\u007f]/.test(raw))
|
|
58
|
+
return null;
|
|
59
|
+
// Must be path-absolute. This alone kills `javascript:`, `data:`, `https://…`
|
|
60
|
+
// and every relative form, but the explicit cases below are what a reader
|
|
61
|
+
// checks this function against.
|
|
62
|
+
if (!raw.startsWith('/'))
|
|
63
|
+
return null;
|
|
64
|
+
// Protocol-relative, in both spellings the browser accepts.
|
|
65
|
+
if (raw.startsWith('//') || raw.startsWith('/\\'))
|
|
66
|
+
return null;
|
|
67
|
+
// A backslash anywhere in the authority position is the same trick with an
|
|
68
|
+
// extra step; reject the character outright rather than reasoning about where
|
|
69
|
+
// it is safe.
|
|
70
|
+
if (raw.includes('\\'))
|
|
71
|
+
return null;
|
|
72
|
+
return raw;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Build the login route with the return target attached.
|
|
76
|
+
*
|
|
77
|
+
* Returns `loginRoute` untouched when there is nothing safe to carry, so the
|
|
78
|
+
* caller never has to branch on it. Preserves any query string the consumer
|
|
79
|
+
* already put on their `loginRoute`.
|
|
80
|
+
*/
|
|
81
|
+
export function withReturnTo(loginRoute, returnTo, param = DEFAULT_RETURN_TO_PARAM) {
|
|
82
|
+
const safe = sanitizeReturnTo(returnTo);
|
|
83
|
+
if (!safe)
|
|
84
|
+
return loginRoute;
|
|
85
|
+
const separator = loginRoute.includes('?') ? '&' : '?';
|
|
86
|
+
return `${loginRoute}${separator}${param}=${encodeURIComponent(safe)}`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Read the return target back off the login page's URL, validated.
|
|
90
|
+
*
|
|
91
|
+
* This is the half consumers would otherwise have to write themselves, and the
|
|
92
|
+
* half where forgetting the validation is an open redirect. Accepts a `URL`, a
|
|
93
|
+
* `URLSearchParams`, or a raw query/href string so it can be called from a load
|
|
94
|
+
* function, a component, or a plain browser context without ceremony.
|
|
95
|
+
*
|
|
96
|
+
* Returns null when absent or unsafe — callers should fall back to their own
|
|
97
|
+
* default route, never navigate to null.
|
|
98
|
+
*/
|
|
99
|
+
export function readReturnTo(source, param = DEFAULT_RETURN_TO_PARAM) {
|
|
100
|
+
if (!source)
|
|
101
|
+
return null;
|
|
102
|
+
let params;
|
|
103
|
+
if (source instanceof URLSearchParams) {
|
|
104
|
+
params = source;
|
|
105
|
+
}
|
|
106
|
+
else if (typeof source === 'string') {
|
|
107
|
+
try {
|
|
108
|
+
// Works for a full href, and for a bare "?a=b" or "a=b".
|
|
109
|
+
params = source.includes('://')
|
|
110
|
+
? new URL(source).searchParams
|
|
111
|
+
: new URLSearchParams(source.startsWith('?') ? source.slice(1) : source);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
params = source.searchParams;
|
|
119
|
+
}
|
|
120
|
+
return sanitizeReturnTo(params.get(param));
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Storage key for the hosted-mode return target. Namespaced like the other
|
|
124
|
+
* Bridge-owned sessionStorage entries (`bridge_checkout_session_id`).
|
|
125
|
+
*/
|
|
126
|
+
export const RETURN_TO_STORAGE_KEY = 'bridge_return_to';
|
|
127
|
+
/**
|
|
128
|
+
* Hosted mode carries the return target in sessionStorage, NOT in the URL
|
|
129
|
+
* (TBP-629).
|
|
130
|
+
*
|
|
131
|
+
* This is not a stylistic difference from SDK mode — it is forced. Hosted login
|
|
132
|
+
* hands `redirectUri` to the OAuth authorize call, and bridge-api validates it
|
|
133
|
+
* with `appConfig.allowedRedirectUris.includes(redirect_uri)`: an exact string
|
|
134
|
+
* match. Appending `?redirectUri=/deep/link` to the callback URL would fail that
|
|
135
|
+
* check and break login outright, so the OAuth contract has to stay byte-for-byte
|
|
136
|
+
* what it is today.
|
|
137
|
+
*
|
|
138
|
+
* sessionStorage is sound here for a reason that does NOT hold in general: the
|
|
139
|
+
* whole round-trip happens in one tab and returns to the origin that wrote the
|
|
140
|
+
* value. The visitor opens the deep link (tab A), we stash and redirect tab A to
|
|
141
|
+
* the hosted portal, they sign in, the portal returns tab A to our callback on
|
|
142
|
+
* our origin — where the value is still sitting.
|
|
143
|
+
*
|
|
144
|
+
* Every failure mode here is "fall back to the default route", never "throw":
|
|
145
|
+
* Safari in private mode throws on setItem, and SSR has no sessionStorage at all.
|
|
146
|
+
* Losing a deep link is the bug we are fixing; breaking login would be worse.
|
|
147
|
+
*/
|
|
148
|
+
export function stashReturnTo(value) {
|
|
149
|
+
const safe = sanitizeReturnTo(value);
|
|
150
|
+
if (!safe)
|
|
151
|
+
return;
|
|
152
|
+
try {
|
|
153
|
+
if (typeof sessionStorage === 'undefined')
|
|
154
|
+
return;
|
|
155
|
+
sessionStorage.setItem(RETURN_TO_STORAGE_KEY, safe);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Private mode / quota / disabled storage — deep link is lost, login is not.
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Read and CLEAR the stashed return target. One-shot by design: a value left
|
|
163
|
+
* behind would hijack the next login in this tab, sending somebody to a page
|
|
164
|
+
* they asked for ten minutes ago.
|
|
165
|
+
*
|
|
166
|
+
* Re-sanitized on the way out. The value is same-origin and was sanitized on the
|
|
167
|
+
* way in, so this is belt-and-braces — but it is the difference between "storage
|
|
168
|
+
* was tampered with" being a routing oddity and being an open redirect.
|
|
169
|
+
*/
|
|
170
|
+
export function takeReturnTo() {
|
|
171
|
+
try {
|
|
172
|
+
if (typeof sessionStorage === 'undefined')
|
|
173
|
+
return null;
|
|
174
|
+
const raw = sessionStorage.getItem(RETURN_TO_STORAGE_KEY);
|
|
175
|
+
sessionStorage.removeItem(RETURN_TO_STORAGE_KEY);
|
|
176
|
+
return sanitizeReturnTo(raw);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=return-to.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"return-to.js","sourceRoot":"","sources":["../src/return-to.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-guard.d.ts","sourceRoot":"","sources":["../src/route-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"route-guard.d.ts","sourceRoot":"","sources":["../src/route-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAGV,cAAc,EACd,UAAU,EACV,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAsBpB,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,gBAAgB,EAC7B,UAAU,EAAE,cAAc,EAC1B,eAAe,EAAE,MAAM,OAAO,EAC9B,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,MAAM,EAC3D,YAAY,EAAE,kBAAkB,EAChC,MAAM,EAAE,MAAM,GACb,UAAU,CAwHZ"}
|
package/dist/route-guard.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { sanitizeReturnTo } from './return-to.js';
|
|
1
2
|
import { useBridge } from './billing/use-bridge.js';
|
|
2
3
|
function escapeRegex(text) {
|
|
3
4
|
return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
@@ -66,9 +67,51 @@ export function createRouteGuard(guardConfig, authConfig, isAuthenticated, creat
|
|
|
66
67
|
function getLoginRedirect() {
|
|
67
68
|
return createLoginUrl();
|
|
68
69
|
}
|
|
69
|
-
|
|
70
|
+
/**
|
|
71
|
+
* TBP-629 — decide what the visitor should be sent back to after logging in.
|
|
72
|
+
*
|
|
73
|
+
* Returns null rather than a best guess whenever the answer is not clearly
|
|
74
|
+
* safe and useful. A null here just means the consumer falls back to its
|
|
75
|
+
* `defaultRedirectRoute`, i.e. exactly the old behaviour, so failing closed
|
|
76
|
+
* costs nothing.
|
|
77
|
+
*
|
|
78
|
+
* The login route excludes itself. Without that, a visitor bounced through
|
|
79
|
+
* `/auth/login` comes back carrying `?redirectUri=/auth/login`, which either
|
|
80
|
+
* loops or strands them on a login form they have already completed — a
|
|
81
|
+
* worse outcome than the bug this is fixing.
|
|
82
|
+
*/
|
|
83
|
+
function resolveReturnTo(attempted) {
|
|
84
|
+
const returnToConfig = guardConfig.returnTo;
|
|
85
|
+
if (returnToConfig?.enabled === false)
|
|
86
|
+
return null;
|
|
87
|
+
const safe = sanitizeReturnTo(attempted);
|
|
88
|
+
if (!safe)
|
|
89
|
+
return null;
|
|
90
|
+
// Compare paths only — a query string must not let `/auth/login?x=1` slip
|
|
91
|
+
// past an exclusion written as `/auth/login`.
|
|
92
|
+
const path = safe.split('?')[0];
|
|
93
|
+
const loginRoute = returnToConfig?.loginRoute;
|
|
94
|
+
if (loginRoute && path === loginRoute.split('?')[0])
|
|
95
|
+
return null;
|
|
96
|
+
const excluded = returnToConfig?.exclude ?? [];
|
|
97
|
+
if (excluded.some((pattern) => toRegExp(pattern).test(path)))
|
|
98
|
+
return null;
|
|
99
|
+
// A public route is never what the guard turned somebody away from, and
|
|
100
|
+
// sending them "back" to one after login is noise.
|
|
101
|
+
if (isPublicRoute(path))
|
|
102
|
+
return null;
|
|
103
|
+
return safe;
|
|
104
|
+
}
|
|
105
|
+
async function getNavigationDecision(pathname, attempted) {
|
|
70
106
|
if (shouldRedirectToLogin(pathname)) {
|
|
71
|
-
|
|
107
|
+
// Fall back to the bare pathname when the caller did not supply the full
|
|
108
|
+
// attempted URL, so older adapters still preserve something useful.
|
|
109
|
+
const returnTo = resolveReturnTo(attempted ?? pathname);
|
|
110
|
+
return {
|
|
111
|
+
type: 'login',
|
|
112
|
+
loginUrl: getLoginRedirect(),
|
|
113
|
+
...(returnTo ? { returnTo } : {}),
|
|
114
|
+
};
|
|
72
115
|
}
|
|
73
116
|
const redirectTo = await checkRouteRestrictions(pathname);
|
|
74
117
|
if (redirectTo) {
|
|
@@ -83,6 +126,7 @@ export function createRouteGuard(guardConfig, authConfig, isAuthenticated, creat
|
|
|
83
126
|
checkRouteRestrictions,
|
|
84
127
|
getLoginRedirect,
|
|
85
128
|
getNavigationDecision,
|
|
129
|
+
resolveReturnTo,
|
|
86
130
|
};
|
|
87
131
|
}
|
|
88
132
|
//# sourceMappingURL=route-guard.js.map
|
package/dist/route-guard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-guard.js","sourceRoot":"","sources":["../src/route-guard.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"route-guard.js","sourceRoot":"","sources":["../src/route-guard.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -204,12 +204,53 @@ export interface RouteRule {
|
|
|
204
204
|
export interface RouteGuardConfig {
|
|
205
205
|
rules: RouteRule[];
|
|
206
206
|
defaultAccess?: 'public' | 'protected';
|
|
207
|
+
/**
|
|
208
|
+
* Deep-link preservation for SDK mode (TBP-629).
|
|
209
|
+
*
|
|
210
|
+
* Without this the guard sends an unauthenticated visitor to the login route
|
|
211
|
+
* and forgets what they asked for, so every protected deep link collapses to
|
|
212
|
+
* `defaultRedirectRoute` after sign-in — silently, with no error.
|
|
213
|
+
*/
|
|
214
|
+
returnTo?: ReturnToConfig;
|
|
215
|
+
}
|
|
216
|
+
export interface ReturnToConfig {
|
|
217
|
+
/**
|
|
218
|
+
* Default true. Set false to keep the pre-TBP-629 behaviour, where every
|
|
219
|
+
* login lands on the app's default route regardless of what was asked for.
|
|
220
|
+
*/
|
|
221
|
+
enabled?: boolean;
|
|
222
|
+
/**
|
|
223
|
+
* Query parameter carrying the attempted path. Defaults to `redirectUri`,
|
|
224
|
+
* matching hosted mode rather than inventing a second vocabulary.
|
|
225
|
+
*/
|
|
226
|
+
param?: string;
|
|
227
|
+
/**
|
|
228
|
+
* Paths that must never become a return target, in addition to the login
|
|
229
|
+
* route itself (which the guard always excludes). Accepts the same
|
|
230
|
+
* string-with-`*` or RegExp forms as `RouteRule.match`.
|
|
231
|
+
*
|
|
232
|
+
* The point is to stop a bounce through an auth screen coming back as
|
|
233
|
+
* `?redirectUri=/auth/login`, which either loops or strands the visitor.
|
|
234
|
+
*/
|
|
235
|
+
exclude?: (string | RegExp)[];
|
|
236
|
+
/**
|
|
237
|
+
* The app's login route, so the guard can exclude it from being its own
|
|
238
|
+
* destination. Framework adapters pass this from their own config; consumers
|
|
239
|
+
* of `createRouteGuard` directly can set it here.
|
|
240
|
+
*/
|
|
241
|
+
loginRoute?: string;
|
|
207
242
|
}
|
|
208
243
|
export type NavigationDecision = {
|
|
209
244
|
type: 'allow';
|
|
210
245
|
} | {
|
|
211
246
|
type: 'login';
|
|
212
247
|
loginUrl: string;
|
|
248
|
+
/**
|
|
249
|
+
* The path+query the visitor was turned away from, sanitized and safe to
|
|
250
|
+
* navigate to, or undefined when there is nothing worth carrying (opted
|
|
251
|
+
* out, excluded, or the attempt was not supplied). TBP-629.
|
|
252
|
+
*/
|
|
253
|
+
returnTo?: string;
|
|
213
254
|
} | {
|
|
214
255
|
type: 'redirect';
|
|
215
256
|
to: string;
|
|
@@ -220,7 +261,14 @@ export interface RouteGuard {
|
|
|
220
261
|
shouldRedirectToLogin(pathname: string): boolean;
|
|
221
262
|
checkRouteRestrictions(pathname: string): Promise<string | null>;
|
|
222
263
|
getLoginRedirect(): string;
|
|
223
|
-
|
|
264
|
+
/**
|
|
265
|
+
* `attempted` is the full path+query the visitor asked for. Optional so the
|
|
266
|
+
* existing single-argument callers keep working unchanged; supplying it is
|
|
267
|
+
* what turns deep-link preservation on.
|
|
268
|
+
*/
|
|
269
|
+
getNavigationDecision(pathname: string, attempted?: string): Promise<NavigationDecision>;
|
|
270
|
+
/** Sanitized return target for a path, or null. Exposed for adapters. */
|
|
271
|
+
resolveReturnTo(attempted: string | null | undefined): string | null;
|
|
224
272
|
}
|
|
225
273
|
/** Token storage interface — pluggable */
|
|
226
274
|
export interface TokenStorage {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IAEd,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;+CAC2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;gDAC4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qDAAqD;IACrD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iFAAiF;IACjF,OAAO,CAAC,EAAE,YAAY,CAAC;IAEvB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,gDAAgD;AAChD,MAAM,WAAW,cAAe,SAAQ,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IACjF,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,6CAA6C;AAC7C,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oCAAoC;AACpC,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,yCAAyC;AACzC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;CACH;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,kGAAkG;IAClG,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,gCAAgC;AAChC,MAAM,MAAM,SAAS,GACjB,iBAAiB,GACjB,uBAAuB,GACvB,cAAc,GACd,oBAAoB,GACpB,kBAAkB,GAClB,eAAe,CAAC;AAEpB,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,uCAAuC;AACvC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,gCAAgC;AAChC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,uBAAuB;AACvB,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,cAAc,GAAG,mBAAmB,GAAG,uBAAuB,GAAG,YAAY,CAAC;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAwB;AACxB,MAAM,MAAM,eAAe,GACvB,MAAM,GACN;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,GACjB;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEtB,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|