@dloizides/auth-web 1.18.3 → 1.20.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/index.mjs CHANGED
@@ -341,6 +341,7 @@ var DEFAULT_REGISTER_LABELS = {
341
341
  submit: "Create account",
342
342
  submitHint: "Creates your account",
343
343
  submitting: "Creating account...",
344
+ fullName: field("Your name", "Enter your full name"),
344
345
  fields: {
345
346
  firstName: field("First name", "Enter your first name"),
346
347
  lastName: field("Last name", "Enter your last name"),
@@ -4100,6 +4101,18 @@ var FIELDS = [
4100
4101
  { key: "confirmPassword", testId: RegisterTestIds.confirmPasswordInput, secure: true },
4101
4102
  { key: "tenantName", testId: RegisterTestIds.tenantNameInput }
4102
4103
  ];
4104
+ var COMPACT_FIELDS = [
4105
+ { key: "firstName", testId: RegisterTestIds.firstNameInput, autoComplete: "name" },
4106
+ { key: "email", testId: RegisterTestIds.emailInput, autoComplete: "email", keyboardType: "email-address" },
4107
+ { key: "password", testId: RegisterTestIds.passwordInput, secure: true },
4108
+ { key: "tenantName", testId: RegisterTestIds.tenantNameInput }
4109
+ ];
4110
+ function copyFor(key, labels, compact) {
4111
+ if (compact && key === "firstName" && labels.fullName !== void 0) {
4112
+ return labels.fullName;
4113
+ }
4114
+ return labels.fields[key];
4115
+ }
4103
4116
  var OFF_SCREEN = -9999;
4104
4117
  var HONEYPOT_SIZE = 1;
4105
4118
  var HONEYPOT_PLACEHOLDER = "Website";
@@ -4121,11 +4134,12 @@ function RegisterFormFields({
4121
4134
  styles: styles3,
4122
4135
  onChange,
4123
4136
  onSubmitEditing,
4124
- testIdPrefix
4137
+ testIdPrefix,
4138
+ compact = false
4125
4139
  }) {
4126
4140
  return /* @__PURE__ */ jsxs(Fragment, { children: [
4127
- FIELDS.map((config) => {
4128
- const copy = labels.fields[config.key];
4141
+ (compact ? COMPACT_FIELDS : FIELDS).map((config) => {
4142
+ const copy = copyFor(config.key, labels, compact);
4129
4143
  return /* @__PURE__ */ jsxs(View, { style: styles3.fieldGroup, children: [
4130
4144
  /* @__PURE__ */ jsx(Text, { style: styles3.label, children: copy.label }),
4131
4145
  /* @__PURE__ */ jsx(
@@ -4178,6 +4192,9 @@ var RegisterErrorCode = /* @__PURE__ */ ((RegisterErrorCode2) => {
4178
4192
  RegisterErrorCode2["UsernameTaken"] = "usernameTaken";
4179
4193
  RegisterErrorCode2["EmailTaken"] = "emailTaken";
4180
4194
  RegisterErrorCode2["RealmInvalid"] = "realmInvalid";
4195
+ RegisterErrorCode2["TenantNameTaken"] = "tenantNameTaken";
4196
+ RegisterErrorCode2["RateLimited"] = "rateLimited";
4197
+ RegisterErrorCode2["AutoLoginFailed"] = "autoLoginFailed";
4181
4198
  RegisterErrorCode2["ValidationFailed"] = "validationFailed";
4182
4199
  RegisterErrorCode2["Failed"] = "failed";
4183
4200
  RegisterErrorCode2["InFlight"] = "inFlight";
@@ -4269,6 +4286,41 @@ function validateRegisterValues(values, passwordPolicy) {
4269
4286
  }
4270
4287
  return null;
4271
4288
  }
4289
+ var HTTP_TOO_MANY_REQUESTS = 429;
4290
+ var HTTP_SERVER_ERROR_MIN = 500;
4291
+ var BODY_ERROR_CODES = {
4292
+ USER_EXISTS: "emailTaken" /* EmailTaken */,
4293
+ USERNAME_TAKEN: "usernameTaken" /* UsernameTaken */,
4294
+ EMAIL_TAKEN: "emailTaken" /* EmailTaken */,
4295
+ TENANT_NAME_TAKEN: "tenantNameTaken" /* TenantNameTaken */,
4296
+ AUTO_LOGIN_FAILED: "autoLoginFailed" /* AutoLoginFailed */,
4297
+ INVALID_REQUEST: "validationFailed" /* ValidationFailed */,
4298
+ REALM_REQUIRED: "realmInvalid" /* RealmInvalid */,
4299
+ REALM_INVALID: "realmInvalid" /* RealmInvalid */
4300
+ };
4301
+ function typedFailureOf(error) {
4302
+ if (typeof error !== "object" || error === null) {
4303
+ return null;
4304
+ }
4305
+ const { status, errorCode } = error;
4306
+ const hasStatus = typeof status === "number";
4307
+ const hasCode = typeof errorCode === "string";
4308
+ if (!hasStatus && !hasCode) {
4309
+ return null;
4310
+ }
4311
+ return { status: hasStatus ? status : null, errorCode: hasCode ? errorCode : null };
4312
+ }
4313
+ function mapTypedFailure(failure) {
4314
+ const byCode = failure.errorCode === null ? void 0 : BODY_ERROR_CODES[failure.errorCode];
4315
+ if (byCode !== void 0) {
4316
+ return byCode;
4317
+ }
4318
+ if (failure.status === HTTP_TOO_MANY_REQUESTS) {
4319
+ return "rateLimited" /* RateLimited */;
4320
+ }
4321
+ const isServerError = failure.status !== null && failure.status >= HTTP_SERVER_ERROR_MIN;
4322
+ return isServerError ? "failed" /* Failed */ : null;
4323
+ }
4272
4324
  function messageOf(error) {
4273
4325
  if (error instanceof Error) {
4274
4326
  return error.message;
@@ -4276,6 +4328,11 @@ function messageOf(error) {
4276
4328
  return typeof error === "string" ? error : "";
4277
4329
  }
4278
4330
  function mapRegisterErrorCode(error) {
4331
+ const failure = typedFailureOf(error);
4332
+ const typed = failure === null ? null : mapTypedFailure(failure);
4333
+ if (typed !== null) {
4334
+ return typed;
4335
+ }
4279
4336
  const message = messageOf(error);
4280
4337
  if (message === "") {
4281
4338
  return "failed" /* Failed */;
@@ -4284,6 +4341,29 @@ function mapRegisterErrorCode(error) {
4284
4341
  return match === void 0 ? "validationFailed" /* ValidationFailed */ : match[1];
4285
4342
  }
4286
4343
 
4344
+ // src/hooks/registerCompact.ts
4345
+ var WHITESPACE_RUN = /\s+/;
4346
+ var UNSAFE_USERNAME_CHARS = /[^a-z0-9._-]/g;
4347
+ var USERNAME_REPLACEMENT = "_";
4348
+ function splitFullName(fullName) {
4349
+ const words = fullName.trim().split(WHITESPACE_RUN).filter((word) => word !== "");
4350
+ const [first = "", ...rest] = words;
4351
+ return { firstName: first, lastName: rest.length > 0 ? rest.join(" ") : first };
4352
+ }
4353
+ function deriveUsernameFromEmail(email) {
4354
+ return email.trim().toLowerCase().replace(UNSAFE_USERNAME_CHARS, USERNAME_REPLACEMENT);
4355
+ }
4356
+ function expandCompactRegisterValues(values) {
4357
+ const { firstName, lastName } = splitFullName(values.firstName);
4358
+ return {
4359
+ ...values,
4360
+ firstName,
4361
+ lastName,
4362
+ username: deriveUsernameFromEmail(values.email),
4363
+ confirmPassword: values.password
4364
+ };
4365
+ }
4366
+
4287
4367
  // src/hooks/useRegisterForm.ts
4288
4368
  var EMPTY_VALUES = {
4289
4369
  firstName: "",
@@ -4309,7 +4389,8 @@ function toSubmitValues(values) {
4309
4389
  function useRegisterForm({
4310
4390
  onSubmit,
4311
4391
  passwordPolicy = isRegisterPasswordStrong,
4312
- onSubmitAttempt
4392
+ onSubmitAttempt,
4393
+ compact = false
4313
4394
  }) {
4314
4395
  const [state, setState] = useState(EMPTY_VALUES);
4315
4396
  const [isSubmitting, setIsSubmitting] = useState(false);
@@ -4323,7 +4404,8 @@ function useRegisterForm({
4323
4404
  return { ok: false, error: "inFlight" /* InFlight */ };
4324
4405
  }
4325
4406
  onSubmitAttempt?.();
4326
- const trimmed = trimRegisterValues(state);
4407
+ const trimmedRaw = trimRegisterValues(state);
4408
+ const trimmed = compact ? expandCompactRegisterValues(trimmedRaw) : trimmedRaw;
4327
4409
  const refusal = trimmed.website === "" ? validateRegisterValues(trimmed, passwordPolicy) : "failed" /* Failed */;
4328
4410
  if (refusal !== null) {
4329
4411
  setError(refusal);
@@ -4343,7 +4425,7 @@ function useRegisterForm({
4343
4425
  inFlight.current = false;
4344
4426
  setIsSubmitting(false);
4345
4427
  }
4346
- }, [onSubmit, onSubmitAttempt, passwordPolicy, state]);
4428
+ }, [compact, onSubmit, onSubmitAttempt, passwordPolicy, state]);
4347
4429
  return { state, setField, submit, isSubmitting, error };
4348
4430
  }
4349
4431
  function RegisterForm({
@@ -4355,7 +4437,8 @@ function RegisterForm({
4355
4437
  labels: labelsProp,
4356
4438
  theme: themeProp,
4357
4439
  footer,
4358
- testIdPrefix
4440
+ testIdPrefix,
4441
+ compact = false
4359
4442
  }) {
4360
4443
  const theme = useAuthTheme(themeProp);
4361
4444
  const styles3 = useAuthStyles(theme);
@@ -4366,7 +4449,8 @@ function RegisterForm({
4366
4449
  const { state, setField, submit, isSubmitting } = useRegisterForm({
4367
4450
  onSubmit,
4368
4451
  onSubmitAttempt,
4369
- passwordPolicy
4452
+ passwordPolicy,
4453
+ compact
4370
4454
  });
4371
4455
  const handlePress = useCallback(async () => {
4372
4456
  routeRegisterOutcome(await submit(), { onSuccess, onError });
@@ -4378,6 +4462,7 @@ function RegisterForm({
4378
4462
  /* @__PURE__ */ jsx(
4379
4463
  RegisterFormFields,
4380
4464
  {
4465
+ compact,
4381
4466
  disabled: isSubmitting,
4382
4467
  labels,
4383
4468
  styles: styles3,
@@ -4539,6 +4624,6 @@ function createBffChangePasswordClient(options = {}) {
4539
4624
  };
4540
4625
  }
4541
4626
 
4542
- export { AccountSettingsScreen, AuthScreen, AuthTestIds, AuthThemeProvider, BffAuthStatus, CHANGE_PASSWORD_ENDPOINT, ChangePasswordCard, ChangePasswordErrorKey, DEFAULT_ACCOUNT_SETTINGS_LABELS, DEFAULT_AUTH_CARD_MAX_WIDTH, DEFAULT_DEMO_CREDENTIALS_HINT_LABELS, DEFAULT_DEVICE_PIN_ENROLL_LABELS, DEFAULT_DEVICE_PIN_SETTINGS_LABELS, DEFAULT_DEVICE_PIN_UNLOCK_LABELS, DEFAULT_FORGOT_PASSWORD_FIELDS_LABELS, DEFAULT_FORGOT_PASSWORD_LABELS, DEFAULT_LOGIN_LABELS, DEFAULT_OTP_LABELS, DEFAULT_PASSKEY_LOGIN_LABELS, DEFAULT_PASSKEY_SETTINGS_LABELS, DEFAULT_PIN_LABELS, DEFAULT_PREFERRED_METHOD_HINT_LABELS, DEFAULT_PREFERRED_METHOD_SETTINGS_LABELS, DEFAULT_REGISTER_LABELS, DEFAULT_RESET_PASSWORD_LABELS, DEVICE_PIN_ALLOWED_DIGITS, DEVICE_PIN_DEFAULT_DIGITS, DemoCredentialsHint, DemoCredentialsHintVariant, DevicePinEnrollErrorKey, DevicePinEnrollForm, DevicePinErrorKey, DevicePinInput, DevicePinLengthPicker, DevicePinOffer, DevicePinSettingsCard, DevicePinUnlockScreen, ForgotPasswordFields, ForgotPasswordForm, LoginForm, OtpForm, OtpLoginStep, PASSWORD_MAX_LENGTH, PASSWORD_MIN_LENGTH, PasskeyCeremonyMode, PasskeyCeremonyStatus, PasskeyLoginButton, PasskeySettingsCard, PasswordPolicyError, PinForm, PreferredMethodHint, PreferredMethodSettingsCard, PrefillIntent, RegisterErrorCode, RegisterForm, RegisterTestIds, ResetPasswordError, ResetPasswordForm, cachePreferredMethod, clearCachedPreferredMethod, collectUserRoles, createBffAuthClient, createBffChangePasswordClient, createPreferencesClient, defaultAuthTheme, isAllowedPinDigits, isPasswordValid, isRegisterPasswordStrong, isValidForgotPasswordEmail, performBffLogout, readCachedPreferredMethod, readPasskeyError, readPasskeyRegistered, resolveAccessibleRoutes, resolveAccountList, resolveDemoAccounts, resolveDemoCredentials, resolvePostLoginRoute, startPasskeyLogin, startPasskeyRegistration, syncPreferredMethodFromServer, useAuthTheme, useBffAuth, useBffForgotPassword, useBffLoginConfig, useBffResetPassword, useChangePassword, useDemoCredentials, useDevicePinDisable, useDevicePinEnroll, useDevicePinUnlock, useForgotPasswordSubmit, useOtpLogin, usePasskeyCeremony, usePinLogin, usePreferredMethodSetting, useRegisterForm, useResetPasswordForm, validatePasswordPolicy, withTestIdPrefix };
4627
+ export { AccountSettingsScreen, AuthScreen, AuthTestIds, AuthThemeProvider, BffAuthStatus, CHANGE_PASSWORD_ENDPOINT, ChangePasswordCard, ChangePasswordErrorKey, DEFAULT_ACCOUNT_SETTINGS_LABELS, DEFAULT_AUTH_CARD_MAX_WIDTH, DEFAULT_DEMO_CREDENTIALS_HINT_LABELS, DEFAULT_DEVICE_PIN_ENROLL_LABELS, DEFAULT_DEVICE_PIN_SETTINGS_LABELS, DEFAULT_DEVICE_PIN_UNLOCK_LABELS, DEFAULT_FORGOT_PASSWORD_FIELDS_LABELS, DEFAULT_FORGOT_PASSWORD_LABELS, DEFAULT_LOGIN_LABELS, DEFAULT_OTP_LABELS, DEFAULT_PASSKEY_LOGIN_LABELS, DEFAULT_PASSKEY_SETTINGS_LABELS, DEFAULT_PIN_LABELS, DEFAULT_PREFERRED_METHOD_HINT_LABELS, DEFAULT_PREFERRED_METHOD_SETTINGS_LABELS, DEFAULT_REGISTER_LABELS, DEFAULT_RESET_PASSWORD_LABELS, DEVICE_PIN_ALLOWED_DIGITS, DEVICE_PIN_DEFAULT_DIGITS, DemoCredentialsHint, DemoCredentialsHintVariant, DevicePinEnrollErrorKey, DevicePinEnrollForm, DevicePinErrorKey, DevicePinInput, DevicePinLengthPicker, DevicePinOffer, DevicePinSettingsCard, DevicePinUnlockScreen, ForgotPasswordFields, ForgotPasswordForm, LoginForm, OtpForm, OtpLoginStep, PASSWORD_MAX_LENGTH, PASSWORD_MIN_LENGTH, PasskeyCeremonyMode, PasskeyCeremonyStatus, PasskeyLoginButton, PasskeySettingsCard, PasswordPolicyError, PinForm, PreferredMethodHint, PreferredMethodSettingsCard, PrefillIntent, RegisterErrorCode, RegisterForm, RegisterTestIds, ResetPasswordError, ResetPasswordForm, cachePreferredMethod, clearCachedPreferredMethod, collectUserRoles, createBffAuthClient, createBffChangePasswordClient, createPreferencesClient, defaultAuthTheme, deriveUsernameFromEmail, isAllowedPinDigits, isPasswordValid, isRegisterPasswordStrong, isValidForgotPasswordEmail, performBffLogout, readCachedPreferredMethod, readPasskeyError, readPasskeyRegistered, resolveAccessibleRoutes, resolveAccountList, resolveDemoAccounts, resolveDemoCredentials, resolvePostLoginRoute, splitFullName, startPasskeyLogin, startPasskeyRegistration, syncPreferredMethodFromServer, useAuthTheme, useBffAuth, useBffForgotPassword, useBffLoginConfig, useBffResetPassword, useChangePassword, useDemoCredentials, useDevicePinDisable, useDevicePinEnroll, useDevicePinUnlock, useForgotPasswordSubmit, useOtpLogin, usePasskeyCeremony, usePinLogin, usePreferredMethodSetting, useRegisterForm, useResetPasswordForm, validatePasswordPolicy, withTestIdPrefix };
4543
4628
  //# sourceMappingURL=index.mjs.map
4544
4629
  //# sourceMappingURL=index.mjs.map