@j2blasco/ts-auth
Version:
TypeScript authentication abstraction library that eliminates vendor lock-in and provides mock-free testing for both frontend and backend authentication systems
103 lines (102 loc) • 4.13 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AuthBackendTesting = void 0;
const ts_result_1 = require("@j2blasco/ts-result");
const rxjs_1 = require("rxjs");
const uuid_1 = require("uuid");
class AuthBackendTesting {
constructor() { }
changePassword(args) {
const { uid, newPassword } = args;
const user = this.registeredUsers.find((u) => u.uid === uid);
if (!user) {
return Promise.resolve(ts_result_1.resultError.unknown('User not found'));
}
user.password = newPassword;
return Promise.resolve((0, ts_result_1.resultSuccessVoid)());
}
sendResetPasswordEmail(_args) {
throw new Error('Method not implemented.');
}
registeredUsers = new Array();
getUidFromIdToken(idToken) {
const user = this.registeredUsers.find((u) => u.idToken === idToken);
if (!user) {
return Promise.resolve(ts_result_1.resultError.unknown('User not found'));
}
return Promise.resolve((0, ts_result_1.resultSuccess)(user.uid));
}
onUserCreated$ = new rxjs_1.Subject();
onUserDeleted$ = new rxjs_1.Subject();
async signInWithEmailAndPassword(args) {
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!regex.test(args.email)) {
return Promise.resolve(ts_result_1.resultError.withCode('invalid-email'));
}
const user = this.registeredUsers.find((u) => u.email === args.email);
if (!user) {
return Promise.resolve(ts_result_1.resultError.withCode('user-not-found'));
}
if (user.password !== args.password) {
return Promise.resolve(ts_result_1.resultError.withCode('wrong-password'));
}
return Promise.resolve((0, ts_result_1.resultSuccess)({
uid: user.uid,
refreshToken: user.refreshToken,
idToken: user.idToken,
}));
}
async signInWithRefreshToken(refreshToken) {
// Find the user with the matching refresh token
const user = this.registeredUsers.find((u) => u.refreshToken === refreshToken);
if (!user) {
return Promise.resolve(ts_result_1.resultError.unknown('Invalid refresh token'));
}
// Generate a new idToken for this session
const newIdToken = (0, uuid_1.v4)();
user.idToken = newIdToken;
return Promise.resolve((0, ts_result_1.resultSuccess)({
idToken: newIdToken,
uid: user.uid,
}));
}
async signUpWithEmailPassword(_args) {
const uid = (0, uuid_1.v4)();
const idToken = (0, uuid_1.v4)();
const refreshToken = (0, uuid_1.v4)();
this.registeredUsers.push({
idToken,
uid,
email: _args.email,
password: _args.password,
refreshToken,
});
this.onUserCreated$.next({ uid });
return Promise.resolve((0, ts_result_1.resultSuccess)({ uid }));
}
async changeEmail(_args) {
const user = this.registeredUsers.find((u) => u.uid === _args.uid);
if (!user) {
return Promise.resolve(ts_result_1.resultError.unknown('User not found'));
}
user.email = _args.newEmail;
return Promise.resolve((0, ts_result_1.resultSuccess)(undefined));
}
async deleteUser(_args) {
const index = this.registeredUsers.findIndex((u) => u.uid === _args.uid);
if (index === -1) {
return Promise.resolve(ts_result_1.resultError.unknown('User not found'));
}
this.registeredUsers.splice(index, 1);
this.onUserDeleted$.next({ uid: _args.uid });
return Promise.resolve((0, ts_result_1.resultSuccess)(undefined));
}
getUidByEmail(email) {
const user = this.registeredUsers.find((u) => u.email === email);
if (!user) {
return Promise.resolve(ts_result_1.resultError.withCode('email-not-found'));
}
return Promise.resolve((0, ts_result_1.resultSuccess)({ uid: user.uid }));
}
}
exports.AuthBackendTesting = AuthBackendTesting;