auth0-lock
Version:
Auth0 Lock
466 lines (369 loc) • 16.8 kB
JavaScript
;
exports.__esModule = true;
exports.initDatabase = initDatabase;
exports.overrideDatabaseOptions = overrideDatabaseOptions;
exports.defaultDatabaseConnection = defaultDatabaseConnection;
exports.defaultDatabaseConnectionName = defaultDatabaseConnectionName;
exports.databaseConnection = databaseConnection;
exports.databaseConnectionName = databaseConnectionName;
exports.forgotPasswordLink = forgotPasswordLink;
exports.signUpLink = signUpLink;
exports.setScreen = setScreen;
exports.getScreen = getScreen;
exports.availableScreens = availableScreens;
exports.getInitialScreen = getInitialScreen;
exports.hasInitialScreen = hasInitialScreen;
exports.databaseConnectionRequiresUsername = databaseConnectionRequiresUsername;
exports.databaseUsernameStyle = databaseUsernameStyle;
exports.databaseLogInWithEmail = databaseLogInWithEmail;
exports.databaseUsernameValue = databaseUsernameValue;
exports.authWithUsername = authWithUsername;
exports.hasScreen = hasScreen;
exports.shouldAutoLogin = shouldAutoLogin;
exports.passwordStrengthPolicy = passwordStrengthPolicy;
exports.additionalSignUpFields = additionalSignUpFields;
exports.mustAcceptTerms = mustAcceptTerms;
exports.termsAccepted = termsAccepted;
exports.toggleTermsAcceptance = toggleTermsAcceptance;
exports.resolveAdditionalSignUpFields = resolveAdditionalSignUpFields;
var _immutable = require('immutable');
var _immutable2 = _interopRequireDefault(_immutable);
var _index = require('../../core/index');
var l = _interopRequireWildcard(_index);
var _index2 = require('../../field/index');
var _data_utils = require('../../utils/data_utils');
var _sync = require('../../sync');
var _sync2 = _interopRequireDefault(_sync);
var _trim = require('trim');
var _trim2 = _interopRequireDefault(_trim);
var _tenant = require('../../core/tenant');
var _enterprise = require('../../connection/enterprise');
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _dataFns = (0, _data_utils.dataFns)(["database"]),
get = _dataFns.get,
initNS = _dataFns.initNS,
tget = _dataFns.tget,
tset = _dataFns.tset;
function initDatabase(m, options) {
m = initNS(m, _immutable2.default.fromJS(processDatabaseOptions(options)));
m = resolveAdditionalSignUpFields(m);
return m;
}
function assertMaybeBoolean(opts, name) {
var valid = opts[name] === undefined || typeof opts[name] === "boolean";
if (!valid) l.warn(opts, 'The `' + name + '` option will be ignored, because it is not a booelan.');
return valid;
}
function assertMaybeEnum(opts, name, a) {
var valid = opts[name] === undefined || a.indexOf(opts[name]) > -1;
if (!valid) l.warn(opts, 'The `' + name + '` option will be ignored, because it is not one of the following allowed values: ' + a.map(function (x) {
return JSON.stringify(x);
}).join(", ") + '.');
return valid;
}
function assertMaybeString(opts, name) {
var valid = opts[name] === undefined || typeof opts[name] === "string" && (0, _trim2.default)(opts[name]).length > 0;
if (!valid) l.warn(opts, 'The `' + name + '` option will be ignored, because it is not a non-empty string.');
return valid;
}
function assertMaybeArray(opts, name) {
var valid = opts[name] === undefined || global.Array.isArray(opts[name]);
if (!valid) l.warn(opts, 'The `' + name + '` option will be ignored, because it is not an array.');
return valid;
}
function processDatabaseOptions(opts) {
var additionalSignUpFields = opts.additionalSignUpFields,
defaultDatabaseConnection = opts.defaultDatabaseConnection,
forgotPasswordLink = opts.forgotPasswordLink,
loginAfterSignUp = opts.loginAfterSignUp,
mustAcceptTerms = opts.mustAcceptTerms,
signUpLink = opts.signUpLink,
usernameStyle = opts.usernameStyle;
var _processScreenOptions = processScreenOptions(opts),
initialScreen = _processScreenOptions.initialScreen,
screens = _processScreenOptions.screens;
if (!assertMaybeEnum(opts, "usernameStyle", ["email", "username"])) {
usernameStyle = undefined;
}
if (!assertMaybeString(opts, "defaultDatabaseConnection")) {
defaultDatabaseConnection = undefined;
}
if (!assertMaybeString(opts, "forgotPasswordLink")) {
forgotPasswordLink = undefined;
}
if (!assertMaybeString(opts, "signUpLink")) {
signUpLink = undefined;
}
if (!assertMaybeBoolean(opts, "mustAcceptTerms")) {
mustAcceptTerms = undefined;
}
if (!assertMaybeArray(opts, "additionalSignUpFields")) {
additionalSignUpFields = undefined;
} else if (additionalSignUpFields) {
additionalSignUpFields = additionalSignUpFields.reduce(function (r, x) {
var icon = x.icon,
name = x.name,
options = x.options,
placeholder = x.placeholder,
prefill = x.prefill,
type = x.type,
validator = x.validator;
var filter = true;
var reservedNames = ["email", "username", "password"];
if (typeof name != "string" || !name.match(/^[a-zA-Z0-9_]+$/) || reservedNames.indexOf(name) > -1) {
l.warn(opts, 'Ignoring an element of `additionalSignUpFields` because it does not contain valid `name` property. Every element of `additionalSignUpFields` must be an object with a `name` property that is a non-empty string consisting of letters, numbers and underscores. The following names are reserved, and therefore, cannot be used: ' + reservedNames.join(", ") + '.');
filter = false;
}
if (typeof placeholder != "string" || !placeholder) {
l.warn(opts, "Ignoring an element of `additionalSignUpFields` because it does not contain a valid `placeholder` property. Every element of `additionalSignUpFields` must have a `placeholder` property that is a non-empty string.");
filter = false;
}
if (icon != undefined && (typeof icon != "string" || !icon)) {
l.warn(opts, "When provided, the `icon` property of an element of `additionalSignUpFields` must be a non-empty string.");
icon = undefined;
}
if (prefill != undefined && (typeof prefill != "string" || !prefill) && typeof prefill != "function") {
l.warn(opts, "When provided, the `prefill` property of an element of `additionalSignUpFields` must be a non-empty string or a function.");
prefill = undefined;
}
var types = ["select", "text", "checkbox"];
if (type != undefined && (typeof type != "string" || types.indexOf(type) === -1)) {
l.warn(opts, 'When provided, the `type` property of an element of `additionalSignUpFields` must be one of the following strings: "' + types.join("\", \"") + '".');
type = undefined;
}
if (validator != undefined && type === "select") {
l.warn(opts, "Elements of `additionalSignUpFields` with a \"select\" `type` cannot specify a `validator` function, all of its `options` are assumed to be valid.");
validator = undefined;
}
if (validator != undefined && typeof validator != "function") {
l.warn(opts, "When provided, the `validator` property of an element of `additionalSignUpFields` must be a function.");
validator = undefined;
}
if (options != undefined && type != "select") {
l.warn(opts, "The `options` property can only by provided for an element of `additionalSignUpFields` when its `type` equals to \"select\"");
options = undefined;
}
if (options != undefined && !global.Array.isArray(options) && typeof options != "function" || type === "select" && options === undefined) {
l.warn(opts, "Ignoring an element of `additionalSignUpFields` because it has a \"select\" `type` but does not specify an `options` property that is an Array or a function.");
filter = false;
}
return filter ? r.concat([{ icon: icon, name: name, options: options, placeholder: placeholder, prefill: prefill, type: type, validator: validator }]) : r;
}, []);
additionalSignUpFields = _immutable2.default.fromJS(additionalSignUpFields).map(function (x) {
return x.filter(function (y) {
return y !== undefined;
});
});
}
// TODO: add a warning if it is not a boolean, leave it undefined,
// and change accesor fn.
loginAfterSignUp = loginAfterSignUp === false ? false : true;
return (0, _immutable.Map)({
additionalSignUpFields: additionalSignUpFields,
defaultConnectionName: defaultDatabaseConnection,
forgotPasswordLink: forgotPasswordLink,
initialScreen: initialScreen,
loginAfterSignUp: loginAfterSignUp,
mustAcceptTerms: mustAcceptTerms,
screens: screens,
signUpLink: signUpLink,
usernameStyle: usernameStyle
}).filter(function (x) {
return typeof x !== "undefined";
}).toJS();
}
function processScreenOptions(opts) {
var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { allowLogin: true, allowSignUp: true, allowForgotPassword: true, initialScreen: undefined };
var allowForgotPassword = opts.allowForgotPassword,
allowLogin = opts.allowLogin,
allowSignUp = opts.allowSignUp,
initialScreen = opts.initialScreen;
var screens = [];
if (allowLogin === true || !assertMaybeBoolean(opts, "allowLogin") && defaults.allowLogin || allowLogin === undefined && defaults.allowLogin) {
screens.push("login");
}
if (allowSignUp === true || !assertMaybeBoolean(opts, "allowSignUp") && defaults.allowSignUp || allowSignUp === undefined && defaults.allowSignUp) {
screens.push("signUp");
}
if (allowForgotPassword === true || !assertMaybeBoolean(opts, "allowForgotPassword") && defaults.allowForgotPassword || allowForgotPassword === undefined && defaults.allowForgotPassword) {
screens.push("forgotPassword");
}
screens.push("mfaLogin");
if (!assertMaybeEnum(opts, "initialScreen", screens)) {
initialScreen = undefined;
}
if (initialScreen === undefined) {
initialScreen = defaults.initialScreen || screens[0];
}
return { initialScreen: initialScreen, screens: new _immutable.List(screens) };
}
function overrideDatabaseOptions(m, opts) {
var _processScreenOptions2 = processScreenOptions(opts, {
allowLogin: availableScreens(m).contains("login"),
allowSignUp: availableScreens(m).contains("signUp"),
allowForgotPassword: availableScreens(m).contains("forgotPassword"),
initialScreen: get(m, "initialScreen")
}),
initialScreen = _processScreenOptions2.initialScreen,
screens = _processScreenOptions2.screens;
m = tset(m, "initialScreen", initialScreen);
m = tset(m, "screens", screens);
return m;
}
function defaultDatabaseConnection(m) {
var name = defaultDatabaseConnectionName(m);
return name && l.findConnection(m, name);
}
function defaultDatabaseConnectionName(m) {
return get(m, "defaultConnectionName");
}
function databaseConnection(m) {
return (0, _tenant.defaultDirectory)(m) || defaultDatabaseConnection(m) || l.connection(m, "database");
}
function databaseConnectionName(m) {
return (databaseConnection(m) || (0, _immutable.Map)()).get("name");
}
function forgotPasswordLink(m) {
var notFound = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
return get(m, "forgotPasswordLink", notFound);
}
function signUpLink(m) {
var notFound = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
return get(m, "signUpLink", notFound);
}
function setScreen(m, name) {
var fields = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
// TODO: the lock/index module should provide a way to clear
// everything that needs the be cleared when changing screens, other
// modules should not care.
m = l.clearGlobalError(m);
m = l.clearGlobalSuccess(m);
m = (0, _index2.hideInvalidFields)(m, fields);
m = (0, _index2.clearFields)(m, fields);
return tset(m, "screen", name);
}
function getScreen(m) {
var screen = tget(m, "screen");
var initialScreen = getInitialScreen(m);
var screens = [screen, initialScreen, "login", "signUp", "forgotPassword", "mfaLogin"];
var availableScreens = screens.filter(function (x) {
return hasScreen(m, x);
});
return availableScreens[0];
}
function availableScreens(m) {
return tget(m, "screens") || get(m, "screens", new _immutable.List());
}
function getInitialScreen(m) {
return tget(m, "initialScreen") || get(m, "initialScreen");
}
function hasInitialScreen(m, str) {
return getInitialScreen(m) === str;
}
function databaseConnectionRequiresUsername(m) {
return (databaseConnection(m) || (0, _immutable.Map)()).toJS().requireUsername;
}
function databaseUsernameStyle(m) {
if (l.hasSomeConnections(m, "database")) {
return databaseConnectionRequiresUsername(m) ? get(m, "usernameStyle", "any") : "email";
}
return l.hasSomeConnections(m, "enterprise") && (0, _enterprise.findADConnectionWithoutDomain)(m) ? 'username' : 'email';
}
function databaseLogInWithEmail(m) {
return databaseUsernameStyle(m) === "email";
}
function databaseUsernameValue(m) {
return (0, _index2.getFieldValue)(m, databaseLogInWithEmail(m) ? "email" : "username");
}
function authWithUsername(m) {
return databaseConnectionRequiresUsername(m) || get(m, "usernameStyle", "email") === "username";
}
function hasScreen(m, s) {
var _toJS = (databaseConnection(m) || (0, _immutable.Map)()).toJS(),
allowForgot = _toJS.allowForgot,
allowSignup = _toJS.allowSignup;
return !(allowForgot === false && s === "forgotPassword") && !(allowSignup === false && s === "signUp") && availableScreens(m).contains(s);
}
function shouldAutoLogin(m) {
return get(m, "loginAfterSignUp");
}
function passwordStrengthPolicy(m) {
return (databaseConnection(m) || (0, _immutable.Map)()).get("passwordPolicy", "none");
}
function additionalSignUpFields(m) {
return get(m, "additionalSignUpFields", (0, _immutable.List)());
}
function mustAcceptTerms(m) {
return get(m, "mustAcceptTerms", false);
}
function termsAccepted(m) {
return !mustAcceptTerms(m) || tget(m, "termsAccepted", false);
}
function toggleTermsAcceptance(m) {
return tset(m, "termsAccepted", !termsAccepted(m));
}
function resolveAdditionalSignUpFields(m) {
return additionalSignUpFields(m).reduce(function (r, x) {
return x.get("type") === "select" ? resolveAdditionalSignUpSelectField(r, x) : resolveAdditionalSignUpTextField(r, x);
}, m);
}
function resolveAdditionalSignUpSelectField(m, x) {
var name = x.get("name");
var keyNs = ["additionalSignUpField", name];
var prefill = x.get("prefill");
var options = x.get("options");
var resolvedPrefill = typeof prefill === "function" ? undefined : prefill || "";
var resolvedOptions = typeof options === "function" ? undefined : options;
var register = function register(m) {
return resolvedPrefill !== undefined && resolvedOptions !== undefined ? (0, _index2.registerOptionField)(m, name, _immutable2.default.fromJS(resolvedOptions), resolvedPrefill) : m;
};
if (resolvedPrefill === undefined) {
m = (0, _sync2.default)(m, keyNs.concat("prefill"), {
recoverResult: "",
successFn: function successFn(m, result) {
resolvedPrefill = result;
return register(m);
},
syncFn: function syncFn(m, cb) {
return prefill(cb);
}
});
}
if (resolvedOptions === undefined) {
m = (0, _sync2.default)(m, keyNs.concat("options"), {
successFn: function successFn(m, result) {
resolvedOptions = result;
return register(m);
},
syncFn: function syncFn(m, cb) {
return options(cb);
}
});
}
if (resolvedPrefill !== undefined && resolvedOptions !== undefined) {
m = (0, _index2.registerOptionField)(m, name, _immutable2.default.fromJS(resolvedOptions), resolvedPrefill);
}
return m;
}
function resolveAdditionalSignUpTextField(m, x) {
var name = x.get("name");
var key = ["additionalSignUpField", name, "prefill"];
var prefill = x.get("prefill");
var validator = x.get("validator");
var resolvedPrefill = typeof prefill === "function" ? undefined : prefill || "";
if (resolvedPrefill === undefined) {
m = (0, _sync2.default)(m, key, {
recoverResult: "",
successFn: function successFn(m, result) {
return (0, _index2.setField)(m, name, result, validator);
},
syncFn: function syncFn(m, cb) {
return prefill(cb);
}
});
} else {
m = (0, _index2.setField)(m, name, resolvedPrefill, validator);
}
return m;
}