@digitaldefiance/suite-core-lib 3.6.6 → 3.6.8
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/LICENSE +21 -0
- package/README.md +82 -44
- package/package.json +10 -6
- package/src/backup-code-string.ts +96 -0
- package/src/builders/{index.d.ts → index.ts} +1 -1
- package/src/builders/role-builder.ts +63 -0
- package/src/builders/user-builder.ts +72 -0
- package/src/constants.ts +220 -0
- package/src/core/{errors.d.ts → errors.ts} +4 -1
- package/src/core/{index.d.ts → index.ts} +1 -1
- package/src/core/result.ts +36 -0
- package/src/core/{types.d.ts → types.ts} +6 -1
- package/src/defaults.ts +110 -0
- package/src/enumerations/account-status.ts +17 -0
- package/src/enumerations/email-token-type.ts +24 -0
- package/src/enumerations/fec-error-type.ts +13 -0
- package/src/enumerations/{index.d.ts → index.ts} +1 -2
- package/src/enumerations/pbkdf2-error-type.ts +4 -0
- package/src/enumerations/role.ts +5 -0
- package/src/enumerations/suite-core-string-key.ts +495 -0
- package/src/errors/account-locked.ts +9 -0
- package/src/errors/account-status.ts +33 -0
- package/src/errors/admin-role-not-found.ts +10 -0
- package/src/errors/core-typed-handleable.ts +69 -0
- package/src/errors/direct-challenge-not-enabled.ts +12 -0
- package/src/errors/direct-token-used.ts +9 -0
- package/src/errors/email-in-use.ts +11 -0
- package/src/errors/email-token-expired.ts +12 -0
- package/src/errors/email-token-failed-to-send.ts +20 -0
- package/src/errors/email-token-sent-too-recently.ts +29 -0
- package/src/errors/email-token-used-or-invalid.ts +12 -0
- package/src/errors/email-verified.ts +11 -0
- package/src/errors/failed-to-use-direct-token.ts +9 -0
- package/src/errors/fec-error.ts +33 -0
- package/src/errors/generic-validation.ts +11 -0
- package/src/errors/{index.d.ts → index.ts} +0 -1
- package/src/errors/invalid-backup-code.ts +6 -0
- package/src/errors/invalid-challenge-response.ts +12 -0
- package/src/errors/invalid-challenge.ts +9 -0
- package/src/errors/invalid-credentials.ts +14 -0
- package/src/errors/invalid-email.ts +22 -0
- package/src/errors/invalid-expired-token.ts +11 -0
- package/src/errors/invalid-token.ts +13 -0
- package/src/errors/invalid-userid.ts +21 -0
- package/src/errors/invalid-username.ts +14 -0
- package/src/errors/last-admin-error.ts +12 -0
- package/src/errors/login-challenge-expired.ts +12 -0
- package/src/errors/member-role-not-found.ts +10 -0
- package/src/errors/password-login-not-enabled.ts +12 -0
- package/src/errors/password-login-not-setup.ts +12 -0
- package/src/errors/pbkdf2-error.ts +19 -0
- package/src/errors/pending-email-verification.ts +9 -0
- package/src/errors/private-key-required.ts +13 -0
- package/src/errors/system-role-not-found.ts +10 -0
- package/src/errors/token-not-found.ts +26 -0
- package/src/errors/translatable-suite-handleable.ts +27 -0
- package/src/errors/translatable-suite.ts +34 -0
- package/src/errors/user-not-found.ts +14 -0
- package/src/errors/username-email-required.ts +20 -0
- package/src/errors/username-in-use.ts +14 -0
- package/src/i18n-setup.ts +141 -0
- package/src/{index.d.ts → index.ts} +0 -1
- package/src/interfaces/backup-code-consts.ts +15 -0
- package/src/interfaces/backup-code.ts +6 -0
- package/src/interfaces/bases/email-token.ts +38 -0
- package/src/interfaces/bases/{index.d.ts → index.ts} +0 -1
- package/src/interfaces/bases/{mnemonic.d.ts → mnemonic.ts} +5 -5
- package/src/interfaces/bases/role.ts +40 -0
- package/src/interfaces/bases/token-role.ts +9 -0
- package/src/interfaces/bases/{used-direct-login-token.d.ts → used-direct-login-token.ts} +3 -3
- package/src/interfaces/bases/user-role.ts +21 -0
- package/src/interfaces/bases/user.ts +88 -0
- package/src/interfaces/combined-role-privileges.ts +6 -0
- package/src/interfaces/constants.ts +56 -0
- package/src/interfaces/core-consts.ts +130 -0
- package/src/interfaces/deep-partial.ts +3 -0
- package/src/interfaces/dto/{email-token.d.ts → email-token.ts} +1 -1
- package/src/interfaces/dto/{index.d.ts → index.ts} +1 -2
- package/src/interfaces/dto/{mnemonic.d.ts → mnemonic.ts} +1 -1
- package/src/interfaces/dto/request-user.ts +19 -0
- package/src/interfaces/dto/{role.d.ts → role.ts} +1 -1
- package/src/interfaces/dto/{token-role.d.ts → token-role.ts} +9 -3
- package/src/interfaces/dto/{user-role.d.ts → user-role.ts} +1 -1
- package/src/interfaces/dto/{user-settings.d.ts → user-settings.ts} +1 -2
- package/src/interfaces/dto/{user.d.ts → user.ts} +1 -1
- package/src/interfaces/failable-result.ts +6 -0
- package/src/interfaces/frontend-objects/email-token.ts +8 -0
- package/src/interfaces/frontend-objects/{index.d.ts → index.ts} +1 -2
- package/src/interfaces/frontend-objects/request-user.ts +17 -0
- package/src/interfaces/frontend-objects/{role.d.ts → role.ts} +1 -1
- package/src/interfaces/frontend-objects/{user-role.d.ts → user-role.ts} +1 -1
- package/src/interfaces/frontend-objects/user.ts +9 -0
- package/src/interfaces/has-creation.ts +6 -0
- package/src/interfaces/has-creator.ts +6 -0
- package/src/interfaces/has-id.ts +3 -0
- package/src/interfaces/has-soft-delete.ts +6 -0
- package/src/interfaces/has-soft-deleter.ts +6 -0
- package/src/interfaces/has-timestamp-owners.ts +6 -0
- package/src/interfaces/has-timestamps.ts +7 -0
- package/src/interfaces/has-updater.ts +6 -0
- package/src/interfaces/has-updates.ts +3 -0
- package/src/interfaces/{index.d.ts → index.ts} +0 -1
- package/src/interfaces/success-message.ts +4 -0
- package/src/interfaces/{token-user.d.ts → token-user.ts} +3 -3
- package/src/interfaces/{user-settings.d.ts → user-settings.ts} +2 -2
- package/src/lib/flags.ts +286 -0
- package/src/lib/formatters.ts +28 -0
- package/src/lib/hydrate-dehydrate.ts +27 -0
- package/src/lib/{index.d.ts → index.ts} +2 -2
- package/src/lib/validators-with-constants.ts +72 -0
- package/src/lib/validators.ts +72 -0
- package/src/local-storage-manager.ts +69 -0
- package/src/strings/de.ts +689 -0
- package/src/strings/en-GB.ts +626 -0
- package/src/strings/en-US.ts +628 -0
- package/src/strings/es.ts +688 -0
- package/src/strings/fr.ts +685 -0
- package/src/strings/ja.ts +654 -0
- package/src/strings/uk.ts +667 -0
- package/src/strings/zh-CN.ts +566 -0
- package/src/backup-code-string.d.ts +0 -29
- package/src/backup-code-string.d.ts.map +0 -1
- package/src/backup-code-string.js +0 -81
- package/src/backup-code-string.js.map +0 -1
- package/src/builders/index.d.ts.map +0 -1
- package/src/builders/index.js +0 -9
- package/src/builders/index.js.map +0 -1
- package/src/builders/role-builder.d.ts +0 -19
- package/src/builders/role-builder.d.ts.map +0 -1
- package/src/builders/role-builder.js +0 -57
- package/src/builders/role-builder.js.map +0 -1
- package/src/builders/user-builder.d.ts +0 -23
- package/src/builders/user-builder.d.ts.map +0 -1
- package/src/builders/user-builder.js +0 -63
- package/src/builders/user-builder.js.map +0 -1
- package/src/constants.d.ts +0 -7
- package/src/constants.d.ts.map +0 -1
- package/src/constants.js +0 -209
- package/src/constants.js.map +0 -1
- package/src/core/errors.d.ts.map +0 -1
- package/src/core/errors.js +0 -29
- package/src/core/errors.js.map +0 -1
- package/src/core/index.d.ts.map +0 -1
- package/src/core/index.js +0 -10
- package/src/core/index.js.map +0 -1
- package/src/core/result.d.ts +0 -34
- package/src/core/result.d.ts.map +0 -1
- package/src/core/result.js +0 -35
- package/src/core/result.js.map +0 -1
- package/src/core/types.d.ts.map +0 -1
- package/src/core/types.js +0 -6
- package/src/core/types.js.map +0 -1
- package/src/defaults.d.ts +0 -7
- package/src/defaults.d.ts.map +0 -1
- package/src/defaults.js +0 -66
- package/src/defaults.js.map +0 -1
- package/src/enumerations/account-status.d.ts +0 -18
- package/src/enumerations/account-status.d.ts.map +0 -1
- package/src/enumerations/account-status.js +0 -22
- package/src/enumerations/account-status.js.map +0 -1
- package/src/enumerations/email-token-type.d.ts +0 -25
- package/src/enumerations/email-token-type.d.ts.map +0 -1
- package/src/enumerations/email-token-type.js +0 -29
- package/src/enumerations/email-token-type.js.map +0 -1
- package/src/enumerations/fec-error-type.d.ts +0 -14
- package/src/enumerations/fec-error-type.d.ts.map +0 -1
- package/src/enumerations/fec-error-type.js +0 -18
- package/src/enumerations/fec-error-type.js.map +0 -1
- package/src/enumerations/index.d.ts.map +0 -1
- package/src/enumerations/index.js +0 -10
- package/src/enumerations/index.js.map +0 -1
- package/src/enumerations/pbkdf2-error-type.d.ts +0 -5
- package/src/enumerations/pbkdf2-error-type.d.ts.map +0 -1
- package/src/enumerations/pbkdf2-error-type.js +0 -9
- package/src/enumerations/pbkdf2-error-type.js.map +0 -1
- package/src/enumerations/role.d.ts +0 -6
- package/src/enumerations/role.d.ts.map +0 -1
- package/src/enumerations/role.js +0 -10
- package/src/enumerations/role.js.map +0 -1
- package/src/enumerations/suite-core-string-key.d.ts +0 -482
- package/src/enumerations/suite-core-string-key.d.ts.map +0 -1
- package/src/enumerations/suite-core-string-key.js +0 -493
- package/src/enumerations/suite-core-string-key.js.map +0 -1
- package/src/errors/account-locked.d.ts +0 -5
- package/src/errors/account-locked.d.ts.map +0 -1
- package/src/errors/account-locked.js +0 -13
- package/src/errors/account-locked.js.map +0 -1
- package/src/errors/account-status.d.ts +0 -7
- package/src/errors/account-status.d.ts.map +0 -1
- package/src/errors/account-status.js +0 -31
- package/src/errors/account-status.js.map +0 -1
- package/src/errors/admin-role-not-found.d.ts +0 -6
- package/src/errors/admin-role-not-found.d.ts.map +0 -1
- package/src/errors/admin-role-not-found.js +0 -13
- package/src/errors/admin-role-not-found.js.map +0 -1
- package/src/errors/core-typed-handleable.d.ts +0 -12
- package/src/errors/core-typed-handleable.d.ts.map +0 -1
- package/src/errors/core-typed-handleable.js +0 -51
- package/src/errors/core-typed-handleable.js.map +0 -1
- package/src/errors/direct-challenge-not-enabled.d.ts +0 -5
- package/src/errors/direct-challenge-not-enabled.d.ts.map +0 -1
- package/src/errors/direct-challenge-not-enabled.js +0 -16
- package/src/errors/direct-challenge-not-enabled.js.map +0 -1
- package/src/errors/direct-token-used.d.ts +0 -5
- package/src/errors/direct-token-used.d.ts.map +0 -1
- package/src/errors/direct-token-used.js +0 -13
- package/src/errors/direct-token-used.js.map +0 -1
- package/src/errors/email-in-use.d.ts +0 -5
- package/src/errors/email-in-use.d.ts.map +0 -1
- package/src/errors/email-in-use.js +0 -15
- package/src/errors/email-in-use.js.map +0 -1
- package/src/errors/email-token-expired.d.ts +0 -5
- package/src/errors/email-token-expired.d.ts.map +0 -1
- package/src/errors/email-token-expired.js +0 -15
- package/src/errors/email-token-expired.js.map +0 -1
- package/src/errors/email-token-failed-to-send.d.ts +0 -6
- package/src/errors/email-token-failed-to-send.d.ts.map +0 -1
- package/src/errors/email-token-failed-to-send.js +0 -22
- package/src/errors/email-token-failed-to-send.js.map +0 -1
- package/src/errors/email-token-sent-too-recently.d.ts +0 -7
- package/src/errors/email-token-sent-too-recently.d.ts.map +0 -1
- package/src/errors/email-token-sent-too-recently.js +0 -21
- package/src/errors/email-token-sent-too-recently.js.map +0 -1
- package/src/errors/email-token-used-or-invalid.d.ts +0 -5
- package/src/errors/email-token-used-or-invalid.d.ts.map +0 -1
- package/src/errors/email-token-used-or-invalid.js +0 -15
- package/src/errors/email-token-used-or-invalid.js.map +0 -1
- package/src/errors/email-verified.d.ts +0 -5
- package/src/errors/email-verified.d.ts.map +0 -1
- package/src/errors/email-verified.js +0 -15
- package/src/errors/email-verified.js.map +0 -1
- package/src/errors/failed-to-use-direct-token.d.ts +0 -5
- package/src/errors/failed-to-use-direct-token.d.ts.map +0 -1
- package/src/errors/failed-to-use-direct-token.js +0 -13
- package/src/errors/failed-to-use-direct-token.js.map +0 -1
- package/src/errors/fec-error.d.ts +0 -6
- package/src/errors/fec-error.d.ts.map +0 -1
- package/src/errors/fec-error.js +0 -26
- package/src/errors/fec-error.js.map +0 -1
- package/src/errors/generic-validation.d.ts +0 -5
- package/src/errors/generic-validation.d.ts.map +0 -1
- package/src/errors/generic-validation.js +0 -12
- package/src/errors/generic-validation.js.map +0 -1
- package/src/errors/index.d.ts.map +0 -1
- package/src/errors/index.js +0 -43
- package/src/errors/index.js.map +0 -1
- package/src/errors/invalid-backup-code.d.ts +0 -4
- package/src/errors/invalid-backup-code.d.ts.map +0 -1
- package/src/errors/invalid-backup-code.js +0 -11
- package/src/errors/invalid-backup-code.js.map +0 -1
- package/src/errors/invalid-challenge-response.d.ts +0 -5
- package/src/errors/invalid-challenge-response.d.ts.map +0 -1
- package/src/errors/invalid-challenge-response.js +0 -16
- package/src/errors/invalid-challenge-response.js.map +0 -1
- package/src/errors/invalid-challenge.d.ts +0 -5
- package/src/errors/invalid-challenge.d.ts.map +0 -1
- package/src/errors/invalid-challenge.js +0 -13
- package/src/errors/invalid-challenge.js.map +0 -1
- package/src/errors/invalid-credentials.d.ts +0 -5
- package/src/errors/invalid-credentials.d.ts.map +0 -1
- package/src/errors/invalid-credentials.js +0 -15
- package/src/errors/invalid-credentials.js.map +0 -1
- package/src/errors/invalid-email.d.ts +0 -8
- package/src/errors/invalid-email.d.ts.map +0 -1
- package/src/errors/invalid-email.js +0 -25
- package/src/errors/invalid-email.js.map +0 -1
- package/src/errors/invalid-expired-token.d.ts +0 -7
- package/src/errors/invalid-expired-token.d.ts.map +0 -1
- package/src/errors/invalid-expired-token.js +0 -13
- package/src/errors/invalid-expired-token.js.map +0 -1
- package/src/errors/invalid-token.d.ts +0 -5
- package/src/errors/invalid-token.d.ts.map +0 -1
- package/src/errors/invalid-token.js +0 -16
- package/src/errors/invalid-token.js.map +0 -1
- package/src/errors/invalid-userid.d.ts +0 -6
- package/src/errors/invalid-userid.d.ts.map +0 -1
- package/src/errors/invalid-userid.js +0 -18
- package/src/errors/invalid-userid.js.map +0 -1
- package/src/errors/invalid-username.d.ts +0 -5
- package/src/errors/invalid-username.d.ts.map +0 -1
- package/src/errors/invalid-username.js +0 -13
- package/src/errors/invalid-username.js.map +0 -1
- package/src/errors/last-admin-error.d.ts +0 -6
- package/src/errors/last-admin-error.d.ts.map +0 -1
- package/src/errors/last-admin-error.js +0 -15
- package/src/errors/last-admin-error.js.map +0 -1
- package/src/errors/login-challenge-expired.d.ts +0 -5
- package/src/errors/login-challenge-expired.d.ts.map +0 -1
- package/src/errors/login-challenge-expired.js +0 -16
- package/src/errors/login-challenge-expired.js.map +0 -1
- package/src/errors/member-role-not-found.d.ts +0 -6
- package/src/errors/member-role-not-found.d.ts.map +0 -1
- package/src/errors/member-role-not-found.js +0 -13
- package/src/errors/member-role-not-found.js.map +0 -1
- package/src/errors/password-login-not-enabled.d.ts +0 -5
- package/src/errors/password-login-not-enabled.d.ts.map +0 -1
- package/src/errors/password-login-not-enabled.js +0 -16
- package/src/errors/password-login-not-enabled.js.map +0 -1
- package/src/errors/password-login-not-setup.d.ts +0 -5
- package/src/errors/password-login-not-setup.d.ts.map +0 -1
- package/src/errors/password-login-not-setup.js +0 -16
- package/src/errors/password-login-not-setup.js.map +0 -1
- package/src/errors/pbkdf2-error.d.ts +0 -7
- package/src/errors/pbkdf2-error.d.ts.map +0 -1
- package/src/errors/pbkdf2-error.js +0 -20
- package/src/errors/pbkdf2-error.js.map +0 -1
- package/src/errors/pending-email-verification.d.ts +0 -5
- package/src/errors/pending-email-verification.d.ts.map +0 -1
- package/src/errors/pending-email-verification.js +0 -13
- package/src/errors/pending-email-verification.js.map +0 -1
- package/src/errors/private-key-required.d.ts +0 -5
- package/src/errors/private-key-required.d.ts.map +0 -1
- package/src/errors/private-key-required.js +0 -13
- package/src/errors/private-key-required.js.map +0 -1
- package/src/errors/system-role-not-found.d.ts +0 -6
- package/src/errors/system-role-not-found.d.ts.map +0 -1
- package/src/errors/system-role-not-found.js +0 -13
- package/src/errors/system-role-not-found.js.map +0 -1
- package/src/errors/token-not-found.d.ts +0 -7
- package/src/errors/token-not-found.d.ts.map +0 -1
- package/src/errors/token-not-found.js +0 -19
- package/src/errors/token-not-found.js.map +0 -1
- package/src/errors/translatable-suite-handleable.d.ts +0 -10
- package/src/errors/translatable-suite-handleable.d.ts.map +0 -1
- package/src/errors/translatable-suite-handleable.js +0 -15
- package/src/errors/translatable-suite-handleable.js.map +0 -1
- package/src/errors/translatable-suite.d.ts +0 -13
- package/src/errors/translatable-suite.d.ts.map +0 -1
- package/src/errors/translatable-suite.js +0 -29
- package/src/errors/translatable-suite.js.map +0 -1
- package/src/errors/user-not-found.d.ts +0 -5
- package/src/errors/user-not-found.d.ts.map +0 -1
- package/src/errors/user-not-found.js +0 -13
- package/src/errors/user-not-found.js.map +0 -1
- package/src/errors/username-email-required.d.ts +0 -6
- package/src/errors/username-email-required.d.ts.map +0 -1
- package/src/errors/username-email-required.js +0 -16
- package/src/errors/username-email-required.js.map +0 -1
- package/src/errors/username-in-use.d.ts +0 -5
- package/src/errors/username-in-use.d.ts.map +0 -1
- package/src/errors/username-in-use.js +0 -13
- package/src/errors/username-in-use.js.map +0 -1
- package/src/i18n-setup.d.ts +0 -13
- package/src/i18n-setup.d.ts.map +0 -1
- package/src/i18n-setup.js +0 -116
- package/src/i18n-setup.js.map +0 -1
- package/src/index.d.ts.map +0 -1
- package/src/index.js +0 -15
- package/src/index.js.map +0 -1
- package/src/interfaces/backup-code-consts.d.ts +0 -16
- package/src/interfaces/backup-code-consts.d.ts.map +0 -1
- package/src/interfaces/backup-code-consts.js +0 -3
- package/src/interfaces/backup-code-consts.js.map +0 -1
- package/src/interfaces/backup-code.d.ts +0 -7
- package/src/interfaces/backup-code.d.ts.map +0 -1
- package/src/interfaces/backup-code.js +0 -3
- package/src/interfaces/backup-code.js.map +0 -1
- package/src/interfaces/bases/email-token.d.ts +0 -33
- package/src/interfaces/bases/email-token.d.ts.map +0 -1
- package/src/interfaces/bases/email-token.js +0 -3
- package/src/interfaces/bases/email-token.js.map +0 -1
- package/src/interfaces/bases/index.d.ts.map +0 -1
- package/src/interfaces/bases/index.js +0 -11
- package/src/interfaces/bases/index.js.map +0 -1
- package/src/interfaces/bases/mnemonic.d.ts.map +0 -1
- package/src/interfaces/bases/mnemonic.js +0 -3
- package/src/interfaces/bases/mnemonic.js.map +0 -1
- package/src/interfaces/bases/role.d.ts +0 -32
- package/src/interfaces/bases/role.d.ts.map +0 -1
- package/src/interfaces/bases/role.js +0 -3
- package/src/interfaces/bases/role.js.map +0 -1
- package/src/interfaces/bases/token-role.d.ts +0 -8
- package/src/interfaces/bases/token-role.d.ts.map +0 -1
- package/src/interfaces/bases/token-role.js +0 -3
- package/src/interfaces/bases/token-role.js.map +0 -1
- package/src/interfaces/bases/used-direct-login-token.d.ts.map +0 -1
- package/src/interfaces/bases/used-direct-login-token.js +0 -3
- package/src/interfaces/bases/used-direct-login-token.js.map +0 -1
- package/src/interfaces/bases/user-role.d.ts +0 -16
- package/src/interfaces/bases/user-role.d.ts.map +0 -1
- package/src/interfaces/bases/user-role.js +0 -3
- package/src/interfaces/bases/user-role.js.map +0 -1
- package/src/interfaces/bases/user.d.ts +0 -79
- package/src/interfaces/bases/user.d.ts.map +0 -1
- package/src/interfaces/bases/user.js +0 -3
- package/src/interfaces/bases/user.js.map +0 -1
- package/src/interfaces/combined-role-privileges.d.ts +0 -7
- package/src/interfaces/combined-role-privileges.d.ts.map +0 -1
- package/src/interfaces/combined-role-privileges.js +0 -3
- package/src/interfaces/combined-role-privileges.js.map +0 -1
- package/src/interfaces/constants.d.ts +0 -56
- package/src/interfaces/constants.d.ts.map +0 -1
- package/src/interfaces/constants.js +0 -3
- package/src/interfaces/constants.js.map +0 -1
- package/src/interfaces/core-consts.d.ts +0 -130
- package/src/interfaces/core-consts.d.ts.map +0 -1
- package/src/interfaces/core-consts.js +0 -3
- package/src/interfaces/core-consts.js.map +0 -1
- package/src/interfaces/deep-partial.d.ts +0 -4
- package/src/interfaces/deep-partial.d.ts.map +0 -1
- package/src/interfaces/deep-partial.js +0 -3
- package/src/interfaces/deep-partial.js.map +0 -1
- package/src/interfaces/dto/email-token.d.ts.map +0 -1
- package/src/interfaces/dto/email-token.js +0 -3
- package/src/interfaces/dto/email-token.js.map +0 -1
- package/src/interfaces/dto/index.d.ts.map +0 -1
- package/src/interfaces/dto/index.js +0 -12
- package/src/interfaces/dto/index.js.map +0 -1
- package/src/interfaces/dto/mnemonic.d.ts.map +0 -1
- package/src/interfaces/dto/mnemonic.js +0 -3
- package/src/interfaces/dto/mnemonic.js.map +0 -1
- package/src/interfaces/dto/request-user.d.ts +0 -17
- package/src/interfaces/dto/request-user.d.ts.map +0 -1
- package/src/interfaces/dto/request-user.js +0 -3
- package/src/interfaces/dto/request-user.js.map +0 -1
- package/src/interfaces/dto/role.d.ts.map +0 -1
- package/src/interfaces/dto/role.js +0 -3
- package/src/interfaces/dto/role.js.map +0 -1
- package/src/interfaces/dto/token-role.d.ts.map +0 -1
- package/src/interfaces/dto/token-role.js +0 -3
- package/src/interfaces/dto/token-role.js.map +0 -1
- package/src/interfaces/dto/user-role.d.ts.map +0 -1
- package/src/interfaces/dto/user-role.js +0 -3
- package/src/interfaces/dto/user-role.js.map +0 -1
- package/src/interfaces/dto/user-settings.d.ts.map +0 -1
- package/src/interfaces/dto/user-settings.js +0 -3
- package/src/interfaces/dto/user-settings.js.map +0 -1
- package/src/interfaces/dto/user.d.ts.map +0 -1
- package/src/interfaces/dto/user.js +0 -3
- package/src/interfaces/dto/user.js.map +0 -1
- package/src/interfaces/failable-result.d.ts +0 -7
- package/src/interfaces/failable-result.d.ts.map +0 -1
- package/src/interfaces/failable-result.js +0 -3
- package/src/interfaces/failable-result.js.map +0 -1
- package/src/interfaces/frontend-objects/email-token.d.ts +0 -4
- package/src/interfaces/frontend-objects/email-token.d.ts.map +0 -1
- package/src/interfaces/frontend-objects/email-token.js +0 -3
- package/src/interfaces/frontend-objects/email-token.js.map +0 -1
- package/src/interfaces/frontend-objects/index.d.ts.map +0 -1
- package/src/interfaces/frontend-objects/index.js +0 -9
- package/src/interfaces/frontend-objects/index.js.map +0 -1
- package/src/interfaces/frontend-objects/request-user.d.ts +0 -17
- package/src/interfaces/frontend-objects/request-user.d.ts.map +0 -1
- package/src/interfaces/frontend-objects/request-user.js +0 -3
- package/src/interfaces/frontend-objects/request-user.js.map +0 -1
- package/src/interfaces/frontend-objects/role.d.ts.map +0 -1
- package/src/interfaces/frontend-objects/role.js +0 -3
- package/src/interfaces/frontend-objects/role.js.map +0 -1
- package/src/interfaces/frontend-objects/user-role.d.ts.map +0 -1
- package/src/interfaces/frontend-objects/user-role.js +0 -3
- package/src/interfaces/frontend-objects/user-role.js.map +0 -1
- package/src/interfaces/frontend-objects/user.d.ts +0 -4
- package/src/interfaces/frontend-objects/user.d.ts.map +0 -1
- package/src/interfaces/frontend-objects/user.js +0 -3
- package/src/interfaces/frontend-objects/user.js.map +0 -1
- package/src/interfaces/has-creation.d.ts +0 -7
- package/src/interfaces/has-creation.d.ts.map +0 -1
- package/src/interfaces/has-creation.js +0 -3
- package/src/interfaces/has-creation.js.map +0 -1
- package/src/interfaces/has-creator.d.ts +0 -7
- package/src/interfaces/has-creator.d.ts.map +0 -1
- package/src/interfaces/has-creator.js +0 -3
- package/src/interfaces/has-creator.js.map +0 -1
- package/src/interfaces/has-id.d.ts +0 -4
- package/src/interfaces/has-id.d.ts.map +0 -1
- package/src/interfaces/has-id.js +0 -3
- package/src/interfaces/has-id.js.map +0 -1
- package/src/interfaces/has-soft-delete.d.ts +0 -7
- package/src/interfaces/has-soft-delete.d.ts.map +0 -1
- package/src/interfaces/has-soft-delete.js +0 -3
- package/src/interfaces/has-soft-delete.js.map +0 -1
- package/src/interfaces/has-soft-deleter.d.ts +0 -7
- package/src/interfaces/has-soft-deleter.d.ts.map +0 -1
- package/src/interfaces/has-soft-deleter.js +0 -3
- package/src/interfaces/has-soft-deleter.js.map +0 -1
- package/src/interfaces/has-timestamp-owners.d.ts +0 -5
- package/src/interfaces/has-timestamp-owners.d.ts.map +0 -1
- package/src/interfaces/has-timestamp-owners.js +0 -3
- package/src/interfaces/has-timestamp-owners.js.map +0 -1
- package/src/interfaces/has-timestamps.d.ts +0 -6
- package/src/interfaces/has-timestamps.d.ts.map +0 -1
- package/src/interfaces/has-timestamps.js +0 -3
- package/src/interfaces/has-timestamps.js.map +0 -1
- package/src/interfaces/has-updater.d.ts +0 -7
- package/src/interfaces/has-updater.d.ts.map +0 -1
- package/src/interfaces/has-updater.js +0 -3
- package/src/interfaces/has-updater.js.map +0 -1
- package/src/interfaces/has-updates.d.ts +0 -4
- package/src/interfaces/has-updates.d.ts.map +0 -1
- package/src/interfaces/has-updates.js +0 -3
- package/src/interfaces/has-updates.js.map +0 -1
- package/src/interfaces/index.d.ts.map +0 -1
- package/src/interfaces/index.js +0 -26
- package/src/interfaces/index.js.map +0 -1
- package/src/interfaces/success-message.d.ts +0 -5
- package/src/interfaces/success-message.d.ts.map +0 -1
- package/src/interfaces/success-message.js +0 -3
- package/src/interfaces/success-message.js.map +0 -1
- package/src/interfaces/token-user.d.ts.map +0 -1
- package/src/interfaces/token-user.js +0 -3
- package/src/interfaces/token-user.js.map +0 -1
- package/src/interfaces/user-settings.d.ts.map +0 -1
- package/src/interfaces/user-settings.js +0 -3
- package/src/interfaces/user-settings.js.map +0 -1
- package/src/lib/flags.d.ts +0 -10
- package/src/lib/flags.d.ts.map +0 -1
- package/src/lib/flags.js +0 -288
- package/src/lib/flags.js.map +0 -1
- package/src/lib/formatters.d.ts +0 -16
- package/src/lib/formatters.d.ts.map +0 -1
- package/src/lib/formatters.js +0 -29
- package/src/lib/formatters.js.map +0 -1
- package/src/lib/hydrate-dehydrate.d.ts +0 -4
- package/src/lib/hydrate-dehydrate.d.ts.map +0 -1
- package/src/lib/hydrate-dehydrate.js +0 -27
- package/src/lib/hydrate-dehydrate.js.map +0 -1
- package/src/lib/index.d.ts.map +0 -1
- package/src/lib/index.js +0 -12
- package/src/lib/index.js.map +0 -1
- package/src/lib/validators-with-constants.d.ts +0 -73
- package/src/lib/validators-with-constants.d.ts.map +0 -1
- package/src/lib/validators-with-constants.js +0 -64
- package/src/lib/validators-with-constants.js.map +0 -1
- package/src/lib/validators.d.ts +0 -37
- package/src/lib/validators.d.ts.map +0 -1
- package/src/lib/validators.js +0 -74
- package/src/lib/validators.js.map +0 -1
- package/src/local-storage-manager.d.ts +0 -22
- package/src/local-storage-manager.d.ts.map +0 -1
- package/src/local-storage-manager.js +0 -74
- package/src/local-storage-manager.js.map +0 -1
- package/src/strings/de.d.ts +0 -3
- package/src/strings/de.d.ts.map +0 -1
- package/src/strings/de.js +0 -486
- package/src/strings/de.js.map +0 -1
- package/src/strings/en-GB.d.ts +0 -3
- package/src/strings/en-GB.d.ts.map +0 -1
- package/src/strings/en-GB.js +0 -486
- package/src/strings/en-GB.js.map +0 -1
- package/src/strings/en-US.d.ts +0 -3
- package/src/strings/en-US.d.ts.map +0 -1
- package/src/strings/en-US.js +0 -486
- package/src/strings/en-US.js.map +0 -1
- package/src/strings/es.d.ts +0 -3
- package/src/strings/es.d.ts.map +0 -1
- package/src/strings/es.js +0 -486
- package/src/strings/es.js.map +0 -1
- package/src/strings/fr.d.ts +0 -3
- package/src/strings/fr.d.ts.map +0 -1
- package/src/strings/fr.js +0 -486
- package/src/strings/fr.js.map +0 -1
- package/src/strings/ja.d.ts +0 -3
- package/src/strings/ja.d.ts.map +0 -1
- package/src/strings/ja.js +0 -486
- package/src/strings/ja.js.map +0 -1
- package/src/strings/uk.d.ts +0 -3
- package/src/strings/uk.d.ts.map +0 -1
- package/src/strings/uk.js +0 -486
- package/src/strings/uk.js.map +0 -1
- package/src/strings/zh-CN.d.ts +0 -3
- package/src/strings/zh-CN.d.ts.map +0 -1
- package/src/strings/zh-CN.js +0 -486
- package/src/strings/zh-CN.js.map +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Digital Defiance
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -40,36 +40,37 @@ All error messages, validation texts, and user-facing strings are fully localize
|
|
|
40
40
|
|
|
41
41
|
## 🏗️ Architecture Overview
|
|
42
42
|
|
|
43
|
-
### Type-Safe Interfaces
|
|
43
|
+
### Type-Safe Base Interfaces
|
|
44
44
|
|
|
45
45
|
```typescript
|
|
46
46
|
import {
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
IUserBase,
|
|
48
|
+
IRoleBase,
|
|
49
|
+
IUserRoleBase,
|
|
49
50
|
AccountStatus,
|
|
50
51
|
Role,
|
|
51
52
|
CoreLanguage
|
|
52
53
|
} from '@digitaldefiance/suite-core-lib';
|
|
53
54
|
|
|
54
|
-
//
|
|
55
|
-
interface
|
|
56
|
-
|
|
57
|
-
siteLanguage: 'en';
|
|
58
|
-
accountStatus: AccountStatus;
|
|
55
|
+
// Create a user interface with string IDs for frontend applications
|
|
56
|
+
interface FrontendUser extends IUserBase<string, Date, 'en', AccountStatus> {
|
|
57
|
+
// Additional app-specific fields
|
|
59
58
|
}
|
|
60
59
|
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
60
|
+
// Create a user interface with ObjectId for MongoDB backend
|
|
61
|
+
import { Types } from 'mongoose';
|
|
62
|
+
interface BackendUser extends IUserBase<Types.ObjectId, Date, 'en', AccountStatus> {
|
|
63
|
+
// Additional app-specific fields
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Create a user interface with UUID strings for SQL databases
|
|
67
|
+
interface SqlUser extends IUserBase<string, Date, 'en', AccountStatus> {
|
|
68
|
+
// Additional app-specific fields
|
|
66
69
|
}
|
|
67
70
|
|
|
68
|
-
//
|
|
69
|
-
interface
|
|
70
|
-
|
|
71
|
-
createdBy: string;
|
|
72
|
-
updatedBy: string;
|
|
71
|
+
// Create custom role interfaces
|
|
72
|
+
interface AppRole extends IRoleBase<string, Date, Role> {
|
|
73
|
+
// Additional app-specific fields
|
|
73
74
|
}
|
|
74
75
|
```
|
|
75
76
|
|
|
@@ -120,17 +121,23 @@ The **@digitaldefiance/node-express-suite** package builds upon these primitives
|
|
|
120
121
|
### Express.js Framework Usage
|
|
121
122
|
|
|
122
123
|
```typescript
|
|
123
|
-
//
|
|
124
|
+
// Usage of suite-core-lib primitives in Express applications
|
|
124
125
|
import {
|
|
125
|
-
|
|
126
|
+
IUserBase,
|
|
126
127
|
AccountStatus,
|
|
127
128
|
BackupCodeString,
|
|
128
129
|
UserNotFoundError,
|
|
130
|
+
InvalidBackupCodeError,
|
|
129
131
|
CoreLanguage
|
|
130
132
|
} from '@digitaldefiance/suite-core-lib';
|
|
131
133
|
|
|
134
|
+
interface BackupCode {
|
|
135
|
+
encrypted: string;
|
|
136
|
+
used: boolean;
|
|
137
|
+
}
|
|
138
|
+
|
|
132
139
|
// Middleware example: validate backup code input
|
|
133
|
-
function validateBackupCode(userInput: string, storedCodes:
|
|
140
|
+
function validateBackupCode(userInput: string, storedCodes: BackupCode[]): boolean {
|
|
134
141
|
try {
|
|
135
142
|
const inputCode = new BackupCodeString(userInput);
|
|
136
143
|
return storedCodes.some(stored =>
|
|
@@ -149,21 +156,24 @@ function validateBackupCode(userInput: string, storedCodes: IBackupCode[]) {
|
|
|
149
156
|
### Frontend Framework Integration
|
|
150
157
|
|
|
151
158
|
```typescript
|
|
152
|
-
// Frontend frameworks consume type-safe interfaces
|
|
153
|
-
import {
|
|
159
|
+
// Frontend frameworks consume type-safe base interfaces
|
|
160
|
+
import { IUserBase, AccountStatus } from '@digitaldefiance/suite-core-lib';
|
|
161
|
+
|
|
162
|
+
// Define a frontend user type with string IDs and Date objects
|
|
163
|
+
type FrontendUser = IUserBase<string, Date, 'en' | 'fr' | 'es', AccountStatus>;
|
|
154
164
|
|
|
155
165
|
// React/Vue/Angular component props example
|
|
156
166
|
interface UserProfileProps {
|
|
157
|
-
user:
|
|
167
|
+
user: FrontendUser;
|
|
158
168
|
onStatusChange: (status: AccountStatus) => void;
|
|
159
169
|
}
|
|
160
170
|
|
|
161
171
|
// Function to update user status with type safety
|
|
162
|
-
function updateUserStatus(user:
|
|
172
|
+
function updateUserStatus(user: FrontendUser, status: AccountStatus): FrontendUser {
|
|
163
173
|
return {
|
|
164
174
|
...user,
|
|
165
175
|
accountStatus: status,
|
|
166
|
-
updatedAt: new Date()
|
|
176
|
+
updatedAt: new Date()
|
|
167
177
|
};
|
|
168
178
|
}
|
|
169
179
|
```
|
|
@@ -171,11 +181,14 @@ function updateUserStatus(user: IFrontendUser<string>, status: AccountStatus) {
|
|
|
171
181
|
### Database Layer Integration
|
|
172
182
|
|
|
173
183
|
```typescript
|
|
174
|
-
// Database schemas implementing suite-core-lib interfaces
|
|
175
|
-
import {
|
|
184
|
+
// Database schemas implementing suite-core-lib base interfaces
|
|
185
|
+
import { IUserBase, IUserRoleBase, AccountStatus } from '@digitaldefiance/suite-core-lib';
|
|
176
186
|
import { Types } from 'mongoose';
|
|
177
187
|
|
|
178
|
-
|
|
188
|
+
// Define a MongoDB user type using ObjectId
|
|
189
|
+
type MongoUser = IUserBase<Types.ObjectId, Date, 'en', AccountStatus>;
|
|
190
|
+
|
|
191
|
+
const userSchema = new mongoose.Schema<MongoUser>({
|
|
179
192
|
_id: { type: Types.ObjectId, required: true },
|
|
180
193
|
username: { type: String, required: true, unique: true },
|
|
181
194
|
email: { type: String, required: true, unique: true },
|
|
@@ -186,6 +199,11 @@ const userSchema = new mongoose.Schema<IBackendUser<'en'>>({
|
|
|
186
199
|
},
|
|
187
200
|
// Additional schema fields matching the interface
|
|
188
201
|
});
|
|
202
|
+
|
|
203
|
+
// SQL database example with UUID strings
|
|
204
|
+
type SqlUser = IUserBase<string, Date, 'en', AccountStatus> & {
|
|
205
|
+
customField: string;
|
|
206
|
+
};
|
|
189
207
|
```
|
|
190
208
|
|
|
191
209
|
## 🔧 Advanced Configuration
|
|
@@ -259,14 +277,23 @@ The **@digitaldefiance/node-ecies** and **@digitaldefiance/node-express-suite**
|
|
|
259
277
|
## 🆕 What's New in v3.0
|
|
260
278
|
|
|
261
279
|
### Generic ID Support
|
|
262
|
-
Core interfaces (`
|
|
280
|
+
Core base interfaces (`IUserBase`, `IRoleBase`, `IUserRoleBase`, etc.) now support generic ID types. This enables seamless integration with any database system using the **Pluggable ID Providers** (ObjectId, UUID, GUID) introduced in `@digitaldefiance/ecies-lib` v4.1.0.
|
|
263
281
|
|
|
264
282
|
```typescript
|
|
265
|
-
|
|
266
|
-
|
|
283
|
+
import { IUserBase, AccountStatus } from '@digitaldefiance/suite-core-lib';
|
|
284
|
+
import { Types } from 'mongoose';
|
|
285
|
+
|
|
286
|
+
// MongoDB with ObjectId
|
|
287
|
+
type MongoUser = IUserBase<Types.ObjectId, Date, 'en', AccountStatus>;
|
|
288
|
+
|
|
289
|
+
// SQL database with UUID strings
|
|
290
|
+
type SqlUser = IUserBase<string, Date, 'en', AccountStatus>;
|
|
291
|
+
|
|
292
|
+
// PostgreSQL with numeric IDs
|
|
293
|
+
type PostgresUser = IUserBase<number, Date, 'en', AccountStatus>;
|
|
267
294
|
|
|
268
|
-
//
|
|
269
|
-
|
|
295
|
+
// Frontend with string IDs and ISO date strings
|
|
296
|
+
type FrontendUser = IUserBase<string, string, 'en', AccountStatus>;
|
|
270
297
|
```
|
|
271
298
|
|
|
272
299
|
## ✨ Key Features (v2.1+)
|
|
@@ -501,23 +528,31 @@ describe('Error Handling', () => {
|
|
|
501
528
|
|
|
502
529
|
### Cross-Package Testing
|
|
503
530
|
|
|
504
|
-
Testing with
|
|
531
|
+
Testing with base interfaces:
|
|
505
532
|
|
|
506
533
|
```typescript
|
|
507
|
-
import {
|
|
508
|
-
import {
|
|
534
|
+
import { IUserBase, AccountStatus } from '@digitaldefiance/suite-core-lib';
|
|
535
|
+
import { Types } from 'mongoose';
|
|
536
|
+
|
|
537
|
+
// Define your user type
|
|
538
|
+
type TestUser = IUserBase<Types.ObjectId, Date, 'en', AccountStatus>;
|
|
509
539
|
|
|
510
|
-
describe('
|
|
511
|
-
it('should
|
|
512
|
-
const user:
|
|
540
|
+
describe('User Management', () => {
|
|
541
|
+
it('should create user with correct status', () => {
|
|
542
|
+
const user: TestUser = {
|
|
543
|
+
_id: new Types.ObjectId(),
|
|
513
544
|
username: 'alice',
|
|
514
545
|
email: 'alice@example.com',
|
|
515
546
|
accountStatus: AccountStatus.Active,
|
|
516
|
-
|
|
547
|
+
emailVerified: true,
|
|
548
|
+
siteLanguage: 'en',
|
|
549
|
+
createdAt: new Date(),
|
|
550
|
+
updatedAt: new Date(),
|
|
551
|
+
// ... other required fields
|
|
517
552
|
};
|
|
518
553
|
|
|
519
|
-
// Use with UserService
|
|
520
554
|
expect(user.accountStatus).toBe(AccountStatus.Active);
|
|
555
|
+
expect(user.emailVerified).toBe(true);
|
|
521
556
|
});
|
|
522
557
|
});
|
|
523
558
|
```
|
|
@@ -526,7 +561,10 @@ describe('Integration with node-express-suite', () => {
|
|
|
526
561
|
|
|
527
562
|
## v3.6.6
|
|
528
563
|
|
|
529
|
-
- Move
|
|
564
|
+
- **Breaking Change**: Move `IFrontend*` and `IBackend*` type aliases to `@digitaldefiance/node-express-suite`
|
|
565
|
+
- Base interfaces (`IUserBase`, `IRoleBase`, `IUserRoleBase`, etc.) remain in `suite-core-lib` as the core primitives
|
|
566
|
+
- Framework-specific type aliases moved to `node-express-suite` for better separation of concerns
|
|
567
|
+
- Migration: Use base interfaces directly (e.g., `IUserBase<string, Date, 'en', AccountStatus>`) or import pre-configured types from `@digitaldefiance/node-express-suite`
|
|
530
568
|
- Update testing
|
|
531
569
|
- Update ecies
|
|
532
570
|
|
|
@@ -593,7 +631,7 @@ None. This is a backward-compatible release focused on internal type safety impr
|
|
|
593
631
|
## v3.0.0
|
|
594
632
|
|
|
595
633
|
- Upgrade ECIES to 4.1.0
|
|
596
|
-
- Update
|
|
634
|
+
- Update base interfaces (`IUserBase`, `IUserRoleBase`, `ITokenRole`, etc.) to support generic ID types. This enables support for pluggable ID providers (e.g. ObjectId, UUID, GUID, numbers) introduced in `@digitaldefiance/ecies-lib` v4.1.0.
|
|
597
635
|
|
|
598
636
|
## v2.2.26
|
|
599
637
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@digitaldefiance/suite-core-lib",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.8",
|
|
4
|
+
"homepage": "https://github.com/Digital-Defiance/suite-core-lib",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/Digital-Defiance/suite-core-lib.git"
|
|
8
|
+
},
|
|
4
9
|
"description": "Generic user system and document system common core for applications",
|
|
5
10
|
"main": "src/index.js",
|
|
6
11
|
"types": "src/index.d.ts",
|
|
@@ -22,8 +27,8 @@
|
|
|
22
27
|
"publish:public": "npm publish --access public"
|
|
23
28
|
},
|
|
24
29
|
"dependencies": {
|
|
25
|
-
"@digitaldefiance/ecies-lib": "4.4.
|
|
26
|
-
"@digitaldefiance/i18n-lib": "3.8.
|
|
30
|
+
"@digitaldefiance/ecies-lib": "4.4.7",
|
|
31
|
+
"@digitaldefiance/i18n-lib": "3.8.2"
|
|
27
32
|
},
|
|
28
33
|
"files": [
|
|
29
34
|
"src",
|
|
@@ -41,6 +46,5 @@
|
|
|
41
46
|
"@typescript-eslint/parser": "^8.48.0",
|
|
42
47
|
"eslint-plugin-import": "^2.32.0",
|
|
43
48
|
"eslint-plugin-prettier": "^5.5.4"
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { Constants } from './constants';
|
|
2
|
+
import { InvalidBackupCodeError } from './errors/invalid-backup-code';
|
|
3
|
+
import { IConstants } from './interfaces';
|
|
4
|
+
|
|
5
|
+
export class BackupCodeString {
|
|
6
|
+
private readonly _normalizedCode: string;
|
|
7
|
+
|
|
8
|
+
constructor(code: string) {
|
|
9
|
+
const normalizedCode = BackupCodeString.normalizeCode(code);
|
|
10
|
+
if (!Constants.BACKUP_CODES.NormalizedHexRegex.test(normalizedCode)) {
|
|
11
|
+
throw new InvalidBackupCodeError();
|
|
12
|
+
}
|
|
13
|
+
this._normalizedCode = normalizedCode;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public get value(): string {
|
|
17
|
+
return BackupCodeString.formatBackupCode(this._normalizedCode);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public get notNullValue(): string {
|
|
21
|
+
return BackupCodeString.formatBackupCode(this._normalizedCode);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public get valueAsHexString(): string {
|
|
25
|
+
const formattedValue = BackupCodeString.formatBackupCode(
|
|
26
|
+
this._normalizedCode,
|
|
27
|
+
);
|
|
28
|
+
return new TextEncoder().encode(formattedValue).reduce((str, byte) => {
|
|
29
|
+
return str + byte.toString(16).padStart(2, '0');
|
|
30
|
+
}, '');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public get valueAsBase64String(): string {
|
|
34
|
+
const formattedValue = BackupCodeString.formatBackupCode(
|
|
35
|
+
this._normalizedCode,
|
|
36
|
+
);
|
|
37
|
+
return btoa(formattedValue);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public get valueAsUint8Array(): Uint8Array {
|
|
41
|
+
const formattedValue = BackupCodeString.formatBackupCode(
|
|
42
|
+
this._normalizedCode,
|
|
43
|
+
);
|
|
44
|
+
return new TextEncoder().encode(formattedValue);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public get hasValue(): boolean {
|
|
48
|
+
return this._normalizedCode.length > 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public get length(): number {
|
|
52
|
+
return this._normalizedCode.length;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public dispose(): void {
|
|
56
|
+
// Backup codes are not sensitive enough to require secure disposal
|
|
57
|
+
// They're already encrypted when stored in the database
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Format a 32-char normalized code into display form (8 groups of 4).
|
|
62
|
+
* Does not restrict characters beyond grouping.
|
|
63
|
+
*/
|
|
64
|
+
public static formatBackupCode(code: string): string {
|
|
65
|
+
const groups = code.match(/.{1,4}/g) ?? [code];
|
|
66
|
+
return groups.join('-');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Normalize user-entered code: remove spaces and hyphens, lowercase, and trim.
|
|
70
|
+
*/
|
|
71
|
+
public static normalizeCode(input: string): string {
|
|
72
|
+
return input.replace(/[\s-]/g, '').toLowerCase().trim();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public static generateBackupCode(): string {
|
|
76
|
+
const alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
|
77
|
+
const rnd = crypto.getRandomValues(new Uint8Array(32));
|
|
78
|
+
let raw = '';
|
|
79
|
+
for (let j = 0; j < 32; j++) {
|
|
80
|
+
raw += alphabet[rnd[j] % alphabet.length];
|
|
81
|
+
}
|
|
82
|
+
return raw;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Generate the configured number of backup codes.
|
|
87
|
+
* Note: If generation alphabet/length is controlled elsewhere, prefer that path.
|
|
88
|
+
*/
|
|
89
|
+
public static generateBackupCodes(constants: IConstants = Constants): Array<BackupCodeString> {
|
|
90
|
+
const codes: Array<BackupCodeString> = [];
|
|
91
|
+
for (let i = 0; i < constants.BACKUP_CODES.Count; i++) {
|
|
92
|
+
codes.push(new BackupCodeString(BackupCodeString.generateBackupCode()));
|
|
93
|
+
}
|
|
94
|
+
return codes;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluent builder for creating role objects
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Role } from '../enumerations/role';
|
|
6
|
+
import { IRoleBase } from '../interfaces/bases/role';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Builder for creating role objects with fluent API
|
|
10
|
+
*/
|
|
11
|
+
export class RoleBuilder<I = string, D extends Date | string = Date> {
|
|
12
|
+
private data: Partial<IRoleBase<I, D, Role>> = {
|
|
13
|
+
admin: false,
|
|
14
|
+
member: false,
|
|
15
|
+
child: false,
|
|
16
|
+
system: false,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
static create<I = string, D extends Date | string = Date>(): RoleBuilder<I, D> {
|
|
20
|
+
return new RoleBuilder<I, D>();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
withName(name: Role): this {
|
|
24
|
+
this.data.name = name;
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
asAdmin(): this {
|
|
29
|
+
this.data.admin = true;
|
|
30
|
+
this.data.member = false;
|
|
31
|
+
this.data.child = false;
|
|
32
|
+
this.data.system = false;
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
asMember(): this {
|
|
37
|
+
this.data.admin = false;
|
|
38
|
+
this.data.member = true;
|
|
39
|
+
this.data.child = false;
|
|
40
|
+
this.data.system = false;
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
asChild(): this {
|
|
45
|
+
this.data.admin = false;
|
|
46
|
+
this.data.member = false;
|
|
47
|
+
this.data.child = true;
|
|
48
|
+
this.data.system = false;
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
asSystem(): this {
|
|
53
|
+
this.data.admin = false;
|
|
54
|
+
this.data.member = false;
|
|
55
|
+
this.data.child = false;
|
|
56
|
+
this.data.system = true;
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
build(): Partial<IRoleBase<I, D, Role>> {
|
|
61
|
+
return { ...this.data };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluent builder for creating user objects
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { AccountStatus } from '../enumerations/account-status';
|
|
6
|
+
import { IUserBase } from '../interfaces/bases/user';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Builder for creating user objects with fluent API
|
|
10
|
+
*/
|
|
11
|
+
export class UserBuilder<I = string, D extends Date | string = Date, S extends string = string> {
|
|
12
|
+
private data: Partial<IUserBase<I, D, S, AccountStatus>> = {
|
|
13
|
+
emailVerified: false,
|
|
14
|
+
accountStatus: AccountStatus.Active,
|
|
15
|
+
directChallenge: false,
|
|
16
|
+
backupCodes: [],
|
|
17
|
+
timezone: 'UTC',
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
static create<I = string, D extends Date | string = Date, S extends string = string>(): UserBuilder<I, D, S> {
|
|
21
|
+
return new UserBuilder<I, D, S>();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
withUsername(username: string): this {
|
|
25
|
+
this.data.username = username;
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
withEmail(email: string): this {
|
|
30
|
+
this.data.email = email;
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
withPublicKey(publicKey: string): this {
|
|
35
|
+
this.data.publicKey = publicKey;
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
withTimezone(timezone: string): this {
|
|
40
|
+
this.data.timezone = timezone;
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
withSiteLanguage(siteLanguage: S): this {
|
|
45
|
+
this.data.siteLanguage = siteLanguage;
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
withEmailVerified(verified: boolean): this {
|
|
50
|
+
this.data.emailVerified = verified;
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
withAccountStatus(status: AccountStatus): this {
|
|
55
|
+
this.data.accountStatus = status;
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
withDirectChallenge(enabled: boolean): this {
|
|
60
|
+
this.data.directChallenge = enabled;
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
withMnemonicRecovery(recovery: string): this {
|
|
65
|
+
this.data.mnemonicRecovery = recovery;
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
build(): Partial<IUserBase<I, D, S, AccountStatus>> {
|
|
70
|
+
return { ...this.data };
|
|
71
|
+
}
|
|
72
|
+
}
|