@tern-secure/auth 1.0.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/cjs/global.d.js +2 -0
- package/dist/cjs/global.d.js.map +1 -0
- package/dist/cjs/index.js +42 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/instance/TernAuth.js +471 -0
- package/dist/cjs/instance/TernAuth.js.map +1 -0
- package/dist/cjs/instance/TernAuthServer.js +95 -0
- package/dist/cjs/instance/TernAuthServer.js.map +1 -0
- package/dist/cjs/instance/coreApiClient.example.js +96 -0
- package/dist/cjs/instance/coreApiClient.example.js.map +1 -0
- package/dist/cjs/instance/coreApiClient.js +255 -0
- package/dist/cjs/instance/coreApiClient.js.map +1 -0
- package/dist/cjs/instance/events.js +38 -0
- package/dist/cjs/instance/events.js.map +1 -0
- package/dist/cjs/resources/AuthCookieManager.js +89 -0
- package/dist/cjs/resources/AuthCookieManager.js.map +1 -0
- package/dist/cjs/resources/Base.js +125 -0
- package/dist/cjs/resources/Base.js.map +1 -0
- package/dist/cjs/resources/Error.js +31 -0
- package/dist/cjs/resources/Error.js.map +1 -0
- package/dist/cjs/resources/SignIn.js +224 -0
- package/dist/cjs/resources/SignIn.js.map +1 -0
- package/dist/cjs/resources/SignUp.js +43 -0
- package/dist/cjs/resources/SignUp.js.map +1 -0
- package/dist/cjs/resources/index.js +23 -0
- package/dist/cjs/resources/index.js.map +1 -0
- package/dist/cjs/resources/internal.js +33 -0
- package/dist/cjs/resources/internal.js.map +1 -0
- package/dist/cjs/utils/construct.js +174 -0
- package/dist/cjs/utils/construct.js.map +1 -0
- package/dist/cjs/utils/index.js +25 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/querystring.js +70 -0
- package/dist/cjs/utils/querystring.js.map +1 -0
- package/dist/esm/global.d.js +1 -0
- package/dist/esm/global.d.js.map +1 -0
- package/dist/esm/index.js +13 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/instance/TernAuth.js +455 -0
- package/dist/esm/instance/TernAuth.js.map +1 -0
- package/dist/esm/instance/TernAuthServer.js +73 -0
- package/dist/esm/instance/TernAuthServer.js.map +1 -0
- package/dist/esm/instance/coreApiClient.example.js +70 -0
- package/dist/esm/instance/coreApiClient.example.js.map +1 -0
- package/dist/esm/instance/coreApiClient.js +226 -0
- package/dist/esm/instance/coreApiClient.js.map +1 -0
- package/dist/esm/instance/events.js +13 -0
- package/dist/esm/instance/events.js.map +1 -0
- package/dist/esm/resources/AuthCookieManager.js +67 -0
- package/dist/esm/resources/AuthCookieManager.js.map +1 -0
- package/dist/esm/resources/Base.js +101 -0
- package/dist/esm/resources/Base.js.map +1 -0
- package/dist/esm/resources/Error.js +9 -0
- package/dist/esm/resources/Error.js.map +1 -0
- package/dist/esm/resources/SignIn.js +208 -0
- package/dist/esm/resources/SignIn.js.map +1 -0
- package/dist/esm/resources/SignUp.js +19 -0
- package/dist/esm/resources/SignUp.js.map +1 -0
- package/dist/esm/resources/index.js +2 -0
- package/dist/esm/resources/index.js.map +1 -0
- package/dist/esm/resources/internal.js +7 -0
- package/dist/esm/resources/internal.js.map +1 -0
- package/dist/esm/utils/construct.js +143 -0
- package/dist/esm/utils/construct.js.map +1 -0
- package/dist/esm/utils/index.js +3 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/querystring.js +45 -0
- package/dist/esm/utils/querystring.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/instance/TernAuth.d.ts +62 -0
- package/dist/types/instance/TernAuth.d.ts.map +1 -0
- package/dist/types/instance/TernAuthServer.d.ts +32 -0
- package/dist/types/instance/TernAuthServer.d.ts.map +1 -0
- package/dist/types/instance/coreApiClient.d.ts +65 -0
- package/dist/types/instance/coreApiClient.d.ts.map +1 -0
- package/dist/types/instance/coreApiClient.example.d.ts +8 -0
- package/dist/types/instance/coreApiClient.example.d.ts.map +1 -0
- package/dist/types/instance/events.d.ts +27 -0
- package/dist/types/instance/events.d.ts.map +1 -0
- package/dist/types/resources/AuthCookieManager.d.ts +26 -0
- package/dist/types/resources/AuthCookieManager.d.ts.map +1 -0
- package/dist/types/resources/Base.d.ts +40 -0
- package/dist/types/resources/Base.d.ts.map +1 -0
- package/dist/types/resources/Error.d.ts +2 -0
- package/dist/types/resources/Error.d.ts.map +1 -0
- package/dist/types/resources/SignIn.d.ts +32 -0
- package/dist/types/resources/SignIn.d.ts.map +1 -0
- package/dist/types/resources/SignUp.d.ts +14 -0
- package/dist/types/resources/SignUp.d.ts.map +1 -0
- package/dist/types/resources/index.d.ts +2 -0
- package/dist/types/resources/index.d.ts.map +1 -0
- package/dist/types/resources/internal.d.ts +8 -0
- package/dist/types/resources/internal.d.ts.map +1 -0
- package/dist/types/utils/construct.d.ts +67 -0
- package/dist/types/utils/construct.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +3 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/querystring.d.ts +7 -0
- package/dist/types/utils/querystring.d.ts.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { handleFirebaseAuthError } from "@tern-secure/shared/errors";
|
|
2
|
+
import {
|
|
3
|
+
getRedirectResult,
|
|
4
|
+
GoogleAuthProvider,
|
|
5
|
+
OAuthProvider,
|
|
6
|
+
sendEmailVerification,
|
|
7
|
+
signInWithEmailAndPassword,
|
|
8
|
+
signInWithPopup,
|
|
9
|
+
signInWithRedirect
|
|
10
|
+
} from "firebase/auth";
|
|
11
|
+
import { TernSecureBase } from "./Base";
|
|
12
|
+
class SignIn extends TernSecureBase {
|
|
13
|
+
pathRoot = "/sessions/createsession";
|
|
14
|
+
status;
|
|
15
|
+
auth;
|
|
16
|
+
csrfToken;
|
|
17
|
+
_currentUser = null;
|
|
18
|
+
constructor(auth, csrfToken) {
|
|
19
|
+
super();
|
|
20
|
+
this.auth = auth;
|
|
21
|
+
this.csrfToken = csrfToken;
|
|
22
|
+
}
|
|
23
|
+
signInWithCredential = async (credential) => {
|
|
24
|
+
const idToken = await credential.user.getIdToken();
|
|
25
|
+
const params = {
|
|
26
|
+
idToken,
|
|
27
|
+
csrfToken: this.csrfToken
|
|
28
|
+
};
|
|
29
|
+
return this._post({
|
|
30
|
+
path: this.pathRoot,
|
|
31
|
+
body: params
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
withEmailAndPassword = async (params) => {
|
|
35
|
+
try {
|
|
36
|
+
const { email, password } = params;
|
|
37
|
+
const userCredential = await signInWithEmailAndPassword(
|
|
38
|
+
this.auth,
|
|
39
|
+
email,
|
|
40
|
+
password
|
|
41
|
+
);
|
|
42
|
+
await this.signInWithCredential(userCredential);
|
|
43
|
+
const { user } = userCredential;
|
|
44
|
+
return {
|
|
45
|
+
success: true,
|
|
46
|
+
message: "Authentication successful",
|
|
47
|
+
user,
|
|
48
|
+
error: !user.emailVerified ? "REQUIRES_VERIFICATION" : "AUTHENTICATED"
|
|
49
|
+
};
|
|
50
|
+
} catch (error) {
|
|
51
|
+
const authError = handleFirebaseAuthError(error);
|
|
52
|
+
return {
|
|
53
|
+
success: false,
|
|
54
|
+
message: authError.message,
|
|
55
|
+
error: authError.code,
|
|
56
|
+
user: null
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
withCredential = async (params) => {
|
|
61
|
+
try {
|
|
62
|
+
const { email, password } = params;
|
|
63
|
+
const userCredential = await signInWithEmailAndPassword(
|
|
64
|
+
this.auth,
|
|
65
|
+
email,
|
|
66
|
+
password
|
|
67
|
+
);
|
|
68
|
+
await this.signInWithCredential(userCredential);
|
|
69
|
+
} catch (error) {
|
|
70
|
+
const authError = handleFirebaseAuthError(error);
|
|
71
|
+
console.error(authError);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
withSocialProvider = async (provider, options) => {
|
|
75
|
+
try {
|
|
76
|
+
if ((options == null ? void 0 : options.mode) === "redirect") {
|
|
77
|
+
const redirectResult = await this.authRedirectResult();
|
|
78
|
+
if (redirectResult) {
|
|
79
|
+
if (redirectResult.success) {
|
|
80
|
+
console.log("Redirect after sign in");
|
|
81
|
+
}
|
|
82
|
+
return redirectResult;
|
|
83
|
+
}
|
|
84
|
+
await this._signInWithRedirect(provider);
|
|
85
|
+
return;
|
|
86
|
+
} else {
|
|
87
|
+
await this._signInWithPopUp(provider);
|
|
88
|
+
return {
|
|
89
|
+
success: true,
|
|
90
|
+
message: "Sign in successful"
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
} catch (error) {
|
|
94
|
+
return {
|
|
95
|
+
success: false,
|
|
96
|
+
message: error.message || `Sign in with ${provider} failed`,
|
|
97
|
+
error,
|
|
98
|
+
user: null
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
completeMfaSignIn = async (_mfaToken, _mfaContext) => {
|
|
103
|
+
throw new Error("Method not implemented.");
|
|
104
|
+
};
|
|
105
|
+
sendPasswordResetEmail = async (email) => {
|
|
106
|
+
console.log(`Sending password reset email to ${email}`);
|
|
107
|
+
};
|
|
108
|
+
resendEmailVerification = async () => {
|
|
109
|
+
const user = this._currentUser;
|
|
110
|
+
if (!user) {
|
|
111
|
+
throw new Error("No user is currently signed in");
|
|
112
|
+
}
|
|
113
|
+
await user.reload();
|
|
114
|
+
if (user.emailVerified) {
|
|
115
|
+
return {
|
|
116
|
+
success: true,
|
|
117
|
+
message: "Email is already verified. You can sign in.",
|
|
118
|
+
isVerified: true
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
const actionCodeSettings = {
|
|
122
|
+
url: "/sign-in",
|
|
123
|
+
// TODO: Make this configurable
|
|
124
|
+
handleCodeInApp: true
|
|
125
|
+
};
|
|
126
|
+
await sendEmailVerification(user, actionCodeSettings);
|
|
127
|
+
return {
|
|
128
|
+
success: true,
|
|
129
|
+
message: "Verification email sent. Please check your inbox.",
|
|
130
|
+
isVerified: false
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
getProviderConfig(providerName) {
|
|
134
|
+
switch (providerName.toLowerCase()) {
|
|
135
|
+
case "google": {
|
|
136
|
+
const googleProvider = new GoogleAuthProvider();
|
|
137
|
+
return {
|
|
138
|
+
provider: googleProvider,
|
|
139
|
+
customParameters: {
|
|
140
|
+
login_hint: "user@example.com",
|
|
141
|
+
prompt: "select_account"
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
case "microsoft": {
|
|
146
|
+
const microsoftProvider = new OAuthProvider("microsoft.com");
|
|
147
|
+
return {
|
|
148
|
+
provider: microsoftProvider,
|
|
149
|
+
customParameters: {
|
|
150
|
+
prompt: "consent"
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
default:
|
|
155
|
+
throw new Error(`Unsupported provider: ${providerName}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async authRedirectResult() {
|
|
159
|
+
try {
|
|
160
|
+
const result = await getRedirectResult(this.auth);
|
|
161
|
+
if (result) {
|
|
162
|
+
const user = result.user;
|
|
163
|
+
return {
|
|
164
|
+
success: true,
|
|
165
|
+
user
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
return null;
|
|
169
|
+
} catch (error) {
|
|
170
|
+
const authError = handleFirebaseAuthError(error);
|
|
171
|
+
return {
|
|
172
|
+
success: false,
|
|
173
|
+
message: authError.message,
|
|
174
|
+
error: authError.code,
|
|
175
|
+
user: null
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async executeAuthMethod(authMethod, providerName) {
|
|
180
|
+
const config = this.getProviderConfig(providerName);
|
|
181
|
+
config.provider.setCustomParameters(config.customParameters);
|
|
182
|
+
try {
|
|
183
|
+
await authMethod(this.auth, config.provider);
|
|
184
|
+
return { success: true, message: "Authentication initiated" };
|
|
185
|
+
} catch (error) {
|
|
186
|
+
const authError = handleFirebaseAuthError(error);
|
|
187
|
+
return {
|
|
188
|
+
success: false,
|
|
189
|
+
message: authError.message,
|
|
190
|
+
error: authError.code,
|
|
191
|
+
user: null
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async _signInWithRedirect(providerName) {
|
|
196
|
+
return this.executeAuthMethod(signInWithRedirect, providerName);
|
|
197
|
+
}
|
|
198
|
+
async _signInWithPopUp(providerName) {
|
|
199
|
+
return this.executeAuthMethod(signInWithPopup, providerName);
|
|
200
|
+
}
|
|
201
|
+
async checkRedirectResult() {
|
|
202
|
+
return this.authRedirectResult();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
export {
|
|
206
|
+
SignIn
|
|
207
|
+
};
|
|
208
|
+
//# sourceMappingURL=SignIn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/resources/SignIn.ts"],"sourcesContent":["import { handleFirebaseAuthError } from \"@tern-secure/shared/errors\";\nimport type {\n ResendEmailVerification,\n SignInFormValuesTree,\n SignInResource,\n SignInResponseTree,\n SignInStatus,\n TernSecureUser,\n} from \"@tern-secure/types\";\nimport type {\n Auth,\n UserCredential} from \"firebase/auth\";\nimport {\n getRedirectResult,\n GoogleAuthProvider,\n OAuthProvider,\n sendEmailVerification,\n signInWithEmailAndPassword,\n signInWithPopup,\n signInWithRedirect\n} from \"firebase/auth\";\n\nimport { TernSecureBase } from \"./Base\";\n\ninterface ProviderConfig {\n provider: GoogleAuthProvider | OAuthProvider;\n customParameters: Record<string, string>;\n}\n\nexport type TernRequestInit = RequestInit;\n\nexport type SignInParams = {\n idToken: string;\n csrfToken: string | undefined;\n};\n\n\n\ntype FirebaseAuthResult = UserCredential | void;\n\ntype AuthMethodFunction = (\n auth: Auth,\n provider: GoogleAuthProvider | OAuthProvider\n) => Promise<FirebaseAuthResult>;\n\nexport class SignIn extends TernSecureBase implements SignInResource {\n pathRoot = '/sessions/createsession';\n \n status?: SignInStatus | undefined;\n private auth: Auth;\n private csrfToken: string | undefined;\n private _currentUser: TernSecureUser | null = null;\n\n constructor(auth: Auth, csrfToken: string | undefined) {\n super();\n this.auth = auth;\n this.csrfToken = csrfToken;\n }\n\n\n signInWithCredential = async (credential: UserCredential) => {\n const idToken = await credential.user.getIdToken();\n const params = {\n idToken: idToken,\n csrfToken: this.csrfToken,\n };\n\n return this._post({\n path: this.pathRoot,\n body: params,\n });\n };\n\n \n\n\n withEmailAndPassword = async (\n params: SignInFormValuesTree\n ): Promise<SignInResponseTree> => {\n try {\n const { email, password } = params;\n const userCredential = await signInWithEmailAndPassword(\n this.auth,\n email,\n password\n );\n \n await this.signInWithCredential(userCredential);\n\n const { user } = userCredential;\n return {\n success: true,\n message: \"Authentication successful\",\n user,\n error: !user.emailVerified ? \"REQUIRES_VERIFICATION\" : \"AUTHENTICATED\",\n };\n } catch (error) {\n const authError = handleFirebaseAuthError(error);\n return {\n success: false,\n message: authError.message,\n error: authError.code,\n user: null,\n };\n }\n };\n\n withCredential = async (params: SignInFormValuesTree): Promise<void> => {\n try {\n const { email, password } = params;\n const userCredential = await signInWithEmailAndPassword(\n this.auth,\n email,\n password\n );\n await this.signInWithCredential(userCredential);\n } catch (error) {\n const authError = handleFirebaseAuthError(error);\n console.error(authError);\n }\n };\n\n withSocialProvider = async (\n provider: string,\n options?: {\n mode?: \"popup\" | \"redirect\";\n }\n ): Promise<SignInResponseTree | void> => {\n try {\n if (options?.mode === \"redirect\") {\n const redirectResult = await this.authRedirectResult();\n\n if (redirectResult) {\n if (redirectResult.success) {\n console.log(\"Redirect after sign in\");\n }\n return redirectResult;\n }\n\n await this._signInWithRedirect(provider);\n return;\n } else {\n await this._signInWithPopUp(provider);\n return {\n success: true,\n message: \"Sign in successful\",\n };\n }\n } catch (error: any) {\n return {\n success: false,\n message: error.message || `Sign in with ${provider} failed`,\n error,\n user: null,\n };\n }\n };\n\n completeMfaSignIn = async (\n _mfaToken: string,\n _mfaContext?: any\n ): Promise<SignInResponseTree> => {\n throw new Error(\"Method not implemented.\");\n };\n\n sendPasswordResetEmail = async (email: string): Promise<void> => {\n console.log(`Sending password reset email to ${email}`);\n };\n\n resendEmailVerification = async (): Promise<ResendEmailVerification> => {\n const user = this._currentUser;\n if (!user) {\n throw new Error(\"No user is currently signed in\");\n }\n\n await user.reload();\n\n if (user.emailVerified) {\n return {\n success: true,\n message: \"Email is already verified. You can sign in.\",\n isVerified: true,\n };\n }\n\n const actionCodeSettings = {\n url: \"/sign-in\", // TODO: Make this configurable\n handleCodeInApp: true,\n };\n\n await sendEmailVerification(user, actionCodeSettings);\n return {\n success: true,\n message: \"Verification email sent. Please check your inbox.\",\n isVerified: false,\n };\n };\n\n private getProviderConfig(providerName: string): ProviderConfig {\n switch (providerName.toLowerCase()) {\n case \"google\": {\n const googleProvider = new GoogleAuthProvider();\n return {\n provider: googleProvider,\n customParameters: {\n login_hint: \"user@example.com\",\n prompt: \"select_account\",\n },\n };\n }\n case \"microsoft\": {\n const microsoftProvider = new OAuthProvider(\"microsoft.com\");\n return {\n provider: microsoftProvider,\n customParameters: {\n prompt: \"consent\",\n },\n };\n }\n default:\n throw new Error(`Unsupported provider: ${providerName}`);\n }\n }\n\n private async authRedirectResult(): Promise<SignInResponseTree | null> {\n try {\n const result = await getRedirectResult(this.auth);\n\n if (result) {\n const user = result.user;\n return {\n success: true,\n user,\n };\n }\n return null;\n } catch (error) {\n const authError = handleFirebaseAuthError(error);\n return {\n success: false,\n message: authError.message,\n error: authError.code,\n user: null,\n };\n }\n }\n\n private async executeAuthMethod(\n authMethod: AuthMethodFunction,\n providerName: string\n ): Promise<SignInResponseTree> {\n const config = this.getProviderConfig(providerName);\n config.provider.setCustomParameters(config.customParameters);\n try {\n await authMethod(this.auth, config.provider);\n return { success: true, message: \"Authentication initiated\" };\n } catch (error) {\n const authError = handleFirebaseAuthError(error);\n return {\n success: false,\n message: authError.message,\n error: authError.code,\n user: null,\n };\n }\n }\n\n private async _signInWithRedirect(\n providerName: string\n ): Promise<SignInResponseTree> {\n return this.executeAuthMethod(signInWithRedirect, providerName);\n }\n\n private async _signInWithPopUp(\n providerName: string\n ): Promise<SignInResponseTree> {\n return this.executeAuthMethod(signInWithPopup, providerName);\n }\n\n public async checkRedirectResult(): Promise<SignInResponseTree | null> {\n return this.authRedirectResult();\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class SignUp {
|
|
2
|
+
status = null;
|
|
3
|
+
username = null;
|
|
4
|
+
firstName = null;
|
|
5
|
+
lastName = null;
|
|
6
|
+
email = null;
|
|
7
|
+
auth;
|
|
8
|
+
ternSecureConfig;
|
|
9
|
+
constructor(auth) {
|
|
10
|
+
this.auth = auth;
|
|
11
|
+
}
|
|
12
|
+
withSocialProvider() {
|
|
13
|
+
throw new Error("Method not implemented.");
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
SignUp
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=SignUp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/resources/SignUp.ts"],"sourcesContent":["import type {\n SignUpResource,\n SignUpStatus,\n TernSecureConfig\n} from '@tern-secure/types';\nimport type { Auth } from 'firebase/auth';\n\nexport class SignUp implements SignUpResource {\n status?: SignUpStatus | null = null;\n username?: string | null = null;\n firstName?: string | null = null;\n lastName?: string | null = null\n email: string | null = null;\n private auth: Auth;\n private ternSecureConfig?: TernSecureConfig;\n\n constructor(auth: Auth) {\n this.auth = auth;\n }\n\n withSocialProvider(): Promise<void> {\n throw new Error('Method not implemented.');\n }\n}"],"mappings":"AAOO,MAAM,OAAiC;AAAA,EAC1C,SAA+B;AAAA,EAC/B,WAA2B;AAAA,EAC3B,YAA4B;AAAA,EAC5B,WAA2B;AAAA,EAC3B,QAAuB;AAAA,EACf;AAAA,EACA;AAAA,EAER,YAAY,MAAY;AACpB,SAAK,OAAO;AAAA,EAChB;AAAA,EAEF,qBAAoC;AAClC,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/resources/index.ts"],"sourcesContent":["export * from './SignIn';"],"mappings":"AAAA,cAAc;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/resources/internal.ts"],"sourcesContent":["export type { TernSecureAuth } from '../instance/TernAuth';\nexport * from './SignUp';\nexport * from './SignIn';\nexport * from './Base';\nexport * from './AuthCookieManager';\nexport * from '../utils';\nexport * from './Error';"],"mappings":"AACA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
function buildURL(params, options = {}) {
|
|
2
|
+
const { base, hashPath, hashSearch, searchParams, hashSearchParams, ...rest } = params;
|
|
3
|
+
const { stringify = true, skipOrigin = false } = options;
|
|
4
|
+
const baseFallback = typeof window !== "undefined" && window.location ? window.location.href : "http://react-native-fake-base-url";
|
|
5
|
+
const appendToUrlSearchParams = (target, source) => {
|
|
6
|
+
if (!source) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
if (source instanceof URLSearchParams) {
|
|
10
|
+
source.forEach((value, key) => {
|
|
11
|
+
target.set(key, value);
|
|
12
|
+
});
|
|
13
|
+
} else if (typeof source === "object") {
|
|
14
|
+
Object.entries(source).forEach(([key, value]) => {
|
|
15
|
+
target.set(key, String(value));
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
try {
|
|
20
|
+
const url = new URL(base || "", baseFallback);
|
|
21
|
+
if (searchParams) {
|
|
22
|
+
searchParams.forEach((value, key) => {
|
|
23
|
+
url.searchParams.set(key, value);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
if (hashPath || hashSearch || hashSearchParams) {
|
|
27
|
+
const finalHashPath = hashPath || "";
|
|
28
|
+
const queryForHash = new URLSearchParams(hashSearch || "");
|
|
29
|
+
if (hashSearchParams) {
|
|
30
|
+
if (Array.isArray(hashSearchParams)) {
|
|
31
|
+
hashSearchParams.forEach((item) => appendToUrlSearchParams(queryForHash, item));
|
|
32
|
+
} else {
|
|
33
|
+
appendToUrlSearchParams(queryForHash, hashSearchParams);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const hashQueryString = queryForHash.toString();
|
|
37
|
+
let combinedHashString = "";
|
|
38
|
+
if (finalHashPath) {
|
|
39
|
+
combinedHashString = finalHashPath;
|
|
40
|
+
if (hashQueryString) {
|
|
41
|
+
if (combinedHashString.includes("?")) {
|
|
42
|
+
combinedHashString += "&" + hashQueryString;
|
|
43
|
+
} else {
|
|
44
|
+
combinedHashString += "?" + hashQueryString;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
} else {
|
|
48
|
+
if (hashQueryString) {
|
|
49
|
+
combinedHashString = hashQueryString;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (combinedHashString) {
|
|
53
|
+
url.hash = combinedHashString;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (stringify) {
|
|
57
|
+
return skipOrigin ? url.href.replace(url.origin, "") : url.href;
|
|
58
|
+
}
|
|
59
|
+
return url;
|
|
60
|
+
} catch (error) {
|
|
61
|
+
console.error("[TernSecure] Error building URL:", error);
|
|
62
|
+
const fallbackUrlString = base || "/";
|
|
63
|
+
if (stringify) {
|
|
64
|
+
return fallbackUrlString;
|
|
65
|
+
} else {
|
|
66
|
+
return new URL(fallbackUrlString, baseFallback);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const constructFullUrl = (path) => {
|
|
71
|
+
if (typeof window === "undefined") return path;
|
|
72
|
+
const baseUrl = window.location.origin;
|
|
73
|
+
if (path.startsWith("http")) {
|
|
74
|
+
return path;
|
|
75
|
+
}
|
|
76
|
+
return `${baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
|
|
77
|
+
};
|
|
78
|
+
const hasRedirectLoop = (currentPath, redirectPath) => {
|
|
79
|
+
if (!currentPath || !redirectPath) return false;
|
|
80
|
+
const cleanCurrentPath = currentPath.split("?")[0];
|
|
81
|
+
const cleanRedirectPath = redirectPath.split("?")[0];
|
|
82
|
+
return cleanCurrentPath === cleanRedirectPath;
|
|
83
|
+
};
|
|
84
|
+
const urlWithRedirect = (options) => {
|
|
85
|
+
const { signInUrl, signInPathParam = "/sign-in", currentPath, signUpUrl, signUpPathParam = "/sign-up" } = options;
|
|
86
|
+
const baseUrl = window.location.origin;
|
|
87
|
+
if (typeof window === "undefined") {
|
|
88
|
+
return signInUrl;
|
|
89
|
+
}
|
|
90
|
+
const url = new URL(signInUrl, baseUrl);
|
|
91
|
+
if (!currentPath.includes(signInPathParam) && !currentPath.includes(signUpPathParam)) {
|
|
92
|
+
url.searchParams.set("redirect", currentPath);
|
|
93
|
+
}
|
|
94
|
+
return url.toString();
|
|
95
|
+
};
|
|
96
|
+
const storePreviousPath = (path) => {
|
|
97
|
+
if (typeof window !== "undefined") {
|
|
98
|
+
sessionStorage.setItem("previousPath", path);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const getPreviousPath = () => {
|
|
102
|
+
if (typeof window !== "undefined") {
|
|
103
|
+
return sessionStorage.getItem("previousPath");
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
};
|
|
107
|
+
const getValidRedirectUrl = (searchParams, configuredRedirect) => {
|
|
108
|
+
const urlRedirect = searchParams.get("redirect");
|
|
109
|
+
if (urlRedirect) {
|
|
110
|
+
return validateUrl(urlRedirect);
|
|
111
|
+
}
|
|
112
|
+
if (configuredRedirect) {
|
|
113
|
+
return validateUrl(configuredRedirect);
|
|
114
|
+
}
|
|
115
|
+
return "/";
|
|
116
|
+
};
|
|
117
|
+
const validateUrl = (url) => {
|
|
118
|
+
try {
|
|
119
|
+
if (url.startsWith("http")) {
|
|
120
|
+
const urlObj = new URL(url);
|
|
121
|
+
if (typeof window !== "undefined" && urlObj.origin !== window.location.origin) {
|
|
122
|
+
return "/";
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return "/";
|
|
126
|
+
} catch {
|
|
127
|
+
return "/";
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
function toURL(url) {
|
|
131
|
+
return new URL(url.toString(), window.location.origin);
|
|
132
|
+
}
|
|
133
|
+
export {
|
|
134
|
+
buildURL,
|
|
135
|
+
constructFullUrl,
|
|
136
|
+
getPreviousPath,
|
|
137
|
+
getValidRedirectUrl,
|
|
138
|
+
hasRedirectLoop,
|
|
139
|
+
storePreviousPath,
|
|
140
|
+
toURL,
|
|
141
|
+
urlWithRedirect
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=construct.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/construct.ts"],"sourcesContent":["//v2: redict with taking priority from the sign-in page\n\nexport type constructUrlWithRedirectProps = {\n signInUrl: string;\n signInPathParam?: string;\n currentPath: string;\n signUpUrl?: string;\n signUpPathParam?: string;\n};\n\ninterface BuildURLParams extends Partial<URL> {\n base?: string;\n hashPath?: string;\n hashSearch?: string;\n hashSearchParams?: URLSearchParams | Record<string, string> | Array<URLSearchParams | Record<string, string>>;\n}\n\ninterface BuildURLOptions<T> {\n skipOrigin?: boolean;\n stringify?: T;\n}\n\n/**\n *\n * buildURL(params: URLParams, options: BuildURLOptions): string\n *\n * Builds a URL safely by using the native URL() constructor. It can\n * also build a secondary path and search URL that lives inside the hash\n * of the main URL. For example:\n *\n * https://foo.com/bar?qux=42#/hash-bar?hash-qux=42\n *\n * References:\n * https://developer.mozilla.org/en-US/docs/Web/API/URL\n *\n * @param {BuildURLParams} params\n * @param {BuildURLOptions} options\n * @returns {URL | string} Returns the URL href\n */\nexport function buildURL<B extends boolean>(\n params: BuildURLParams,\n options?: BuildURLOptions<B>,\n): B extends true ? string : URL;\n\n/**\n * Builds a URL from given parameters, handling search and hash parameters\n * @param params - The parameters to construct the URL\n * @param options - Options for building the URL\n * @returns The constructed URL as a string or URL object\n */\nexport function buildURL(params: BuildURLParams, options: BuildURLOptions<boolean> = {}): URL | string {\n const { base, hashPath, hashSearch, searchParams, hashSearchParams, ...rest} = params;\n const { stringify = true, skipOrigin = false } = options;\n\n const baseFallback =\n typeof window !== 'undefined' && window.location ? window.location.href : 'http://react-native-fake-base-url';\n\n // Helper function to append parameters to a URLSearchParams object\n const appendToUrlSearchParams = (\n target: URLSearchParams,\n source: URLSearchParams | Record<string, string> | undefined | null,\n ) => {\n if (!source) {\n return;\n }\n if (source instanceof URLSearchParams) {\n source.forEach((value, key) => {\n target.set(key, value);\n });\n } else if (typeof source === 'object') {\n Object.entries(source).forEach(([key, value]) => {\n target.set(key, String(value));\n });\n }\n };\n\n try {\n const url = new URL(base || '', baseFallback);\n\n // Handle search parameters\n // params.searchParams comes from Partial<URL>, so it's URLSearchParams | undefined\n if (searchParams) {\n searchParams.forEach((value, key) => {\n url.searchParams.set(key, value);\n });\n }\n\n // Handle hash-related parameters\n if (hashPath || hashSearch || hashSearchParams) {\n const finalHashPath = hashPath || '';\n const queryForHash = new URLSearchParams(hashSearch || '');\n\n if (hashSearchParams) {\n if (Array.isArray(hashSearchParams)) {\n hashSearchParams.forEach(item => appendToUrlSearchParams(queryForHash, item));\n } else {\n appendToUrlSearchParams(queryForHash, hashSearchParams);\n }\n }\n\n const hashQueryString = queryForHash.toString();\n let combinedHashString = '';\n\n if (finalHashPath) {\n combinedHashString = finalHashPath;\n if (hashQueryString) {\n if (combinedHashString.includes('?')) {\n combinedHashString += '&' + hashQueryString;\n } else {\n combinedHashString += '?' + hashQueryString;\n }\n }\n } else {\n // No hashPath\n if (hashQueryString) {\n // If only query, it forms the hash content directly.\n // e.g. \"param=value\" or \"?param=value\" are both valid after '#'\n combinedHashString = hashQueryString;\n }\n }\n\n if (combinedHashString) {\n url.hash = combinedHashString;\n }\n }\n\n if (stringify) {\n return skipOrigin ? url.href.replace(url.origin, '') : url.href;\n }\n return url;\n } catch (error) {\n console.error('[TernSecure] Error building URL:', error);\n const fallbackUrlString = base || '/';\n if (stringify) {\n return fallbackUrlString;\n } else {\n // Attempt to create a URL object for the fallback\n return new URL(fallbackUrlString, baseFallback);\n }\n }\n}\n\n/**\n * Constructs a full URL with the current origin\n * @param path - The path to construct the URL for\n * @returns The full URL with origin\n */\nexport const constructFullUrl = (path: string) => {\n if (typeof window === 'undefined') return path;\n const baseUrl = window.location.origin;\n if (path.startsWith('http')) {\n return path;\n }\n return `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`;\n};\n\n/**\n * Checks if the current URL has a redirect loop\n * @param currentPath - The current pathname\n * @param redirectPath - The path we're trying to redirect to\n * @returns boolean indicating if there's a redirect loop\n */\nexport const hasRedirectLoop = (currentPath: string, redirectPath: string): boolean => {\n if (!currentPath || !redirectPath) return false;\n\n // Remove any query parameters for comparison\n const cleanCurrentPath = currentPath.split('?')[0];\n const cleanRedirectPath = redirectPath.split('?')[0];\n\n return cleanCurrentPath === cleanRedirectPath;\n};\n\nexport const urlWithRedirect = (options: constructUrlWithRedirectProps): string => {\n const { signInUrl, signInPathParam = '/sign-in', currentPath, signUpUrl, signUpPathParam = '/sign-up' } = options;\n\n const baseUrl = window.location.origin;\n\n if (typeof window === 'undefined') {\n return signInUrl;\n }\n\n const url = new URL(signInUrl, baseUrl);\n\n if (!currentPath.includes(signInPathParam) && !currentPath.includes(signUpPathParam)) {\n url.searchParams.set('redirect', currentPath);\n }\n\n return url.toString();\n};\n\n/**\n * Stores the current path before signing out\n */\nexport const storePreviousPath = (path: string): void => {\n if (typeof window !== 'undefined') {\n sessionStorage.setItem('previousPath', path);\n }\n};\n\n/**\n * Gets the stored previous path\n */\nexport const getPreviousPath = (): string | null => {\n if (typeof window !== 'undefined') {\n return sessionStorage.getItem('previousPath');\n }\n return null;\n};\n\n/**\n * Gets a validated redirect URL ensuring it's from the same origin\n * @param redirectUrl - The URL to validate\n * @param searchParams - The search parameters to check for redirect\n * @returns A validated redirect URL\n */\nexport const getValidRedirectUrl = (searchParams: URLSearchParams, configuredRedirect?: string): string => {\n // Check URL search param first (highest priority)\n const urlRedirect = searchParams.get('redirect');\n if (urlRedirect) {\n return validateUrl(urlRedirect);\n }\n\n // Then check configured redirect (for first visits)\n if (configuredRedirect) {\n return validateUrl(configuredRedirect);\n }\n\n // Default fallback\n return '/';\n};\n\n/**\n * Validates and sanitizes URLs\n */\nconst validateUrl = (url: string): string => {\n try {\n // For absolute URLs\n if (url.startsWith('http')) {\n const urlObj = new URL(url);\n if (typeof window !== 'undefined' && urlObj.origin !== window.location.origin) {\n return '/';\n }\n }\n\n // For relative URLs\n return '/';\n } catch {\n return '/';\n }\n};\n\nexport function toURL(url: string | URL): URL {\n return new URL(url.toString(), window.location.origin);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from './construct';\nexport * from './querystring';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const getQueryParams = (queryString) => {
|
|
2
|
+
const queryParamsObject = {};
|
|
3
|
+
const queryParams = new URLSearchParams(queryString);
|
|
4
|
+
queryParams.forEach((value, key) => {
|
|
5
|
+
if (key in queryParamsObject) {
|
|
6
|
+
const existingValue = queryParamsObject[key];
|
|
7
|
+
if (Array.isArray(existingValue)) {
|
|
8
|
+
existingValue.push(value);
|
|
9
|
+
} else {
|
|
10
|
+
queryParamsObject[key] = [existingValue, value];
|
|
11
|
+
}
|
|
12
|
+
} else {
|
|
13
|
+
queryParamsObject[key] = value;
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
return queryParamsObject;
|
|
17
|
+
};
|
|
18
|
+
const stringifyQueryParams = (params, opts = {}) => {
|
|
19
|
+
if (params === null || params === void 0) {
|
|
20
|
+
return "";
|
|
21
|
+
}
|
|
22
|
+
if (!params || typeof params !== "object") {
|
|
23
|
+
return "";
|
|
24
|
+
}
|
|
25
|
+
const queryParams = new URLSearchParams();
|
|
26
|
+
Object.keys(params).forEach((key) => {
|
|
27
|
+
const encodedKey = opts.keyEncoder ? opts.keyEncoder(key) : key;
|
|
28
|
+
const value = params[key];
|
|
29
|
+
if (Array.isArray(value)) {
|
|
30
|
+
value.forEach((v) => v !== void 0 && queryParams.append(encodedKey, v || ""));
|
|
31
|
+
} else if (value === void 0) {
|
|
32
|
+
return;
|
|
33
|
+
} else if (typeof value === "object" && value !== null) {
|
|
34
|
+
queryParams.append(encodedKey, JSON.stringify(value));
|
|
35
|
+
} else {
|
|
36
|
+
queryParams.append(encodedKey, String(value ?? ""));
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
return queryParams.toString();
|
|
40
|
+
};
|
|
41
|
+
export {
|
|
42
|
+
getQueryParams,
|
|
43
|
+
stringifyQueryParams
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=querystring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/querystring.ts"],"sourcesContent":["export const getQueryParams = (queryString: string) => {\n const queryParamsObject: { [key: string]: string | string[] } = {};\n const queryParams = new URLSearchParams(queryString);\n queryParams.forEach((value, key) => {\n if (key in queryParamsObject) {\n // If the key already exists, we need to handle it as an array\n const existingValue = queryParamsObject[key];\n if (Array.isArray(existingValue)) {\n existingValue.push(value);\n } else {\n queryParamsObject[key] = [existingValue, value];\n }\n } else {\n queryParamsObject[key] = value;\n }\n });\n return queryParamsObject as Record<string, string>;\n};\n\ntype StringifyQueryParamsOptions = {\n keyEncoder?: (key: string) => string;\n};\n\nexport const stringifyQueryParams = (\n params:\n | Record<string, string | undefined | null | object | boolean | Array<string | undefined | null>>\n | null\n | undefined\n | string,\n opts: StringifyQueryParamsOptions = {},\n) => {\n if (params === null || params === undefined) {\n return '';\n }\n if (!params || typeof params !== 'object') {\n return '';\n }\n\n const queryParams = new URLSearchParams();\n\n Object.keys(params).forEach(key => {\n const encodedKey = opts.keyEncoder ? opts.keyEncoder(key) : key;\n const value = params[key];\n if (Array.isArray(value)) {\n value.forEach(v => v !== undefined && queryParams.append(encodedKey, v || ''));\n } else if (value === undefined) {\n return;\n } else if (typeof value === 'object' && value !== null) {\n queryParams.append(encodedKey, JSON.stringify(value));\n } else {\n queryParams.append(encodedKey, String(value ?? ''));\n }\n });\n\n return queryParams.toString();\n};\n"],"mappings":"AAAO,MAAM,iBAAiB,CAAC,gBAAwB;AACrD,QAAM,oBAA0D,CAAC;AACjE,QAAM,cAAc,IAAI,gBAAgB,WAAW;AACnD,cAAY,QAAQ,CAAC,OAAO,QAAQ;AAClC,QAAI,OAAO,mBAAmB;AAE5B,YAAM,gBAAgB,kBAAkB,GAAG;AAC3C,UAAI,MAAM,QAAQ,aAAa,GAAG;AAChC,sBAAc,KAAK,KAAK;AAAA,MAC1B,OAAO;AACL,0BAAkB,GAAG,IAAI,CAAC,eAAe,KAAK;AAAA,MAChD;AAAA,IACF,OAAO;AACL,wBAAkB,GAAG,IAAI;AAAA,IAC3B;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAMO,MAAM,uBAAuB,CAClC,QAKA,OAAoC,CAAC,MAClC;AACH,MAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,IAAI,gBAAgB;AAExC,SAAO,KAAK,MAAM,EAAE,QAAQ,SAAO;AACjC,UAAM,aAAa,KAAK,aAAa,KAAK,WAAW,GAAG,IAAI;AAC5D,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,QAAQ,OAAK,MAAM,UAAa,YAAY,OAAO,YAAY,KAAK,EAAE,CAAC;AAAA,IAC/E,WAAW,UAAU,QAAW;AAC9B;AAAA,IACF,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACtD,kBAAY,OAAO,YAAY,KAAK,UAAU,KAAK,CAAC;AAAA,IACtD,OAAO;AACL,kBAAY,OAAO,YAAY,OAAO,SAAS,EAAE,CAAC;AAAA,IACpD;AAAA,EACF,CAAC;AAED,SAAO,YAAY,SAAS;AAC9B;","names":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { TernSecureAuth } from './instance/TernAuth';
|
|
2
|
+
export type { TernAuth } from './instance/TernAuth';
|
|
3
|
+
export { TernServerAuth } from './instance/TernAuthServer';
|
|
4
|
+
export type { TernServerAuthOptions, AuthenticatedApp } from './instance/TernAuthServer';
|
|
5
|
+
export { CoreApiClient, coreApiClient } from './instance/coreApiClient';
|
|
6
|
+
export type { ApiResponse, ApiResponseJSON, RequestOptions, BeforeRequestHook, AfterResponseHook } from './instance/coreApiClient';
|
|
7
|
+
export { SignIn, TernSecureBase } from './resources/internal';
|
|
8
|
+
export type { TernSecureConfig, SignInFormValuesTree, SignInResponseTree, ResendEmailVerification, TernSecureUser, TernSecureState } from '@tern-secure/types';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAEzF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACxE,YAAY,EACR,WAAW,EACX,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACpB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE9D,YAAY,EACR,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,EACd,eAAe,EAClB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { InstanceType, ListenerCallback, SignedInSession, SignInRedirectOptions, SignInResource, SignInResponseTree, SignOut, SignUpRedirectOptions, SignUpResource, TernSecureAuth as TernSecureAuthInterface, TernSecureAuthOptions, TernSecureSDK, TernSecureUser, UnsubscribeCallback } from '@tern-secure/types';
|
|
2
|
+
import type { Auth as TernAuth } from 'firebase/auth';
|
|
3
|
+
import { AuthCookieManager } from '../resources/internal';
|
|
4
|
+
export declare function inBrowser(): boolean;
|
|
5
|
+
export { TernAuth };
|
|
6
|
+
/**
|
|
7
|
+
* Firebase implementation of the TernSecureAuth interface
|
|
8
|
+
*/
|
|
9
|
+
export declare class TernSecureAuth implements TernSecureAuthInterface {
|
|
10
|
+
#private;
|
|
11
|
+
static version: string;
|
|
12
|
+
static sdkMetadata: TernSecureSDK;
|
|
13
|
+
private static instance;
|
|
14
|
+
private _currentUser;
|
|
15
|
+
private signedInSession;
|
|
16
|
+
private firebaseClientApp;
|
|
17
|
+
private authStateUnsubscribe;
|
|
18
|
+
private auth;
|
|
19
|
+
private csrfToken;
|
|
20
|
+
isLoading: boolean;
|
|
21
|
+
error: Error | null;
|
|
22
|
+
user: TernSecureUser | null | undefined;
|
|
23
|
+
__internal_country?: string | null;
|
|
24
|
+
signIn: SignInResource;
|
|
25
|
+
signUp: SignUpResource;
|
|
26
|
+
get isReady(): boolean;
|
|
27
|
+
get status(): TernSecureAuthInterface['status'];
|
|
28
|
+
get version(): string;
|
|
29
|
+
set sdkMetadata(metadata: TernSecureSDK);
|
|
30
|
+
get sdkMetadata(): TernSecureSDK;
|
|
31
|
+
get requiresVerification(): boolean;
|
|
32
|
+
get apiUrl(): string;
|
|
33
|
+
getApiUrl: () => string;
|
|
34
|
+
get domain(): string;
|
|
35
|
+
get instanceType(): InstanceType | undefined;
|
|
36
|
+
constructor(options?: TernSecureAuthOptions);
|
|
37
|
+
setLoading(isLoading: boolean): void;
|
|
38
|
+
authCookieManager(): AuthCookieManager | undefined;
|
|
39
|
+
static getorCreateInstance(options?: TernSecureAuthOptions): TernSecureAuth;
|
|
40
|
+
static clearInstance(): void;
|
|
41
|
+
static initialize(options: TernSecureAuthOptions): TernSecureAuth;
|
|
42
|
+
private initializeFirebaseApp;
|
|
43
|
+
signOut: SignOut;
|
|
44
|
+
get currentSession(): SignedInSession | null;
|
|
45
|
+
private initAuthStateListener;
|
|
46
|
+
private _onIdTokenChanged;
|
|
47
|
+
onAuthStateChanged(callback: (cb: any) => void): () => void;
|
|
48
|
+
onIdTokenChanged(callback: (cb: any) => void): () => void;
|
|
49
|
+
private updateCurrentSession;
|
|
50
|
+
checkRedirectResult(): Promise<SignInResponseTree | null>;
|
|
51
|
+
addListener: (listener: ListenerCallback) => UnsubscribeCallback;
|
|
52
|
+
on: TernSecureAuthInterface['on'];
|
|
53
|
+
off: TernSecureAuthInterface['off'];
|
|
54
|
+
initialize(options: TernSecureAuthOptions): Promise<void>;
|
|
55
|
+
static create(options: TernSecureAuthOptions): TernSecureAuth;
|
|
56
|
+
_initialize: (options: TernSecureAuthOptions) => void;
|
|
57
|
+
constructUrlWithAuthRedirect: (to: string) => string;
|
|
58
|
+
constructSignInUrl: (options?: SignInRedirectOptions) => string;
|
|
59
|
+
constructSignUpUrl: (options?: SignUpRedirectOptions) => string;
|
|
60
|
+
__internal_setCountry: (country: string | null) => void;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=TernAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TernAuth.d.ts","sourceRoot":"","sources":["../../../src/instance/TernAuth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { TernSecureConfig, TernSecureUser } from "@tern-secure/types";
|
|
2
|
+
import type { FirebaseServerApp, FirebaseServerAppSettings } from "firebase/app";
|
|
3
|
+
import type { Auth } from "firebase/auth";
|
|
4
|
+
type TernSecureServerConfig = {
|
|
5
|
+
apiKey: string;
|
|
6
|
+
};
|
|
7
|
+
export interface TernServerAuthOptions {
|
|
8
|
+
firebaseConfig?: TernSecureConfig;
|
|
9
|
+
firebaseServerConfig?: TernSecureServerConfig;
|
|
10
|
+
authIdToken?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AuthenticatedApp {
|
|
13
|
+
firebaseServerApp: FirebaseServerApp;
|
|
14
|
+
auth: Auth;
|
|
15
|
+
currentUser?: TernSecureUser | null;
|
|
16
|
+
}
|
|
17
|
+
export declare class TernServerAuth {
|
|
18
|
+
#private;
|
|
19
|
+
private static instance;
|
|
20
|
+
private auth;
|
|
21
|
+
constructor();
|
|
22
|
+
static getInstance(): TernServerAuth;
|
|
23
|
+
static initialize(options: TernServerAuthOptions): TernServerAuth;
|
|
24
|
+
static clearInstance(): void;
|
|
25
|
+
getAuthIdToken: () => Promise<string | undefined>;
|
|
26
|
+
getAuthenticatedAppFromHeaders: (headers: {
|
|
27
|
+
get: (key: string) => string | null;
|
|
28
|
+
}) => Promise<AuthenticatedApp>;
|
|
29
|
+
getServerApp: (appSettings?: FirebaseServerAppSettings) => Promise<AuthenticatedApp>;
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=TernAuthServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TernAuthServer.d.ts","sourceRoot":"","sources":["../../../src/instance/TernAuthServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,KAAK,EACV,iBAAiB,EACjB,yBAAyB,EAAC,MAAM,cAAc,CAAC;AAIjD,OAAO,KAAK,EAAE,IAAI,EAAC,MAAM,eAAe,CAAC;AAGzC,KAAK,sBAAsB,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AACF,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,oBAAoB,CAAC,EAAE,sBAAsB,CAAC;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CACrC;AAED,qBAAa,cAAc;;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA+B;IACtD,OAAO,CAAC,IAAI,CAAQ;;IAKpB,MAAM,CAAC,WAAW,IAAI,cAAc;WAOtB,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc;IAUxE,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B,cAAc,QAAa,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAIpD;IAEF,8BAA8B,GAAU,SAAS;QAC/C,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;KACrC,KAAG,OAAO,CAAC,gBAAgB,CAAC,CAe3B;IAEF,YAAY,GACV,cAAc,yBAAyB,KACtC,OAAO,CAAC,gBAAgB,CAAC,CAqB1B;CAOH"}
|