auth0-lock
Version:
Auth0 Lock
448 lines (445 loc) • 20 kB
JavaScript
;
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.additionalSignUpFields = additionalSignUpFields;
exports.authWithUsername = authWithUsername;
exports.availableScreens = availableScreens;
exports.databaseConnection = databaseConnection;
exports.databaseConnectionName = databaseConnectionName;
exports.databaseConnectionRequiresUsername = databaseConnectionRequiresUsername;
exports.databaseLogInWithEmail = databaseLogInWithEmail;
exports.databaseUsernameStyle = databaseUsernameStyle;
exports.databaseUsernameValue = databaseUsernameValue;
exports.defaultDatabaseConnection = defaultDatabaseConnection;
exports.defaultDatabaseConnectionName = defaultDatabaseConnectionName;
exports.forgotPasswordLink = forgotPasswordLink;
exports.getInitialScreen = getInitialScreen;
exports.getScreen = getScreen;
exports.hasInitialScreen = hasInitialScreen;
exports.hasScreen = hasScreen;
exports.initDatabase = initDatabase;
exports.mustAcceptTerms = mustAcceptTerms;
exports.overrideDatabaseOptions = overrideDatabaseOptions;
exports.passwordStrengthPolicy = passwordStrengthPolicy;
exports.resolveAdditionalSignUpFields = resolveAdditionalSignUpFields;
exports.setScreen = setScreen;
exports.shouldAutoLogin = shouldAutoLogin;
exports.showTerms = showTerms;
exports.signUpFieldsStrictValidation = signUpFieldsStrictValidation;
exports.signUpHideUsernameField = signUpHideUsernameField;
exports.signUpLink = signUpLink;
exports.termsAccepted = termsAccepted;
exports.toggleTermsAcceptance = toggleTermsAcceptance;
var _immutable = _interopRequireWildcard(require("immutable"));
var l = _interopRequireWildcard(require("../../core/index"));
var _index2 = require("../../field/index");
var _data_utils = require("../../utils/data_utils");
var _sync = _interopRequireDefault(require("../../sync"));
var _trim = _interopRequireDefault(require("trim"));
var _tenant = require("../../core/tenant");
var _enterprise = require("../../connection/enterprise");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
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, _immutable.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 `".concat(name, "` option will be ignored, because it is not a boolean."));
return valid;
}
function assertMaybeEnum(opts, name, a) {
var valid = opts[name] === undefined || a.indexOf(opts[name]) > -1;
if (!valid) l.warn(opts, "The `".concat(name, "` option will be ignored, because it is not one of the following allowed values: ").concat(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, _trim.default)(opts[name]).length > 0;
if (!valid) l.warn(opts, "The `".concat(name, "` option will be ignored, because it is not a non-empty string."));
return valid;
}
function assertMaybeArray(opts, name) {
var valid = opts[name] === undefined || window.Array.isArray(opts[name]);
if (!valid) l.warn(opts, "The `".concat(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,
showTerms = opts.showTerms,
signUpLink = opts.signUpLink,
usernameStyle = opts.usernameStyle,
signUpFieldsStrictValidation = opts.signUpFieldsStrictValidation,
signUpHideUsernameField = opts.signUpHideUsernameField;
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 (!assertMaybeBoolean(opts, 'showTerms')) {
showTerms = true;
}
if (!assertMaybeBoolean(opts, 'signUpFieldsStrictValidation')) {
signUpFieldsStrictValidation = false;
}
if (!assertMaybeBoolean(opts, 'signUpHideUsernameField')) {
signUpHideUsernameField = false;
}
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,
placeholderHTML = x.placeholderHTML,
prefill = x.prefill,
type = x.type,
validator = x.validator,
value = x.value,
storage = x.storage;
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: ".concat(reservedNames.join(', '), "."));
filter = false;
}
if (type !== 'hidden' && (typeof placeholder != 'string' || !placeholder) && (typeof placeholderHTML != 'string' || !placeholderHTML)) {
l.warn(opts, "Ignoring an element of `additionalSignUpFields` (".concat(name, ") because it does not contain a valid `placeholder` or `placeholderHTML` property. Every element of `additionalSignUpFields` must have a `placeholder` or `placeholderHTML` property that is a non-empty string."));
filter = false;
}
if (placeholderHTML && placeholder) {
l.warn(opts, 'When provided, the `placeholderHTML` property of an element of `additionalSignUpFields` will override the `placeholder` property of that element');
}
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', 'hidden'];
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: \"".concat(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 && !window.Array.isArray(options) && typeof options != 'function' || type === 'select' && options === undefined) {
l.warn(opts, "Ignoring an element of `additionalSignUpFields` (".concat(name, ") because it has a \"select\" `type` but does not specify an `options` property that is an Array or a function."));
filter = false;
}
if (type === 'hidden' && !value) {
l.warn(opts, "Ignoring an element of `additionalSignUpFields` (".concat(name, ") because it has a \"hidden\" `type` but does not specify a `value` string."));
filter = false;
}
return filter ? r.concat([{
icon: icon,
name: name,
options: options,
placeholder: placeholder,
placeholderHTML: placeholderHTML,
prefill: prefill,
type: type,
validator: validator,
value: value,
storage: storage
}]) : r;
}, []);
additionalSignUpFields = _immutable.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 accessor fn.
loginAfterSignUp = loginAfterSignUp === false ? false : true;
return (0, _immutable.Map)({
additionalSignUpFields: additionalSignUpFields,
defaultConnectionName: defaultDatabaseConnection,
forgotPasswordLink: forgotPasswordLink,
initialScreen: initialScreen,
loginAfterSignUp: loginAfterSignUp,
mustAcceptTerms: mustAcceptTerms,
showTerms: showTerms,
screens: screens,
signUpLink: signUpLink,
usernameStyle: usernameStyle,
signUpFieldsStrictValidation: signUpFieldsStrictValidation,
signUpHideUsernameField: signUpHideUsernameField
}).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 l.resolvedConnection(m) || (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')) {
if (l.connectionResolver(m)) {
return 'username';
}
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) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var isEmailOnly = databaseLogInWithEmail(m);
if (isEmailOnly) {
return (0, _index2.getFieldValue)(m, 'email');
}
if (options.emailFirst) {
return (0, _index2.getFieldValue)(m, 'email') || (0, _index2.getFieldValue)(m, 'username');
}
return (0, _index2.getFieldValue)(m, 'username') || (0, _index2.getFieldValue)(m, 'email');
}
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 showTerms(m) {
return get(m, 'showTerms', true);
}
function signUpFieldsStrictValidation(m) {
return get(m, 'signUpFieldsStrictValidation', false);
}
function signUpHideUsernameField(m) {
return get(m, 'signUpHideUsernameField', false);
}
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) {
switch (x.get('type')) {
case 'select':
return resolveAdditionalSignUpSelectField(r, x);
case 'hidden':
return resolveAdditionalSignUpHiddenField(r, x);
default:
return 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, _immutable.default.fromJS(resolvedOptions), resolvedPrefill) : m;
};
if (resolvedPrefill === undefined) {
m = (0, _sync.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, _sync.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, _immutable.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, _sync.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;
}
function resolveAdditionalSignUpHiddenField(m, x) {
return (0, _index2.setField)(m, x.get('name'), x.get('value'));
}