@forgerock/journey-client 0.0.0-beta-20251222204813
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/CHANGELOG.md +45 -0
- package/LICENSE +21 -0
- package/README.md +143 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/coverage-final.json +1 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +101 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/dist/package.json +62 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +7 -0
- package/dist/src/lib/callbacks/attribute-input-callback.d.ts +44 -0
- package/dist/src/lib/callbacks/attribute-input-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/attribute-input-callback.js +71 -0
- package/dist/src/lib/callbacks/base-callback.d.ts +45 -0
- package/dist/src/lib/callbacks/base-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/base-callback.js +88 -0
- package/dist/src/lib/callbacks/choice-callback.d.ts +33 -0
- package/dist/src/lib/callbacks/choice-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/choice-callback.js +57 -0
- package/dist/src/lib/callbacks/confirmation-callback.d.ts +41 -0
- package/dist/src/lib/callbacks/confirmation-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/confirmation-callback.js +69 -0
- package/dist/src/lib/callbacks/device-profile-callback.d.ts +30 -0
- package/dist/src/lib/callbacks/device-profile-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/device-profile-callback.js +43 -0
- package/dist/src/lib/callbacks/factory.d.ts +8 -0
- package/dist/src/lib/callbacks/factory.d.ts.map +1 -0
- package/dist/src/lib/callbacks/factory.js +87 -0
- package/dist/src/lib/callbacks/hidden-value-callback.d.ts +13 -0
- package/dist/src/lib/callbacks/hidden-value-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/hidden-value-callback.js +19 -0
- package/dist/src/lib/callbacks/kba-create-callback.d.ts +34 -0
- package/dist/src/lib/callbacks/kba-create-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/kba-create-callback.js +59 -0
- package/dist/src/lib/callbacks/metadata-callback.d.ts +17 -0
- package/dist/src/lib/callbacks/metadata-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/metadata-callback.js +25 -0
- package/dist/src/lib/callbacks/name-callback.d.ts +21 -0
- package/dist/src/lib/callbacks/name-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/name-callback.js +31 -0
- package/dist/src/lib/callbacks/password-callback.d.ts +29 -0
- package/dist/src/lib/callbacks/password-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/password-callback.js +43 -0
- package/dist/src/lib/callbacks/ping-protect-evaluation-callback.d.ts +52 -0
- package/dist/src/lib/callbacks/ping-protect-evaluation-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/ping-protect-evaluation-callback.js +64 -0
- package/dist/src/lib/callbacks/ping-protect-initialize-callback.d.ts +29 -0
- package/dist/src/lib/callbacks/ping-protect-initialize-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/ping-protect-initialize-callback.js +40 -0
- package/dist/src/lib/callbacks/polling-wait-callback.d.ts +21 -0
- package/dist/src/lib/callbacks/polling-wait-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/polling-wait-callback.js +31 -0
- package/dist/src/lib/callbacks/recaptcha-callback.d.ts +21 -0
- package/dist/src/lib/callbacks/recaptcha-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/recaptcha-callback.js +31 -0
- package/dist/src/lib/callbacks/recaptcha-enterprise-callback.d.ts +41 -0
- package/dist/src/lib/callbacks/recaptcha-enterprise-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/recaptcha-enterprise-callback.js +65 -0
- package/dist/src/lib/callbacks/redirect-callback.d.ts +17 -0
- package/dist/src/lib/callbacks/redirect-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/redirect-callback.js +25 -0
- package/dist/src/lib/callbacks/select-idp-callback.d.ts +28 -0
- package/dist/src/lib/callbacks/select-idp-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/select-idp-callback.js +35 -0
- package/dist/src/lib/callbacks/suspended-text-output-callback.d.ts +13 -0
- package/dist/src/lib/callbacks/suspended-text-output-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/suspended-text-output-callback.js +19 -0
- package/dist/src/lib/callbacks/terms-and-conditions-callback.d.ts +29 -0
- package/dist/src/lib/callbacks/terms-and-conditions-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/terms-and-conditions-callback.js +45 -0
- package/dist/src/lib/callbacks/text-input-callback.d.ts +21 -0
- package/dist/src/lib/callbacks/text-input-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/text-input-callback.js +31 -0
- package/dist/src/lib/callbacks/text-output-callback.d.ts +22 -0
- package/dist/src/lib/callbacks/text-output-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/text-output-callback.js +32 -0
- package/dist/src/lib/callbacks/validated-create-password-callback.d.ts +37 -0
- package/dist/src/lib/callbacks/validated-create-password-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/validated-create-password-callback.js +63 -0
- package/dist/src/lib/callbacks/validated-create-username-callback.d.ts +37 -0
- package/dist/src/lib/callbacks/validated-create-username-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/validated-create-username-callback.js +64 -0
- package/dist/src/lib/client.store.d.ts +37 -0
- package/dist/src/lib/client.store.d.ts.map +1 -0
- package/dist/src/lib/client.store.js +147 -0
- package/dist/src/lib/client.store.utils.d.ts +81 -0
- package/dist/src/lib/client.store.utils.d.ts.map +1 -0
- package/dist/src/lib/client.store.utils.js +28 -0
- package/dist/src/lib/config.types.d.ts +8 -0
- package/dist/src/lib/config.types.d.ts.map +1 -0
- package/dist/src/lib/config.types.js +7 -0
- package/dist/src/lib/device/defaults.d.ts +13 -0
- package/dist/src/lib/device/defaults.d.ts.map +1 -0
- package/dist/src/lib/device/defaults.js +78 -0
- package/dist/src/lib/device/device-profile.d.ts +41 -0
- package/dist/src/lib/device/device-profile.d.ts.map +1 -0
- package/dist/src/lib/device/device-profile.js +216 -0
- package/dist/src/lib/device/device-profile.mock.data.d.ts +109 -0
- package/dist/src/lib/device/device-profile.mock.data.d.ts.map +1 -0
- package/dist/src/lib/device/device-profile.mock.data.js +117 -0
- package/dist/src/lib/device/interfaces.d.ts +43 -0
- package/dist/src/lib/device/interfaces.d.ts.map +1 -0
- package/dist/src/lib/device/interfaces.js +10 -0
- package/dist/src/lib/interfaces.d.ts +15 -0
- package/dist/src/lib/interfaces.d.ts.map +1 -0
- package/dist/src/lib/interfaces.js +7 -0
- package/dist/src/lib/journey.api.d.ts +15 -0
- package/dist/src/lib/journey.api.d.ts.map +1 -0
- package/dist/src/lib/journey.api.js +129 -0
- package/dist/src/lib/journey.slice.d.ts +12 -0
- package/dist/src/lib/journey.slice.d.ts.map +1 -0
- package/dist/src/lib/journey.slice.js +18 -0
- package/dist/src/lib/journey.utils.d.ts +7 -0
- package/dist/src/lib/journey.utils.d.ts.map +1 -0
- package/dist/src/lib/journey.utils.js +33 -0
- package/dist/src/lib/login-failure.utils.d.ts +16 -0
- package/dist/src/lib/login-failure.utils.d.ts.map +1 -0
- package/dist/src/lib/login-failure.utils.js +34 -0
- package/dist/src/lib/login-success.utils.d.ts +16 -0
- package/dist/src/lib/login-success.utils.d.ts.map +1 -0
- package/dist/src/lib/login-success.utils.js +25 -0
- package/dist/src/lib/policy/interfaces.d.ts +11 -0
- package/dist/src/lib/policy/interfaces.d.ts.map +1 -0
- package/dist/src/lib/policy/interfaces.js +6 -0
- package/dist/src/lib/policy/message-creator.d.ts +3 -0
- package/dist/src/lib/policy/message-creator.d.ts.map +1 -0
- package/dist/src/lib/policy/message-creator.js +58 -0
- package/dist/src/lib/policy/policy.d.ts +57 -0
- package/dist/src/lib/policy/policy.d.ts.map +1 -0
- package/dist/src/lib/policy/policy.js +108 -0
- package/dist/src/lib/qr-code/qr-code.d.ts +35 -0
- package/dist/src/lib/qr-code/qr-code.d.ts.map +1 -0
- package/dist/src/lib/qr-code/qr-code.js +73 -0
- package/dist/src/lib/qr-code/qr-code.mock.data.d.ts +66 -0
- package/dist/src/lib/qr-code/qr-code.mock.data.d.ts.map +1 -0
- package/dist/src/lib/qr-code/qr-code.mock.data.js +175 -0
- package/dist/src/lib/recovery-codes/recovery-codes.d.ts +40 -0
- package/dist/src/lib/recovery-codes/recovery-codes.d.ts.map +1 -0
- package/dist/src/lib/recovery-codes/recovery-codes.js +64 -0
- package/dist/src/lib/recovery-codes/script-parser.d.ts +8 -0
- package/dist/src/lib/recovery-codes/script-parser.d.ts.map +1 -0
- package/dist/src/lib/recovery-codes/script-parser.js +45 -0
- package/dist/src/lib/recovery-codes/script-text.mock.data.d.ts +27 -0
- package/dist/src/lib/recovery-codes/script-text.mock.data.d.ts.map +1 -0
- package/dist/src/lib/recovery-codes/script-text.mock.data.js +103 -0
- package/dist/src/lib/step.types.d.ts +14 -0
- package/dist/src/lib/step.types.d.ts.map +1 -0
- package/dist/src/lib/step.types.js +7 -0
- package/dist/src/lib/step.utils.d.ts +10 -0
- package/dist/src/lib/step.utils.d.ts.map +1 -0
- package/dist/src/lib/step.utils.js +62 -0
- package/dist/src/lib/webauthn/enums.d.ts +24 -0
- package/dist/src/lib/webauthn/enums.d.ts.map +1 -0
- package/dist/src/lib/webauthn/enums.js +35 -0
- package/dist/src/lib/webauthn/helpers.d.ts +18 -0
- package/dist/src/lib/webauthn/helpers.d.ts.map +1 -0
- package/dist/src/lib/webauthn/helpers.js +103 -0
- package/dist/src/lib/webauthn/helpers.mock.data.d.ts +6 -0
- package/dist/src/lib/webauthn/helpers.mock.data.d.ts.map +1 -0
- package/dist/src/lib/webauthn/helpers.mock.data.js +14 -0
- package/dist/src/lib/webauthn/interfaces.d.ts +92 -0
- package/dist/src/lib/webauthn/interfaces.d.ts.map +1 -0
- package/dist/src/lib/webauthn/interfaces.js +34 -0
- package/dist/src/lib/webauthn/script-text.mock.data.d.ts +76 -0
- package/dist/src/lib/webauthn/script-text.mock.data.d.ts.map +1 -0
- package/dist/src/lib/webauthn/script-text.mock.data.js +451 -0
- package/dist/src/lib/webauthn/webauthn.d.ts +124 -0
- package/dist/src/lib/webauthn/webauthn.d.ts.map +1 -0
- package/dist/src/lib/webauthn/webauthn.js +383 -0
- package/dist/src/lib/webauthn/webauthn.mock.data.d.ts +331 -0
- package/dist/src/lib/webauthn/webauthn.mock.data.d.ts.map +1 -0
- package/dist/src/lib/webauthn/webauthn.mock.data.js +446 -0
- package/dist/src/types.d.ts +31 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +34 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/eslint.config.mjs +19 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/attribute-input-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/fr-auth-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/ping-protect-evaluation-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/ping-protect-initialize-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/recaptcha-enterprise-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/text-input-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/validated-create-password-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/validated-create-username-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/fr-device/device-profile.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/fr-policy/fr-policy.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/tsconfig.spec.tsbuildinfo +1 -0
- package/out-tsc/vitest/packages/journey-client/vite.config.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/attribute-input-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/attribute-input-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/attribute-input-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/attribute-input-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/attribute-input-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/attribute-input-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/base-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/base-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/callback-types.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/callback-types.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/callback-utils.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/callback-utils.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/choice-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/choice-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/choice-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/choice-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/choice-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/choice-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/confirmation-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/confirmation-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/confirmation-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/confirmation-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/confirmation-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/confirmation-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/device-profile-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/device-profile-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/factory.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/factory.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/fr-auth-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/fr-auth-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/hidden-value-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/hidden-value-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/hidden-value-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/hidden-value-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/hidden-value-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/hidden-value-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/kba-create-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/kba-create-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/kba-create-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/kba-create-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/kba-create-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/kba-create-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/metadata-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/metadata-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/metadata-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/metadata-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/metadata-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/metadata-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/name-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/name-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/name-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/name-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/name-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/name-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/password-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/password-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/password-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/password-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/password-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/password-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-evaluation-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-evaluation-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-evaluation-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-evaluation-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-evaluation-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-evaluation-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-initialize-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-initialize-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-initialize-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-initialize-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-initialize-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-initialize-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/polling-wait-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/polling-wait-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/polling-wait-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/polling-wait-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/polling-wait-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/polling-wait-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-enterprise-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-enterprise-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-enterprise-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-enterprise-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-enterprise-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-enterprise-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/redirect-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/redirect-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/redirect-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/redirect-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/redirect-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/redirect-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/select-idp-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/select-idp-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/select-idp-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/select-idp-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/select-idp-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/select-idp-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/suspended-text-output-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/suspended-text-output-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/suspended-text-output-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/suspended-text-output-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/suspended-text-output-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/suspended-text-output-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/terms-and-conditions-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/terms-and-conditions-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/terms-and-conditions-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/terms-and-conditions-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/terms-and-conditions-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/terms-and-conditions-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/text-input-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/text-input-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/text-input-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/text-input-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/text-input-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/text-input-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/text-output-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/text-output-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/text-output-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/text-output-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/text-output-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/text-output-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-password-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-password-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-password-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-password-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-password-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-password-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-username-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-username-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-username-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-username-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-username-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-username-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/client.store.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/client.store.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/device/device-profile.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/device/device-profile.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-device/device-profile.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-device/device-profile.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-policy/fr-policy.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-policy/fr-policy.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-qrcode/fr-qrcode.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-qrcode/fr-qrcode.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-recovery-codes/recovery-codes.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-recovery-codes/recovery-codes.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-recovery-codes/script-parser.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-recovery-codes/script-parser.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-step.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-step.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-webauthn/fr-webauthn.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-webauthn/fr-webauthn.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-webauthn/helpers.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-webauthn/helpers.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-webauthn/script-parser.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-webauthn/script-parser.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-client.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-client.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-device/device-profile.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-device/device-profile.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-login-failure.utils.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-login-failure.utils.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-login-success.utils.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-login-success.utils.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-policy/fr-policy.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-policy/fr-policy.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-policy/journey-policy.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-policy/journey-policy.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-qrcode/journey-qrcode.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-qrcode/journey-qrcode.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-step.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-step.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/enums.d.ts +24 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/enums.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/helpers.d.ts +18 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/helpers.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/helpers.mock.data.d.ts +6 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/helpers.mock.data.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/helpers.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/helpers.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/index.d.ts +123 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/index.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/interfaces.d.ts +93 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/interfaces.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/journey-webauthn.mock.data.d.ts +331 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/journey-webauthn.mock.data.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/journey-webauthn.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/journey-webauthn.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/script-parser.d.ts +4 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/script-parser.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/script-parser.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/script-parser.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/script-text.mock.data.d.ts +76 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/script-text.mock.data.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/webauthn-utils.d.ts +38 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/webauthn-utils.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey.api.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey.api.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey.store.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey.store.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/login-failure.utils.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/login-failure.utils.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/login-success.utils.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/login-success.utils.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/object-utils.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/object-utils.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/policy/policy.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/policy/policy.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/qr-code/qr-code.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/qr-code/qr-code.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/recovery-codes/index.d.ts +37 -0
- package/out-tsc/vitest/src/lib/recovery-codes/index.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/recovery-codes/recovery-codes.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/recovery-codes/recovery-codes.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/recovery-codes/script-parser.d.ts +9 -0
- package/out-tsc/vitest/src/lib/recovery-codes/script-parser.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/recovery-codes/script-parser.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/recovery-codes/script-parser.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/recovery-codes/script-text.mock.data.d.ts +27 -0
- package/out-tsc/vitest/src/lib/recovery-codes/script-text.mock.data.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/step-utils.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/step-utils.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/step.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/step.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/webauthn/helpers.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/webauthn/helpers.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/webauthn/webauthn.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/webauthn/webauthn.test.d.ts.map +1 -0
- package/out-tsc/vitest/tsconfig.spec.tsbuildinfo +1 -0
- package/out-tsc/vitest/vite.config.d.ts +3 -0
- package/out-tsc/vitest/vite.config.d.ts.map +1 -0
- package/package.json +62 -0
- package/src/index.ts +8 -0
- package/src/lib/callbacks/attribute-input-callback.test.ts +89 -0
- package/src/lib/callbacks/attribute-input-callback.ts +81 -0
- package/src/lib/callbacks/base-callback.test.ts +42 -0
- package/src/lib/callbacks/base-callback.ts +101 -0
- package/src/lib/callbacks/choice-callback.test.ts +77 -0
- package/src/lib/callbacks/choice-callback.ts +64 -0
- package/src/lib/callbacks/confirmation-callback.test.ts +94 -0
- package/src/lib/callbacks/confirmation-callback.ts +78 -0
- package/src/lib/callbacks/device-profile-callback.test.ts +68 -0
- package/src/lib/callbacks/device-profile-callback.ts +51 -0
- package/src/lib/callbacks/factory.test.ts +89 -0
- package/src/lib/callbacks/factory.ts +95 -0
- package/src/lib/callbacks/hidden-value-callback.test.ts +26 -0
- package/src/lib/callbacks/hidden-value-callback.ts +21 -0
- package/src/lib/callbacks/kba-create-callback.test.ts +62 -0
- package/src/lib/callbacks/kba-create-callback.ts +68 -0
- package/src/lib/callbacks/metadata-callback.test.ts +31 -0
- package/src/lib/callbacks/metadata-callback.ts +28 -0
- package/src/lib/callbacks/name-callback.test.ts +42 -0
- package/src/lib/callbacks/name-callback.ts +35 -0
- package/src/lib/callbacks/password-callback.test.ts +60 -0
- package/src/lib/callbacks/password-callback.ts +49 -0
- package/src/lib/callbacks/ping-protect-evaluation-callback.test.ts +69 -0
- package/src/lib/callbacks/ping-protect-evaluation-callback.ts +70 -0
- package/src/lib/callbacks/ping-protect-initialize-callback.test.ts +153 -0
- package/src/lib/callbacks/ping-protect-initialize-callback.ts +44 -0
- package/src/lib/callbacks/polling-wait-callback.test.ts +36 -0
- package/src/lib/callbacks/polling-wait-callback.ts +35 -0
- package/src/lib/callbacks/recaptcha-callback.test.ts +42 -0
- package/src/lib/callbacks/recaptcha-callback.ts +35 -0
- package/src/lib/callbacks/recaptcha-enterprise-callback.test.ts +86 -0
- package/src/lib/callbacks/recaptcha-enterprise-callback.ts +72 -0
- package/src/lib/callbacks/redirect-callback.test.ts +31 -0
- package/src/lib/callbacks/redirect-callback.ts +28 -0
- package/src/lib/callbacks/select-idp-callback.test.ts +51 -0
- package/src/lib/callbacks/select-idp-callback.ts +48 -0
- package/src/lib/callbacks/suspended-text-output-callback.test.ts +35 -0
- package/src/lib/callbacks/suspended-text-output-callback.ts +21 -0
- package/src/lib/callbacks/terms-and-conditions-callback.test.ts +55 -0
- package/src/lib/callbacks/terms-and-conditions-callback.ts +51 -0
- package/src/lib/callbacks/text-input-callback.test.ts +43 -0
- package/src/lib/callbacks/text-input-callback.ts +35 -0
- package/src/lib/callbacks/text-output-callback.test.ts +36 -0
- package/src/lib/callbacks/text-output-callback.ts +36 -0
- package/src/lib/callbacks/validated-create-password-callback.test.ts +84 -0
- package/src/lib/callbacks/validated-create-password-callback.ts +75 -0
- package/src/lib/callbacks/validated-create-username-callback.test.ts +84 -0
- package/src/lib/callbacks/validated-create-username-callback.ts +76 -0
- package/src/lib/client.store.test.ts +324 -0
- package/src/lib/client.store.ts +194 -0
- package/src/lib/client.store.utils.ts +46 -0
- package/src/lib/config.types.ts +17 -0
- package/src/lib/device/defaults.ts +79 -0
- package/src/lib/device/device-profile.mock.data.ts +120 -0
- package/src/lib/device/device-profile.test.ts +128 -0
- package/src/lib/device/device-profile.ts +287 -0
- package/src/lib/device/interfaces.ts +63 -0
- package/src/lib/device/sample-profile.json +45 -0
- package/src/lib/interfaces.ts +25 -0
- package/src/lib/journey.api.ts +198 -0
- package/src/lib/journey.slice.ts +33 -0
- package/src/lib/journey.utils.ts +44 -0
- package/src/lib/login-failure.utils.test.ts +31 -0
- package/src/lib/login-failure.utils.ts +62 -0
- package/src/lib/login-success.utils.test.ts +29 -0
- package/src/lib/login-success.utils.ts +43 -0
- package/src/lib/policy/interfaces.ts +16 -0
- package/src/lib/policy/message-creator.ts +66 -0
- package/src/lib/policy/policy.test.ts +202 -0
- package/src/lib/policy/policy.ts +134 -0
- package/src/lib/qr-code/qr-code.mock.data.ts +184 -0
- package/src/lib/qr-code/qr-code.test.ts +78 -0
- package/src/lib/qr-code/qr-code.ts +96 -0
- package/src/lib/recovery-codes/recovery-codes.test.ts +43 -0
- package/src/lib/recovery-codes/recovery-codes.ts +72 -0
- package/src/lib/recovery-codes/script-parser.test.ts +34 -0
- package/src/lib/recovery-codes/script-parser.ts +50 -0
- package/src/lib/recovery-codes/script-text.mock.data.ts +120 -0
- package/src/lib/step.test.ts +104 -0
- package/src/lib/step.types.ts +22 -0
- package/src/lib/step.utils.ts +99 -0
- package/src/lib/webauthn/enums.ts +36 -0
- package/src/lib/webauthn/helpers.mock.data.ts +24 -0
- package/src/lib/webauthn/helpers.test.ts +54 -0
- package/src/lib/webauthn/helpers.ts +124 -0
- package/src/lib/webauthn/interfaces.ts +112 -0
- package/src/lib/webauthn/script-text.mock.data.ts +463 -0
- package/src/lib/webauthn/webauthn.mock.data.ts +478 -0
- package/src/lib/webauthn/webauthn.test.ts +100 -0
- package/src/lib/webauthn/webauthn.ts +508 -0
- package/src/types.ts +50 -0
- package/tsconfig.json +28 -0
- package/tsconfig.lib.json +37 -0
- package/tsconfig.spec.json +42 -0
- package/vite.config.ts +0 -0
- package/vitest.setup.ts +1 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025 Ping Identity Corporation. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* This software may be modified and distributed under the terms
|
|
5
|
+
* of the MIT license. See the LICENSE file for details.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { callbackType } from '@forgerock/sdk-types';
|
|
9
|
+
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
10
|
+
|
|
11
|
+
import type { Step } from '@forgerock/sdk-types';
|
|
12
|
+
|
|
13
|
+
import { journey } from './client.store.js';
|
|
14
|
+
import { createJourneyStep } from './step.utils.js';
|
|
15
|
+
import { JourneyClientConfig } from './config.types.js';
|
|
16
|
+
|
|
17
|
+
// Create a singleton mock instance for storage
|
|
18
|
+
const mockStorageInstance = {
|
|
19
|
+
get: vi.fn(),
|
|
20
|
+
set: vi.fn(),
|
|
21
|
+
remove: vi.fn(),
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// Mock dependencies with side effects
|
|
25
|
+
vi.mock('@forgerock/storage', () => ({
|
|
26
|
+
createStorage: vi.fn(() => mockStorageInstance),
|
|
27
|
+
}));
|
|
28
|
+
|
|
29
|
+
vi.mock('./device/device-profile.js', () => ({
|
|
30
|
+
default: vi.fn(() => ({
|
|
31
|
+
getProfile: vi.fn().mockResolvedValue({}),
|
|
32
|
+
})),
|
|
33
|
+
}));
|
|
34
|
+
|
|
35
|
+
// Mock the fetch API to control responses
|
|
36
|
+
const mockFetch = vi.fn();
|
|
37
|
+
global.fetch = mockFetch;
|
|
38
|
+
|
|
39
|
+
const mockConfig: JourneyClientConfig = {
|
|
40
|
+
serverConfig: {
|
|
41
|
+
baseUrl: 'https://test.com',
|
|
42
|
+
},
|
|
43
|
+
realmPath: 'root',
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
describe('journey-client', () => {
|
|
47
|
+
afterEach(() => {
|
|
48
|
+
vi.clearAllMocks();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('should initialize and return a client object with all methods', async () => {
|
|
52
|
+
const client = await journey({ config: mockConfig });
|
|
53
|
+
expect(client).toBeDefined();
|
|
54
|
+
expect(client.start).toBeInstanceOf(Function);
|
|
55
|
+
expect(client.next).toBeInstanceOf(Function);
|
|
56
|
+
expect(client.redirect).toBeInstanceOf(Function);
|
|
57
|
+
expect(client.resume).toBeInstanceOf(Function);
|
|
58
|
+
expect(client.terminate).toBeInstanceOf(Function);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('start() should fetch and return the first step', async () => {
|
|
62
|
+
const mockStepResponse: Step = { authId: 'test-auth-id', callbacks: [] };
|
|
63
|
+
mockFetch.mockResolvedValue(new Response(JSON.stringify(mockStepResponse)));
|
|
64
|
+
|
|
65
|
+
const client = await journey({ config: mockConfig });
|
|
66
|
+
const step = await client.start();
|
|
67
|
+
expect(step).toBeDefined();
|
|
68
|
+
|
|
69
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
70
|
+
const request = mockFetch.mock.calls[0][0] as Request;
|
|
71
|
+
// TODO: This should be /journeys?_action=start, but the current implementation calls /authenticate
|
|
72
|
+
expect(request.url).toBe('https://test.com/json/realms/root/authenticate');
|
|
73
|
+
expect(step).toHaveProperty('type', 'Step');
|
|
74
|
+
expect(step && step.payload).toEqual(mockStepResponse);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test('next() should send the current step and return the next step', async () => {
|
|
78
|
+
const initialStep = createJourneyStep({
|
|
79
|
+
authId: 'test-auth-id',
|
|
80
|
+
callbacks: [
|
|
81
|
+
{
|
|
82
|
+
type: callbackType.NameCallback,
|
|
83
|
+
input: [{ name: 'IDToken1', value: 'test-user' }],
|
|
84
|
+
output: [],
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
});
|
|
88
|
+
const nextStepPayload: Step = {
|
|
89
|
+
authId: 'test-auth-id',
|
|
90
|
+
callbacks: [
|
|
91
|
+
{
|
|
92
|
+
type: callbackType.PasswordCallback,
|
|
93
|
+
input: [{ name: 'IDToken2', value: 'test-password' }],
|
|
94
|
+
output: [],
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
mockFetch.mockResolvedValue(new Response(JSON.stringify(nextStepPayload)));
|
|
100
|
+
|
|
101
|
+
const client = await journey({ config: mockConfig });
|
|
102
|
+
const nextStep = await client.next(initialStep, {});
|
|
103
|
+
expect(nextStep).toBeDefined();
|
|
104
|
+
|
|
105
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
106
|
+
const request = mockFetch.mock.calls[0][0] as Request;
|
|
107
|
+
// TODO: This should be /journeys?_action=next, but the current implementation calls /authenticate
|
|
108
|
+
expect(request.url).toBe('https://test.com/json/realms/root/authenticate');
|
|
109
|
+
expect(request.method).toBe('POST');
|
|
110
|
+
expect(await request.json()).toEqual(initialStep.payload);
|
|
111
|
+
expect(nextStep).toHaveProperty('type', 'Step');
|
|
112
|
+
expect(nextStep && nextStep.payload).toEqual(nextStepPayload);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test('redirect() should store the step and call location.assign', async () => {
|
|
116
|
+
const mockStepPayload: Step = {
|
|
117
|
+
callbacks: [
|
|
118
|
+
{
|
|
119
|
+
type: callbackType.RedirectCallback,
|
|
120
|
+
input: [],
|
|
121
|
+
output: [{ name: 'redirectUrl', value: 'https://sso.com/redirect' }],
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
};
|
|
125
|
+
const step = createJourneyStep(mockStepPayload);
|
|
126
|
+
|
|
127
|
+
const assignMock = vi.fn();
|
|
128
|
+
const locationSpy = vi.spyOn(window, 'location', 'get').mockReturnValue({
|
|
129
|
+
...window.location,
|
|
130
|
+
assign: assignMock,
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
const client = await journey({ config: mockConfig });
|
|
134
|
+
await client.redirect(step);
|
|
135
|
+
|
|
136
|
+
expect(mockStorageInstance.set).toHaveBeenCalledWith({ step: step.payload });
|
|
137
|
+
expect(assignMock).toHaveBeenCalledWith('https://sso.com/redirect');
|
|
138
|
+
|
|
139
|
+
locationSpy.mockRestore();
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
describe('resume()', () => {
|
|
143
|
+
test('should call next() with URL params when a previous step is in storage', async () => {
|
|
144
|
+
const previousStepPayload: Step = {
|
|
145
|
+
callbacks: [{ type: callbackType.RedirectCallback, input: [], output: [] }],
|
|
146
|
+
};
|
|
147
|
+
mockStorageInstance.get.mockResolvedValue({ step: previousStepPayload });
|
|
148
|
+
|
|
149
|
+
const nextStepPayload: Step = { authId: 'test-auth-id', callbacks: [] };
|
|
150
|
+
mockFetch.mockResolvedValue(new Response(JSON.stringify(nextStepPayload)));
|
|
151
|
+
|
|
152
|
+
const client = await journey({ config: mockConfig });
|
|
153
|
+
const resumeUrl = 'https://app.com/callback?code=123&state=abc';
|
|
154
|
+
|
|
155
|
+
const step = await client.resume(resumeUrl, {});
|
|
156
|
+
expect(step).toBeDefined();
|
|
157
|
+
|
|
158
|
+
expect(mockStorageInstance.get).toHaveBeenCalledTimes(1);
|
|
159
|
+
expect(mockStorageInstance.remove).toHaveBeenCalledTimes(1);
|
|
160
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
161
|
+
const request = mockFetch.mock.calls[0][0] as Request;
|
|
162
|
+
|
|
163
|
+
// TODO: This should be /journeys?_action=next, but the current implementation calls /authenticate
|
|
164
|
+
const url = new URL(request.url);
|
|
165
|
+
expect(url.origin + url.pathname).toBe('https://test.com/json/realms/root/authenticate');
|
|
166
|
+
expect(url.searchParams.get('code')).toBe('123');
|
|
167
|
+
expect(url.searchParams.get('state')).toBe('abc');
|
|
168
|
+
|
|
169
|
+
expect(request.method).toBe('POST');
|
|
170
|
+
expect(await request.json()).toEqual(previousStepPayload);
|
|
171
|
+
expect(step).toHaveProperty('type', 'Step');
|
|
172
|
+
expect(step && step.payload).toEqual(nextStepPayload);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
test('should correctly resume with a plain Step object from storage', async () => {
|
|
176
|
+
const plainStepPayload: Step = {
|
|
177
|
+
callbacks: [
|
|
178
|
+
{ type: callbackType.TextOutputCallback, output: [{ name: 'message', value: 'Hello' }] },
|
|
179
|
+
],
|
|
180
|
+
stage: 'testStage',
|
|
181
|
+
};
|
|
182
|
+
mockStorageInstance.get.mockResolvedValue({ step: plainStepPayload });
|
|
183
|
+
|
|
184
|
+
const nextStepPayload: Step = { authId: 'test-auth-id', callbacks: [] };
|
|
185
|
+
mockFetch.mockResolvedValue(new Response(JSON.stringify(nextStepPayload)));
|
|
186
|
+
|
|
187
|
+
const client = await journey({ config: mockConfig });
|
|
188
|
+
const resumeUrl = 'https://app.com/callback?code=123&state=abc';
|
|
189
|
+
|
|
190
|
+
const step = await client.resume(resumeUrl, {});
|
|
191
|
+
expect(step).toBeDefined();
|
|
192
|
+
|
|
193
|
+
expect(mockStorageInstance.get).toHaveBeenCalledTimes(1);
|
|
194
|
+
expect(mockStorageInstance.remove).toHaveBeenCalledTimes(1);
|
|
195
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
196
|
+
|
|
197
|
+
const request = mockFetch.mock.calls[0][0] as Request;
|
|
198
|
+
expect(request.method).toBe('POST');
|
|
199
|
+
expect(await request.json()).toEqual(plainStepPayload); // Expect the plain payload to be sent
|
|
200
|
+
expect(step).toHaveProperty('type', 'Step'); // The returned step should still be an JourneyStep instance
|
|
201
|
+
expect(step && step.payload).toEqual(nextStepPayload);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test('should throw an error if a previous step is required but not found', async () => {
|
|
205
|
+
mockStorageInstance.get.mockResolvedValue(undefined);
|
|
206
|
+
|
|
207
|
+
const client = await journey({ config: mockConfig });
|
|
208
|
+
const resumeUrl = 'https://app.com/callback?code=123&state=abc';
|
|
209
|
+
|
|
210
|
+
await expect(client.resume(resumeUrl)).rejects.toThrow(
|
|
211
|
+
'Error: previous step information not found in storage for resume operation.',
|
|
212
|
+
);
|
|
213
|
+
expect(mockStorageInstance.get).toHaveBeenCalledTimes(1);
|
|
214
|
+
expect(mockStorageInstance.remove).toHaveBeenCalledTimes(1);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
test('should call start() with URL params when no previous step is required', async () => {
|
|
218
|
+
mockStorageInstance.get.mockResolvedValue(undefined);
|
|
219
|
+
|
|
220
|
+
const mockStepResponse: Step = { authId: 'test-auth-id', callbacks: [] };
|
|
221
|
+
mockFetch.mockResolvedValue(new Response(JSON.stringify(mockStepResponse)));
|
|
222
|
+
|
|
223
|
+
const client = await journey({ config: mockConfig });
|
|
224
|
+
const resumeUrl = 'https://app.com/callback?foo=bar';
|
|
225
|
+
|
|
226
|
+
const step = await client.resume(resumeUrl, {});
|
|
227
|
+
expect(step).toBeDefined();
|
|
228
|
+
|
|
229
|
+
expect(mockStorageInstance.get).not.toHaveBeenCalled();
|
|
230
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
231
|
+
const request = mockFetch.mock.calls[0][0] as Request;
|
|
232
|
+
|
|
233
|
+
// TODO: This should be /journeys?_action=start, but the current implementation calls /authenticate
|
|
234
|
+
const url = new URL(request.url);
|
|
235
|
+
expect(url.origin + url.pathname).toBe('https://test.com/json/realms/root/authenticate');
|
|
236
|
+
expect(step).toHaveProperty('type', 'Step');
|
|
237
|
+
expect(step && step.payload).toEqual(mockStepResponse);
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
describe('baseUrl normalization', () => {
|
|
242
|
+
test('should add trailing slash to baseUrl without one', async () => {
|
|
243
|
+
const configWithoutSlash: JourneyClientConfig = {
|
|
244
|
+
serverConfig: {
|
|
245
|
+
baseUrl: 'http://localhost:9443/am',
|
|
246
|
+
},
|
|
247
|
+
realmPath: 'root',
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
const mockStepResponse: Step = { authId: 'test-auth-id', callbacks: [] };
|
|
251
|
+
mockFetch.mockResolvedValue(new Response(JSON.stringify(mockStepResponse)));
|
|
252
|
+
|
|
253
|
+
const client = await journey({ config: configWithoutSlash });
|
|
254
|
+
await client.start();
|
|
255
|
+
|
|
256
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
257
|
+
const request = mockFetch.mock.calls[0][0] as Request;
|
|
258
|
+
expect(request.url).toBe('http://localhost:9443/am/json/realms/root/authenticate');
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
test('should preserve trailing slash if already present', async () => {
|
|
262
|
+
const configWithSlash: JourneyClientConfig = {
|
|
263
|
+
serverConfig: {
|
|
264
|
+
baseUrl: 'http://localhost:9443/am/',
|
|
265
|
+
},
|
|
266
|
+
realmPath: 'root',
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
const mockStepResponse: Step = { authId: 'test-auth-id', callbacks: [] };
|
|
270
|
+
mockFetch.mockResolvedValue(new Response(JSON.stringify(mockStepResponse)));
|
|
271
|
+
|
|
272
|
+
const client = await journey({ config: configWithSlash });
|
|
273
|
+
await client.start();
|
|
274
|
+
|
|
275
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
276
|
+
const request = mockFetch.mock.calls[0][0] as Request;
|
|
277
|
+
expect(request.url).toBe('http://localhost:9443/am/json/realms/root/authenticate');
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
test('should work with baseUrl without context path', async () => {
|
|
281
|
+
const configNoContext: JourneyClientConfig = {
|
|
282
|
+
serverConfig: {
|
|
283
|
+
baseUrl: 'http://localhost:9443',
|
|
284
|
+
},
|
|
285
|
+
realmPath: 'root',
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
const mockStepResponse: Step = { authId: 'test-auth-id', callbacks: [] };
|
|
289
|
+
mockFetch.mockResolvedValue(new Response(JSON.stringify(mockStepResponse)));
|
|
290
|
+
|
|
291
|
+
const client = await journey({ config: configNoContext });
|
|
292
|
+
await client.start();
|
|
293
|
+
|
|
294
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
295
|
+
const request = mockFetch.mock.calls[0][0] as Request;
|
|
296
|
+
expect(request.url).toBe('http://localhost:9443/json/realms/root/authenticate');
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
// TODO: Add tests for endSession when the test environment AbortSignal issue is resolved
|
|
301
|
+
// test('endSession() should call the sessions endpoint with DELETE method', async () => {
|
|
302
|
+
// mockFetch.mockResolvedValue(new Response('', { status: 200 }));
|
|
303
|
+
//
|
|
304
|
+
// const client = await journey({ config: mockConfig });
|
|
305
|
+
// await client.endSession();
|
|
306
|
+
//
|
|
307
|
+
// expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
308
|
+
// const request = mockFetch.mock.calls[0][0] as Request;
|
|
309
|
+
// expect(request.url).toBe('https://test.com/json/realms/root/sessions/');
|
|
310
|
+
// expect(request.method).toBe('DELETE');
|
|
311
|
+
// });
|
|
312
|
+
//
|
|
313
|
+
// test('endSession() should handle query parameters', async () => {
|
|
314
|
+
// mockFetch.mockResolvedValue(new Response('', { status: 200 }));
|
|
315
|
+
//
|
|
316
|
+
// const client = await journey({ config: mockConfig });
|
|
317
|
+
// await client.endSession({ query: { foo: 'bar' } });
|
|
318
|
+
//
|
|
319
|
+
// expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
320
|
+
// const request = mockFetch.mock.calls[0][0] as Request;
|
|
321
|
+
// expect(request.url).toBe('https://test.com/json/realms/root/sessions/?foo=bar');
|
|
322
|
+
// expect(request.method).toBe('DELETE');
|
|
323
|
+
// });
|
|
324
|
+
});
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025 Ping Identity Corporation. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* This software may be modified and distributed under the terms
|
|
5
|
+
* of the MIT license. See the LICENSE file for details.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { logger as loggerFn, LogLevel, CustomLogger } from '@forgerock/sdk-logger';
|
|
9
|
+
import { callbackType } from '@forgerock/sdk-types';
|
|
10
|
+
|
|
11
|
+
import type { RequestMiddleware } from '@forgerock/sdk-request-middleware';
|
|
12
|
+
import type { GenericError, Step } from '@forgerock/sdk-types';
|
|
13
|
+
|
|
14
|
+
import { createJourneyStore } from './client.store.utils.js';
|
|
15
|
+
import { journeyApi } from './journey.api.js';
|
|
16
|
+
import { setConfig } from './journey.slice.js';
|
|
17
|
+
import { createStorage } from '@forgerock/storage';
|
|
18
|
+
import { createJourneyObject } from './journey.utils.js';
|
|
19
|
+
|
|
20
|
+
import type { JourneyStep } from './step.utils.js';
|
|
21
|
+
import type { JourneyClientConfig } from './config.types.js';
|
|
22
|
+
import type { RedirectCallback } from './callbacks/redirect-callback.js';
|
|
23
|
+
import { NextOptions, StartParam, ResumeOptions } from './interfaces.js';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Normalizes the serverConfig to ensure baseUrl has a trailing slash.
|
|
27
|
+
* This is required for the resolve() function to work correctly with context paths like /am.
|
|
28
|
+
*/
|
|
29
|
+
function normalizeConfig(config: JourneyClientConfig): JourneyClientConfig {
|
|
30
|
+
if (config.serverConfig?.baseUrl) {
|
|
31
|
+
const url = config.serverConfig.baseUrl;
|
|
32
|
+
if (url.charAt(url.length - 1) !== '/') {
|
|
33
|
+
return {
|
|
34
|
+
...config,
|
|
35
|
+
serverConfig: {
|
|
36
|
+
...config.serverConfig,
|
|
37
|
+
baseUrl: url + '/',
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return config;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export async function journey({
|
|
46
|
+
config,
|
|
47
|
+
requestMiddleware,
|
|
48
|
+
logger,
|
|
49
|
+
}: {
|
|
50
|
+
config: JourneyClientConfig;
|
|
51
|
+
requestMiddleware?: RequestMiddleware[];
|
|
52
|
+
logger?: {
|
|
53
|
+
level: LogLevel;
|
|
54
|
+
custom?: CustomLogger;
|
|
55
|
+
};
|
|
56
|
+
}) {
|
|
57
|
+
const log = loggerFn({ level: logger?.level || 'error', custom: logger?.custom });
|
|
58
|
+
|
|
59
|
+
// Normalize config to ensure baseUrl has trailing slash
|
|
60
|
+
const normalizedConfig = normalizeConfig(config);
|
|
61
|
+
|
|
62
|
+
const store = createJourneyStore({ requestMiddleware, logger: log, config: normalizedConfig });
|
|
63
|
+
store.dispatch(setConfig(normalizedConfig));
|
|
64
|
+
|
|
65
|
+
const stepStorage = createStorage<{ step: Step }>({
|
|
66
|
+
type: 'sessionStorage',
|
|
67
|
+
name: 'journey-step',
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const self = {
|
|
71
|
+
start: async (options?: StartParam) => {
|
|
72
|
+
const { data } = await store.dispatch(journeyApi.endpoints.start.initiate(options));
|
|
73
|
+
return data ? createJourneyObject(data) : undefined;
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Submits the current Step payload to the authentication API and retrieves the next JourneyStep in the journey.
|
|
78
|
+
* The `step` to be submitted is provided within the `options` object.
|
|
79
|
+
*
|
|
80
|
+
* @param options An object containing the current Step payload and optional JourneyClientConfig.
|
|
81
|
+
* @returns A Promise that resolves to the next JourneyStep in the journey, or undefined if the journey ends.
|
|
82
|
+
*/
|
|
83
|
+
next: async (step: JourneyStep, options?: NextOptions) => {
|
|
84
|
+
const { data } = await store.dispatch(journeyApi.endpoints.next.initiate({ step, options }));
|
|
85
|
+
return data ? createJourneyObject(data) : undefined;
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
// TODO: Remove the actual redirect from this method and just return the URL to the caller
|
|
89
|
+
redirect: async (step: JourneyStep) => {
|
|
90
|
+
const cb = step.getCallbackOfType(callbackType.RedirectCallback) as RedirectCallback;
|
|
91
|
+
if (!cb) {
|
|
92
|
+
// TODO: Remove throwing errors from SDK and use Result types instead
|
|
93
|
+
throw new Error('RedirectCallback not found on step');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const redirectUrl = cb.getRedirectUrl();
|
|
97
|
+
if (!redirectUrl || typeof redirectUrl !== 'string') {
|
|
98
|
+
throw new Error('Redirect URL not found on RedirectCallback');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const err = await stepStorage.set({ step: step.payload });
|
|
102
|
+
if (err && (err as GenericError).error) {
|
|
103
|
+
log.warn('Failed to persist step before redirect', err);
|
|
104
|
+
}
|
|
105
|
+
window.location.assign(redirectUrl);
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
resume: async (
|
|
109
|
+
url: string,
|
|
110
|
+
options?: ResumeOptions,
|
|
111
|
+
): Promise<ReturnType<typeof createJourneyObject> | undefined> => {
|
|
112
|
+
const parsedUrl = new URL(url);
|
|
113
|
+
const code = parsedUrl.searchParams.get('code');
|
|
114
|
+
const state = parsedUrl.searchParams.get('state');
|
|
115
|
+
const form_post_entry = parsedUrl.searchParams.get('form_post_entry');
|
|
116
|
+
const responsekey = parsedUrl.searchParams.get('responsekey');
|
|
117
|
+
|
|
118
|
+
let previousStep: JourneyStep | undefined; // Declare previousStep here
|
|
119
|
+
|
|
120
|
+
function requiresPreviousStep() {
|
|
121
|
+
return (code && state) || form_post_entry || responsekey;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Type guard for GenericError (assuming GenericError has 'error' and 'message' properties)
|
|
125
|
+
function isGenericError(obj: unknown): obj is GenericError {
|
|
126
|
+
return typeof obj === 'object' && obj !== null && 'error' in obj && 'message' in obj;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Type guard for { step: JourneyStep }
|
|
130
|
+
function isStoredStep(obj: unknown): obj is { step: Step } {
|
|
131
|
+
return (
|
|
132
|
+
typeof obj === 'object' &&
|
|
133
|
+
obj !== null &&
|
|
134
|
+
'step' in obj &&
|
|
135
|
+
typeof (obj as { step: Step }).step === 'object'
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (requiresPreviousStep()) {
|
|
140
|
+
const stored = await stepStorage.get();
|
|
141
|
+
|
|
142
|
+
if (stored) {
|
|
143
|
+
if (isGenericError(stored)) {
|
|
144
|
+
// If the stored item is a GenericError, it means something went wrong during storage/retrieval
|
|
145
|
+
// or the previous step was an error.
|
|
146
|
+
// TODO: Remove throwing errors from SDK and use Result types instead
|
|
147
|
+
throw new Error(`Error retrieving previous step: ${stored.message || stored.error}`);
|
|
148
|
+
} else if (isStoredStep(stored)) {
|
|
149
|
+
previousStep = createJourneyObject(stored.step) as JourneyStep;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
await stepStorage.remove();
|
|
153
|
+
|
|
154
|
+
if (!previousStep) {
|
|
155
|
+
throw new Error(
|
|
156
|
+
'Error: previous step information not found in storage for resume operation.',
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const resumeOptions = {
|
|
162
|
+
...options,
|
|
163
|
+
query: {
|
|
164
|
+
...(options && options.query), // Spread options.query first
|
|
165
|
+
...(code && { code }),
|
|
166
|
+
...(state && { state }),
|
|
167
|
+
...(form_post_entry && { form_post_entry }),
|
|
168
|
+
...(responsekey && { responsekey }),
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
if (previousStep) {
|
|
173
|
+
return await self.next(previousStep, resumeOptions);
|
|
174
|
+
} else {
|
|
175
|
+
// TODO: We should better handle this type misalignment
|
|
176
|
+
const startOptions = resumeOptions as StartParam;
|
|
177
|
+
return await self.start(startOptions);
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Ends the current authentication session by calling the `/sessions` endpoint.
|
|
183
|
+
* This will invalidate the current session and clean up any server-side state.
|
|
184
|
+
*
|
|
185
|
+
* @param options Optional StepOptions containing query parameters.
|
|
186
|
+
* @returns A Promise that resolves when the session is successfully ended.
|
|
187
|
+
*/
|
|
188
|
+
terminate: async (options?: { query?: Record<string, string> }) => {
|
|
189
|
+
const { data } = await store.dispatch(journeyApi.endpoints.terminate.initiate(options));
|
|
190
|
+
return data;
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
return self;
|
|
194
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025 Ping Identity Corporation. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* This software may be modified and distributed under the terms
|
|
5
|
+
* of the MIT license. See the LICENSE file for details.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { logger as loggerFn } from '@forgerock/sdk-logger';
|
|
9
|
+
import { RequestMiddleware } from '@forgerock/sdk-request-middleware';
|
|
10
|
+
import { combineReducers, configureStore } from '@reduxjs/toolkit';
|
|
11
|
+
|
|
12
|
+
import { journeyApi } from './journey.api.js';
|
|
13
|
+
import { journeySlice } from './journey.slice.js';
|
|
14
|
+
import { JourneyClientConfig } from './config.types.js';
|
|
15
|
+
|
|
16
|
+
const rootReducer = combineReducers({
|
|
17
|
+
[journeyApi.reducerPath]: journeyApi.reducer,
|
|
18
|
+
[journeySlice.name]: journeySlice.reducer,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export const createJourneyStore = ({
|
|
22
|
+
requestMiddleware,
|
|
23
|
+
logger,
|
|
24
|
+
config,
|
|
25
|
+
}: {
|
|
26
|
+
requestMiddleware?: RequestMiddleware[];
|
|
27
|
+
logger?: ReturnType<typeof loggerFn>;
|
|
28
|
+
config: JourneyClientConfig;
|
|
29
|
+
}) => {
|
|
30
|
+
return configureStore({
|
|
31
|
+
reducer: rootReducer,
|
|
32
|
+
middleware: (getDefaultMiddleware) =>
|
|
33
|
+
getDefaultMiddleware({
|
|
34
|
+
serializableCheck: true,
|
|
35
|
+
thunk: {
|
|
36
|
+
extraArgument: {
|
|
37
|
+
requestMiddleware,
|
|
38
|
+
logger,
|
|
39
|
+
config,
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
}).concat(journeyApi.middleware),
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export type RootState = ReturnType<typeof rootReducer>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025 Ping Identity Corporation. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* This software may be modified and distributed under the terms
|
|
5
|
+
* of the MIT license. See the LICENSE file for details.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { BaseConfig } from '@forgerock/sdk-types';
|
|
9
|
+
import type { RequestMiddleware } from '@forgerock/sdk-request-middleware';
|
|
10
|
+
|
|
11
|
+
export interface JourneyClientConfig extends BaseConfig {
|
|
12
|
+
middleware?: Array<RequestMiddleware>;
|
|
13
|
+
realmPath?: string;
|
|
14
|
+
// Add any journey-specific config options here
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type { RequestMiddleware };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @forgerock/ping-javascript-sdk
|
|
3
|
+
*
|
|
4
|
+
* defaults.ts
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2020 - 2025 Ping Identity Corporation. All rights reserved.
|
|
7
|
+
* This software may be modified and distributed under the terms
|
|
8
|
+
* of the MIT license. See the LICENSE file for details.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export const browserProps = [
|
|
12
|
+
'userAgent',
|
|
13
|
+
'appName',
|
|
14
|
+
'appCodeName',
|
|
15
|
+
'appVersion',
|
|
16
|
+
'appMinorVersion',
|
|
17
|
+
'buildID',
|
|
18
|
+
'product',
|
|
19
|
+
'productSub',
|
|
20
|
+
'vendor',
|
|
21
|
+
'vendorSub',
|
|
22
|
+
'browserLanguage',
|
|
23
|
+
];
|
|
24
|
+
export const configurableCategories = [
|
|
25
|
+
'fontNames',
|
|
26
|
+
'displayProps',
|
|
27
|
+
'browserProps',
|
|
28
|
+
'hardwareProps',
|
|
29
|
+
'platformProps',
|
|
30
|
+
];
|
|
31
|
+
export const delay = 30 * 1000;
|
|
32
|
+
export const devicePlatforms = {
|
|
33
|
+
mac: ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'],
|
|
34
|
+
windows: ['Win32', 'Win64', 'Windows', 'WinCE'],
|
|
35
|
+
ios: ['iPhone', 'iPad', 'iPod'],
|
|
36
|
+
};
|
|
37
|
+
export const displayProps = ['width', 'height', 'pixelDepth', 'orientation.angle'];
|
|
38
|
+
export const fontNames = [
|
|
39
|
+
'cursive',
|
|
40
|
+
'monospace',
|
|
41
|
+
'serif',
|
|
42
|
+
'sans-serif',
|
|
43
|
+
'fantasy',
|
|
44
|
+
'Arial',
|
|
45
|
+
'Arial Black',
|
|
46
|
+
'Arial Narrow',
|
|
47
|
+
'Arial Rounded MT Bold',
|
|
48
|
+
'Bookman Old Style',
|
|
49
|
+
'Bradley Hand ITC',
|
|
50
|
+
'Century',
|
|
51
|
+
'Century Gothic',
|
|
52
|
+
'Comic Sans MS',
|
|
53
|
+
'Courier',
|
|
54
|
+
'Courier New',
|
|
55
|
+
'Georgia',
|
|
56
|
+
'Gentium',
|
|
57
|
+
'Impact',
|
|
58
|
+
'King',
|
|
59
|
+
'Lucida Console',
|
|
60
|
+
'Lalit',
|
|
61
|
+
'Modena',
|
|
62
|
+
'Monotype Corsiva',
|
|
63
|
+
'Papyrus',
|
|
64
|
+
'Tahoma',
|
|
65
|
+
'TeX',
|
|
66
|
+
'Times',
|
|
67
|
+
'Times New Roman',
|
|
68
|
+
'Trebuchet MS',
|
|
69
|
+
'Verdana',
|
|
70
|
+
'Verona',
|
|
71
|
+
];
|
|
72
|
+
export const hardwareProps = [
|
|
73
|
+
'cpuClass',
|
|
74
|
+
'deviceMemory',
|
|
75
|
+
'hardwareConcurrency',
|
|
76
|
+
'maxTouchPoints',
|
|
77
|
+
'oscpu',
|
|
78
|
+
];
|
|
79
|
+
export const platformProps = ['language', 'platform', 'userLanguage', 'systemLanguage'];
|