From 01c6d192a49929f10c8d61146a42b8132f93e1b3 Mon Sep 17 00:00:00 2001 From: Poovamraj T T Date: Thu, 10 Aug 2023 11:12:00 +0200 Subject: [PATCH] Merge vNext into Master (#691) Signed-off-by: dependabot[bot] Co-authored-by: Frederik Prijck Co-authored-by: Frederik Prijck Co-authored-by: Steven Qiou Co-authored-by: Evan Sims Co-authored-by: Andrew Flores Co-authored-by: Rita Zerrizuela Co-authored-by: Steve Hobbs Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .circleci/config.yml | 7 +- .github/ISSUE_TEMPLATE/Bug Report.yml | 2 +- .github/ISSUE_TEMPLATE/Feature Request.yml | 2 +- .gitignore | 57 +- .jsdoc.json | 24 - .shiprc | 2 +- .watchmanconfig | 1 + .yarnrc | 3 + A0Auth0.podspec | 8 +- CHANGELOG.md | 47 +- DEVELOPMENT.md | 25 - EXAMPLES.md | 35 +- MIGRATION_GUIDE.md | 52 + README.md | 82 +- android/build.gradle | 2 +- android/src/main/AndroidManifest.xml | 43 - .../java/com/auth0/react/A0Auth0Module.java | 192 +- .../auth0/react/AuthenticationActivity.java | 88 - .../com/auth0/react/CredentialsParser.java | 24 +- .../com/auth0/react/RedirectActivity.java | 20 - app.plugin.js | 2 +- .babelrc.js => babel.config.js | 4 +- codecov.yml | 2 +- docs/.nojekyll | 1 + docs/Auth.html | 2703 ---- docs/Auth0.html | 454 - docs/CredentialsManager.html | 863 -- docs/Users.html | 541 - docs/WebAuth.html | 841 -- docs/assets/highlight.css | 173 + docs/assets/main.js | 2100 +++ docs/assets/search.js | 3 + docs/assets/style.css | 1363 ++ docs/auth0.js.html | 317 - docs/auth_index.js.html | 905 -- docs/classes/TimeoutError.html | 535 + docs/classes/Types.Auth.html | 2814 ++++ docs/classes/Types.BaseError.html | 887 ++ docs/classes/Types.CredentialsManager.html | 1526 +++ docs/classes/Types.Users.html | 1063 ++ docs/classes/Types.WebAuth.html | 1202 ++ docs/classes/default.html | 1007 ++ docs/credentials-manager_index.js.html | 430 - docs/enums/LocalAuthenticationStrategy.html | 547 + docs/fonts/OpenSans-Bold-webfont.eot | Bin 19544 -> 0 bytes docs/fonts/OpenSans-Bold-webfont.svg | 1830 --- docs/fonts/OpenSans-Bold-webfont.woff | Bin 22432 -> 0 bytes docs/fonts/OpenSans-BoldItalic-webfont.eot | Bin 20133 -> 0 bytes docs/fonts/OpenSans-BoldItalic-webfont.svg | 1830 --- docs/fonts/OpenSans-BoldItalic-webfont.woff | Bin 23048 -> 0 bytes docs/fonts/OpenSans-Italic-webfont.eot | Bin 20265 -> 0 bytes docs/fonts/OpenSans-Italic-webfont.svg | 1830 --- docs/fonts/OpenSans-Italic-webfont.woff | Bin 23188 -> 0 bytes docs/fonts/OpenSans-Light-webfont.eot | Bin 19514 -> 0 bytes docs/fonts/OpenSans-Light-webfont.svg | 1831 --- docs/fonts/OpenSans-Light-webfont.woff | Bin 22248 -> 0 bytes docs/fonts/OpenSans-LightItalic-webfont.eot | Bin 20535 -> 0 bytes docs/fonts/OpenSans-LightItalic-webfont.svg | 1835 --- docs/fonts/OpenSans-LightItalic-webfont.woff | Bin 23400 -> 0 bytes docs/fonts/OpenSans-Regular-webfont.eot | Bin 19836 -> 0 bytes docs/fonts/OpenSans-Regular-webfont.svg | 1831 --- docs/fonts/OpenSans-Regular-webfont.woff | Bin 22660 -> 0 bytes docs/fonts/OpenSans-Semibold-webfont.eot | Bin 20028 -> 0 bytes docs/fonts/OpenSans-Semibold-webfont.svg | 1830 --- docs/fonts/OpenSans-Semibold-webfont.ttf | Bin 39476 -> 0 bytes docs/fonts/OpenSans-Semibold-webfont.woff | Bin 22908 -> 0 bytes .../fonts/OpenSans-SemiboldItalic-webfont.eot | Bin 20962 -> 0 bytes .../fonts/OpenSans-SemiboldItalic-webfont.svg | 1830 --- .../fonts/OpenSans-SemiboldItalic-webfont.ttf | Bin 40252 -> 0 bytes .../OpenSans-SemiboldItalic-webfont.woff | Bin 23764 -> 0 bytes docs/functions/Auth0Provider-1.html | 430 + docs/functions/useAuth0.html | 434 + docs/global.html | 608 - docs/hooks_auth0-provider.js.html | 457 - docs/hooks_use-auth0.js.html | 317 - docs/index.html | 1282 +- .../Types.Auth0ContextInterface.html | 2811 ++++ docs/interfaces/Types.AuthState.html | 948 ++ .../interfaces/Types.AuthorizeUrlOptions.html | 930 ++ .../interfaces/Types.ClearSessionOptions.html | 881 ++ .../Types.ClearSessionParameters.html | 848 ++ docs/interfaces/Types.CreateUserOptions.html | 1255 ++ .../Types.ExchangeNativeSocialOptions.html | 1041 ++ docs/interfaces/Types.ExchangeOptions.html | 934 ++ docs/interfaces/Types.GetUserOptions.html | 823 ++ .../Types.LoginWithEmailOptions.html | 976 ++ .../interfaces/Types.LoginWithOOBOptions.html | 933 ++ .../interfaces/Types.LoginWithOTPOptions.html | 932 ++ .../Types.LoginWithRecoveryCodeOptions.html | 888 ++ .../interfaces/Types.LoginWithSMSOptions.html | 974 ++ docs/interfaces/Types.LogoutUrlOptions.html | 937 ++ .../Types.MultifactorChallengeOptions.html | 941 ++ .../Types.PasswordRealmOptions.html | 1029 ++ .../Types.PasswordlessWithEmailOptions.html | 933 ++ .../Types.PasswordlessWithSMSOptions.html | 936 ++ docs/interfaces/Types.PatchUserOptions.html | 865 ++ .../interfaces/Types.RefreshTokenOptions.html | 885 ++ .../Types.ResetPasswordOptions.html | 883 ++ docs/interfaces/Types.RevokeOptions.html | 836 ++ docs/interfaces/Types.UserInfoOptions.html | 824 ++ .../interfaces/Types.WebAuthorizeOptions.html | 985 ++ .../Types.WebAuthorizeParameters.html | 1243 ++ docs/management_users.js.html | 386 - docs/modules.html | 409 + docs/modules/Auth0Provider.html | 433 + docs/modules/Types.html | 975 ++ docs/scripts/linenumber.js | 25 - docs/scripts/prettify/Apache-License-2.0.txt | 202 - docs/scripts/prettify/lang-css.js | 36 - docs/scripts/prettify/prettify.js | 735 - docs/styles/jsdoc-default.css | 733 - docs/styles/prettify-jsdoc.css | 111 - docs/styles/prettify-tomorrow.css | 163 - docs/types/Types.Auth0Response.html | 782 ++ docs/types/Types.Credentials.html | 819 ++ ...Types.MultifactorChallengeOOBResponse.html | 733 + ...factorChallengeOOBWithBindingResponse.html | 734 + ...Types.MultifactorChallengeOTPResponse.html | 728 + .../Types.MultifactorChallengeResponse.html | 723 + docs/types/Types.Telemetry.html | 746 ++ docs/types/Types.User.html | 966 ++ docs/variables/Auth0Provider.propTypes.html | 458 + docs/webauth_index.js.html | 456 - example/.bundle/config | 2 + example/.gitignore | 58 + example/.node-version | 1 + example/.watchmanconfig | 1 + example/Gemfile | 6 + example/README.md | 23 + example/android/app/build.gradle | 171 + example/android/app/proguard-rules.pro | 10 + .../android/app/src/debug/AndroidManifest.xml | 13 + .../com/auth0example/ReactNativeFlipper.java | 75 + .../android/app/src/main/AndroidManifest.xml | 25 + .../java/com/auth0example/MainActivity.java | 35 + .../com/auth0example/MainApplication.java | 62 + .../res/drawable/rn_edit_text_material.xml | 36 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3056 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5024 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2096 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2858 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4569 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7098 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6464 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10676 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9250 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15523 bytes .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/styles.xml | 9 + .../com/auth0example/ReactNativeFlipper.java | 20 + example/android/build.gradle | 21 + example/android/gradle.properties | 44 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + example/android/gradlew | 234 + example/android/gradlew.bat | 89 + example/android/settings.gradle | 4 + example/app.json | 4 + example/babel.config.js | 17 + example/index.js | 5 + example/ios/.xcode.env | 11 + example/ios/Auth0Example-Bridging-Header.h | 3 + .../Auth0Example.xcodeproj/project.pbxproj | 704 + .../xcschemes/Auth0Example.xcscheme | 88 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + example/ios/Auth0Example/AppDelegate.h | 6 + example/ios/Auth0Example/AppDelegate.mm | 36 + .../AppIcon.appiconset/Contents.json | 53 + .../Images.xcassets/Contents.json | 6 + example/ios/Auth0Example/Info.plist | 68 + .../ios/Auth0Example/LaunchScreen.storyboard | 47 + example/ios/Auth0Example/main.m | 10 + .../ios/Auth0ExampleTests/Auth0ExampleTests.m | 66 + example/ios/Auth0ExampleTests/Info.plist | 24 + example/ios/File.swift | 6 + example/ios/Podfile | 60 + example/ios/Podfile.lock | 643 + example/metro.config.js | 40 + example/package.json | 22 + example/react-native.config.js | 10 + example/src/App.tsx | 70 + example/src/auth0-configuration.js | 6 + example/yarn.lock | 4961 +++++++ index.js | 7 - ios/A0Auth0.h | 2 +- ios/A0Auth0.m | 262 +- ios/A0Auth0.xcodeproj/project.pbxproj | 8 +- ios/CredentialsManagerBridge.swift | 112 - ios/NativeBridge.swift | 225 + jest.environment.js | 24 + package.json | 191 +- plugin/jest.config.js | 1 - plugin/tsconfig.json | 9 - scripts/bootstrap.js | 29 + scripts/jsdocs.js | 10 +- .../__snapshots__/index.spec.js.snap | 1383 +- src/auth/__tests__/index.spec.js | 8 +- src/auth/auth0Error.js | 15 - src/auth/auth0Error.ts | 34 + src/auth/authError.js | 19 - src/auth/authError.ts | 34 + src/auth/index.js | 623 - src/auth/index.ts | 597 + src/auth0.js | 35 - src/auth0.ts | 50 + .../__tests__/credentials-manager.spec.js | 55 +- .../credentialsManagerError.js | 17 - .../credentialsManagerError.ts | 43 + src/credentials-manager/index.js | 148 - src/credentials-manager/index.ts | 158 + .../localAuthenticationStrategy.js | 6 - .../localAuthenticationStrategy.ts | 15 + src/hooks/__tests__/use-auth0.spec.js | 558 - src/hooks/__tests__/use-auth0.spec.jsx | 1095 ++ src/hooks/auth0-context.js | 20 - src/hooks/auth0-context.ts | 159 + src/hooks/auth0-provider.js | 175 - src/hooks/auth0-provider.tsx | 387 + src/hooks/reducer.js | 28 - src/hooks/reducer.ts | 37 + src/hooks/use-auth0.js | 35 - src/hooks/use-auth0.ts | 36 + src/index.ts | 8 + src/internal-types.ts | 138 + src/jwt/{base64.js => base64.ts} | 6 +- src/jwt/{index.js => index.ts} | 0 src/jwt/rsa-verifier.js | 72 - src/jwt/rsa-verifier.ts | 78 + ...natureVerifier.js => signatureVerifier.ts} | 22 +- src/jwt/{utils.js => utils.ts} | 0 src/jwt/{validator.js => validator.ts} | 75 +- .../__snapshots__/users.spec.js.snap | 180 +- src/management/__tests__/users.spec.js | 84 +- src/management/error.js | 12 - src/management/error.ts | 30 + src/management/{users.js => users.ts} | 70 +- .../__snapshots__/index.spec.js.snap | 328 +- src/networking/__tests__/index.spec.js | 4 +- src/networking/__tests__/telemetry.spec.js | 2 +- src/networking/index.js | 100 - src/networking/index.ts | 142 + src/networking/telemetry.js | 1 - src/networking/telemetry.ts | 7 + .../__snapshots__/withAuth0-test.ts.snap | 118 +- .../fixtures/appdelegate-withlinking.ts | 0 .../fixtures/appdelegate-withoutlinking.ts | 0 .../plugin}/__tests__/fixtures/buildgradle.ts | 0 .../plugin}/__tests__/withAuth0-test.ts | 64 +- src/plugin/generateCode.ts | 150 + {plugin/src => src/plugin}/withAuth0.ts | 50 +- src/types.ts | 543 + .../timestampConversion.spec.js.snap | 9 + .../__snapshots__/whitelist.spec.js.snap | 2 +- .../__tests__/timestampConversion.spec.js | 35 + src/utils/__tests__/userConversion.spec.js | 17 + src/utils/__tests__/whitelist.spec.js | 94 +- src/utils/{baseError.js => baseError.ts} | 6 +- src/utils/{camel.js => camel.ts} | 24 +- src/utils/deepEqual.js | 23 - src/utils/deepEqual.ts | 21 + ...etchWithTimeout.js => fetchWithTimeout.ts} | 26 +- src/utils/nativeHelper.ts | 13 + src/utils/timestampConversion.ts | 6 + src/utils/userConversion.ts | 56 + src/utils/{whitelist.js => whitelist.ts} | 16 +- src/webauth/__mocks__/auth0.js | 37 +- src/webauth/__mocks__/linking.js | 25 - src/webauth/__mocks__/react-native.js | 2 - .../__snapshots__/agent.spec.js.snap | 14 +- .../__snapshots__/webauth.spec.js.snap | 12 +- src/webauth/__tests__/agent.spec.js | 253 +- src/webauth/__tests__/webauth.spec.js | 189 +- src/webauth/agent.js | 72 - src/webauth/agent.ts | 94 + src/webauth/index.js | 174 - src/webauth/index.ts | 79 + tsconfig.build.json | 4 + tsconfig.json | 31 +- typedoc.json | 9 + yarn.lock | 11140 ++++++++++------ 281 files changed, 70688 insertions(+), 35658 deletions(-) delete mode 100644 .jsdoc.json create mode 100644 .watchmanconfig create mode 100644 .yarnrc delete mode 100644 DEVELOPMENT.md create mode 100644 MIGRATION_GUIDE.md delete mode 100644 android/src/main/java/com/auth0/react/AuthenticationActivity.java delete mode 100644 android/src/main/java/com/auth0/react/RedirectActivity.java rename .babelrc.js => babel.config.js (76%) create mode 100644 docs/.nojekyll delete mode 100644 docs/Auth.html delete mode 100644 docs/Auth0.html delete mode 100644 docs/CredentialsManager.html delete mode 100644 docs/Users.html delete mode 100644 docs/WebAuth.html create mode 100644 docs/assets/highlight.css create mode 100644 docs/assets/main.js create mode 100644 docs/assets/search.js create mode 100644 docs/assets/style.css delete mode 100644 docs/auth0.js.html delete mode 100644 docs/auth_index.js.html create mode 100644 docs/classes/TimeoutError.html create mode 100644 docs/classes/Types.Auth.html create mode 100644 docs/classes/Types.BaseError.html create mode 100644 docs/classes/Types.CredentialsManager.html create mode 100644 docs/classes/Types.Users.html create mode 100644 docs/classes/Types.WebAuth.html create mode 100644 docs/classes/default.html delete mode 100644 docs/credentials-manager_index.js.html create mode 100644 docs/enums/LocalAuthenticationStrategy.html delete mode 100644 docs/fonts/OpenSans-Bold-webfont.eot delete mode 100644 docs/fonts/OpenSans-Bold-webfont.svg delete mode 100644 docs/fonts/OpenSans-Bold-webfont.woff delete mode 100644 docs/fonts/OpenSans-BoldItalic-webfont.eot delete mode 100644 docs/fonts/OpenSans-BoldItalic-webfont.svg delete mode 100644 docs/fonts/OpenSans-BoldItalic-webfont.woff delete mode 100644 docs/fonts/OpenSans-Italic-webfont.eot delete mode 100644 docs/fonts/OpenSans-Italic-webfont.svg delete mode 100644 docs/fonts/OpenSans-Italic-webfont.woff delete mode 100644 docs/fonts/OpenSans-Light-webfont.eot delete mode 100644 docs/fonts/OpenSans-Light-webfont.svg delete mode 100644 docs/fonts/OpenSans-Light-webfont.woff delete mode 100644 docs/fonts/OpenSans-LightItalic-webfont.eot delete mode 100644 docs/fonts/OpenSans-LightItalic-webfont.svg delete mode 100644 docs/fonts/OpenSans-LightItalic-webfont.woff delete mode 100644 docs/fonts/OpenSans-Regular-webfont.eot delete mode 100644 docs/fonts/OpenSans-Regular-webfont.svg delete mode 100644 docs/fonts/OpenSans-Regular-webfont.woff delete mode 100755 docs/fonts/OpenSans-Semibold-webfont.eot delete mode 100755 docs/fonts/OpenSans-Semibold-webfont.svg delete mode 100755 docs/fonts/OpenSans-Semibold-webfont.ttf delete mode 100755 docs/fonts/OpenSans-Semibold-webfont.woff delete mode 100755 docs/fonts/OpenSans-SemiboldItalic-webfont.eot delete mode 100755 docs/fonts/OpenSans-SemiboldItalic-webfont.svg delete mode 100755 docs/fonts/OpenSans-SemiboldItalic-webfont.ttf delete mode 100755 docs/fonts/OpenSans-SemiboldItalic-webfont.woff create mode 100644 docs/functions/Auth0Provider-1.html create mode 100644 docs/functions/useAuth0.html delete mode 100644 docs/global.html delete mode 100644 docs/hooks_auth0-provider.js.html delete mode 100644 docs/hooks_use-auth0.js.html create mode 100644 docs/interfaces/Types.Auth0ContextInterface.html create mode 100644 docs/interfaces/Types.AuthState.html create mode 100644 docs/interfaces/Types.AuthorizeUrlOptions.html create mode 100644 docs/interfaces/Types.ClearSessionOptions.html create mode 100644 docs/interfaces/Types.ClearSessionParameters.html create mode 100644 docs/interfaces/Types.CreateUserOptions.html create mode 100644 docs/interfaces/Types.ExchangeNativeSocialOptions.html create mode 100644 docs/interfaces/Types.ExchangeOptions.html create mode 100644 docs/interfaces/Types.GetUserOptions.html create mode 100644 docs/interfaces/Types.LoginWithEmailOptions.html create mode 100644 docs/interfaces/Types.LoginWithOOBOptions.html create mode 100644 docs/interfaces/Types.LoginWithOTPOptions.html create mode 100644 docs/interfaces/Types.LoginWithRecoveryCodeOptions.html create mode 100644 docs/interfaces/Types.LoginWithSMSOptions.html create mode 100644 docs/interfaces/Types.LogoutUrlOptions.html create mode 100644 docs/interfaces/Types.MultifactorChallengeOptions.html create mode 100644 docs/interfaces/Types.PasswordRealmOptions.html create mode 100644 docs/interfaces/Types.PasswordlessWithEmailOptions.html create mode 100644 docs/interfaces/Types.PasswordlessWithSMSOptions.html create mode 100644 docs/interfaces/Types.PatchUserOptions.html create mode 100644 docs/interfaces/Types.RefreshTokenOptions.html create mode 100644 docs/interfaces/Types.ResetPasswordOptions.html create mode 100644 docs/interfaces/Types.RevokeOptions.html create mode 100644 docs/interfaces/Types.UserInfoOptions.html create mode 100644 docs/interfaces/Types.WebAuthorizeOptions.html create mode 100644 docs/interfaces/Types.WebAuthorizeParameters.html delete mode 100644 docs/management_users.js.html create mode 100644 docs/modules.html create mode 100644 docs/modules/Auth0Provider.html create mode 100644 docs/modules/Types.html delete mode 100644 docs/scripts/linenumber.js delete mode 100644 docs/scripts/prettify/Apache-License-2.0.txt delete mode 100644 docs/scripts/prettify/lang-css.js delete mode 100644 docs/scripts/prettify/prettify.js delete mode 100644 docs/styles/jsdoc-default.css delete mode 100644 docs/styles/prettify-jsdoc.css delete mode 100644 docs/styles/prettify-tomorrow.css create mode 100644 docs/types/Types.Auth0Response.html create mode 100644 docs/types/Types.Credentials.html create mode 100644 docs/types/Types.MultifactorChallengeOOBResponse.html create mode 100644 docs/types/Types.MultifactorChallengeOOBWithBindingResponse.html create mode 100644 docs/types/Types.MultifactorChallengeOTPResponse.html create mode 100644 docs/types/Types.MultifactorChallengeResponse.html create mode 100644 docs/types/Types.Telemetry.html create mode 100644 docs/types/Types.User.html create mode 100644 docs/variables/Auth0Provider.propTypes.html delete mode 100644 docs/webauth_index.js.html create mode 100644 example/.bundle/config create mode 100644 example/.gitignore create mode 100644 example/.node-version create mode 100644 example/.watchmanconfig create mode 100644 example/Gemfile create mode 100644 example/README.md create mode 100644 example/android/app/build.gradle create mode 100644 example/android/app/proguard-rules.pro create mode 100644 example/android/app/src/debug/AndroidManifest.xml create mode 100644 example/android/app/src/debug/java/com/auth0example/ReactNativeFlipper.java create mode 100644 example/android/app/src/main/AndroidManifest.xml create mode 100644 example/android/app/src/main/java/com/auth0example/MainActivity.java create mode 100644 example/android/app/src/main/java/com/auth0example/MainApplication.java create mode 100644 example/android/app/src/main/res/drawable/rn_edit_text_material.xml create mode 100644 example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 example/android/app/src/main/res/values/strings.xml create mode 100644 example/android/app/src/main/res/values/styles.xml create mode 100644 example/android/app/src/release/java/com/auth0example/ReactNativeFlipper.java create mode 100644 example/android/build.gradle create mode 100644 example/android/gradle.properties create mode 100644 example/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 example/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 example/android/gradlew create mode 100644 example/android/gradlew.bat create mode 100644 example/android/settings.gradle create mode 100644 example/app.json create mode 100644 example/babel.config.js create mode 100644 example/index.js create mode 100644 example/ios/.xcode.env create mode 100644 example/ios/Auth0Example-Bridging-Header.h create mode 100644 example/ios/Auth0Example.xcodeproj/project.pbxproj create mode 100644 example/ios/Auth0Example.xcodeproj/xcshareddata/xcschemes/Auth0Example.xcscheme create mode 100644 example/ios/Auth0Example.xcworkspace/contents.xcworkspacedata create mode 100644 example/ios/Auth0Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 example/ios/Auth0Example/AppDelegate.h create mode 100644 example/ios/Auth0Example/AppDelegate.mm create mode 100644 example/ios/Auth0Example/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 example/ios/Auth0Example/Images.xcassets/Contents.json create mode 100644 example/ios/Auth0Example/Info.plist create mode 100644 example/ios/Auth0Example/LaunchScreen.storyboard create mode 100644 example/ios/Auth0Example/main.m create mode 100644 example/ios/Auth0ExampleTests/Auth0ExampleTests.m create mode 100644 example/ios/Auth0ExampleTests/Info.plist create mode 100644 example/ios/File.swift create mode 100644 example/ios/Podfile create mode 100644 example/ios/Podfile.lock create mode 100644 example/metro.config.js create mode 100644 example/package.json create mode 100644 example/react-native.config.js create mode 100644 example/src/App.tsx create mode 100644 example/src/auth0-configuration.js create mode 100644 example/yarn.lock delete mode 100644 index.js delete mode 100644 ios/CredentialsManagerBridge.swift create mode 100644 ios/NativeBridge.swift create mode 100644 jest.environment.js delete mode 100644 plugin/jest.config.js delete mode 100644 plugin/tsconfig.json create mode 100644 scripts/bootstrap.js delete mode 100644 src/auth/auth0Error.js create mode 100644 src/auth/auth0Error.ts delete mode 100644 src/auth/authError.js create mode 100644 src/auth/authError.ts delete mode 100644 src/auth/index.js create mode 100644 src/auth/index.ts delete mode 100644 src/auth0.js create mode 100644 src/auth0.ts delete mode 100644 src/credentials-manager/credentialsManagerError.js create mode 100644 src/credentials-manager/credentialsManagerError.ts delete mode 100644 src/credentials-manager/index.js create mode 100644 src/credentials-manager/index.ts delete mode 100644 src/credentials-manager/localAuthenticationStrategy.js create mode 100644 src/credentials-manager/localAuthenticationStrategy.ts delete mode 100644 src/hooks/__tests__/use-auth0.spec.js create mode 100644 src/hooks/__tests__/use-auth0.spec.jsx delete mode 100644 src/hooks/auth0-context.js create mode 100644 src/hooks/auth0-context.ts delete mode 100644 src/hooks/auth0-provider.js create mode 100644 src/hooks/auth0-provider.tsx delete mode 100644 src/hooks/reducer.js create mode 100644 src/hooks/reducer.ts delete mode 100644 src/hooks/use-auth0.js create mode 100644 src/hooks/use-auth0.ts create mode 100644 src/index.ts create mode 100644 src/internal-types.ts rename src/jwt/{base64.js => base64.ts} (82%) rename src/jwt/{index.js => index.ts} (100%) delete mode 100644 src/jwt/rsa-verifier.js create mode 100644 src/jwt/rsa-verifier.ts rename src/jwt/{signatureVerifier.js => signatureVerifier.ts} (82%) rename src/jwt/{utils.js => utils.ts} (100%) rename src/jwt/{validator.js => validator.ts} (81%) delete mode 100644 src/management/error.js create mode 100644 src/management/error.ts rename src/management/{users.js => users.ts} (56%) delete mode 100644 src/networking/index.js create mode 100644 src/networking/index.ts delete mode 100644 src/networking/telemetry.js create mode 100644 src/networking/telemetry.ts rename {plugin/src => src/plugin}/__tests__/__snapshots__/withAuth0-test.ts.snap (85%) rename {plugin/src => src/plugin}/__tests__/fixtures/appdelegate-withlinking.ts (100%) rename {plugin/src => src/plugin}/__tests__/fixtures/appdelegate-withoutlinking.ts (100%) rename {plugin/src => src/plugin}/__tests__/fixtures/buildgradle.ts (100%) rename {plugin/src => src/plugin}/__tests__/withAuth0-test.ts (82%) create mode 100644 src/plugin/generateCode.ts rename {plugin/src => src/plugin}/withAuth0.ts (79%) create mode 100644 src/types.ts create mode 100644 src/utils/__tests__/__snapshots__/timestampConversion.spec.js.snap create mode 100644 src/utils/__tests__/timestampConversion.spec.js create mode 100644 src/utils/__tests__/userConversion.spec.js rename src/utils/{baseError.js => baseError.ts} (61%) rename src/utils/{camel.js => camel.ts} (54%) delete mode 100644 src/utils/deepEqual.js create mode 100644 src/utils/deepEqual.ts rename src/utils/{fetchWithTimeout.js => fetchWithTimeout.ts} (59%) create mode 100644 src/utils/nativeHelper.ts create mode 100644 src/utils/timestampConversion.ts create mode 100644 src/utils/userConversion.ts rename src/utils/{whitelist.js => whitelist.ts} (70%) delete mode 100644 src/webauth/__mocks__/linking.js delete mode 100644 src/webauth/agent.js create mode 100644 src/webauth/agent.ts delete mode 100644 src/webauth/index.js create mode 100644 src/webauth/index.ts create mode 100644 tsconfig.build.json create mode 100644 typedoc.json diff --git a/.circleci/config.yml b/.circleci/config.yml index b9ee08b8..ef823c11 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,14 +1,14 @@ version: 2.1 orbs: - ship: auth0/ship@0.7.1 + ship: auth0/ship@0 codecov: codecov/codecov@3 jobs: build: executor: name: ship/node - tag: 16.10.0 + tag: 18.16.0 steps: - checkout - ship/node-install-packages: @@ -22,7 +22,9 @@ workflows: jobs: - build - ship/node-publish: + node-version: 18.16.0 pkg-manager: yarn + publish-command: npm publish --tag v3-beta requires: - build context: @@ -32,3 +34,4 @@ workflows: branches: only: - master + - vnext diff --git a/.github/ISSUE_TEMPLATE/Bug Report.yml b/.github/ISSUE_TEMPLATE/Bug Report.yml index c02ef84a..a453e947 100644 --- a/.github/ISSUE_TEMPLATE/Bug Report.yml +++ b/.github/ISSUE_TEMPLATE/Bug Report.yml @@ -1,6 +1,6 @@ name: 🐞 Report a bug description: Have you found a bug or issue? Create a bug report for this library -labels: ["bug"] +labels: ['bug'] body: - type: markdown diff --git a/.github/ISSUE_TEMPLATE/Feature Request.yml b/.github/ISSUE_TEMPLATE/Feature Request.yml index c4fd2cab..63eccb96 100644 --- a/.github/ISSUE_TEMPLATE/Feature Request.yml +++ b/.github/ISSUE_TEMPLATE/Feature Request.yml @@ -1,6 +1,6 @@ name: 🧩 Feature request description: Suggest an idea or a feature for this library -labels: ["feature request"] +labels: ['feature request'] body: - type: checkboxes diff --git a/.gitignore b/.gitignore index 091bb287..531b31a2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,13 @@ # .DS_Store +# XDE +.expo/ + +# VSCode +.vscode/ +jsconfig.json + # Xcode # build/ @@ -22,46 +29,46 @@ DerivedData *.xcuserstate project.xcworkspace -# Android/IntelliJ +# Android/IJ # -build/ -.idea +.classpath +.cxx .gradle +.idea +.project +.settings local.properties -*.iml +android.iml + +# Cocoapods +# +example/ios/Pods + +# Ruby +example/vendor/ # node.js # node_modules/ npm-debug.log +yarn-debug.log yarn-error.log # BUCK buck-out/ \.buckd/ -*.keystore - -# fastlane -# -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/ - -*/fastlane/report.xml -*/fastlane/Preview.html -*/fastlane/screenshots +android/app/libs +android/keystores/debug.keystore -# Bundle artifact -*.jsbundle +# Expo +.expo/ -# CocoaPods -/ios/Pods/ +# Turborepo +.turbo/ -# Coverage -coverage/ +# generated by bob +lib/ -# Temp files +# Other +dist/ out/ - -plugin/build \ No newline at end of file diff --git a/.jsdoc.json b/.jsdoc.json deleted file mode 100644 index 42ded670..00000000 --- a/.jsdoc.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "tags": { - "allowUnknownTags": true, - "dictionaries": ["jsdoc"] - }, - "source": { - "include": ["src", "index.js", "package.json", "README.md"], - "includePattern": ".js$", - "excludePattern": "(node_modules/|docs|__tests__|src/jwt)" - }, - "plugins": ["./node_modules/jsdoc/plugins/markdown"], - "templates": { - "cleverLinks": false, - "monospaceLinks": true, - "useLongnameInNav": false - }, - "opts": { - "destination": "./out/", - "encoding": "utf8", - "private": false, - "recurse": true, - "template": "./node_modules/minami" - } -} diff --git a/.shiprc b/.shiprc index bcab56af..a180cdf9 100644 --- a/.shiprc +++ b/.shiprc @@ -1,6 +1,6 @@ { "files": { - "src/networking/telemetry.js": [] + "src/networking/telemetry.ts": [] }, "postbump": "node scripts/jsdocs.js" } diff --git a/.watchmanconfig b/.watchmanconfig new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/.watchmanconfig @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.yarnrc b/.yarnrc new file mode 100644 index 00000000..fedc0f11 --- /dev/null +++ b/.yarnrc @@ -0,0 +1,3 @@ +# Override Yarn command so we can automatically setup the repo on running `yarn` + +yarn-path "scripts/bootstrap.js" diff --git a/A0Auth0.podspec b/A0Auth0.podspec index a78d0c5e..2e2b10ae 100644 --- a/A0Auth0.podspec +++ b/A0Auth0.podspec @@ -9,7 +9,7 @@ Pod::Spec.new do |s| s.homepage = package['repository']['baseUrl'] s.license = package['license'] s.authors = package['author'] - s.platforms = { :ios => '12.0' } + s.platforms = { :ios => '13.0' } s.source = { :git => 'https://github.com/auth0/react-native-auth0.git', :tag => "v#{s.version}" } s.source_files = 'ios/**/*.{h,m,mm,swift}' @@ -17,7 +17,7 @@ Pod::Spec.new do |s| s.requires_arc = true s.dependency 'React-Core' - s.dependency 'Auth0', '2.3.2' - s.dependency 'JWTDecode', '3.0.1' - s.dependency 'SimpleKeychain', '1.0.1' + s.dependency 'Auth0', '2.5.0' + s.dependency 'JWTDecode', '3.1.0' + s.dependency 'SimpleKeychain', '1.1.0' end diff --git a/CHANGELOG.md b/CHANGELOG.md index 395dc23b..64b52c41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,50 @@ # Change Log +## [v3.0.0-beta.3](https://github.com/auth0/react-native-auth0/tree/v3.0.0-beta.3) (2023-07-11) + +[Full Changelog](https://github.com/auth0/react-native-auth0/compare/v3.0.0-beta.2...v3.0.0-beta.3) + +**Added** + +- Export types as part of root [\#649](https://github.com/auth0/react-native-auth0/pull/676) ([poovamraj](https://github.com/poovamraj)) + +## [v3.0.0-beta.2](https://github.com/auth0/react-native-auth0/tree/v3.0.0-beta.2) (2023-07-10) + +[Full Changelog](https://github.com/auth0/react-native-auth0/compare/v2.17.4...v3.0.0-beta.2) + +💡 Check the [Migration Guide](MIGRATION_GUIDE.md) to understand the changes required to migrate your application to v3. + +**Added** + +- \Credentials are returned as part of authorize methods in hooks +- Added sample app in the repository +- Expo plugin is updated to latest version +- Added 'openid profile email' as mandatory scopes +- Option to `forceRefresh` is added in `getCredentials` +- Added `hasValidCredentials` to hooks +- More options to authorize using Hooks + - `authorizeWithSMS` + - `authorizeWithEmail` + - `authorizeWithOOB` + - `authorizeWithOTP` + - `authorizeWithRecoveryCode` + +**Changed** + +- Custom Scheme is now optional in Expo +- Migrated the codebase to Typescript +- Use Native SDKs ([Auth0.Android](https://github.com/auth0/Auth0.Android/) and [Auth0.Swift](https://github.com/auth0/Auth0.Swift)) for Web Authentication +- `Credentials` object in Android will return `expiresIn` instead of `expiresAt` +- `max_age` parameter is changed to `maxAge` in `WebAuth.authorize()` +- `customScheme` is now part of `ClearSessionOptions` instead of `ClearSessionParameters` in `clearSession` +- Minimum supported version for iOS is bumped to 13 +- Revoke Token and Change Password now return `void` instead of an empty object + +**Removed** + +- Removed the `type` property returned in the `Credentials` object in Android. Use `tokenType` instead. +- `skipLegacyListener` has been removed in `authorize` and `clearSession` + ## [v2.17.4](https://github.com/auth0/react-native-auth0/tree/v2.17.4) (2023-06-15) [Full Changelog](https://github.com/auth0/react-native-auth0/compare/v2.17.3...v2.17.4) @@ -656,7 +701,7 @@ const auth0 = new Auth0({ ```js auth0.webAuth - .authorize({scope: 'openid email'}) + .authorize({ scope: 'openid email' }) .then((credentials) => console.log(credentials)) .catch((error) => console.log(error)); ``` diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md deleted file mode 100644 index 0eb290d7..00000000 --- a/DEVELOPMENT.md +++ /dev/null @@ -1,25 +0,0 @@ -## Setup the development environment - -To test the SDK manually, follow the below steps - -- Ensure [yarn](https://yarnpkg.com/) is setup in your machine. -- Download or Clone the sample app from [here](https://github.com/auth0-samples/auth0-react-native-sample/tree/master/00-Login). -- Change the path of react-native-auth0 in package.json to the path of the SDK in your computer - -```shell -"react-native-auth0": "../{PATH IN COMPUTER}/react-native-auth0" -``` - -- Few folders have to be deleted to ensure the correct version of the SDK is installed. - -```shell -rm -rf node_modules ios/Pods ios/Podfile.lock -``` - -- Install the required dependencies. - -```shell -yarn install && ( cd ios && pod install ) -``` - -- run `yarn run android` or `yarn run ios` to run the app with the new version of SDK diff --git a/EXAMPLES.md b/EXAMPLES.md index b5750578..f9e03346 100644 --- a/EXAMPLES.md +++ b/EXAMPLES.md @@ -48,7 +48,7 @@ auth0.auth ```js auth0.auth - .userInfo({token: 'the user access_token'}) + .userInfo({ token: 'the user access_token' }) .then(console.log) .catch(console.error); ``` @@ -59,19 +59,17 @@ This endpoint requires an access token that was granted the `/userinfo` audience ```js auth0.auth - .refreshToken({refreshToken: 'the user refresh_token'}) + .refreshToken({ refreshToken: 'the user refresh_token' }) .then(console.log) .catch(console.error); ``` ### Using custom scheme for web authentication redirection -Custom Schemes can be used for redirecting to the React Native application after web authentication. Using this is mandatory for Expo applications. +Custom Schemes can be used for redirecting to the React Native application after web authentication: ```js -authorize({}, {customScheme: 'auth0'}) - .then(console.log) - .catch(console.error); +authorize({}, { customScheme: 'auth0' }).then(console.log).catch(console.error); ``` ### Login using MFA with One Time Password code @@ -162,7 +160,10 @@ auth0.auth ```js auth0 .users('the user access_token') - .patchUser({id: 'user_id', metadata: {first_name: 'John', last_name: 'Doe'}}) + .patchUser({ + id: 'user_id', + metadata: { first_name: 'John', last_name: 'Doe' }, + }) .then(console.log) .catch(console.error); ``` @@ -171,8 +172,8 @@ auth0 ```js auth0 - .users('the user access_token') - .getUser({id: 'user_id'}) + .users('{ACCESS_TOKEN}') + .getUser({ id: 'user_id' }) .then(console.log) .catch(console.error); ``` @@ -190,9 +191,9 @@ Note that Organizations is currently only available to customers on our Enterpri ```js auth0.webAuth - .authorize({organization: 'organization-id'}) - .then(credentials => console.log(credentials)) - .catch(error => console.log(error)); + .authorize({ organization: 'organization-id' }) + .then((credentials) => console.log(credentials)) + .catch((error) => console.log(error)); ``` ### Accept user invitations @@ -209,8 +210,8 @@ auth0.webAuth invitationUrl: 'https://myapp.com/login?invitation=inv123&organization=org123', }) - .then(credentials => console.log(credentials)) - .catch(error => console.log(error)); + .then((credentials) => console.log(credentials)) + .catch((error) => console.log(error)); ``` If the URL doesn't contain the expected values, an error will be raised through the provided callback. @@ -231,10 +232,10 @@ auth0.auth realm: realm, scope: scope, }) - .then(credentials => { + .then((credentials) => { // Logged in! }) - .catch(error => { + .catch((error) => { if (error.name === 'requires_verification') { auth0.webAuth .authorize({ @@ -242,7 +243,7 @@ auth0.auth scope: scope, login_hint: email, // So the user doesn't have to type it again }) - .then(credentials => { + .then((credentials) => { // Logged in! }) .catch(console.error); diff --git a/MIGRATION_GUIDE.md b/MIGRATION_GUIDE.md new file mode 100644 index 00000000..f8c9669d --- /dev/null +++ b/MIGRATION_GUIDE.md @@ -0,0 +1,52 @@ +# Migration Guide + +## Upgrading from v2 -> v3 + +### Improvements and changes + +- Web Auth will now have default scope of 'openid profile email', so these scopes can be removed if you're explicitly specifying them +- Minimum supported version for iOS is bumped to 13 +- Minimum supported version for Expo is bumped to 48 +- Revoke Token and Change Password now return `void` instead of an empty object + +### Breaking changes + +- The properties inside the `user` object will now be camelCase instead of snake_case +- Removed the `type` property returned in the `Credentials` object in Android. Use `tokenType` instead. +- `Credentials` object in iOS will return `expiresAt` instead of `expiresIn` +- `expiresIn` value will now return `expiresAt` value which is a UNIX timestamp of the expiration time. +- `max_age` parameter is changed to `maxAge` in `WebAuth.authorize()` +- `skipLegacyListener` has been removed in `authorize` and `clearSession` +- `customScheme` is now part of `ClearSessionOptions` instead of `ClearSessionParameters` in `clearSession` + +### Callback URL migration + +We are migrating the callback URL we use for the SDK to below. + +**Old** + +``` +iOS: {PRODUCT_BUNDLE_IDENTIFIER}://{DOMAIN}/ios/{PRODUCT_BUNDLE_IDENTIFIER}/callback +Android: {YOUR_APP_PACKAGE_NAME}://{DOMAIN}/android/{YOUR_APP_PACKAGE_NAME}/callback +``` + +**New** + +Notice the new `.auth0` suffix after the bundle identifier / package name: + +``` +iOS: {PRODUCT_BUNDLE_IDENTIFIER}.auth0://{DOMAIN}/ios/{PRODUCT_BUNDLE_IDENTIFIER}/callback +Android: {YOUR_APP_PACKAGE_NAME}.auth0://{DOMAIN}/android/{YOUR_APP_PACKAGE_NAME}/callback +``` + +Choose one of the following migration paths depending on your application: + +- **If your project is built with Expo:** + - To keep things as it is, no changes are required + - To migrate to new non-custom scheme flow: + - Remove custom scheme in app.json and `authorize()`. + - Run `npx expo prebuild --clean` (any manual changes to Android or iOS folders will be lost) + - Add the new callback URL to Auth0 dashboard +- **If your project is built with Non Expo:** + - To keep things as it is, set `useLegacyCallbackUrl` to true in `authorize` and `clearSession` + - To migrate to new non-custom scheme flow, add the new callback URL to Auth0 dashboard diff --git a/README.md b/README.md index 0e05ccac..883014a2 100644 --- a/README.md +++ b/README.md @@ -8,42 +8,34 @@ [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fauth0%2Freact-native-auth0.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fauth0%2Freact-native-auth0?ref=badge_shield) | Exciting news! We have just released React Native Auth0 v3 BETA, packed with powerful features and improvements. [Check out the release for more details](https://github.com/auth0/react-native-auth0/releases/tag/v3.0.0-beta.2) | -| --- | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 📚 [Documentation](#documentation) • 🚀 [Getting Started](#getting-started) • ⏭️ [Next Steps](#next-steps) • ❓ [FAQs](https://github.com/auth0/react-native-auth0/blob/master/FAQ.md) • ❓ [Feedback](#feedback) ## Documentation -- [Quickstart](https://auth0.com/docs/quickstart/native/react-native/interactive) -- [Expo Quickstart](https://auth0.com/docs/quickstart/native/react-native-expo/interactive) -- [Sample App](https://github.com/auth0-samples/auth0-react-native-sample/tree/master/00-Login-Hooks) -- [Expo Sample App](https://github.com/auth0-samples/auth0-react-native-sample/tree/master/00-Login-Expo) +- [Quickstart](https://auth0.com/docs/quickstart/native/react-native-beta/interactive) +- [Expo Quickstart](https://auth0.com/docs/quickstart/native/react-native-expo-beta/interactive) +- [Sample App](https://github.com/auth0-samples/auth0-react-native-sample/tree/v3-beta/00-Login-Hooks) +- [Expo Sample App](https://github.com/auth0-samples/auth0-react-native-sample/tree/v3-beta/00-Login-Expo) - [FAQs](https://github.com/auth0/react-native-auth0/blob/master/FAQ.md) - [Examples](https://github.com/auth0/react-native-auth0/blob/master/EXAMPLES.md) - [Docs Site](https://auth0.github.io/react-native-auth0/) -## Important Notices - -Version **2.9.0** introduced a **breaking change** to the Android configuration. Previously it was required to add an intent filter in the definition of the Activity that receives the authentication result, and to use the `singleTask` **launchMode** in that activity. Now both the intent filter and the launch mode **must be removed** and instead you need to add a couple of manifest placeholders. Check out the [Android](#android) section for more details. - ## Getting Started ### Requirements This SDK targets apps that are using React Native SDK version `0.60.5` and up. If you're using an older React Native version, see the compatibility matrix below. -### Compatibility Matrix - -This SDK attempts to follow [semver](https://semver.org/) in a best-effort basis, but React Native is still making releases that eventually include breaking changes on it making this approach difficult for any React Native library module. Use the table below to find the version that best suites your application. +### Platform compatibility -| React Native SDK | Auth0 SDK | -| :--------------: | :-------: | -| v0.65.0 | v2.11.0 | -| v0.62.2 | v2.5.0 | -| v0.60.5 | v2.0.0 | -| v0.59.0 or lower | v1.6.0 | +The following shows platform minimums for running projects with this SDK: -The contents of previous release can be found on the [branch v1](https://github.com/auth0/react-native-auth0/tree/v1). +| Platform | Minimum version | +| -------- | :-------------: | +| iOS | 13.0 | +| Android | 28 | ### Installation @@ -51,11 +43,11 @@ First install the native library module: ### With [npm](https://www.npmjs.com) -`$ npm install react-native-auth0 --save` +`$ npm install react-native-auth0@v3-beta --save` ### With [Yarn](https://yarnpkg.com/en/) -`$ yarn add react-native-auth0` +`$ yarn add react-native-auth0@v3-beta` Then, you need to run the following command to install the ios app pods with Cocoapods. That will auto-link the iOS library: @@ -76,18 +68,18 @@ Open your app's `build.gradle` file (typically at `android/app/build.gradle`) an android { defaultConfig { // Add the next line - manifestPlaceholders = [auth0Domain: "YOUR_AUTH0_DOMAIN", auth0Scheme: "${applicationId}"] + manifestPlaceholders = [auth0Domain: "YOUR_AUTH0_DOMAIN", auth0Scheme: "${applicationId}.auth0"] } ... } ``` -The `auth0Domain` value must be replaced with your Auth0 domain value. So if you have `samples.auth0.com` as your Auth0 domain you would have a configuration like the following: +The `auth0Domain` value must be replaced with your Auth0 domain value. So if you have `samples.us.auth0.com` as your Auth0 domain you would have a configuration like the following: ```groovy android { defaultConfig { - manifestPlaceholders = [auth0Domain: "samples.auth0.com", auth0Scheme: "${applicationId}"] + manifestPlaceholders = [auth0Domain: "samples.us.auth0.com", auth0Scheme: "${applicationId}.auth0"] } ... } @@ -152,7 +144,7 @@ and then below it register a URL type entry using the value of `CFBundleIdentifi auth0 CFBundleURLSchemes - $(PRODUCT_BUNDLE_IDENTIFIER) + $(PRODUCT_BUNDLE_IDENTIFIER).auth0 @@ -192,10 +184,10 @@ To use the SDK with Expo, configure the app at build time by providing the `doma } ``` -| API | Description | -| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| domain | Mandatory: Provide the Auth0 domain that can be found at the [Application Settings](https://manage.auth0.com/#/applications) | -| customScheme | Mandatory: Custom scheme to build the callback URL with. The value provided here should be passed to the `customScheme` option parameter of the `authorize` and `clearSession` methods. The custom scheme should be a unique, all lowercase value with no special characters (For example: auth0.YOUR_APP_PACKAGE_NAME_OR_BUNDLE_IDENTIFIER). | +| API | Description | +| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| domain | Mandatory: Provide the Auth0 domain that can be found at the [Application Settings](https://manage.auth0.com/#/applications) | +| customScheme | Optional: Custom scheme to build the callback URL with. The value provided here should be passed to the `customScheme` option parameter of the `authorize` and `clearSession` methods. The custom scheme should be a unique, all lowercase value with no special characters. | Now you can run the application using `expo run:android` or `expo run:ios`. @@ -212,18 +204,18 @@ If in addition you plan to use the log out method, you must also add these URLs #### Android ```text -{APP_PACKAGE_NAME_OR_CUSTOM_SCHEME}://{AUTH0_DOMAIN}/android/{APP_PACKAGE_NAME}/callback +{YOUR_APP_PACKAGE_NAME}.auth0://{AUTH0_DOMAIN}/android/{YOUR_APP_PACKAGE_NAME}/callback ``` -> Make sure to replace {APP_PACKAGE_NAME_OR_CUSTOM_SCHEME} and {AUTH0_DOMAIN} with the actual values for your application. The {APP_PACKAGE_NAME_OR_CUSTOM_SCHEME} value provided should be all lower case. +> Make sure to replace {YOUR_APP_PACKAGE_NAME} and {AUTH0_DOMAIN} with the actual values for your application. The {YOUR_APP_PACKAGE_NAME} value provided should be all lower case. #### iOS ```text -{BUNDLE_IDENTIFIER_OR_CUSTOM_SCHEME}://{AUTH0_DOMAIN}/ios/{BUNDLE_IDENTIFIER}/callback +{PRODUCT_BUNDLE_IDENTIFIER}.auth0://{AUTH0_DOMAIN}/ios/{PRODUCT_BUNDLE_IDENTIFIER}/callback ``` -> Make sure to replace {BUNDLE_IDENTIFIER_OR_CUSTOM_SCHEME} and {AUTH0_DOMAIN} with the actual values for your application. The {BUNDLE_IDENTIFIER_OR_CUSTOM_SCHEME} value provided should be all lower case. +> Make sure to replace {PRODUCT_BUNDLE_IDENTIFIER} and {AUTH0_DOMAIN} with the actual values for your application. The {PRODUCT_BUNDLE_IDENTIFIER} value provided should be all lower case. ## Next Steps @@ -240,7 +232,7 @@ See the [API Documentation](https://auth0.github.io/react-native-auth0/global.ht First, import the `Auth0Provider` component and wrap it around your application. Provide the `domain` and `clientId` values as given to you when setting up your Auth0 app in the dashboard: ```js -import {Auth0Provider} from 'react-native-auth0'; +import { Auth0Provider } from 'react-native-auth0'; const App = () => { return ( @@ -272,31 +264,31 @@ const auth0 = new Auth0({ Then import the hook into a component where you want to get access to the properties and methods for integrating with Auth0: ```js -import {useAuth0} from 'react-native-auth0'; +import { useAuth0 } from 'react-native-auth0'; ``` #### Login -Use the `authorize` method to redirect the user to the Auth0 [Universal Login](https://auth0.com/docs/authenticate/login/auth0-universal-login) page for authentication. +Use the `authorize` method to redirect the user to the Auth0 [Universal Login](https://auth0.com/docs/authenticate/login/auth0-universal-login) page for authentication. If `scope` is not specified, `openid profile email` is used by default. - The `isLoading` property is set to true once the authentication state of the user is known to the SDK. -- The `user` property is populated with details about the authenticated user. If `user` is `null`, no user is currently authenticated. +- The `user` property is populated with details about the authenticated user. If `user` is `null`, no user is currently authenticated. - The `error` property is populated if any error occurs. ```js const Component = () => { - const {authorize, user, isLoading, error} = useAuth0(); + const { authorize, user, isLoading, error } = useAuth0(); const login = async () => { - await authorize({scope: 'openid profile email'}); // authorize({scope: 'openid profile email'}, {customScheme: 'CUSTOM_SCHEME'}) when using Expo or a custom scheme + await authorize(); }; - if(isLoading) { + if (isLoading) { return ( SDK is Loading - ) + ); } return ( @@ -314,7 +306,7 @@ const Component = () => { ```js auth0.webAuth - .authorize({scope: 'openid email profile'}) + .authorize() .then(credentials => console.log(credentials)) .catch(error => console.log(error)); ``` @@ -336,10 +328,10 @@ Log the user out by using the `clearSession` method from the `useAuth0` hook. ```js const Component = () => { - const {clearSession, user} = useAuth0(); + const { clearSession, user } = useAuth0(); const logout = async () => { - await clearSession(); // clearSession({customScheme: 'CUSTOM_SCHEME'}) when using Expo or a custom scheme + await clearSession(); }; return {user && + + + + + + +
+ + +
+ +
+

+ Generated using + TypeDoc +

+
+
+ + diff --git a/docs/functions/useAuth0.html b/docs/functions/useAuth0.html new file mode 100644 index 00000000..e97a44e2 --- /dev/null +++ b/docs/functions/useAuth0.html @@ -0,0 +1,434 @@ + + + + + + useAuth0 | react-native-auth0 + + + + + + + + + +
+
+ + +
+
+
+
+
+ +

Function useAuth0

+
+
+
    + +
  • +
    +

    + Use the useAuth0 in your function components to + access authentication state and methods. +

    +
    +

    + Returns + Auth0ContextInterface<User> +

    +

    The useAuth0 hook interface

    +
    const {
    // State
    error,
    user,
    isLoading,
    // Methods
    authorize,
    sendSMSCode,
    authorizeWithSMS,
    sendEmailCode,
    authorizeWithEmail,
    sendMultifactorChallenge,
    authorizeWithOOB,
    authorizeWithOTP,
    authorizeWithRecoveryCode,
    clearSession,
    getCredentials,
    clearCredentials,
    requireLocalAuthentication
    } = useAuth0(); +
    +

    + Refer to + Auth0ContextInterface + on how to use the above methods. +

    + +
    + +
  • +
+
+
+
+ + +
+
+
+

+ Generated using + TypeDoc +

+
+
+ + diff --git a/docs/global.html b/docs/global.html deleted file mode 100644 index 3ae4c713..00000000 --- a/docs/global.html +++ /dev/null @@ -1,608 +0,0 @@ - - - - - - Global - Documentation - - - - - - - - - - - - - - - - -
-

Global

- -
-
-

-
- -
-
-
-
- -

Methods

- -
-

- Auth0Provider(domain, clientId) -

- -
-

Provides the Auth0Context to its child components.

-
- -
-
Source:
-
- -
-
- -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
domain - String - -

Your Auth0 domain

-
clientId - String - -

Your Auth0 client ID

-
- -
-
Example
- -
<Auth0Provider domain="YOUR AUTH0 DOMAIN" clientId="YOUR CLIENT ID">
-  <App />
-</Auth0Provider>
-
-
- -
-

- useAuth0() - → {Auth0ContextInterface} -

- -
-

- Use the useAuth0 in your function components to - access authentication state and methods. -

-
- -
-
Source:
-
- -
-
- -
-
Returns:
- -
-
Type:
-
- Auth0ContextInterface -
-
- -
-

The useAuth0 hook interface

-
-
- -
-
Example
- -
const {
-  // State
-  error,
-  user,
-  isLoading,
-  // Methods
-  authorize,
-  clearSession,
-  getCredentials,
-  clearCredentials,
-  requireLocalAuthentication
-} = useAuth0();
-
-
- -

Type Definitions

- -
-

- Auth0ContextInterface -

- -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
user - Object - -

- The user profile as decoded from the ID token after - authentication -

-
error - Object - -

An object representing the last exception

-
isLoading - boolean - -

- A flag that is true until the state knows that a user is - either logged in or not -

-
authorize - function - -

- Authorize the user using Auth0 Universal Login. See - WebAuth#authorize -

-
clearSession - function - -

- Clears the user's web session, credentials and logs them - out. See - WebAuth#clearSession. -

-
getCredentials - function - -

- Gets the user's credentials from the native credential - store. See - CredentialsManager#getCredentials -

-
clearCredentials - function - -

- Clears the user's credentials without clearing their web - session and logs them out. -

-
requireLocalAuthentication - function - -

- Enables Local Authentication (PIN, Biometric, Swipe etc) - to get the credentials. See - CredentialsManager#requireLocalAuthentication -

-
- -
-
Source:
-
- -
-
- -
Type:
-
    -
  • - Object -
  • -
-
-
-
-
- -
- -
- Generated by JSDoc 3.6.11 on - Thu Jun 15 2023 22:57:24 GMT+0530 (India Standard Time) using the Minami - theme. -
- - - - - diff --git a/docs/hooks_auth0-provider.js.html b/docs/hooks_auth0-provider.js.html deleted file mode 100644 index 19f91d72..00000000 --- a/docs/hooks_auth0-provider.js.html +++ /dev/null @@ -1,457 +0,0 @@ - - - - - - hooks/auth0-provider.js - Documentation - - - - - - - - - - - - - - - - -
-

hooks/auth0-provider.js

- -
-
-
import React, {useEffect, useReducer, useState, useRef} from 'react';
-import {useCallback, useMemo} from 'react';
-import jwt_decode from 'jwt-decode';
-import PropTypes from 'prop-types';
-import Auth0Context from './auth0-context';
-import Auth0 from '../auth0';
-import reducer from './reducer';
-import {idTokenNonProfileClaims} from '../jwt/utils';
-
-const initialState = {
-  user: null,
-  error: null,
-  isLoading: true,
-};
-
-/**
- * @ignore
- */
-const getIdTokenProfileClaims = idToken => {
-  const payload = jwt_decode(idToken);
-
-  const profileClaims = Object.keys(payload).reduce((profile, claim) => {
-    if (!idTokenNonProfileClaims.has(claim)) {
-      profile[claim] = payload[claim];
-    }
-
-    return profile;
-  }, {});
-
-  return profileClaims;
-};
-
-/**
- * Provides the Auth0Context to its child components.
- * @param {String} domain Your Auth0 domain
- * @param {String} clientId Your Auth0 client ID
- *
- * @example
- * <Auth0Provider domain="YOUR AUTH0 DOMAIN" clientId="YOUR CLIENT ID">
- *   <App />
- * </Auth0Provider>
- */
-const Auth0Provider = ({domain, clientId, children}) => {
-  const [client] = useState(() => new Auth0({domain, clientId}));
-  const [state, dispatch] = useReducer(reducer, initialState);
-
-  useEffect(() => {
-    (async () => {
-      let user = null;
-
-      if (await client.credentialsManager.hasValidCredentials()) {
-        try {
-          const credentials = await client.credentialsManager.getCredentials();
-          if (credentials) {
-            user = getIdTokenProfileClaims(credentials.idToken);
-          }
-        } catch (error) {
-          dispatch({type: 'ERROR', error});
-        }
-      }
-
-      dispatch({type: 'INITIALIZED', user});
-    })();
-  }, [client]);
-
-  const authorize = useCallback(
-    async (...options) => {
-      try {
-        const params = options.length ? options[0] : {};
-        const opts = options.length > 1 ? options[1] : {};
-        const specifiedScopes =
-          params?.scope?.split(' ').map(s => s.trim()) || [];
-        const scopeSet = new Set([
-          ...specifiedScopes,
-          ...['openid', 'profile', 'email'],
-        ]);
-
-        params.scope = Array.from(scopeSet).join(' ');
-
-        const credentials = await client.webAuth.authorize(params, opts);
-        const user = getIdTokenProfileClaims(credentials.idToken);
-
-        await client.credentialsManager.saveCredentials(credentials);
-        dispatch({type: 'LOGIN_COMPLETE', user});
-      } catch (error) {
-        dispatch({type: 'ERROR', error});
-        return;
-      }
-    },
-    [client],
-  );
-
-  const clearSession = useCallback(
-    async (...options) => {
-      try {
-        await client.webAuth.clearSession(...options);
-        await client.credentialsManager.clearCredentials();
-        dispatch({type: 'LOGOUT_COMPLETE'});
-      } catch (error) {
-        dispatch({type: 'ERROR', error});
-        return;
-      }
-    },
-    [client],
-  );
-
-  const getCredentials = useCallback(
-    async (...options) => {
-      try {
-        const credentials = await client.credentialsManager.getCredentials(...options);
-        if(credentials.idToken) {
-          const user = getIdTokenProfileClaims(credentials.idToken);
-          dispatch({type: 'SET_USER', user});
-        }
-        return credentials;
-      } catch (error) {
-        dispatch({type: 'ERROR', error});
-        return;
-      }
-    },
-    [client],
-  );
-
-  const clearCredentials = useCallback(async () => {
-    try {
-      await client.credentialsManager.clearCredentials();
-      dispatch({type: 'LOGOUT_COMPLETE'});
-    } catch (error) {
-      dispatch({type: 'ERROR', error});
-      return;
-    }
-  }, [client]);
-
-  const requireLocalAuthentication = useCallback(async (...options) => {
-    try {
-      await client.credentialsManager.requireLocalAuthentication(...options);
-    } catch (error) {
-      dispatch({type: 'ERROR', error});
-      return;
-    }
-  });
-
-  const contextValue = useMemo(
-    () => ({
-      ...state,
-      authorize,
-      clearSession,
-      getCredentials,
-      clearCredentials,
-      requireLocalAuthentication,
-    }),
-    [
-      state,
-      authorize,
-      clearSession,
-      getCredentials,
-      clearCredentials,
-      requireLocalAuthentication,
-    ],
-  );
-
-  return (
-    <Auth0Context.Provider value={contextValue}>
-      {children}
-    </Auth0Context.Provider>
-  );
-};
-
-Auth0Provider.propTypes = {
-  domain: PropTypes.string.isRequired,
-  clientId: PropTypes.string.isRequired,
-  children: PropTypes.element.isRequired,
-};
-
-export default Auth0Provider;
-
-
-
-
- -
- -
- Generated by JSDoc 3.6.11 on - Thu Jun 15 2023 22:57:24 GMT+0530 (India Standard Time) using the Minami - theme. -
- - - - - diff --git a/docs/hooks_use-auth0.js.html b/docs/hooks_use-auth0.js.html deleted file mode 100644 index e9fd75ac..00000000 --- a/docs/hooks_use-auth0.js.html +++ /dev/null @@ -1,317 +0,0 @@ - - - - - - hooks/use-auth0.js - Documentation - - - - - - - - - - - - - - - - -
-

hooks/use-auth0.js

- -
-
-
import {useContext} from 'react';
-import Auth0Context from './auth0-context';
-
-/**
- * @typedef {Object} Auth0ContextInterface
- * @property {Object} user The user profile as decoded from the ID token after authentication
- * @property {Object} error An object representing the last exception
- * @property {boolean} isLoading A flag that is true until the state knows that a user is either logged in or not
- * @property {Function} authorize Authorize the user using Auth0 Universal Login. See {@link WebAuth#authorize}
- * @property {Function} clearSession Clears the user's web session, credentials and logs them out. See {@link WebAuth#clearSession}.
- * @property {Function} getCredentials Gets the user's credentials from the native credential store. See {@link CredentialsManager#getCredentials}
- * @property {Function} clearCredentials Clears the user's credentials without clearing their web session and logs them out.
- * @property {Function} requireLocalAuthentication Enables Local Authentication (PIN, Biometric, Swipe etc) to get the credentials. See {@link CredentialsManager#requireLocalAuthentication}
- */
-
-/**
- * Use the `useAuth0` in your function components to access authentication state and methods.
- * @returns {Auth0ContextInterface} The useAuth0 hook interface
- * @example
- * const {
- *   // State
- *   error,
- *   user,
- *   isLoading,
- *   // Methods
- *   authorize,
- *   clearSession,
- *   getCredentials,
- *   clearCredentials,
- *   requireLocalAuthentication
- * } = useAuth0();
- */
-const useAuth0 = () => useContext(Auth0Context);
-
-export default useAuth0;
-
-
-
-
- -
- -
- Generated by JSDoc 3.6.11 on - Thu Jun 15 2023 22:57:24 GMT+0530 (India Standard Time) using the Minami - theme. -
- - - - - diff --git a/docs/index.html b/docs/index.html index 59cc669c..c2889967 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,262 +1,82 @@ - + - - Home - Documentation - - - - - - - + + react-native-auth0 + + + + + + - - - - - - - -
-
-
+ +
+
+ + +
+
+
+
+
+

react-native-auth0

+
+

Build Status • ❓ Feedback

-

Documentation

+ +

Documentation

-

Important Notices

-

- Version 2.9.0 introduced a - breaking change to the Android configuration. - Previously it was required to add an intent filter in the definition - of the Activity that receives the authentication result, and to use - the singleTask launchMode in that - activity. Now both the intent filter and the launch mode - must be removed and instead you need to add a - couple of manifest placeholders. Check out the - Android section for more details. -

-

Getting Started

-

Requirements

+ +

Getting Started

+ +

Requirements

This SDK targets apps that are using React Native SDK version - 0.60.5 and up. If you're using an older React Native - version, see the compatibility matrix below. + 0.60.5 and up. If you're using an older React + Native version, see the compatibility matrix below.

-

Compatibility Matrix

+ +

+ Platform compatibility +

- This SDK attempts to follow - semver in a best-effort basis, but - React Native is still making releases that eventually include - breaking changes on it making this approach difficult for any React - Native library module. Use the table below to find the version that - best suites your application. + The following shows platform minimums for running projects with this + SDK:

- - + + - - - - - - - - - - + + - - + +
React Native SDKAuth0 SDKPlatformMinimum version
v0.65.0v2.11.0
v0.62.2v2.5.0
v0.60.5v2.0.0iOS13.0
v0.59.0 or lowerv1.6.0Android28
-

- The contents of previous release can be found on the - branch v1. -

-

Installation

+ +

Installation

First install the native library module:

-

With npm

+ +

+ With npm +

$ npm install react-native-auth0 --save

-

With Yarn

+ +

+ With Yarn +

$ yarn add react-native-auth0

Then, you need to run the following command to install the ios app pods with Cocoapods. That will auto-link the iOS library:

$ cd ios && pod install

-

Configure the SDK

+ +

Configure the SDK

You need make your Android, iOS or Expo applications aware that an authentication result will be received from the browser. This SDK - makes use of the Android's Package Name and its analogous iOS's - Product Bundle Identifier to generate the redirect URL. Each - platform has its own set of instructions. + makes use of the Android's Package Name and its analogous + iOS's Product Bundle Identifier to generate the redirect URL. + Each platform has its own set of instructions.

-

Android

+ +

Android

Before version 2.9.0, this SDK required you to add an intent - filter to the Activity on which you're going to receive the + filter to the Activity on which you're going to receive the authentication result, and to use the singleTask launchMode in that activity. To migrate your app to version 2.9.0+, remove both and continue with @@ -446,30 +255,19 @@

Android

- Open your app's build.gradle file (typically at + Open your app's build.gradle file (typically at android/app/build.gradle) and add the following manifest placeholders:

-
android {
-    defaultConfig {
-        // Add the next line
-        manifestPlaceholders = [auth0Domain: "YOUR_AUTH0_DOMAIN", auth0Scheme: "${applicationId}"]
-    }
-    ...
-}
-
+
android {
defaultConfig {
// Add the next line
manifestPlaceholders = [auth0Domain: "YOUR_AUTH0_DOMAIN", auth0Scheme: "${applicationId}.auth0"]
}
...
} +

The auth0Domain value must be replaced with your Auth0 - domain value. So if you have samples.auth0.com as your - Auth0 domain you would have a configuration like the following: + domain value. So if you have samples.us.auth0.com as + your Auth0 domain you would have a configuration like the following:

-
android {
-    defaultConfig {
-        manifestPlaceholders = [auth0Domain: "samples.auth0.com", auth0Scheme: "${applicationId}"]
-    }
-    ...
-}
-
+
android {
defaultConfig {
manifestPlaceholders = [auth0Domain: "samples.us.auth0.com", auth0Scheme: "${applicationId}.auth0"]
}
...
} +

The applicationId value will be auto-replaced at runtime with the package name or ID of your application (e.g. @@ -494,7 +292,7 @@

Android

authorize and clearSession methods.

- Take note of this value as you'll be requiring it to define the + Take note of this value as you'll be requiring it to define the callback URLs below.

@@ -506,104 +304,82 @@

Android

>.

-
Skipping the Web Authentication setup
+ +
+ Skipping the Web Authentication setup +

- If you don't plan to use Web Authentication, you will notice that - the compiler will still prompt you to provide the + If you don't plan to use Web Authentication, you will notice + that the compiler will still prompt you to provide the manifestPlaceholders values, since the RedirectActivity included in this library will require - them, and the Gradle tasks won't be able to run without them. + them, and the Gradle tasks won't be able to run without them.

Re-declare the activity manually with - tools:node="remove" in your app's Android + tools:node="remove" in your app's Android Manifest in order to make the manifest merger remove it from the final manifest file. Additionally, one more unused activity can be removed from the final APK by using the same process. A complete snippet to achieve this is:

-
<activity
-    android:name="com.auth0.react.AuthenticationActivity"
-    tools:node="remove"/>
-<!-- Optional: Remove RedirectActivity -->
-<activity
-    android:name="com.auth0.react.RedirectActivity"
-    tools:node="remove"/>
-
-

iOS

+
<activity
android:name="com.auth0.react.AuthenticationActivity"
tools:node="remove"/>
<!-- Optional: Remove RedirectActivity -->
<activity
android:name="com.auth0.react.RedirectActivity"
tools:node="remove"/> +
+ +

iOS

Inside the ios folder find the file AppDelegate.[swift|m] add the following to it:

-
#import <React/RCTLinkingManager.h>
-
-- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url
-            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
-{
-  return [RCTLinkingManager application:app openURL:url options:options];
-}
-
+
#import <React/RCTLinkingManager.h>

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
{
return [RCTLinkingManager application:app openURL:url options:options];
} +

Inside the ios folder open the Info.plist and locate the value for CFBundleIdentifier, e.g.

-
<key>CFBundleIdentifier</key>
-<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
-
+
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> +

and then below it register a URL type entry using the value of CFBundleIdentifier as the value for CFBundleURLSchemes:

-
<key>CFBundleURLTypes</key>
-<array>
-    <dict>
-        <key>CFBundleTypeRole</key>
-        <string>None</string>
-        <key>CFBundleURLName</key>
-        <string>auth0</string>
-        <key>CFBundleURLSchemes</key>
-        <array>
-            <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
-        </array>
-    </dict>
-</array>
-
+
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>None</string>
<key>CFBundleURLName</key>
<string>auth0</string>
<key>CFBundleURLSchemes</key>
<array>
<string>$(PRODUCT_BUNDLE_IDENTIFIER).auth0</string>
</array>
</dict>
</array> +

If your application is generated using the React Native CLI, the default value of $(PRODUCT_BUNDLE_IDENTIFIER) matches org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier). Take note of this value as you'll be requiring it to define the - callback URLs below. If desired, you can change its value using + >. Take note of this value as you'll be requiring it to define + the callback URLs below. If desired, you can change its value using XCode in the following way:

  • Open the ios/TestApp.xcodeproj file replacing - 'TestApp' with the name of your app or run + 'TestApp' with the name of your app or run xed ios from a Terminal.
  • - Open your project's or desired target's + Open your project's or desired target's Build Settings tab and on the search bar at the right type "Product Bundle Identifier".
  • Replace the Product Bundle Identifier value with - your desired application's bundle identifier name (e.g. + your desired application's bundle identifier name (e.g. com.example.app).
  • - If you've changed the project wide settings, make sure the same - were applied to each of the targets your app has. + If you've changed the project wide settings, make sure the + same were applied to each of the targets your app has.

@@ -623,7 +399,8 @@

iOS

>.

-

Expo

+ +

Expo

:warning: This SDK is not compatible with "Expo Go" app @@ -640,21 +417,8 @@

Expo

>. To do this, add the following snippet to app.json or app.config.js:

-
{
-  "expo": {
-    ...
-    "plugins": [
-      [
-        "react-native-auth0",
-        {
-          "domain": "YOUR_AUTH0_DOMAIN",
-          "customScheme": "YOUR_CUSTOM_SCHEME"
-        }
-      ]
-    ]
-  }
-}
-
+
{
"expo": {
...
"plugins": [
[
"react-native-auth0",
{
"domain": "YOUR_AUTH0_DOMAIN",
"customScheme": "YOUR_CUSTOM_SCHEME"
}
]
]
}
} +
@@ -675,13 +439,12 @@

Expo

@@ -690,15 +453,17 @@

Expo

Now you can run the application using expo run:android or expo run:ios.

-

Callback URL(s)

+ +

Callback URL(s)

Callback URLs are the URLs that Auth0 invokes after the authentication process. Auth0 routes your application back to this URL and appends additional parameters to it, including a token. Since callback URLs can be manipulated, you will need to add this - URL to your Application's Allowed Callback URLs for - security. This will enable Auth0 to recognize these URLs as valid. - If omitted, authentication will not be successful. + URL to your Application's + Allowed Callback URLs for security. This will + enable Auth0 to recognize these URLs as valid. If omitted, + authentication will not be successful.

On the Android platform this URL is case-sensitive. Because of that, @@ -721,33 +486,31 @@

Callback URL(s)

If in addition you plan to use the log out method, you must also add these URLs to the Allowed Logout URLs.

-

Android

-
{APP_PACKAGE_NAME_OR_CUSTOM_SCHEME}://{AUTH0_DOMAIN}/android/{APP_PACKAGE_NAME}/callback
-
+ +

Android

+
{YOUR_APP_PACKAGE_NAME}.auth0://{AUTH0_DOMAIN}/android/{YOUR_APP_PACKAGE_NAME}/callback
+

- Make sure to replace {APP_PACKAGE_NAME_OR_CUSTOM_SCHEME} and - {AUTH0_DOMAIN} with the actual values for your application. The - {APP_PACKAGE_NAME_OR_CUSTOM_SCHEME} value provided should be all - lower case. + Make sure to replace {YOUR_APP_PACKAGE_NAME} and {AUTH0_DOMAIN} + with the actual values for your application. The + {YOUR_APP_PACKAGE_NAME} value provided should be all lower case.

-

iOS

-
{BUNDLE_IDENTIFIER_OR_CUSTOM_SCHEME}://{AUTH0_DOMAIN}/ios/{BUNDLE_IDENTIFIER}/callback
-
+ +

iOS

+
{PRODUCT_BUNDLE_IDENTIFIER}.auth0://{AUTH0_DOMAIN}/ios/{PRODUCT_BUNDLE_IDENTIFIER}/callback
+

- Make sure to replace {BUNDLE_IDENTIFIER_OR_CUSTOM_SCHEME} and + Make sure to replace {PRODUCT_BUNDLE_IDENTIFIER} and {AUTH0_DOMAIN} with the actual values for your application. The - {BUNDLE_IDENTIFIER_OR_CUSTOM_SCHEME} value provided should be all - lower case. + {PRODUCT_BUNDLE_IDENTIFIER} value provided should be all lower + case.

-

Next Steps

+ +

Next Steps

This SDK is OIDC compliant. To ensure OIDC compliant responses @@ -761,7 +524,8 @@

Next Steps

>.

-

Web Authentication

+ +

Web Authentication

The SDK exports a React hook as the primary interface for performing web authentication through the @@ -789,45 +553,27 @@

Web Authentication

clientId values as given to you when setting up your Auth0 app in the dashboard:

-
import {Auth0Provider} from 'react-native-auth0';
-
-const App = () => {
-  return (
-    <Auth0Provider domain="YOUR_AUTH0_DOMAIN" clientId="YOUR_AUTH0_CLIENT_ID">
-      {/* YOUR APP */}
-    </Auth0Provider>
-  );
-};
-
-export default App;
-
+
import { Auth0Provider } from 'react-native-auth0';

const App = () => {
return (
<Auth0Provider domain="YOUR_AUTH0_DOMAIN" clientId="YOUR_AUTH0_CLIENT_ID">
{/* YOUR APP */}
</Auth0Provider>
);
};

export default App; +
Using the `Auth0` class +

- If you're not using React Hooks, you can simply instantiate the - Auth0 class: + If you're not using React Hooks, you can simply instantiate + the Auth0 class:

-
import Auth0 from 'react-native-auth0';
-
-const auth0 = new Auth0({
-  domain: 'YOUR_AUTH0_DOMAIN',
-  clientId: 'YOUR_AUTH0_CLIENT_ID',
-});
-
+
import Auth0 from 'react-native-auth0';

const auth0 = new Auth0({
domain: 'YOUR_AUTH0_DOMAIN',
clientId: 'YOUR_AUTH0_CLIENT_ID',
}); +
+

Then import the hook into a component where you want to get access to the properties and methods for integrating with Auth0:

-
import {useAuth0} from 'react-native-auth0';
-
-

Login

+
import { useAuth0 } from 'react-native-auth0';
+
+ +

Login

Use the authorize method to redirect the user to the Auth0 @@ -835,7 +581,8 @@

Login

href="https://auth0.com/docs/authenticate/login/auth0-universal-login" >Universal Login - page for authentication. + page for authentication. If scope is not specified, + openid profile email is used by default.

  • @@ -851,40 +598,15 @@

    Login

    The error property is populated if any error occurs.
-
const Component = () => {
-  const {authorize, user, isLoading, error} = useAuth0();
-
-  const login = async () => {
-    await authorize({scope: 'openid profile email'}); // authorize({scope: 'openid profile email'}, {customScheme: 'CUSTOM_SCHEME'}) when using Expo or a custom scheme
-  };
-
-  if(isLoading) {
-    return (
-      <View>
-        <Text>SDK is Loading</Text>
-      </View>
-    )
-  }
-
-  return (
-    <View>
-      {!user && <Button onPress={login} title="Log in" />}
-      {user && <Text>Logged in as {user.name}</Text>}
-      {error && <Text>{error.message}</Text>}
-    </View>
-  );
-};
-
+
const Component = () => {
const { authorize, user, isLoading, error } = useAuth0();

const login = async () => {
await authorize(); // authorize({}, {customScheme: 'CUSTOM_SCHEME'}) when using Expo or a custom scheme
};

if (isLoading) {
return (
<View>
<Text>SDK is Loading</Text>
</View>
);
}

return (
<View>
{!user && <Button onPress={login} title="Log in" />}
{user && <Text>Logged in as {user.name}</Text>}
{error && <Text>{error.message}</Text>}
</View>
);
}; +
Using the `Auth0` class -
auth0.webAuth
-  .authorize({scope: 'openid email profile'})
-  .then(credentials => console.log(credentials))
-  .catch(error => console.log(error));
-
+ +
auth0.webAuth
.authorize()
.then(credentials => console.log(credentials))
.catch(error => console.log(error)); +
+

Web Authentication flows require a Browser application installed @@ -893,7 +615,8 @@

Login

provided callback.

-
SSO Alert Box (iOS)
+ +
SSO Alert Box (iOS)

ios-sso-alert

Check the FAQ for more information about the @@ -909,31 +632,23 @@

SSO Alert Box (iOS)
for a detailed overview of Single Sign-On (SSO) on iOS.

-

Logout

+ +

Logout

Log the user out by using the clearSession method from the useAuth0 hook.

-
const Component = () => {
-  const {clearSession, user} = useAuth0();
-
-  const logout = async () => {
-    await clearSession(); // clearSession({customScheme: 'CUSTOM_SCHEME'}) when using Expo or a custom scheme
-  };
-
-  return <View>{user && <Button onPress={logout} title="Log out" />}</View>;
-};
-
+
const Component = () => {
const { clearSession, user } = useAuth0();

const logout = async () => {
await clearSession(); // clearSession({}, { customScheme: 'CUSTOM_SCHEME' }) when using Expo or a custom scheme
};

return <View>{user && <Button onPress={logout} title="Log out" />}</View>;
}; +
Using the `Auth0` class -
auth0.webAuth.clearSession().catch(error => console.log(error));
-
+ +
auth0.webAuth.clearSession().catch((error) => console.log(error));
+
-

Credentials Manager

+ + +

Credentials Manager

The Credentials Manager allows you to securely store and retrieve - the user's credentials. The credentials will be stored encrypted in - Shared Preferences on Android, and in the Keychain on iOS. + the user's credentials. The credentials will be stored encrypted + in Shared Preferences on Android, and in the Keychain on iOS.

The Auth0 class exposes the @@ -964,29 +679,31 @@

Credentials Manager

- 💡 If you're using Web Auth (authorize) through + 💡 If you're using Web Auth (authorize) through Hooks, you do not need to manually store the credentials after login and delete them after logout; the SDK does this automatically.

-

Check for stored credentials

+
+

+ Check for stored credentials +

When the users open your app, check for valid credentials. If they - exist, you can retrieve them and redirect the users to the app's + exist, you can retrieve them and redirect the users to the app's main flow without any additional login steps.

-
const isLoggedIn = await auth0.credentialsManager.hasValidCredentials();
-
-if (isLoggedIn) {
-  // Retrieve credentials and redirect to the main flow
-} else {
-  // Redirect to the login page
-}
-
-

Retrieve stored credentials

+
const isLoggedIn = await auth0.credentialsManager.hasValidCredentials();

if (isLoggedIn) {
// Retrieve credentials and redirect to the main flow
} else {
// Redirect to the login page
} +
+ +

+ Retrieve stored credentials +

The credentials will be automatically renewed using the Retrieve stored credentials >, if the access token has expired. This method is thread safe.

-
const credentials = await auth0.credentialsManager.getCredentials();
-
+
const credentials = await auth0.credentialsManager.getCredentials();
+

💡 You do not need to call credentialsManager.saveCredentials() @@ -1005,17 +720,16 @@

Retrieve stored credentials

renewed credentials.

-

Local authentication

+
+

Local authentication

You can enable an additional level of user authentication before retrieving credentials using the local authentication supported by the device, for example PIN or fingerprint on Android, and Face ID or Touch ID on iOS.

-
await auth0.credentialsManager.requireLocalAuthentication();
-
+
await auth0.credentialsManager.requireLocalAuthentication();
+

Check the Local authentication iOS. Local Authentication is not available in simulators.

-

Credentials Manager errors

+
+

+ Credentials Manager errors +

The Credentials Manager will only throw CredentialsManagerError exceptions. You can find more information in the details property of the exception.

-
try {
-  const credentials = await auth0.credentialsManager.getCredentials();
-} catch (error) {
-  console.log(error);
-}
-
-

Feedback

-

Contributing

+
try {
const credentials = await auth0.credentialsManager.getCredentials();
} catch (error) {
console.log(error);
} +
+ +

Feedback

+ +

Contributing

We appreciate feedback and contribution to this repo! Before you get started, please see the following: @@ -1052,25 +769,31 @@

Contributing

  • Auth0's general contribution guidelinesAuth0's general contribution guidelines
  • Auth0's code of conduct guidelinesAuth0's code of conduct guidelines
  • -
  • This repo's development guide
  • +
  • + This repo's development guide +
  • -

    Raise an issue

    + +

    Raise an issue

    To provide feedback or report a bug, please raise an issue on our issue tracker.

    -

    Vulnerability Reporting

    + +

    + Vulnerability Reporting +

    Please do not report security vulnerabilities on the public Github issue tracker. The @@ -1117,22 +840,465 @@

    Vulnerability Reporting

    > file for more info.

    + - - + + +
    + + +
    - -
    - -
    - Generated by JSDoc 3.6.11 on - Thu Jun 15 2023 22:57:24 GMT+0530 (India Standard Time) using the Minami - theme. -
    - - - +
    +

    + Generated using + TypeDoc +

    +
    +
    diff --git a/docs/interfaces/Types.Auth0ContextInterface.html b/docs/interfaces/Types.Auth0ContextInterface.html new file mode 100644 index 00000000..d8b1423f --- /dev/null +++ b/docs/interfaces/Types.Auth0ContextInterface.html @@ -0,0 +1,2811 @@ + + + + + + Auth0ContextInterface | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface Auth0ContextInterface<TUser>

    +
    +
    +

    Type Parameters

    +
      +
    • +

      + TUser extends User + = + User +

      +
    • +
    +
    +
    +

    Hierarchy

    +
      +
    • + AuthState<TUser> +
        +
      • Auth0ContextInterface
      • +
      +
    • +
    +
    + +
    +
    +
    + + + + +
    +
    +
    +
    +

    Properties

    +
    + + +
    + authorize: + ((parameters, + options) => Promise<undefined | Credentials>) +
    +
    +

    Type declaration

    +
      +
    • +
        +
      • + (parameters, + options): Promise<undefined | Credentials> +
      • +
      • +
        +

        + Authorize the user using Auth0 Universal Login. See + authorize +

        +
        +
        +

        Parameters

        +
          +
        • +
          + parameters: + WebAuthorizeParameters +
          +
          +

          + The parameters that are sent to the + /authorize endpoint. +

          +
          +
          +
        • +
        • +
          + options: + WebAuthorizeOptions +
          +
          +

          + Options for customizing the SDK's handling + of the authorize call +

          +
          +
          +
        • +
        +
        +

        + Returns Promise<undefined | Credentials> +

        +
        +
      • +
      +
    • +
    +
    + +
    +
    + + +
    + authorizeWithEmail: + ((parameters) => Promise<undefined | Credentials>) +
    +
    +

    Type declaration

    + +
    + +
    +
    + + +
    + authorizeWithOOB: + ((parameters) => Promise<undefined | Credentials>) +
    +
    +

    Type declaration

    +
      +
    • +
        +
      • + (parameters): Promise<undefined | Credentials> +
      • +
      • +
        +

        + Authorize the user using an Out Of Band authentication + code. See + loginWithOOB +

        +
        +
        +

        Parameters

        + +
        +

        + Returns Promise<undefined | Credentials> +

        +
        +
      • +
      +
    • +
    +
    + +
    +
    + + +
    + authorizeWithOTP: + ((parameters) => Promise<undefined | Credentials>) +
    +
    +

    Type declaration

    + +
    + +
    +
    + + +
    + authorizeWithRecoveryCode: + ((parameters) => Promise<undefined | Credentials>) +
    +
    +

    Type declaration

    + +
    + +
    +
    + + +
    + authorizeWithSMS: + ((parameters) => Promise<undefined | Credentials>) +
    +
    +

    Type declaration

    + +
    + +
    +
    + + +
    + clearCredentials: + (() => Promise<void>) +
    +
    +

    Type declaration

    +
      +
    • +
        +
      • + (): Promise<void> +
      • +
      • +
        +

        + Clears the user's credentials without clearing + their web session and logs them out. +

        +
        +

        + Returns Promise<void> +

        +
        +
      • +
      +
    • +
    +
    + +
    +
    + + +
    + clearSession: + ((parameters, + options) => Promise<void>) +
    +
    +

    Type declaration

    +
      +
    • +
        +
      • + (parameters, + options): Promise<void> +
      • +
      • +
        +

        + Clears the user's web session, credentials and + logs them out. See + clearSession +

        +
        +
        +

        Parameters

        +
          +
        • +
          + parameters: + ClearSessionParameters +
          +
          +

          + Additional parameters to send to the Auth0 + logout endpoint. +

          +
          +
          +
        • +
        • +
          + options: + ClearSessionOptions +
          +
          +

          + Options for configuring the SDK's clear + session behaviour. +

          +
          +
          +
        • +
        +
        +

        + Returns Promise<void> +

        +
        +
      • +
      +
    • +
    +
    + +
    +
    + + +
    + error: + null | Error +
    +
    +

    An object representing the last exception

    +
    +
    + +
    +
    + + +
    + getCredentials: + ((scope?, + minTtl?, + parameters?, + forceRefresh?) => Promise<undefined | Credentials>) +
    +
    +

    Type declaration

    +
      +
    • +
        +
      • + (scope?, + minTtl?, + parameters?, + forceRefresh?): Promise<undefined | Credentials> +
      • +
      • +
        +

        + Gets the user's credentials from the native + credential store. If credentials have expired, they + are automatically refreshed by default. See + getCredentials +

        +
        +
        +

        Parameters

        +
          +
        • +
          + Optional + scope: + string +
          +
          +

          The scopes used to get the credentials

          +
          +
          +
        • +
        • +
          + Optional + minTtl: + number +
          +
          +

          + The minimum time in seconds that the access + token should last before expiration +

          +
          +
          +
        • +
        • +
          + Optional + parameters: Record<string, unknown> +
          +
          +

          + Any additional parameters to send in the request + to refresh expired credentials. +

          +
          +
          +
        • +
        • +
          + Optional + forceRefresh: boolean +
          +
          +

          + If true, credentials are always + refreshed regardless of their expiry, provided a + valid refresh token is available. +

          +
          +
          +
        • +
        +
        +

        + Returns Promise<undefined | Credentials> +

        +
        +
      • +
      +
    • +
    +
    + +
    +
    + + +
    + hasValidCredentials: + ((minTtl) => Promise<boolean>) +
    +
    +

    Type declaration

    +
      +
    • +
        +
      • + (minTtl): Promise<boolean> +
      • +
      • +
        +

        + Whether the SDK currently holds valid, unexpired + credentials. +

        +
        +
        +

        Parameters

        +
          +
        • +
          + minTtl: + number +
          +
          +

          + The minimum time in seconds that the access + token should last before expiration +

          +
          +
          +
        • +
        +
        +

        + Returns Promise<boolean> +

        +

        + true if there are valid credentials. + Otherwise, false. +

        + +
        +
      • +
      +
    • +
    +
    + +
    +
    + + +
    + isLoading: + boolean +
    +
    +

    + A flag that is true until the state knows that a user is either + logged in or not +

    +
    +
    + +
    +
    + + +
    + requireLocalAuthentication: + ((title?, + description?, + cancelTitle?, + fallbackTitle?, + strategy?) => Promise<void>) +
    +
    +

    Type declaration

    +
      +
    • +
        +
      • + (title?, + description?, + cancelTitle?, + fallbackTitle?, + strategy?): Promise<void> +
      • +
      • +
        +

        + Enables Local Authentication (PIN, Biometric, Swipe + etc) to get the credentials. See + requireLocalAuthentication +

        +
        +
        +

        Parameters

        +
          +
        • +
          + Optional + title: + string +
          +
          +

          + the text to use as title in the authentication + screen. Passing null will result in using the + OS's default value in Android and + "Please authenticate to continue" in + iOS. +

          +
          +
          +
        • +
        • +
          + Optional + description: string +
          +
          +

          + Android only: the text to use + as description in the authentication screen. On + some Android versions it might not be shown. + Passing null will result in using the OS's + default value. +

          +
          +
          +
        • +
        • +
          + Optional + cancelTitle: string +
          +
          +

          + iOS only: the cancel message to + display on the local authentication prompt. +

          +
          +
          +
        • +
        • +
          + Optional + fallbackTitle: string +
          +
          +

          + iOS only: the fallback message + to display on the local authentication prompt + after a failed match. +

          +
          +
          +
        • +
        • +
          + Optional + strategy: + LocalAuthenticationStrategy +
          +
          +

          + iOS only: the evaluation policy + to use when accessing the credentials. Defaults + to + LocalAuthenticationStrategy.deviceOwnerWithBiometrics. +

          +
          +
          +
        • +
        +
        +

        + Returns Promise<void> +

        +
        +
      • +
      +
    • +
    +
    + +
    +
    + + +
    + sendEmailCode: + ((parameters) => Promise<void>) +
    +
    +

    Type declaration

    + +
    + +
    +
    + + +
    + sendMultifactorChallenge: + ((parameters) => Promise<void>) +
    +
    +

    Type declaration

    +
      +
    • + +
    • +
    +
    + +
    +
    + + +
    + sendSMSCode: + ((parameters) => Promise<void>) +
    +
    +

    Type declaration

    +
      +
    • + +
    • +
    +
    + +
    +
    + + +
    + user: + null | TUser +
    +
    +

    + The user profile as decoded from the ID token after + authentication +

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.AuthState.html b/docs/interfaces/Types.AuthState.html new file mode 100644 index 00000000..df726dbd --- /dev/null +++ b/docs/interfaces/Types.AuthState.html @@ -0,0 +1,948 @@ + + + + + + AuthState | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface AuthState<TUser>

    +
    +
    +

    Type Parameters

    +
      +
    • +

      + TUser extends User + = + User +

      +
    • +
    +
    +
    +

    Hierarchy

    + +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + error: + null | Error +
    +
    +

    An object representing the last exception

    +
    +
    + +
    +
    + + +
    + isLoading: + boolean +
    +
    +

    + A flag that is true until the state knows that a user is either + logged in or not +

    +
    +
    + +
    +
    + + +
    + user: + null | TUser +
    +
    +

    + The user profile as decoded from the ID token after + authentication +

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.AuthorizeUrlOptions.html b/docs/interfaces/Types.AuthorizeUrlOptions.html new file mode 100644 index 00000000..63f6e3a1 --- /dev/null +++ b/docs/interfaces/Types.AuthorizeUrlOptions.html @@ -0,0 +1,930 @@ + + + + + + AuthorizeUrlOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface AuthorizeUrlOptions

    +
    +
    +
    +

    Options for building a URL for /authorize

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • AuthorizeUrlOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + redirectUri: + object +
    +
    +

    + Where the authorization server will redirect back after success + or failure. +

    +
    +
    + +
    +
    + + +
    + responseType: + string +
    +
    +

    The response_type value

    +
    +
    + +
    +
    + + +
    + state: + object +
    +
    +

    Random string to prevent CSRF attacks.

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.ClearSessionOptions.html b/docs/interfaces/Types.ClearSessionOptions.html new file mode 100644 index 00000000..7f739c6a --- /dev/null +++ b/docs/interfaces/Types.ClearSessionOptions.html @@ -0,0 +1,881 @@ + + + + + + ClearSessionOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface ClearSessionOptions

    +
    +
    +
    +

    + Options for configuring the SDK's clear session behaviour. +

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • ClearSessionOptions
    • +
    +
    + +
    +
    +
    + + + + +
    +
    +
    +
    +

    Properties

    +
    + + +
    + customScheme?: + string +
    +
    +

    + Android only: Custom scheme to build the + callback URL with. +

    +
    +
    + +
    +
    + + +
    + useLegacyCallbackUrl?: + boolean +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.ClearSessionParameters.html b/docs/interfaces/Types.ClearSessionParameters.html new file mode 100644 index 00000000..58ee5566 --- /dev/null +++ b/docs/interfaces/Types.ClearSessionParameters.html @@ -0,0 +1,848 @@ + + + + + + ClearSessionParameters | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface ClearSessionParameters

    +
    +
    +
    +

    Parameters for sending to the Auth0 logout endpoint.

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • ClearSessionParameters
    • +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + federated?: + boolean +
    +
    +

    + If true, the user will be signed out of any + connected identity providers in addition to their Auth0 session. +

    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.CreateUserOptions.html b/docs/interfaces/Types.CreateUserOptions.html new file mode 100644 index 00000000..de1ffa0e --- /dev/null +++ b/docs/interfaces/Types.CreateUserOptions.html @@ -0,0 +1,1255 @@ + + + + + + CreateUserOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface CreateUserOptions

    +
    +
    +
    +

    Options for creating a new user.

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • CreateUserOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + + +
    +
    +
    +
    +

    Properties

    +
    + + +
    + connection: + string +
    +
    +

    + The name of the database connection where to create the user +

    +
    +
    + +
    +
    + + +
    + email: + string +
    +
    +

    The user's email

    +
    +
    + +
    +
    + + +
    + family_name?: + string +
    +
    +

    The user's family name(s)

    +
    +
    + +
    +
    + + +
    + given_name?: + string +
    +
    +

    The user's given name(s)

    +
    +
    + +
    +
    + + +
    + metadata?: + string +
    +
    +

    + Additional information that will be stored in + user_metadata +

    +
    +
    + +
    +
    + + +
    + name?: + string +
    +
    +

    The user's full name

    +
    +
    + +
    +
    + + +
    + nickname?: + string +
    +
    +

    The user's nickname

    +
    +
    + +
    +
    + + +
    + password: + string +
    +
    +

    The user's password

    +
    +
    + +
    +
    + + +
    + picture?: + string +
    +
    +

    A URL pointing to the user's picture

    +
    +
    + +
    +
    + + +
    + username?: + string +
    +
    +

    The user's username

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.ExchangeNativeSocialOptions.html b/docs/interfaces/Types.ExchangeNativeSocialOptions.html new file mode 100644 index 00000000..236e15be --- /dev/null +++ b/docs/interfaces/Types.ExchangeNativeSocialOptions.html @@ -0,0 +1,1041 @@ + + + + + + ExchangeNativeSocialOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface ExchangeNativeSocialOptions

    +
    +
    +
    +

    + Options for obtaining user tokens from an external provider's + token +

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • ExchangeNativeSocialOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + + +
    +
    +
    +
    +

    Properties

    +
    + + +
    + audience?: + string +
    +
    +

    The API audience to request

    +
    +
    + +
    +
    + + +
    + scope?: + string +
    +
    +

    + The scopes requested for the issued tokens. e.g. + openid profile +

    +
    +
    + +
    +
    + + +
    + subjectToken: + string +
    +
    +

    + The token returned by the native social authentication solution +

    +
    +
    + +
    +
    + + +
    + subjectTokenType: + string +
    +
    +

    + The identifier that indicates the native social authentication + solution +

    +
    +
    + +
    +
    + + +
    + userProfile?: + object +
    +
    +

    + Additional profile attributes to set or override, only on select + native social authentication solutions +

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.ExchangeOptions.html b/docs/interfaces/Types.ExchangeOptions.html new file mode 100644 index 00000000..21e45864 --- /dev/null +++ b/docs/interfaces/Types.ExchangeOptions.html @@ -0,0 +1,934 @@ + + + + + + ExchangeOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface ExchangeOptions

    +
    +
    +
    +

    + Options for the /oauth/token endpoint to exchange a + code for an access token +

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • ExchangeOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + code: + string +
    +
    +

    The code returned by /authorize.

    +
    +
    + +
    +
    + + +
    + redirectUri: + string +
    +
    +

    + The original redirectUri used when calling + /authorize. +

    +
    +
    + +
    +
    + + +
    + verifier: + string +
    +
    +

    + The value used to generate the code challenge sent to + /authorize. +

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.GetUserOptions.html b/docs/interfaces/Types.GetUserOptions.html new file mode 100644 index 00000000..4cadedb3 --- /dev/null +++ b/docs/interfaces/Types.GetUserOptions.html @@ -0,0 +1,823 @@ + + + + + + GetUserOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface GetUserOptions

    +
    +
    +

    Hierarchy

    +
      +
    • GetUserOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + id: + string +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.LoginWithEmailOptions.html b/docs/interfaces/Types.LoginWithEmailOptions.html new file mode 100644 index 00000000..9a3fe0b5 --- /dev/null +++ b/docs/interfaces/Types.LoginWithEmailOptions.html @@ -0,0 +1,976 @@ + + + + + + LoginWithEmailOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface LoginWithEmailOptions

    +
    +
    +
    +

    + The options for completing the passwordless login with email + request +

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • LoginWithEmailOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + audience?: + string +
    +
    +

    The API audience to request

    +
    +
    + +
    +
    + + +
    + code: + string +
    +
    +

    The code numeric value (OTP)

    +
    +
    + +
    +
    + + +
    + email: + string +
    +
    +

    The email where the link/code was received

    +
    +
    + +
    +
    + + +
    + scope?: + string +
    +
    +

    The scopes to request

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.LoginWithOOBOptions.html b/docs/interfaces/Types.LoginWithOOBOptions.html new file mode 100644 index 00000000..d0c3a813 --- /dev/null +++ b/docs/interfaces/Types.LoginWithOOBOptions.html @@ -0,0 +1,933 @@ + + + + + + LoginWithOOBOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface LoginWithOOBOptions

    +
    +
    +
    +

    Options for logging in using an OOB code

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • LoginWithOOBOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + bindingCode?: + string +
    +
    +

    + The code used to bind the side channel (used to deliver the + challenge) with the main channel you are using to authenticate. + This is usually an OTP-like code delivered as part of the + challenge message. +

    +
    +
    + +
    +
    + + +
    + mfaToken: + string +
    +
    +

    The token received in the previous login response

    +
    +
    + +
    +
    + + +
    + oobCode: + string +
    +
    +

    The out of band code received in the challenge response.

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.LoginWithOTPOptions.html b/docs/interfaces/Types.LoginWithOTPOptions.html new file mode 100644 index 00000000..53a2c7e3 --- /dev/null +++ b/docs/interfaces/Types.LoginWithOTPOptions.html @@ -0,0 +1,932 @@ + + + + + + LoginWithOTPOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface LoginWithOTPOptions

    +
    +
    +
    +

    Options for logging in using an OTP code

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • LoginWithOTPOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + audience?: + string +
    +
    +

    The API audience

    +
    +
    + +
    +
    + + +
    + mfaToken: + string +
    +
    +

    The token received in the previous login response

    +
    +
    + +
    +
    + + +
    + otp: + string +
    +
    +

    + The one time password code provided by the resource owner, + typically obtained from an MFA application such as Google + Authenticator or Guardian. +

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.LoginWithRecoveryCodeOptions.html b/docs/interfaces/Types.LoginWithRecoveryCodeOptions.html new file mode 100644 index 00000000..2502ecf0 --- /dev/null +++ b/docs/interfaces/Types.LoginWithRecoveryCodeOptions.html @@ -0,0 +1,888 @@ + + + + + + LoginWithRecoveryCodeOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface LoginWithRecoveryCodeOptions

    +
    +
    +
    +

    Options for logging in using a recovery code

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • LoginWithRecoveryCodeOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + mfaToken: + string +
    +
    +

    The token received in the previous login response

    +
    +
    + +
    +
    + + +
    + recoveryCode: + string +
    +
    +

    The recovery code provided by the end-user.

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.LoginWithSMSOptions.html b/docs/interfaces/Types.LoginWithSMSOptions.html new file mode 100644 index 00000000..1851403b --- /dev/null +++ b/docs/interfaces/Types.LoginWithSMSOptions.html @@ -0,0 +1,974 @@ + + + + + + LoginWithSMSOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface LoginWithSMSOptions

    +
    +
    +
    +

    + The options for completing the passwordless login with SMS request +

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • LoginWithSMSOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + audience?: + string +
    +
    +

    Optional API audience to request

    +
    +
    + +
    +
    + + +
    + code: + string +
    +
    +

    The code numeric value (OTP)

    +
    +
    + +
    +
    + + +
    + phoneNumber: + string +
    +
    +

    The phone number where the code was received

    +
    +
    + +
    +
    + + +
    + scope?: + string +
    +
    +

    Optional scopes to request

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.LogoutUrlOptions.html b/docs/interfaces/Types.LogoutUrlOptions.html new file mode 100644 index 00000000..241b68db --- /dev/null +++ b/docs/interfaces/Types.LogoutUrlOptions.html @@ -0,0 +1,937 @@ + + + + + + LogoutUrlOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface LogoutUrlOptions

    +
    +
    +
    +

    Options for the logout endpoint

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • LogoutUrlOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + clientId?: + string +
    +
    +

    The client identifier of the one requesting the logout

    +
    +
    + +
    +
    + + +
    + federated?: + boolean +
    +
    +

    + Whether the logout should include removing session for federated + IdP. +

    +
    +
    + +
    +
    + + +
    + returnTo?: + string +
    +
    +

    + URL where the user is redirected to after logout. It must be + declared in you Auth0 Dashboard +

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.MultifactorChallengeOptions.html b/docs/interfaces/Types.MultifactorChallengeOptions.html new file mode 100644 index 00000000..3c747460 --- /dev/null +++ b/docs/interfaces/Types.MultifactorChallengeOptions.html @@ -0,0 +1,941 @@ + + + + + + MultifactorChallengeOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface MultifactorChallengeOptions

    +
    +
    +
    +

    Options for multifactor challenge.

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • MultifactorChallengeOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + + +
    +
    +
    +
    +

    Properties

    +
    + + +
    + authenticatorId?: + string +
    +
    +

    The ID of the authenticator to challenge.

    +
    +
    + +
    +
    + + +
    + challengeType?: + string +
    +
    +

    + A whitespace-separated list of the challenges types accepted by + your application. Accepted challenge types are oob or otp. + Excluding this parameter means that your client application + accepts all supported challenge types. +

    +
    +
    + +
    +
    + + +
    + mfaToken: + string +
    +
    +

    The token received in the previous login response

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.PasswordRealmOptions.html b/docs/interfaces/Types.PasswordRealmOptions.html new file mode 100644 index 00000000..52a64d18 --- /dev/null +++ b/docs/interfaces/Types.PasswordRealmOptions.html @@ -0,0 +1,1029 @@ + + + + + + PasswordRealmOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface PasswordRealmOptions

    +
    +
    +
    +

    + Options for authenticating using the username & password + grant. +

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • PasswordRealmOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + + +
    +
    +
    +
    +

    Properties

    +
    + + +
    + audience?: + string +
    +
    +

    + The identifier of Resource Server (RS) to be included as + audience (aud claim) of the issued access token +

    +
    +
    + +
    +
    + + +
    + password: + string +
    +
    +

    The user's password

    +
    +
    + +
    +
    + + +
    + realm: + string +
    +
    +

    The name of the Realm where to Auth (or connection name)

    +
    +
    + +
    +
    + + +
    + scope?: + string +
    +
    +

    + The scopes requested for the issued tokens. e.g. + openid profile +

    +
    +
    + +
    +
    + + +
    + username: + string +
    +
    +

    The user's username or email

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.PasswordlessWithEmailOptions.html b/docs/interfaces/Types.PasswordlessWithEmailOptions.html new file mode 100644 index 00000000..d94952c7 --- /dev/null +++ b/docs/interfaces/Types.PasswordlessWithEmailOptions.html @@ -0,0 +1,933 @@ + + + + + + PasswordlessWithEmailOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface PasswordlessWithEmailOptions

    +
    +
    +
    +

    Options for requesting passwordless login using email

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • PasswordlessWithEmailOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + authParams?: + string +
    +
    +

    Optional parameters, used when strategy is 'linḱ'

    +
    +
    + +
    +
    + + +
    + email: + string +
    +
    +

    The email to send the link/code to

    +
    +
    + +
    +
    + + +
    + send?: + string +
    +
    +

    + The passwordless strategy, either 'link' or + 'code' +

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.PasswordlessWithSMSOptions.html b/docs/interfaces/Types.PasswordlessWithSMSOptions.html new file mode 100644 index 00000000..64ac2a2e --- /dev/null +++ b/docs/interfaces/Types.PasswordlessWithSMSOptions.html @@ -0,0 +1,936 @@ + + + + + + PasswordlessWithSMSOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface PasswordlessWithSMSOptions

    +
    +
    +
    +

    Options for requesting passwordless login using SMS

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • PasswordlessWithSMSOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + authParams?: + string +
    +
    +

    Optional passwordless parameters

    +
    +
    + +
    +
    + + +
    + phoneNumber: + string +
    +
    +

    The phone number to send the link/code to

    +
    +
    + +
    +
    + + +
    + send?: + string +
    +
    +

    + The passwordless strategy, either 'link' or + 'code' +

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.PatchUserOptions.html b/docs/interfaces/Types.PatchUserOptions.html new file mode 100644 index 00000000..de697359 --- /dev/null +++ b/docs/interfaces/Types.PatchUserOptions.html @@ -0,0 +1,865 @@ + + + + + + PatchUserOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface PatchUserOptions

    +
    +
    +

    Hierarchy

    +
      +
    • PatchUserOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + id: + string +
    + +
    +
    + + +
    + metadata: + object +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.RefreshTokenOptions.html b/docs/interfaces/Types.RefreshTokenOptions.html new file mode 100644 index 00000000..2a3dc1ef --- /dev/null +++ b/docs/interfaces/Types.RefreshTokenOptions.html @@ -0,0 +1,885 @@ + + + + + + RefreshTokenOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface RefreshTokenOptions

    +
    +
    +
    +

    Refresh token parameters

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • RefreshTokenOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + refreshToken: + string +
    +
    +

    The issued refresh token

    +
    +
    + +
    +
    + + +
    + scope?: + string +
    +
    +

    + The scopes requested for the issued tokens. e.g. + openid profile +

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.ResetPasswordOptions.html b/docs/interfaces/Types.ResetPasswordOptions.html new file mode 100644 index 00000000..8edafef9 --- /dev/null +++ b/docs/interfaces/Types.ResetPasswordOptions.html @@ -0,0 +1,883 @@ + + + + + + ResetPasswordOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface ResetPasswordOptions

    +
    +
    +
    +

    Options for resetting a user's password.

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • ResetPasswordOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + connection: + string +
    +
    +

    The name of the database connection of the user

    +
    +
    + +
    +
    + + +
    + email: + string +
    +
    +

    The user's email

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.RevokeOptions.html b/docs/interfaces/Types.RevokeOptions.html new file mode 100644 index 00000000..61f957ed --- /dev/null +++ b/docs/interfaces/Types.RevokeOptions.html @@ -0,0 +1,836 @@ + + + + + + RevokeOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface RevokeOptions

    +
    +
    +
    +

    Options for the revoke refresh token endpoint.

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • RevokeOptions
    • +
    +
    +
    +

    Indexable

    +
    + [key: + string]: any +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + refreshToken: + string +
    +
    +

    The user's issued refresh token

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.UserInfoOptions.html b/docs/interfaces/Types.UserInfoOptions.html new file mode 100644 index 00000000..e550bab3 --- /dev/null +++ b/docs/interfaces/Types.UserInfoOptions.html @@ -0,0 +1,824 @@ + + + + + + UserInfoOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface UserInfoOptions

    +
    +
    +
    +

    Options for accessing the /userinfo endpoint.

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • UserInfoOptions
    • +
    +
    + +
    +
    +
    + + + +
    +
    +

    Properties

    + +
    +
    +
    +
    +
    +
    +

    Properties

    +
    + + +
    + token: + string +
    +
    +

    The user's access token

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.WebAuthorizeOptions.html b/docs/interfaces/Types.WebAuthorizeOptions.html new file mode 100644 index 00000000..38d5db67 --- /dev/null +++ b/docs/interfaces/Types.WebAuthorizeOptions.html @@ -0,0 +1,985 @@ + + + + + + WebAuthorizeOptions | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface WebAuthorizeOptions

    +
    +
    +
    +

    + Options for controlling the SDK's behaviour when calling the + /authorize endpoint. +

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • WebAuthorizeOptions
    • +
    +
    + +
    +
    +
    + + + + +
    +
    +
    +
    +

    Properties

    +
    + + +
    + customScheme?: + string +
    +
    +

    + Android only: Custom scheme to build the + callback URL with. +

    +
    +
    + +
    +
    + + +
    + ephemeralSession?: + boolean +
    +
    +

    + iOS only: Disable Single-Sign-On (SSO). It only + affects iOS with versions 13 and above. +

    +
    +
    +

    Default

    +

    false

    +
    + +
    +
    + + +
    + leeway?: + number +
    +
    +

    + The amount of leeway, in seconds, to accommodate potential clock + skew when validating an ID token's claims. +

    +
    +
    +

    Default

    +

    60 seconds.

    +
    + +
    +
    + + +
    + useLegacyCallbackUrl?: + boolean +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/interfaces/Types.WebAuthorizeParameters.html b/docs/interfaces/Types.WebAuthorizeParameters.html new file mode 100644 index 00000000..84667e0a --- /dev/null +++ b/docs/interfaces/Types.WebAuthorizeParameters.html @@ -0,0 +1,1243 @@ + + + + + + WebAuthorizeParameters | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Interface WebAuthorizeParameters

    +
    +
    +
    +

    + Parameters that are sent to a call to the + /authorize endpoint. +

    +
    +
    +
    +
    +

    Hierarchy

    +
      +
    • WebAuthorizeParameters
    • +
    +
    + +
    +
    +
    + + + + +
    +
    +
    +
    +

    Properties

    +
    + + +
    + additionalParameters?: + {
        [key: + string]: string;
    } +
    +
    +

    + Any additional arbitrary parameters to send along in the URL. +

    +
    +
    +

    Type declaration

    +
      +
    • +
      + [key: + string]: string +
      +
    • +
    +
    +
    + +
    +
    + + +
    + audience?: + string +
    +
    +

    + The intended API identifier that will be the consumer for the + issued access token. +

    +
    +
    + +
    +
    + + +
    + connection?: + string +
    +
    +

    The database connection in which to look for users.

    +
    +
    + +
    +
    + + +
    + invitationUrl?: + string +
    +
    +

    + The invitation URL for those users who have been invited to join + a specific organization. +

    +
    +
    + +
    +
    + + +
    + maxAge?: + number +
    +
    +

    + The maximum age in seconds that the resulting ID token should be + issued for. +

    +
    +
    + +
    +
    + + +
    + nonce?: + string +
    +
    +

    + One-time random value that is used to prevent replay attacks. +

    +
    +
    + +
    +
    + + +
    + organization?: + string +
    +
    +

    + The organization in which user's should be authenticated + into. +

    +
    +
    + +
    +
    + + +
    + scope?: + string +
    +
    +

    + The scopes requested for the issued tokens. e.g. + openid profile +

    +
    +
    + +
    +
    + + +
    + state?: + string +
    +
    +

    Random string to prevent CSRF attacks.

    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/management_users.js.html b/docs/management_users.js.html deleted file mode 100644 index 064bf979..00000000 --- a/docs/management_users.js.html +++ /dev/null @@ -1,386 +0,0 @@ - - - - - - management/users.js - Documentation - - - - - - - - - - - - - - - - -
    -

    management/users.js

    - -
    -
    -
    import Client from '../networking';
    -import { apply } from '../utils/whitelist';
    -import { toCamelCase } from '../utils/camel';
    -import Auth0Error from './error';
    -
    -function responseHandler(response, exceptions = {}) {
    -  if (response.ok && response.json) {
    -    return toCamelCase(response.json, exceptions);
    -  }
    -  throw new Auth0Error(response);
    -}
    -
    -const attributes = [
    -  'name',
    -  'nickname',
    -  'picture',
    -  'user_id',
    -  'user_metadata',
    -  'app_metadata',
    -  'email',
    -  'email_verified',
    -  'given_name',
    -  'family_name'
    -];
    -
    -/**
    - * Auth0 Management API User endpoints
    - *
    - * @export
    - * @see https://auth0.com/docs/api/management/v2#!/Users/
    - * @class Users
    - */
    -export default class Users {
    -  constructor(options = {}) {
    -    this.client = new Client(options);
    -    if (!options.token) {
    -      throw new Error('Missing token in parameters');
    -    }
    -  }
    -
    -  /**
    -   * Returns the user by identifier
    -   *
    -   * @param {Object} parameters get user by identifier parameters
    -   * @param {String} parameters.id identifier of the user to obtain
    -   * @returns {Promise}
    -   * @see https://auth0.com/docs/api/management/v2#!/Users/get_users_by_id
    -   *
    -   * @memberof Users
    -   */
    -  getUser(parameters = {}) {
    -    const payload = apply(
    -      {
    -        parameters: {
    -          id: { required: true }
    -        }
    -      },
    -      parameters
    -    );
    -    return this.client
    -      .get(`/api/v2/users/${encodeURIComponent(payload.id)}`)
    -      .then(response =>
    -        responseHandler(response, {
    -          attributes,
    -          whitelist: true,
    -          rootOnly: true
    -        })
    -      );
    -  }
    -
    -  /**
    -   * Patch a user's `user_metadata`
    -   *
    -   * @param {Object} parameters patch user metadata parameters
    -   * @param {String} parameters.id identifier of the user to patch
    -   * @param {Object} parameters.metadata object with attributes to store in user_metadata.
    -   * @returns {Promise}
    -   * @see https://auth0.com/docs/api/management/v2#!/Users/patch_users_by_id
    -   *
    -   * @memberof Users
    -   */
    -  patchUser(parameters = {}) {
    -    const payload = apply(
    -      {
    -        parameters: {
    -          id: { required: true },
    -          metadata: { required: true }
    -        }
    -      },
    -      parameters
    -    );
    -    return this.client
    -      .patch(`/api/v2/users/${encodeURIComponent(payload.id)}`, {
    -        user_metadata: payload.metadata
    -      })
    -      .then(response =>
    -        responseHandler(response, {
    -          attributes,
    -          whitelist: true,
    -          rootOnly: true
    -        })
    -      );
    -  }
    -}
    -
    -
    -
    -
    - -
    - -
    - Generated by JSDoc 3.6.11 on - Thu Jun 15 2023 22:57:24 GMT+0530 (India Standard Time) using the Minami - theme. -
    - - - - - diff --git a/docs/modules.html b/docs/modules.html new file mode 100644 index 00000000..b8be8217 --- /dev/null +++ b/docs/modules.html @@ -0,0 +1,409 @@ + + + + + + react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +

    react-native-auth0

    +
    +
    +
    +

    Index

    +
    +

    Modules

    + +
    +
    +

    Namespaces

    + +
    +
    +

    Enumerations

    + +
    +
    +

    Classes

    + +
    +
    +

    Functions

    + +
    +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/modules/Auth0Provider.html b/docs/modules/Auth0Provider.html new file mode 100644 index 00000000..d61f659d --- /dev/null +++ b/docs/modules/Auth0Provider.html @@ -0,0 +1,433 @@ + + + + + + Auth0Provider | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Namespace Auth0Provider

    +
    +
    +
    +

    Provides the Auth0Context to its child components.

    +
    +
    +

    Param

    +

    Your Auth0 domain

    + +

    Param

    +

    Your Auth0 client ID

    + +

    Example

    +
    <Auth0Provider domain="YOUR AUTH0 DOMAIN" clientId="YOUR CLIENT ID">
    <App />
    </Auth0Provider> +
    +
    +
    + +
    +
    +

    Index

    +
    +

    Variables

    + +
    +
    +
    +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/modules/Types.html b/docs/modules/Types.html new file mode 100644 index 00000000..c3cc5601 --- /dev/null +++ b/docs/modules/Types.html @@ -0,0 +1,975 @@ + + + + + + Types | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    + + +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/scripts/linenumber.js b/docs/scripts/linenumber.js deleted file mode 100644 index 92b7067c..00000000 --- a/docs/scripts/linenumber.js +++ /dev/null @@ -1,25 +0,0 @@ -/*global document */ -(function () { - var source = document.getElementsByClassName('prettyprint source linenums'); - var i = 0; - var lineNumber = 0; - var lineId; - var lines; - var totalLines; - var anchorHash; - - if (source && source[0]) { - anchorHash = document.location.hash.substring(1); - lines = source[0].getElementsByTagName('li'); - totalLines = lines.length; - - for (; i < totalLines; i++) { - lineNumber++; - lineId = 'line' + lineNumber; - lines[i].id = lineId; - if (lineId === anchorHash) { - lines[i].className += ' selected'; - } - } - } -})(); diff --git a/docs/scripts/prettify/Apache-License-2.0.txt b/docs/scripts/prettify/Apache-License-2.0.txt deleted file mode 100644 index d6456956..00000000 --- a/docs/scripts/prettify/Apache-License-2.0.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/docs/scripts/prettify/lang-css.js b/docs/scripts/prettify/lang-css.js deleted file mode 100644 index 927f226d..00000000 --- a/docs/scripts/prettify/lang-css.js +++ /dev/null @@ -1,36 +0,0 @@ -PR.registerLangHandler( - PR.createSimpleLexer( - [['pln', /^[\t\n\f\r ]+/, null, ' \t\r\n ']], - [ - ['str', /^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/, null], - ['str', /^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/, null], - ['lang-css-str', /^url\(([^"')]*)\)/i], - [ - 'kwd', - /^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i, - null, - ], - [ - 'lang-css-kw', - /^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i, - ], - ['com', /^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//], - ['com', /^(?:<\!--|--\>)/], - ['lit', /^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i], - ['lit', /^#[\da-f]{3,6}/i], - ['pln', /^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i], - ['pun', /^[^\s\w"']+/], - ], - ), - ['css'], -); -PR.registerLangHandler( - PR.createSimpleLexer( - [], - [['kwd', /^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]], - ), - ['css-kw'], -); -PR.registerLangHandler(PR.createSimpleLexer([], [['str', /^[^"')]+/]]), [ - 'css-str', -]); diff --git a/docs/scripts/prettify/prettify.js b/docs/scripts/prettify/prettify.js deleted file mode 100644 index d458ebba..00000000 --- a/docs/scripts/prettify/prettify.js +++ /dev/null @@ -1,735 +0,0 @@ -var q = null; -window.PR_SHOULD_USE_CONTINUATION = !0; -(function () { - function L(a) { - function m(a) { - var f = a.charCodeAt(0); - if (f !== 92) return f; - var b = a.charAt(1); - return (f = r[b]) - ? f - : '0' <= b && b <= '7' - ? parseInt(a.substring(1), 8) - : b === 'u' || b === 'x' - ? parseInt(a.substring(2), 16) - : a.charCodeAt(1); - } - function e(a) { - if (a < 32) return (a < 16 ? '\\x0' : '\\x') + a.toString(16); - a = String.fromCharCode(a); - if (a === '\\' || a === '-' || a === '[' || a === ']') a = '\\' + a; - return a; - } - function h(a) { - for ( - var f = a - .substring(1, a.length - 1) - .match( - /\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g, - ), - a = [], - b = [], - o = f[0] === '^', - c = o ? 1 : 0, - i = f.length; - c < i; - ++c - ) { - var j = f[c]; - if (/\\[bdsw]/i.test(j)) a.push(j); - else { - var j = m(j), - d; - c + 2 < i && '-' === f[c + 1] - ? ((d = m(f[c + 2])), (c += 2)) - : (d = j); - b.push([j, d]); - d < 65 || - j > 122 || - (d < 65 || - j > 90 || - b.push([Math.max(65, j) | 32, Math.min(d, 90) | 32]), - d < 97 || - j > 122 || - b.push([Math.max(97, j) & -33, Math.min(d, 122) & -33])); - } - } - b.sort(function (a, f) { - return a[0] - f[0] || f[1] - a[1]; - }); - f = []; - j = [NaN, NaN]; - for (c = 0; c < b.length; ++c) - (i = b[c]), - i[0] <= j[1] + 1 ? (j[1] = Math.max(j[1], i[1])) : f.push((j = i)); - b = ['[']; - o && b.push('^'); - b.push.apply(b, a); - for (c = 0; c < f.length; ++c) - (i = f[c]), - b.push(e(i[0])), - i[1] > i[0] && (i[1] + 1 > i[0] && b.push('-'), b.push(e(i[1]))); - b.push(']'); - return b.join(''); - } - function y(a) { - for ( - var f = a.source.match( - /\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g, - ), - b = f.length, - d = [], - c = 0, - i = 0; - c < b; - ++c - ) { - var j = f[c]; - j === '(' - ? ++i - : '\\' === j.charAt(0) && - (j = +j.substring(1)) && - j <= i && - (d[j] = -1); - } - for (c = 1; c < d.length; ++c) -1 === d[c] && (d[c] = ++t); - for (i = c = 0; c < b; ++c) - (j = f[c]), - j === '(' - ? (++i, d[i] === void 0 && (f[c] = '(?:')) - : '\\' === j.charAt(0) && - (j = +j.substring(1)) && - j <= i && - (f[c] = '\\' + d[i]); - for (i = c = 0; c < b; ++c) - '^' === f[c] && '^' !== f[c + 1] && (f[c] = ''); - if (a.ignoreCase && s) - for (c = 0; c < b; ++c) - (j = f[c]), - (a = j.charAt(0)), - j.length >= 2 && a === '[' - ? (f[c] = h(j)) - : a !== '\\' && - (f[c] = j.replace(/[A-Za-z]/g, function (a) { - a = a.charCodeAt(0); - return '[' + String.fromCharCode(a & -33, a | 32) + ']'; - })); - return f.join(''); - } - for (var t = 0, s = !1, l = !1, p = 0, d = a.length; p < d; ++p) { - var g = a[p]; - if (g.ignoreCase) l = !0; - else if ( - /[a-z]/i.test( - g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi, ''), - ) - ) { - s = !0; - l = !1; - break; - } - } - for ( - var r = {b: 8, t: 9, n: 10, v: 11, f: 12, r: 13}, - n = [], - p = 0, - d = a.length; - p < d; - ++p - ) { - g = a[p]; - if (g.global || g.multiline) throw Error('' + g); - n.push('(?:' + y(g) + ')'); - } - return RegExp(n.join('|'), l ? 'gi' : 'g'); - } - function M(a) { - function m(a) { - switch (a.nodeType) { - case 1: - if (e.test(a.className)) break; - for (var g = a.firstChild; g; g = g.nextSibling) m(g); - g = a.nodeName; - if ('BR' === g || 'LI' === g) - (h[s] = '\n'), (t[s << 1] = y++), (t[(s++ << 1) | 1] = a); - break; - case 3: - case 4: - (g = a.nodeValue), - g.length && - ((g = p - ? g.replace(/\r\n?/g, '\n') - : g.replace(/[\t\n\r ]+/g, ' ')), - (h[s] = g), - (t[s << 1] = y), - (y += g.length), - (t[(s++ << 1) | 1] = a)); - } - } - var e = /(?:^|\s)nocode(?:\s|$)/, - h = [], - y = 0, - t = [], - s = 0, - l; - a.currentStyle - ? (l = a.currentStyle.whiteSpace) - : window.getComputedStyle && - (l = document.defaultView - .getComputedStyle(a, q) - .getPropertyValue('white-space')); - var p = l && 'pre' === l.substring(0, 3); - m(a); - return {a: h.join('').replace(/\n$/, ''), c: t}; - } - function B(a, m, e, h) { - m && ((a = {a: m, d: a}), e(a), h.push.apply(h, a.e)); - } - function x(a, m) { - function e(a) { - for ( - var l = a.d, - p = [l, 'pln'], - d = 0, - g = a.a.match(y) || [], - r = {}, - n = 0, - z = g.length; - n < z; - ++n - ) { - var f = g[n], - b = r[f], - o = void 0, - c; - if (typeof b === 'string') c = !1; - else { - var i = h[f.charAt(0)]; - if (i) (o = f.match(i[1])), (b = i[0]); - else { - for (c = 0; c < t; ++c) - if (((i = m[c]), (o = f.match(i[1])))) { - b = i[0]; - break; - } - o || (b = 'pln'); - } - if ( - (c = b.length >= 5 && 'lang-' === b.substring(0, 5)) && - !(o && typeof o[1] === 'string') - ) - (c = !1), (b = 'src'); - c || (r[f] = b); - } - i = d; - d += f.length; - if (c) { - c = o[1]; - var j = f.indexOf(c), - k = j + c.length; - o[2] && ((k = f.length - o[2].length), (j = k - c.length)); - b = b.substring(5); - B(l + i, f.substring(0, j), e, p); - B(l + i + j, c, C(b, c), p); - B(l + i + k, f.substring(k), e, p); - } else p.push(l + i, b); - } - a.e = p; - } - var h = {}, - y; - (function () { - for ( - var e = a.concat(m), l = [], p = {}, d = 0, g = e.length; - d < g; - ++d - ) { - var r = e[d], - n = r[3]; - if (n) for (var k = n.length; --k >= 0; ) h[n.charAt(k)] = r; - r = r[1]; - n = '' + r; - p.hasOwnProperty(n) || (l.push(r), (p[n] = q)); - } - l.push(/[\S\s]/); - y = L(l); - })(); - var t = m.length; - return e; - } - function u(a) { - var m = [], - e = []; - a.tripleQuotedStrings - ? m.push([ - 'str', - /^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/, - q, - '\'"', - ]) - : a.multiLineStrings - ? m.push([ - 'str', - /^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, - q, - '\'"`', - ]) - : m.push([ - 'str', - /^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/, - q, - '"\'', - ]); - a.verbatimStrings && e.push(['str', /^@"(?:[^"]|"")*(?:"|$)/, q]); - var h = a.hashComments; - h && - (a.cStyleComments - ? (h > 1 - ? m.push(['com', /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, q, '#']) - : m.push([ - 'com', - /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/, - q, - '#', - ]), - e.push([ - 'str', - /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/, - q, - ])) - : m.push(['com', /^#[^\n\r]*/, q, '#'])); - a.cStyleComments && - (e.push(['com', /^\/\/[^\n\r]*/, q]), - e.push(['com', /^\/\*[\S\s]*?(?:\*\/|$)/, q])); - a.regexLiterals && - e.push([ - 'lang-regex', - /^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/, - ]); - (h = a.types) && e.push(['typ', h]); - a = ('' + a.keywords).replace(/^ | $/g, ''); - a.length && - e.push(['kwd', RegExp('^(?:' + a.replace(/[\s,]+/g, '|') + ')\\b'), q]); - m.push(['pln', /^\s+/, q, ' \r\n\t\xa0']); - e.push( - ['lit', /^@[$_a-z][\w$@]*/i, q], - ['typ', /^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/, q], - ['pln', /^[$_a-z][\w$@]*/i, q], - [ - 'lit', - /^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i, - q, - '0123456789', - ], - ['pln', /^\\[\S\s]?/, q], - ['pun', /^.[^\s\w"-$'./@\\`]*/, q], - ); - return x(m, e); - } - function D(a, m) { - function e(a) { - switch (a.nodeType) { - case 1: - if (k.test(a.className)) break; - if ('BR' === a.nodeName) - h(a), a.parentNode && a.parentNode.removeChild(a); - else for (a = a.firstChild; a; a = a.nextSibling) e(a); - break; - case 3: - case 4: - if (p) { - var b = a.nodeValue, - d = b.match(t); - if (d) { - var c = b.substring(0, d.index); - a.nodeValue = c; - (b = b.substring(d.index + d[0].length)) && - a.parentNode.insertBefore(s.createTextNode(b), a.nextSibling); - h(a); - c || a.parentNode.removeChild(a); - } - } - } - } - function h(a) { - function b(a, d) { - var e = d ? a.cloneNode(!1) : a, - f = a.parentNode; - if (f) { - var f = b(f, 1), - g = a.nextSibling; - f.appendChild(e); - for (var h = g; h; h = g) (g = h.nextSibling), f.appendChild(h); - } - return e; - } - for (; !a.nextSibling; ) if (((a = a.parentNode), !a)) return; - for ( - var a = b(a.nextSibling, 0), e; - (e = a.parentNode) && e.nodeType === 1; - - ) - a = e; - d.push(a); - } - var k = /(?:^|\s)nocode(?:\s|$)/, - t = /\r\n?|\n/, - s = a.ownerDocument, - l; - a.currentStyle - ? (l = a.currentStyle.whiteSpace) - : window.getComputedStyle && - (l = s.defaultView - .getComputedStyle(a, q) - .getPropertyValue('white-space')); - var p = l && 'pre' === l.substring(0, 3); - for (l = s.createElement('LI'); a.firstChild; ) l.appendChild(a.firstChild); - for (var d = [l], g = 0; g < d.length; ++g) e(d[g]); - m === (m | 0) && d[0].setAttribute('value', m); - var r = s.createElement('OL'); - r.className = 'linenums'; - for (var n = Math.max(0, (m - 1) | 0) || 0, g = 0, z = d.length; g < z; ++g) - (l = d[g]), - (l.className = 'L' + ((g + n) % 10)), - l.firstChild || l.appendChild(s.createTextNode('\xa0')), - r.appendChild(l); - a.appendChild(r); - } - function k(a, m) { - for (var e = m.length; --e >= 0; ) { - var h = m[e]; - A.hasOwnProperty(h) - ? window.console && - console.warn('cannot override language handler %s', h) - : (A[h] = a); - } - } - function C(a, m) { - if (!a || !A.hasOwnProperty(a)) - a = /^\s*= o && (h += 2); - e >= c && (a += 2); - } - } catch (w) { - 'console' in window && console.log(w && w.stack ? w.stack : w); - } - } - var v = ['break,continue,do,else,for,if,return,while'], - w = [ - [ - v, - 'auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile', - ], - 'catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof', - ], - F = [ - w, - 'alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where', - ], - G = [ - w, - 'abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient', - ], - H = [ - G, - 'as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var', - ], - w = [ - w, - 'debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN', - ], - I = [ - v, - 'and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None', - ], - J = [ - v, - 'alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END', - ], - v = [v, 'case,done,elif,esac,eval,fi,function,in,local,set,then,until'], - K = - /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/, - N = /\S/, - O = u({ - keywords: [ - F, - H, - w, - 'caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END' + - I, - J, - v, - ], - hashComments: !0, - cStyleComments: !0, - multiLineStrings: !0, - regexLiterals: !0, - }), - A = {}; - k(O, ['default-code']); - k( - x( - [], - [ - ['pln', /^[^]*(?:>|$)/], - ['com', /^<\!--[\S\s]*?(?:--\>|$)/], - ['lang-', /^<\?([\S\s]+?)(?:\?>|$)/], - ['lang-', /^<%([\S\s]+?)(?:%>|$)/], - ['pun', /^(?:<[%?]|[%?]>)/], - ['lang-', /^]*>([\S\s]+?)<\/xmp\b[^>]*>/i], - ['lang-js', /^]*>([\S\s]*?)(<\/script\b[^>]*>)/i], - ['lang-css', /^]*>([\S\s]*?)(<\/style\b[^>]*>)/i], - ['lang-in.tag', /^(<\/?[a-z][^<>]*>)/i], - ], - ), - ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl'], - ); - k( - x( - [ - ['pln', /^\s+/, q, ' \t\r\n'], - ['atv', /^(?:"[^"]*"?|'[^']*'?)/, q, '"\''], - ], - [ - ['tag', /^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i], - ['atn', /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i], - ['lang-uq.val', /^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/], - ['pun', /^[/<->]+/], - ['lang-js', /^on\w+\s*=\s*"([^"]+)"/i], - ['lang-js', /^on\w+\s*=\s*'([^']+)'/i], - ['lang-js', /^on\w+\s*=\s*([^\s"'>]+)/i], - ['lang-css', /^style\s*=\s*"([^"]+)"/i], - ['lang-css', /^style\s*=\s*'([^']+)'/i], - ['lang-css', /^style\s*=\s*([^\s"'>]+)/i], - ], - ), - ['in.tag'], - ); - k(x([], [['atv', /^[\S\s]+/]]), ['uq.val']); - k(u({keywords: F, hashComments: !0, cStyleComments: !0, types: K}), [ - 'c', - 'cc', - 'cpp', - 'cxx', - 'cyc', - 'm', - ]); - k(u({keywords: 'null,true,false'}), ['json']); - k( - u({ - keywords: H, - hashComments: !0, - cStyleComments: !0, - verbatimStrings: !0, - types: K, - }), - ['cs'], - ); - k(u({keywords: G, cStyleComments: !0}), ['java']); - k(u({keywords: v, hashComments: !0, multiLineStrings: !0}), [ - 'bsh', - 'csh', - 'sh', - ]); - k( - u({ - keywords: I, - hashComments: !0, - multiLineStrings: !0, - tripleQuotedStrings: !0, - }), - ['cv', 'py'], - ); - k( - u({ - keywords: - 'caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END', - hashComments: !0, - multiLineStrings: !0, - regexLiterals: !0, - }), - ['perl', 'pl', 'pm'], - ); - k( - u({keywords: J, hashComments: !0, multiLineStrings: !0, regexLiterals: !0}), - ['rb'], - ); - k(u({keywords: w, cStyleComments: !0, regexLiterals: !0}), ['js']); - k( - u({ - keywords: - 'all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes', - hashComments: 3, - cStyleComments: !0, - multilineStrings: !0, - tripleQuotedStrings: !0, - regexLiterals: !0, - }), - ['coffee'], - ); - k(x([], [['str', /^[\S\s]+/]]), ['regex']); - window.prettyPrintOne = function (a, m, e) { - var h = document.createElement('PRE'); - h.innerHTML = a; - e && D(h, e); - E({g: m, i: e, h: h}); - return h.innerHTML; - }; - window.prettyPrint = function (a) { - function m() { - for ( - var e = window.PR_SHOULD_USE_CONTINUATION ? l.now() + 250 : Infinity; - p < h.length && l.now() < e; - p++ - ) { - var n = h[p], - k = n.className; - if (k.indexOf('prettyprint') >= 0) { - var k = k.match(g), - f, - b; - if ((b = !k)) { - b = n; - for (var o = void 0, c = b.firstChild; c; c = c.nextSibling) - var i = c.nodeType, - o = - i === 1 - ? o - ? b - : c - : i === 3 - ? N.test(c.nodeValue) - ? b - : o - : o; - b = (f = o === b ? void 0 : o) && 'CODE' === f.tagName; - } - b && (k = f.className.match(g)); - k && (k = k[1]); - b = !1; - for (o = n.parentNode; o; o = o.parentNode) - if ( - (o.tagName === 'pre' || - o.tagName === 'code' || - o.tagName === 'xmp') && - o.className && - o.className.indexOf('prettyprint') >= 0 - ) { - b = !0; - break; - } - b || - ((b = (b = n.className.match(/\blinenums\b(?::(\d+))?/)) - ? b[1] && b[1].length - ? +b[1] - : !0 - : !1) && D(n, b), - (d = {g: k, h: n, i: b}), - E(d)); - } - } - p < h.length ? setTimeout(m, 250) : a && a(); - } - for ( - var e = [ - document.getElementsByTagName('pre'), - document.getElementsByTagName('code'), - document.getElementsByTagName('xmp'), - ], - h = [], - k = 0; - k < e.length; - ++k - ) - for (var t = 0, s = e[k].length; t < s; ++t) h.push(e[k][t]); - var e = q, - l = Date; - l.now || - (l = { - now: function () { - return +new Date(); - }, - }); - var p = 0, - d, - g = /\blang(?:uage)?-([\w.]+)(?!\S)/; - m(); - }; - window.PR = { - createSimpleLexer: x, - registerLangHandler: k, - sourceDecorator: u, - PR_ATTRIB_NAME: 'atn', - PR_ATTRIB_VALUE: 'atv', - PR_COMMENT: 'com', - PR_DECLARATION: 'dec', - PR_KEYWORD: 'kwd', - PR_LITERAL: 'lit', - PR_NOCODE: 'nocode', - PR_PLAIN: 'pln', - PR_PUNCTUATION: 'pun', - PR_SOURCE: 'src', - PR_STRING: 'str', - PR_TAG: 'tag', - PR_TYPE: 'typ', - }; -})(); diff --git a/docs/styles/jsdoc-default.css b/docs/styles/jsdoc-default.css deleted file mode 100644 index f463161d..00000000 --- a/docs/styles/jsdoc-default.css +++ /dev/null @@ -1,733 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,500i,500,600,600i|Roboto); - -* { - box-sizing: border-box; -} - -html, -body { - height: 100%; - width: 100%; -} - -body { - color: #4d4e53; - background-color: white; - margin: 0 auto; - padding: 0; - font-family: 'Source Sans Pro', Helvetica, sans-serif; - font-size: 16px; - line-height: 160%; -} - -a, -a:active { - color: #0095dd; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -p, -ul, -ol, -blockquote { - margin-bottom: 1em; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - font-family: 'Roboto', sans-serif; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - color: #000; - font-weight: 400; - margin: 0; -} - -h1 { - font-weight: 300; - font-size: 48px; - margin: 1em 0 0.5em; -} - -h1.page-title { - margin-bottom: 10px; - font-size: 34px; - font-weight: 300; - border-bottom: solid 2px #ddd; - padding: 0.5em 0 0.5em; - margin-top: 0; -} - -h2 { - font-size: 32px; - margin: 1.2em 0 0.8em; - font-weight: bold; -} - -h3 { - /* margin-top: 1em; */ - /* margin-bottom: 16px; */ - /* font-weight: bold; */ - padding: 0; - margin: 1em 0 0.6em; - font-size: 28px; - /* border-bottom: 1px solid #eee; */ - /* padding-bottom: 15px; */ -} - -h4 { - font-size: 18px; - margin: 1em 0 0.2em; - color: #4d4e53; - /* border-bottom: 1px solid #eee; */ - padding-bottom: 8px; -} - -h5, -.container-overview .subsection-title { - font-size: 120%; - /* letter-spacing: -0.01em; */ - margin: 20px 0 5px; -} - -h6 { - font-size: 100%; - letter-spacing: -0.01em; - margin: 6px 0 3px 0; - font-style: italic; -} - -tt, -code, -kbd, -samp { - font-family: Consolas, Monaco, 'Andale Mono', monospace; - background: #f4f4f4; - padding: 1px 5px; - border-radius: 5px; - font-size: 14px; -} - -blockquote { - display: block; - border-left: 4px solid #eee; - margin: 0; - padding-left: 1em; - color: #888; -} - -.class-description { - font-size: 130%; - line-height: 140%; - margin-bottom: 1em; - margin-top: 1em; -} - -.class-description:empty { - margin: 0; -} - -/** Container **/ -#main { - float: right; - min-width: 360px; - width: calc(100% - 250px); - padding: 0 30px 20px 30px; -} - -header { - display: block; -} - -section { - display: block; - background-color: #fff; - padding: 0; -} - -.variation { - display: none; -} - -.signature-attributes { - font-size: 60%; - color: #aaa; - font-style: italic; - font-weight: lighter; -} - -/** Readme **/ - -.readme { - font-size: 16px; -} - -.readme h1, -.readme h2, -.readme h3, -.readme h4, -.readme h5 { - margin-top: 1em; - margin-bottom: 16px; - font-weight: bold; - padding: 0; -} - -.readme h1 { - font-size: 2em; - padding-bottom: 0.3em; -} - -.readme h2 { - font-size: 1.75em; - padding-bottom: 0.3em; -} - -.readme h3 { - font-size: 1.5em; - background-color: transparent; -} - -.readme h4 { - font-size: 1.25em; -} - -.readme h5 { - font-size: 1em; -} - -.readme img { - max-width: 100%; -} - -.readme ul, -.readme ol { - padding-left: 2em; -} - -.readme pre > code { - font-size: 0.85em; -} - -.readme table { - margin-bottom: 1em; - border-collapse: collapse; - border-spacing: 0; -} - -.readme table tr { - background-color: #fff; - border-top: 1px solid #ccc; -} - -.readme table th, -.readme table td { - padding: 6px 13px; - border: 1px solid #ddd; -} - -.readme table tr:nth-child(2n) { - background-color: #f8f8f8; -} - -/** Nav **/ -nav { - float: left; - display: block; - width: 250px; - background: #fff; - overflow: auto; - position: fixed; - height: 100%; - padding: 10px; - border-right: 1px solid #eee; - /* box-shadow: 0 0 3px rgba(0,0,0,0.1); */ -} - -nav li { - list-style: none; - padding: 0; - margin: 0; -} - -.nav-heading { - margin-top: 10px; - font-weight: bold; -} - -.nav-heading a { - color: #888; - font-size: 14px; - display: inline-block; -} - -.nav-item-type { - /* margin-left: 5px; */ - width: 18px; - height: 18px; - display: inline-block; - text-align: center; - border-radius: 0.2em; - margin-right: 5px; - font-weight: bold; - line-height: 20px; - font-size: 13px; -} - -.type-function { - background: #b3e5fc; - color: #0288d1; -} - -.type-class { - background: #d1c4e9; - color: #4527a0; -} - -.type-member { - background: #c8e6c9; - color: #388e3c; -} - -.type-module { - background: #e1bee7; - color: #7b1fa2; -} - -/** Footer **/ -footer { - color: hsl(0, 0%, 28%); - margin-left: 250px; - display: block; - padding: 30px; - font-style: italic; - font-size: 90%; - border-top: 1px solid #eee; -} - -.ancestors { - color: #999; -} - -.ancestors a { - color: #999 !important; - text-decoration: none; -} - -.clear { - clear: both; -} - -.important { - font-weight: bold; - color: #950b02; -} - -.yes-def { - text-indent: -1000px; -} - -.type-signature { - color: #aaa; -} - -.name, -.signature { - font-family: Consolas, Monaco, 'Andale Mono', monospace; -} - -.details { - margin-top: 14px; - border-left: 2px solid #ddd; - line-height: 30px; -} - -.details dt { - width: 120px; - float: left; - padding-left: 10px; -} - -.details dd { - margin-left: 70px; -} - -.details ul { - margin: 0; -} - -.details ul { - list-style-type: none; -} - -.details li { - margin-left: 30px; -} - -.details pre.prettyprint { - margin: 0; -} - -.details .object-value { - padding-top: 0; -} - -.description { - margin-bottom: 1em; - margin-top: 1em; -} - -.code-caption { - font-style: italic; - font-size: 107%; - margin: 0; -} - -.prettyprint { - font-size: 13px; - border: 1px solid #ddd; - border-radius: 3px; - box-shadow: 0 1px 3px hsla(0, 0%, 0%, 0.05); - overflow: auto; -} - -.prettyprint.source { - width: inherit; -} - -.prettyprint code { - font-size: 12px; - line-height: 18px; - display: block; - background-color: #fff; - color: #4d4e53; -} - -.prettyprint code:empty:before { - content: ''; -} - -.prettyprint > code { - padding: 15px; -} - -.prettyprint .linenums code { - padding: 0 15px; -} - -.prettyprint .linenums li:first-of-type code { - padding-top: 15px; -} - -.prettyprint code span.line { - display: inline-block; -} - -.prettyprint.linenums { - padding-left: 70px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.prettyprint.linenums ol { - padding-left: 0; -} - -.prettyprint.linenums li { - border-left: 3px #ddd solid; -} - -.prettyprint.linenums li.selected, -.prettyprint.linenums li.selected * { - background-color: lightyellow; -} - -.prettyprint.linenums li * { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.params, -.props { - border-spacing: 0; - border: 1px solid #ddd; - border-collapse: collapse; - border-radius: 3px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - width: 100%; - font-size: 14px; - /* margin-left: 15px; */ -} - -.params .name, -.props .name, -.name code { - color: #4d4e53; - font-family: Consolas, Monaco, 'Andale Mono', monospace; - font-size: 100%; -} - -.params td, -.params th, -.props td, -.props th { - margin: 0px; - text-align: left; - vertical-align: top; - padding: 10px; - display: table-cell; -} - -.params td { - border-top: 1px solid #eee; -} - -.params thead tr, -.props thead tr { - background-color: #fff; - font-weight: bold; -} - -.params .params thead tr, -.props .props thead tr { - background-color: #fff; - font-weight: bold; -} - -.params td.description > p:first-child, -.props td.description > p:first-child { - margin-top: 0; - padding-top: 0; -} - -.params td.description > p:last-child, -.props td.description > p:last-child { - margin-bottom: 0; - padding-bottom: 0; -} - -dl.param-type { - /* border-bottom: 1px solid hsl(0, 0%, 87%); */ - margin: 0; - padding: 0; - font-size: 16px; -} - -.param-type dt, -.param-type dd { - display: inline-block; -} - -.param-type dd { - font-family: Consolas, Monaco, 'Andale Mono', monospace; - display: inline-block; - padding: 0; - margin: 0; - font-size: 14px; -} - -.disabled { - color: #454545; -} - -/* navicon button */ -.navicon-button { - display: none; - position: relative; - padding: 2.0625rem 1.5rem; - transition: 0.25s; - cursor: pointer; - user-select: none; - opacity: 0.8; -} -.navicon-button .navicon:before, -.navicon-button .navicon:after { - transition: 0.25s; -} -.navicon-button:hover { - transition: 0.5s; - opacity: 1; -} -.navicon-button:hover .navicon:before, -.navicon-button:hover .navicon:after { - transition: 0.25s; -} -.navicon-button:hover .navicon:before { - top: 0.825rem; -} -.navicon-button:hover .navicon:after { - top: -0.825rem; -} - -/* navicon */ -.navicon { - position: relative; - width: 2.5em; - height: 0.3125rem; - background: #000; - transition: 0.3s; - border-radius: 2.5rem; -} -.navicon:before, -.navicon:after { - display: block; - content: ''; - height: 0.3125rem; - width: 2.5rem; - background: #000; - position: absolute; - z-index: -1; - transition: 0.3s 0.25s; - border-radius: 1rem; -} -.navicon:before { - top: 0.625rem; -} -.navicon:after { - top: -0.625rem; -} - -/* open */ -.nav-trigger:checked + label:not(.steps) .navicon:before, -.nav-trigger:checked + label:not(.steps) .navicon:after { - top: 0 !important; -} - -.nav-trigger:checked + label .navicon:before, -.nav-trigger:checked + label .navicon:after { - transition: 0.5s; -} - -/* Minus */ -.nav-trigger:checked + label { - transform: scale(0.75); -} - -/* × and + */ -.nav-trigger:checked + label.plus .navicon, -.nav-trigger:checked + label.x .navicon { - background: transparent; -} - -.nav-trigger:checked + label.plus .navicon:before, -.nav-trigger:checked + label.x .navicon:before { - transform: rotate(-45deg); - background: #fff; -} - -.nav-trigger:checked + label.plus .navicon:after, -.nav-trigger:checked + label.x .navicon:after { - transform: rotate(45deg); - background: #fff; -} - -.nav-trigger:checked + label.plus { - transform: scale(0.75) rotate(45deg); -} - -.nav-trigger:checked ~ nav { - left: 0 !important; -} - -.nav-trigger:checked ~ .overlay { - display: block; -} - -.nav-trigger { - position: fixed; - top: 0; - clip: rect(0, 0, 0, 0); -} - -.overlay { - display: none; - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - width: 100%; - height: 100%; - background: hsla(0, 0%, 0%, 0.5); - z-index: 1; -} - -.section-method { - margin-bottom: 30px; - padding-bottom: 30px; - border-bottom: 1px solid #eee; -} - -@media only screen and (min-width: 320px) and (max-width: 680px) { - body { - overflow-x: hidden; - } - - nav { - background: #fff; - width: 250px; - height: 100%; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: -250px; - z-index: 3; - padding: 0 10px; - transition: left 0.2s; - } - - .navicon-button { - display: inline-block; - position: fixed; - top: 1.5em; - right: 0; - z-index: 2; - } - - #main { - width: 100%; - min-width: 360px; - } - - #main h1.page-title { - margin: 1em 0; - } - - #main section { - padding: 0; - } - - footer { - margin-left: 0; - } -} - -@media only print { - nav { - display: none; - } - - #main { - float: none; - width: 100%; - } -} diff --git a/docs/styles/prettify-jsdoc.css b/docs/styles/prettify-jsdoc.css deleted file mode 100644 index 834a866d..00000000 --- a/docs/styles/prettify-jsdoc.css +++ /dev/null @@ -1,111 +0,0 @@ -/* JSDoc prettify.js theme */ - -/* plain text */ -.pln { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* string content */ -.str { - color: hsl(104, 100%, 24%); - font-weight: normal; - font-style: normal; -} - -/* a keyword */ -.kwd { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a comment */ -.com { - font-weight: normal; - font-style: italic; -} - -/* a type name */ -.typ { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a literal value */ -.lit { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* punctuation */ -.pun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp open bracket */ -.opn { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp close bracket */ -.clo { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a markup tag name */ -.tag { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute name */ -.atn { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute value */ -.atv { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a declaration */ -.dec { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a variable name */ -.var { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a function name */ -.fun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; -} diff --git a/docs/styles/prettify-tomorrow.css b/docs/styles/prettify-tomorrow.css deleted file mode 100644 index 921a3836..00000000 --- a/docs/styles/prettify-tomorrow.css +++ /dev/null @@ -1,163 +0,0 @@ -/* Tomorrow Theme */ -/* Original theme - https://github.com/chriskempson/tomorrow-theme */ -/* Pretty printing styles. Used with prettify.js. */ -/* SPAN elements with the classes below are added by prettyprint. */ -/* plain text */ -.pln { - color: #4d4d4c; -} - -@media screen { - /* string content */ - .str { - color: hsl(104, 100%, 24%); - } - - /* a keyword */ - .kwd { - color: hsl(240, 100%, 50%); - } - - /* a comment */ - .com { - color: hsl(0, 0%, 60%); - } - - /* a type name */ - .typ { - color: hsl(240, 100%, 32%); - } - - /* a literal value */ - .lit { - color: hsl(240, 100%, 40%); - } - - /* punctuation */ - .pun { - color: #000000; - } - - /* lisp open bracket */ - .opn { - color: #000000; - } - - /* lisp close bracket */ - .clo { - color: #000000; - } - - /* a markup tag name */ - .tag { - color: #c82829; - } - - /* a markup attribute name */ - .atn { - color: #f5871f; - } - - /* a markup attribute value */ - .atv { - color: #3e999f; - } - - /* a declaration */ - .dec { - color: #f5871f; - } - - /* a variable name */ - .var { - color: #c82829; - } - - /* a function name */ - .fun { - color: #4271ae; - } -} -/* Use higher contrast and text-weight for printable form. */ -@media print, projection { - .str { - color: #060; - } - - .kwd { - color: #006; - font-weight: bold; - } - - .com { - color: #600; - font-style: italic; - } - - .typ { - color: #404; - font-weight: bold; - } - - .lit { - color: #044; - } - - .pun, - .opn, - .clo { - color: #440; - } - - .tag { - color: #006; - font-weight: bold; - } - - .atn { - color: #404; - } - - .atv { - color: #060; - } -} -/* Style */ -/* -pre.prettyprint { - background: white; - font-family: Consolas, Monaco, 'Andale Mono', monospace; - font-size: 12px; - line-height: 1.5; - border: 1px solid #ccc; - padding: 10px; } -*/ - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; -} - -/* IE indents via margin-left */ -li.L0, -li.L1, -li.L2, -li.L3, -li.L4, -li.L5, -li.L6, -li.L7, -li.L8, -li.L9 { - /* */ -} - -/* Alternate shading for lines */ -li.L1, -li.L3, -li.L5, -li.L7, -li.L9 { - /* */ -} diff --git a/docs/types/Types.Auth0Response.html b/docs/types/Types.Auth0Response.html new file mode 100644 index 00000000..5f59bb3a --- /dev/null +++ b/docs/types/Types.Auth0Response.html @@ -0,0 +1,782 @@ + + + + + + Auth0Response | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Type alias Auth0Response<TData>

    +
    +
    + Auth0Response<TData>: + {
        headers?: Headers;
        json?: TData;
        ok?: boolean;
        status: number;
        text?: string;
    } +
    +
    +

    Type Parameters

    +
      +
    • +

      TData

      +
    • +
    +
    +
    +

    Type declaration

    +
      +
    • +
      + Optional + headers?: Headers +
      +
    • +
    • +
      + Optional + json?: TData +
      +
    • +
    • +
      + Optional + ok?: boolean +
      +
    • +
    • +
      + status: number +
      +
    • +
    • +
      + Optional + text?: string +
      +
    • +
    +
    + +
    + +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/types/Types.Credentials.html b/docs/types/Types.Credentials.html new file mode 100644 index 00000000..af381566 --- /dev/null +++ b/docs/types/Types.Credentials.html @@ -0,0 +1,819 @@ + + + + + + Credentials | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Type alias Credentials

    +
    +
    + Credentials: + {
        accessToken: string;
        expiresIn: number;
        idToken: string;
        refreshToken?: string;
        scope?: string;
        tokenType: string;
        [key: + string]: any;
    } +
    +
    +

    Type declaration

    +
      +
    • +
      + [key: + string]: any +
      +
    • +
    • +
      + accessToken: string +
      +
      +

      The token used to make API calls

      +
      +
      +
    • +
    • +
      + expiresIn: number +
      +
      +

      + Used to denote when the token will expire from the issued time +

      +
      +
      +
    • +
    • +
      + idToken: string +
      +
      +

      A token in JWT format that has user claims

      +
      +
      +
    • +
    • +
      + Optional + refreshToken?: string +
      +
      +

      The token used to refresh the access token

      +
      +
      +
    • +
    • +
      + Optional + scope?: string +
      +
      +

      Represents the scope of the current token

      +
      +
      +
    • +
    • +
      + tokenType: string +
      +
      +

      The type of the token, e.g.: Bearer

      +
      +
      +
    • +
    +
    + +
    + +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/types/Types.MultifactorChallengeOOBResponse.html b/docs/types/Types.MultifactorChallengeOOBResponse.html new file mode 100644 index 00000000..ad0d690a --- /dev/null +++ b/docs/types/Types.MultifactorChallengeOOBResponse.html @@ -0,0 +1,733 @@ + + + + + + MultifactorChallengeOOBResponse | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Type alias MultifactorChallengeOOBResponse

    +
    +
    + MultifactorChallengeOOBResponse: + MultifactorChallengeOTPResponse & {
        oobCode: string;
    } +
    +
    +

    Type declaration

    +
      +
    • +
      + oobCode: string +
      +
    • +
    +
    + +
    + +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/types/Types.MultifactorChallengeOOBWithBindingResponse.html b/docs/types/Types.MultifactorChallengeOOBWithBindingResponse.html new file mode 100644 index 00000000..5d8f51ab --- /dev/null +++ b/docs/types/Types.MultifactorChallengeOOBWithBindingResponse.html @@ -0,0 +1,734 @@ + + + + + + + MultifactorChallengeOOBWithBindingResponse | react-native-auth0 + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Type alias MultifactorChallengeOOBWithBindingResponse

    +
    +
    + MultifactorChallengeOOBWithBindingResponse: + MultifactorChallengeOOBResponse & {
        bindingMethod: string;
    } +
    +
    +

    Type declaration

    +
      +
    • +
      + bindingMethod: string +
      +
    • +
    +
    + +
    + +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/types/Types.MultifactorChallengeOTPResponse.html b/docs/types/Types.MultifactorChallengeOTPResponse.html new file mode 100644 index 00000000..332442de --- /dev/null +++ b/docs/types/Types.MultifactorChallengeOTPResponse.html @@ -0,0 +1,728 @@ + + + + + + MultifactorChallengeOTPResponse | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Type alias MultifactorChallengeOTPResponse

    +
    +
    + MultifactorChallengeOTPResponse: + {
        challengeType: string;
    } +
    +
    +

    Type declaration

    +
      +
    • +
      + challengeType: string +
      +
    • +
    +
    + +
    + +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/types/Types.MultifactorChallengeResponse.html b/docs/types/Types.MultifactorChallengeResponse.html new file mode 100644 index 00000000..6a7c7a13 --- /dev/null +++ b/docs/types/Types.MultifactorChallengeResponse.html @@ -0,0 +1,723 @@ + + + + + + MultifactorChallengeResponse | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Type alias MultifactorChallengeResponse

    +
    + + +
    + +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/types/Types.Telemetry.html b/docs/types/Types.Telemetry.html new file mode 100644 index 00000000..5d4c1e3e --- /dev/null +++ b/docs/types/Types.Telemetry.html @@ -0,0 +1,746 @@ + + + + + + Telemetry | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Type alias Telemetry

    +
    +
    + Telemetry: + {
        env?: any;
        name?: string;
        version?: string;
    } +
    +
    +

    Type declaration

    +
      +
    • +
      + Optional + env?: any +
      +
    • +
    • +
      + Optional + name?: string +
      +
    • +
    • +
      + Optional + version?: string +
      +
    • +
    +
    + +
    + +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/types/Types.User.html b/docs/types/Types.User.html new file mode 100644 index 00000000..a53dceb5 --- /dev/null +++ b/docs/types/Types.User.html @@ -0,0 +1,966 @@ + + + + + + User | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Type alias User

    +
    +
    + User: + {
        address?: string;
        birthdate?: string;
        email?: string;
        emailVerified?: boolean;
        familyName?: string;
        gender?: string;
        givenName?: string;
        locale?: string;
        middleName?: string;
        name?: string;
        nickname?: string;
        phoneNumber?: string;
        phoneNumberVerified?: boolean;
        picture?: string;
        preferredUsername?: string;
        profile?: string;
        sub?: string;
        updatedAt?: string;
        website?: string;
        zoneinfo?: string;
        [key: + string]: any;
    } +
    +
    +

    Type declaration

    +
      +
    • +
      + [key: + string]: any +
      +
    • +
    • +
      + Optional + address?: string +
      +
    • +
    • +
      + Optional + birthdate?: string +
      +
    • +
    • +
      + Optional + email?: string +
      +
    • +
    • +
      + Optional + emailVerified?: boolean +
      +
    • +
    • +
      + Optional + familyName?: string +
      +
    • +
    • +
      + Optional + gender?: string +
      +
    • +
    • +
      + Optional + givenName?: string +
      +
    • +
    • +
      + Optional + locale?: string +
      +
    • +
    • +
      + Optional + middleName?: string +
      +
    • +
    • +
      + Optional + name?: string +
      +
    • +
    • +
      + Optional + nickname?: string +
      +
    • +
    • +
      + Optional + phoneNumber?: string +
      +
    • +
    • +
      + Optional + phoneNumberVerified?: boolean +
      +
    • +
    • +
      + Optional + picture?: string +
      +
    • +
    • +
      + Optional + preferredUsername?: string +
      +
    • +
    • +
      + Optional + profile?: string +
      +
    • +
    • +
      + Optional + sub?: string +
      +
    • +
    • +
      + Optional + updatedAt?: string +
      +
    • +
    • +
      + Optional + website?: string +
      +
    • +
    • +
      + Optional + zoneinfo?: string +
      +
    • +
    +
    + +
    + +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/variables/Auth0Provider.propTypes.html b/docs/variables/Auth0Provider.propTypes.html new file mode 100644 index 00000000..4e1aad07 --- /dev/null +++ b/docs/variables/Auth0Provider.propTypes.html @@ -0,0 +1,458 @@ + + + + + + propTypes | react-native-auth0 + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    + +

    Variable propTypes

    +
    +
    + propTypes: + {
        children: Validator<ReactElementLike>;
        clientId: Validator<string>;
        domain: Validator<string>;
    } +
    +
    +

    Type declaration

    +
      +
    • +
      + children: Validator<ReactElementLike> +
      +
    • +
    • +
      + clientId: Validator<string> +
      +
    • +
    • +
      + domain: Validator<string> +
      +
    • +
    +
    + +
    +
    + + +
    +
    +
    +

    + Generated using + TypeDoc +

    +
    +
    + + diff --git a/docs/webauth_index.js.html b/docs/webauth_index.js.html deleted file mode 100644 index 13b52436..00000000 --- a/docs/webauth_index.js.html +++ /dev/null @@ -1,456 +0,0 @@ - - - - - - webauth/index.js - Documentation - - - - - - - - - - - - - - - - -
    -

    webauth/index.js

    - -
    -
    -
    import Agent from './agent';
    -import {NativeModules, Platform} from 'react-native';
    -
    -import url from 'url';
    -import AuthError from '../auth/authError';
    -import verifyToken from '../jwt';
    -
    -const {A0Auth0} = NativeModules;
    -
    -const callbackUri = (domain, customScheme) => {
    -  const bundleIdentifier = A0Auth0.bundleIdentifier;
    -  const lowerCasedIdentifier = bundleIdentifier.toLowerCase();
    -  if (!customScheme && bundleIdentifier !== lowerCasedIdentifier) {
    -    console.warn(
    -      'The Bundle Identifier or Application ID of your app contains uppercase characters and will be lowercased to build the Callback URL. Check the Auth0 dashboard to whitelist the right URL value.',
    -    );
    -  }
    -  return `${customScheme || lowerCasedIdentifier}://${domain}/${
    -    Platform.OS
    -  }/${bundleIdentifier}/callback`;
    -};
    -
    -/**
    - * Helper to perform Auth against Auth0 hosted login page
    - *
    - * It will use `/authorize` endpoint of the Authorization Server (AS)
    - * with Code Grant and Proof Key for Challenge Exchange (PKCE).
    - *
    - * @export
    - * @class WebAuth
    - * @see https://auth0.com/docs/api-auth/grant/authorization-code-pkce
    - */
    -class WebAuth {
    -  constructor(auth) {
    -    this.client = auth;
    -    const {baseUrl, clientId, domain} = auth;
    -    this.domain = domain;
    -    this.clientId = clientId;
    -    this.agent = new Agent();
    -  }
    -
    -  /**
    -   * Starts the AuthN/AuthZ transaction against the AS in the in-app browser.
    -   *
    -   * In iOS <11 it will use `SFSafariViewController`, in iOS 11 `SFAuthenticationSession`  and in iOS >11 `ASWebAuthenticationSession`.
    -   * In Android it will use Chrome Custom Tabs.
    -   *
    -   * To learn more about how to customize the authorize call, check the Universal Login Page
    -   * article at https://auth0.com/docs/hosted-pages/login
    -   *
    -   * @param {Object}  parameters Parameters to send on the AuthN/AuthZ request.
    -   * @param {String}  [parameters.state] Random string to prevent CSRF attacks and used to discard unexepcted results. By default its a cryptographically secure random.
    -   * @param {String}  [parameters.nonce] Random string to prevent replay attacks of id_tokens.
    -   * @param {String}  [parameters.audience] Identifier of Resource Server (RS) to be included as audience (aud claim) of the issued access token
    -   * @param {String}  [parameters.scope] Scopes requested for the issued tokens. e.g. `openid profile`
    -   * @param {String}  [parameters.connection] The name of the identity provider to use, e.g. "google-oauth2" or "facebook". When not set, it will display Auth0's Universal Login Page.
    -   * @param {Number}  [parameters.max_age] The allowable elapsed time in seconds since the last time the user was authenticated (optional).
    -   * @param {String}  [parameters.organization] the ID of the organization to join
    -   * @param {String}  [parameters.invitationUrl] the invitation URL to join an organization. Takes precedence over the "organization" parameter.
    -   * @param {Object}  options Other configuration options.
    -   * @param {Number}  [options.leeway] The amount of leeway, in seconds, to accommodate potential clock skew when validating an ID token's claims. Defaults to 60 seconds if not specified.
    -   * @param {Boolean} [options.ephemeralSession] Disable Single-Sign-On (SSO). It only affects iOS with versions 13 and above. Defaults to `false`.
    -   * @param {String}  [options.customScheme] Custom scheme to build the callback URL with.
    -   * @param {String}  [options.skipLegacyListener] Whether to register the event listener necessary for the SDK to work on iOS <11 or not. Defaults to `false`.
    -   * @returns {Promise}
    -   * @see https://auth0.com/docs/api/authentication#authorize-client
    -   *
    -   * @memberof WebAuth
    -   */
    -  authorize(parameters = {}, options = {}) {
    -    const {clientId, domain, client, agent} = this;
    -    return agent.newTransaction().then(({state, verifier, ...defaults}) => {
    -      const redirectUri = callbackUri(domain, options.customScheme);
    -      const expectedState = parameters.state || state;
    -      if (parameters.invitationUrl) {
    -        const urlQuery = url.parse(parameters.invitationUrl, true).query;
    -        const {invitation, organization} = urlQuery;
    -        if (!invitation || !organization) {
    -          throw new AuthError({
    -            json: {
    -              error: 'a0.invalid_invitation_url',
    -              error_description: `The invitation URL provided doesn't contain the 'organization' or 'invitation' values.`,
    -            },
    -            status: 0,
    -          });
    -        }
    -        parameters.invitation = invitation;
    -        parameters.organization = organization;
    -      }
    -
    -      let query = {
    -        ...defaults,
    -        clientId,
    -        responseType: 'code',
    -        redirectUri,
    -        state: expectedState,
    -        ...parameters,
    -      };
    -      const authorizeUrl = this.client.authorizeUrl(query);
    -      return agent
    -        .show(
    -          authorizeUrl,
    -          options.ephemeralSession,
    -          options.skipLegacyListener,
    -        )
    -        .then(redirectUrl => {
    -          if (!redirectUrl || !redirectUrl.startsWith(redirectUri)) {
    -            throw new AuthError({
    -              json: {
    -                error: 'a0.redirect_uri.not_expected',
    -                error_description: `Expected ${redirectUri} but got ${redirectUrl}`,
    -              },
    -              status: 0,
    -            });
    -          }
    -          const query = url.parse(redirectUrl, true).query;
    -          const {code, state: resultState, error} = query;
    -          if (error) {
    -            throw new AuthError({json: query, status: 0});
    -          }
    -          if (resultState !== expectedState) {
    -            throw new AuthError({
    -              json: {
    -                error: 'a0.state.invalid',
    -                error_description: `Invalid state received in redirect url`,
    -              },
    -              status: 0,
    -            });
    -          }
    -
    -          return client
    -            .exchange({code, verifier, redirectUri})
    -            .then(credentials => {
    -              return verifyToken(credentials.idToken, {
    -                domain,
    -                clientId,
    -                nonce: parameters.nonce,
    -                maxAge: parameters.max_age,
    -                scope: parameters.scope,
    -                leeway: options.leeway,
    -                orgId: parameters.organization,
    -              }).then(() => Promise.resolve(credentials));
    -            });
    -        });
    -    });
    -  }
    -
    -  /**
    -   *  Removes Auth0 session and optionally remove the Identity Provider session.
    -   *
    -   * In iOS <11 it will use `SFSafariViewController`, in iOS 11 `SFAuthenticationSession`  and in iOS >11 `ASWebAuthenticationSession`.
    -   * In Android it will use Chrome Custom Tabs.
    -   *
    -   * @param {Object} parameters Parameters to send
    -   * @param {Bool} [parameters.federated] Optionally remove the IdP session.
    -   * @param {String} [parameters.customScheme] Custom scheme to build the callback URL with.
    -   * @param {Object} options Other configuration options.
    -   * @param {String} [options.skipLegacyListener] Whether to register the event listener necessary for the SDK to work on iOS <11 or not. Defaults to `false`.
    -   * @returns {Promise}
    -   * @see https://auth0.com/docs/logout
    -   *
    -   * @memberof WebAuth
    -   */
    -  clearSession(parameters = {}, options = {}) {
    -    const {client, agent, domain, clientId} = this;
    -    parameters.clientId = clientId;
    -    parameters.returnTo = callbackUri(domain, parameters.customScheme);
    -    parameters.federated = parameters.federated || false;
    -    const logoutUrl = client.logoutUrl(parameters);
    -    return agent.show(logoutUrl, false, options.skipLegacyListener, true);
    -  }
    -}
    -
    -export default WebAuth;
    -
    -
    -
    -
    - -
    - -
    - Generated by JSDoc 3.6.11 on - Thu Jun 15 2023 22:57:24 GMT+0530 (India Standard Time) using the Minami - theme. -
    - - - - - diff --git a/example/.bundle/config b/example/.bundle/config new file mode 100644 index 00000000..848943bb --- /dev/null +++ b/example/.bundle/config @@ -0,0 +1,2 @@ +BUNDLE_PATH: "vendor/bundle" +BUNDLE_FORCE_RUBY_PLATFORM: 1 diff --git a/example/.gitignore b/example/.gitignore new file mode 100644 index 00000000..318d73b8 --- /dev/null +++ b/example/.gitignore @@ -0,0 +1,58 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml + +# node.js +# +node_modules/ +package-lock.json # include if you are using npm - don't use both yarn and npm +npm-debug.log +yarn-error.log +yarn.lock # include if you are using yarn - don't use both npm and yarn + +# BUCK +buck-out/ +\.buckd/ +*.keystore + +# Fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use Fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/ + +*/fastlane/report.xml +*/fastlane/Preview.html +*/fastlane/screenshots + +# Bundle artifact +*.jsbundle \ No newline at end of file diff --git a/example/.node-version b/example/.node-version new file mode 100644 index 00000000..3c032078 --- /dev/null +++ b/example/.node-version @@ -0,0 +1 @@ +18 diff --git a/example/.watchmanconfig b/example/.watchmanconfig new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/example/.watchmanconfig @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/example/Gemfile b/example/Gemfile new file mode 100644 index 00000000..1142b1b2 --- /dev/null +++ b/example/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' + +# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version +ruby '>= 2.6.10' + +gem 'cocoapods', '>= 1.11.3' diff --git a/example/README.md b/example/README.md new file mode 100644 index 00000000..eaa4ead4 --- /dev/null +++ b/example/README.md @@ -0,0 +1,23 @@ +## Running the Example Application 🏃‍♂️ + +The Example application can be used for development purpose of the SDK. To integrate with Auth0, it is better to use the [Quickstart](https://auth0.com/docs/quickstart/native/react-native/interactive) and [Sample App](https://github.com/auth0-samples/auth0-react-native-sample/tree/master/00-Login-Hooks) applications + +To run the example application inside the repository, follow these steps: + +1. Open a terminal or command prompt. +2. Run `yarn run bootstrap` to set up the project. +3. Run `yarn run prepare` to build the project. +4. To run the application: + For Android, run `yarn example android`. + For iOS, run `yarn example ios`. + +The application will be built and launched on the specified platform, allowing you to interact with it. + +### To run on different Auth0 Application + +1. Change the `clientId` and `domain` value in `example/src/auth0-configuration.js` +2. For Android, Change the `auth0Domain` value in `example/android/app/build.gradle` + +``` +manifestPlaceholders = [auth0Domain: "YOUR_DOMAIN_HERE", auth0Scheme: "${applicationId}"] +``` diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle new file mode 100644 index 00000000..a9d55982 --- /dev/null +++ b/example/android/app/build.gradle @@ -0,0 +1,171 @@ +apply plugin: "com.android.application" +apply plugin: "com.facebook.react" + +import com.android.build.OutputFile + +/** + * This is the configuration block to customize your React Native Android app. + * By default you don't need to apply any configuration, just uncomment the lines you need. + */ +react { + /* Folders */ + // The root of your project, i.e. where "package.json" lives. Default is '..' + // root = file("../") + // The folder where the react-native NPM package is. Default is ../node_modules/react-native + // reactNativeDir = file("../node_modules/react-native") + // The folder where the react-native Codegen package is. Default is ../node_modules/react-native-codegen + // codegenDir = file("../node_modules/react-native-codegen") + // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js + // cliFile = file("../node_modules/react-native/cli.js") + + /* Variants */ + // The list of variants to that are debuggable. For those we're going to + // skip the bundling of the JS bundle and the assets. By default is just 'debug'. + // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. + // debuggableVariants = ["liteDebug", "prodDebug"] + + /* Bundling */ + // A list containing the node command and its flags. Default is just 'node'. + // nodeExecutableAndArgs = ["node"] + // + // The command to run when bundling. By default is 'bundle' + // bundleCommand = "ram-bundle" + // + // The path to the CLI configuration file. Default is empty. + // bundleConfig = file(../rn-cli.config.js) + // + // The name of the generated asset file containing your JS bundle + // bundleAssetName = "MyApplication.android.bundle" + // + // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' + // entryFile = file("../js/MyApplication.android.js") + // + // A list of extra flags to pass to the 'bundle' commands. + // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle + // extraPackagerArgs = [] + + /* Hermes Commands */ + // The hermes compiler command to run. By default it is 'hermesc' + // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" + // + // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" + // hermesFlags = ["-O", "-output-source-map"] +} + +/** + * Set this to true to create four separate APKs instead of one, + * one for each native architecture. This is useful if you don't + * use App Bundles (https://developer.android.com/guide/app-bundle/) + * and want to have separate APKs to upload to the Play Store. + */ +def enableSeparateBuildPerCPUArchitecture = false + +/** + * Set this to true to Run Proguard on Release builds to minify the Java bytecode. + */ +def enableProguardInReleaseBuilds = false + +/** + * The preferred build flavor of JavaScriptCore (JSC) + * + * For example, to use the international variant, you can use: + * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` + * + * The international variant includes ICU i18n library and necessary data + * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that + * give correct results when using with locales other than en-US. Note that + * this variant is about 6MiB larger per architecture than default. + */ +def jscFlavor = 'org.webkit:android-jsc:+' + +/** + * Private function to get the list of Native Architectures you want to build. + * This reads the value from reactNativeArchitectures in your gradle.properties + * file and works together with the --active-arch-only flag of react-native run-android. + */ +def reactNativeArchitectures() { + def value = project.getProperties().get("reactNativeArchitectures") + return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] +} + +android { + ndkVersion rootProject.ext.ndkVersion + + compileSdkVersion rootProject.ext.compileSdkVersion + + namespace "com.auth0example" + defaultConfig { + applicationId "com.auth0example" + manifestPlaceholders = [auth0Domain: "brucke.auth0.com", auth0Scheme: "${applicationId}.auth0"] + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0" + } + + splits { + abi { + reset() + enable enableSeparateBuildPerCPUArchitecture + universalApk false // If true, also generate a universal APK + include (*reactNativeArchitectures()) + } + } + signingConfigs { + debug { + storeFile file('debug.keystore') + storePassword 'android' + keyAlias 'androiddebugkey' + keyPassword 'android' + } + } + buildTypes { + debug { + signingConfig signingConfigs.debug + } + release { + // Caution! In production, you need to generate your own keystore file. + // see https://reactnative.dev/docs/signed-apk-android. + signingConfig signingConfigs.debug + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + } + } + + // applicationVariants are e.g. debug, release + applicationVariants.all { variant -> + variant.outputs.each { output -> + // For each separate APK per architecture, set a unique version code as described here: + // https://developer.android.com/studio/build/configure-apk-splits.html + // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc. + def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] + def abi = output.getFilter(OutputFile.ABI) + if (abi != null) { // null for the universal-debug, universal-release variants + output.versionCodeOverride = + defaultConfig.versionCode * 1000 + versionCodes.get(abi) + } + + } + } +} + +dependencies { + // The version of react-native is set by the React Native Gradle Plugin + implementation("com.facebook.react:react-android") + + implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0") + + debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") + debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { + exclude group:'com.squareup.okhttp3', module:'okhttp' + } + + debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") + if (hermesEnabled.toBoolean()) { + implementation("com.facebook.react:hermes-android") + } else { + implementation jscFlavor + } +} + +apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) diff --git a/example/android/app/proguard-rules.pro b/example/android/app/proguard-rules.pro new file mode 100644 index 00000000..11b02572 --- /dev/null +++ b/example/android/app/proguard-rules.pro @@ -0,0 +1,10 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..4b185bc1 --- /dev/null +++ b/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/example/android/app/src/debug/java/com/auth0example/ReactNativeFlipper.java b/example/android/app/src/debug/java/com/auth0example/ReactNativeFlipper.java new file mode 100644 index 00000000..7e49e327 --- /dev/null +++ b/example/android/app/src/debug/java/com/auth0example/ReactNativeFlipper.java @@ -0,0 +1,75 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + *

    This source code is licensed under the MIT license found in the LICENSE file in the root + * directory of this source tree. + */ +package com.auth0example; + +import android.content.Context; +import com.facebook.flipper.android.AndroidFlipperClient; +import com.facebook.flipper.android.utils.FlipperUtils; +import com.facebook.flipper.core.FlipperClient; +import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; +import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin; +import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin; +import com.facebook.flipper.plugins.inspector.DescriptorMapping; +import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; +import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; +import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; +import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; +import com.facebook.react.ReactInstanceEventListener; +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.bridge.ReactContext; +import com.facebook.react.modules.network.NetworkingModule; +import okhttp3.OkHttpClient; + +/** + * Class responsible of loading Flipper inside your React Native application. This is the debug + * flavor of it. Here you can add your own plugins and customize the Flipper setup. + */ +public class ReactNativeFlipper { + public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { + if (FlipperUtils.shouldEnableFlipper(context)) { + final FlipperClient client = AndroidFlipperClient.getInstance(context); + + client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); + client.addPlugin(new DatabasesFlipperPlugin(context)); + client.addPlugin(new SharedPreferencesFlipperPlugin(context)); + client.addPlugin(CrashReporterPlugin.getInstance()); + + NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); + NetworkingModule.setCustomClientBuilder( + new NetworkingModule.CustomClientBuilder() { + @Override + public void apply(OkHttpClient.Builder builder) { + builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); + } + }); + client.addPlugin(networkFlipperPlugin); + client.start(); + + // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized + // Hence we run if after all native modules have been initialized + ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); + if (reactContext == null) { + reactInstanceManager.addReactInstanceEventListener( + new ReactInstanceEventListener() { + @Override + public void onReactContextInitialized(ReactContext reactContext) { + reactInstanceManager.removeReactInstanceEventListener(this); + reactContext.runOnNativeModulesQueueThread( + new Runnable() { + @Override + public void run() { + client.addPlugin(new FrescoFlipperPlugin()); + } + }); + } + }); + } else { + client.addPlugin(new FrescoFlipperPlugin()); + } + } + } +} diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..4122f36a --- /dev/null +++ b/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + diff --git a/example/android/app/src/main/java/com/auth0example/MainActivity.java b/example/android/app/src/main/java/com/auth0example/MainActivity.java new file mode 100644 index 00000000..150a1442 --- /dev/null +++ b/example/android/app/src/main/java/com/auth0example/MainActivity.java @@ -0,0 +1,35 @@ +package com.auth0example; + +import com.facebook.react.ReactActivity; +import com.facebook.react.ReactActivityDelegate; +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; +import com.facebook.react.defaults.DefaultReactActivityDelegate; + +public class MainActivity extends ReactActivity { + + /** + * Returns the name of the main component registered from JavaScript. This is used to schedule + * rendering of the component. + */ + @Override + protected String getMainComponentName() { + return "Auth0Example"; + } + + /** + * Returns the instance of the {@link ReactActivityDelegate}. Here we use a util class {@link + * DefaultReactActivityDelegate} which allows you to easily enable Fabric and Concurrent React + * (aka React 18) with two boolean flags. + */ + @Override + protected ReactActivityDelegate createReactActivityDelegate() { + return new DefaultReactActivityDelegate( + this, + getMainComponentName(), + // If you opted-in for the New Architecture, we enable the Fabric Renderer. + DefaultNewArchitectureEntryPoint.getFabricEnabled(), // fabricEnabled + // If you opted-in for the New Architecture, we enable Concurrent React (i.e. React 18). + DefaultNewArchitectureEntryPoint.getConcurrentReactEnabled() // concurrentRootEnabled + ); + } +} diff --git a/example/android/app/src/main/java/com/auth0example/MainApplication.java b/example/android/app/src/main/java/com/auth0example/MainApplication.java new file mode 100644 index 00000000..0a5ad22b --- /dev/null +++ b/example/android/app/src/main/java/com/auth0example/MainApplication.java @@ -0,0 +1,62 @@ +package com.auth0example; + +import android.app.Application; +import com.facebook.react.PackageList; +import com.facebook.react.ReactApplication; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; +import com.facebook.react.defaults.DefaultReactNativeHost; +import com.facebook.soloader.SoLoader; +import java.util.List; + +public class MainApplication extends Application implements ReactApplication { + + private final ReactNativeHost mReactNativeHost = + new DefaultReactNativeHost(this) { + @Override + public boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } + + @Override + protected List getPackages() { + @SuppressWarnings("UnnecessaryLocalVariable") + List packages = new PackageList(this).getPackages(); + // Packages that cannot be autolinked yet can be added manually here, for example: + // packages.add(new MyReactNativePackage()); + return packages; + } + + @Override + protected String getJSMainModuleName() { + return "index"; + } + + @Override + protected boolean isNewArchEnabled() { + return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; + } + + @Override + protected Boolean isHermesEnabled() { + return BuildConfig.IS_HERMES_ENABLED; + } + }; + + @Override + public ReactNativeHost getReactNativeHost() { + return mReactNativeHost; + } + + @Override + public void onCreate() { + super.onCreate(); + SoLoader.init(this, /* native exopackage */ false); + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + // If you opted-in for the New Architecture, we load the native entry point for this app. + DefaultNewArchitectureEntryPoint.load(); + } + ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); + } +} diff --git a/example/android/app/src/main/res/drawable/rn_edit_text_material.xml b/example/android/app/src/main/res/drawable/rn_edit_text_material.xml new file mode 100644 index 00000000..f35d9962 --- /dev/null +++ b/example/android/app/src/main/res/drawable/rn_edit_text_material.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f5908281d070150700378b64a84c7db1f97aa1 GIT binary patch literal 3056 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 axPAxe%7rDusX+w*00006jj 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⁣ zwiG+x#%j}{0gU~J8;<|!B1@-XaB@{KORFwrYg_8rOv({b0EO#DbeQRm;B6_9=mXGf z-x|VL{zd`)#@yN}HkCSJbjbNlE|zL3Wm9Q8HY`sV)}3%pgN>cL^67{Z;PPL(*wT8N zUjXU{@|*hvm}({wsAC=x0^ok0%UAz0;sogW{B!nDqk|JJ5x~4NfTDgP49^zeu`csl?5mY@JdQdISc zFs!E{^grmkLnUk9 zny~m)1vws@5BFI<-0Tuo2JWX(0v`W|t(wg;s--L47WTvTMz-8l#TL^=OJNRS2?_Qj z3AKT+gvbyBi#H*-tJ%tWD|>EV3wy|8qxfzS!5RW;Jpl5*zo&^UBU=fG#2}UvRyNkK zA06Dy9;K1ca@r2T>yThYgI!ont$(G{6q#2QT+00r_x0(b)gsE`lBB?2gr55gq^D3Fi&p%E(p9>U%bv zkg1Jco(RbyTX7FDHOnl7-O@ zI$AaIl?9NJKPm(WiBP`1-#CB1QzU>&hKm)fpa5DKE{2$X0hGz-0uZ?cyTk(YC!Y&| zL=1VrNERSA5NA2jq7FACfX4JfPyj5XXl1yv0>~s;eF7L2$>&oMqeTFT2m$y7FlkON z_yurD1yIOvA;5C6016pyxBznGUt0kJ&k5r#;&>Jow`r)sp9R~PmK~lz$3xH%LT*1U zJdOyABZ3!FvNoR*vN$5ykHS8f`jA4zV+|L}i1C4`B2c{R0;UdYxaU|H)2avz@ z=mEYc|2S<+(B2Tj+FkX+2D+yFI!k9lWMA61DJ{)e;lum$(;O87?vGJJe!KtK04+N_ zI*P~t@dUb>9Xh{dbyl{-ZQ(UMgz7$|QfL5XSPkskt^NgctYC#;4WcZB1@%@wy@2t3 z2z0DI7&%b$*Aw~abe?GxE`ez@+6hOh-6*8fHRV{1os$EL@}uUZeG4h1&Be`98q*7j z=3-v+lhIjfWVo12!<>%V^a6lTgW3+_#W6n|p*~==zOH7z$0{LSZk(Tpd7EaD04hnA zL;#fxS0aD{`5^&D`}>0Uq?byDD-l2=!wm_bLcUl4gc(% za1p|itVANvFF>hghAS07Im1;IK;|b*W)}VDyI;BIp2=K*yu2a)j?B|f<44NI$NbmJ z#dE0>jI$fMr&@>4kN8MLFb4&2O9fEKaQg%(QO$4_1rVQywG^CmBLh#}_7gKW3vd?| z2?1^&KWq8}8I^_S0|)MowU_pw$q@nl@Nkn$z>BQq_KA^9yaR`(R3u{{Ig;cwt z@AJ^{ODQCm^neroM9nKNUAXi9RCK`OsP_LuR0PUR(YZCCX5dNF6VzcoK&=b^r`W?ltt|*F zpkoae%ZT{C1h~EcFui~b7fF`vb<<~j_VquuUA$}QqIKYELPp#;{u?q8Dz}WAG-(3; zjrm$i%7UbyZMM(Y{>!uJ#vNB?R~B{6Htp=>e*<{fQQ5W7V(1coCWlOON!MzZxhum| ztZBQpGR z;~#ur^&PockKdV{Q6R>o`Pl{0x!DEbpZ7y9Y;*ZvE!*gU`V1W3znva{f=?WO5I&>B z&hw6}tjECtaghm5z|C#%M;Yf_*pI^};h}Vl=^r9EN=tVDj86D;C$jIJ?K7VP+00000NkvXXu0mjf D5i!M* literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..459ca609d3ae0d3943ab44cdc27feef9256dc6d7 GIT binary patch literal 7098 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 literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8ca12fe024be86e868d14e91120a6902f8e88ac6 GIT binary patch literal 6464 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 B0*L?s literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..8e19b410a1b15ff180f3dacac19395fe3046cdec GIT binary patch literal 10676 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 literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..4c19a13c239cb67b8a2134ddd5f325db1d2d5bee GIT binary patch literal 15523 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 BIP(Ai literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/values/strings.xml b/example/android/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..467276c5 --- /dev/null +++ b/example/android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Auth0Example + diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..7ba83a2a --- /dev/null +++ b/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/example/android/app/src/release/java/com/auth0example/ReactNativeFlipper.java b/example/android/app/src/release/java/com/auth0example/ReactNativeFlipper.java new file mode 100644 index 00000000..a30a36f1 --- /dev/null +++ b/example/android/app/src/release/java/com/auth0example/ReactNativeFlipper.java @@ -0,0 +1,20 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + *

    This source code is licensed under the MIT license found in the LICENSE file in the root + * directory of this source tree. + */ +package com.auth0example; + +import android.content.Context; +import com.facebook.react.ReactInstanceManager; + +/** + * Class responsible of loading Flipper inside your React Native application. This is the release + * flavor of it so it's empty as we don't want to load Flipper. + */ +public class ReactNativeFlipper { + public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { + // Do nothing as we don't want to initialize Flipper on Release. + } +} diff --git a/example/android/build.gradle b/example/android/build.gradle new file mode 100644 index 00000000..67d887b0 --- /dev/null +++ b/example/android/build.gradle @@ -0,0 +1,21 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + ext { + buildToolsVersion = "33.0.0" + minSdkVersion = 21 + compileSdkVersion = 33 + targetSdkVersion = 33 + + // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. + ndkVersion = "23.1.7779620" + } + repositories { + google() + mavenCentral() + } + dependencies { + classpath("com.android.tools.build:gradle:7.3.1") + classpath("com.facebook.react:react-native-gradle-plugin") + } +} diff --git a/example/android/gradle.properties b/example/android/gradle.properties new file mode 100644 index 00000000..e4af465e --- /dev/null +++ b/example/android/gradle.properties @@ -0,0 +1,44 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true + +# Version of flipper SDK to use with React Native +FLIPPER_VERSION=0.125.0 + +# Use this property to specify which architecture you want to build. +# You can also override it from the CLI using +# ./gradlew -PreactNativeArchitectures=x86_64 +reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 + +# Use this property to enable support to the new architecture. +# This will allow you to use TurboModules and the Fabric render in +# your application. You should enable this flag either if you want +# to write custom TurboModules/Fabric components OR use libraries that +# are providing them. +newArchEnabled=false + +# Use this property to enable or disable the Hermes JS engine. +# If set to false, you will be using JSC instead. +hermesEnabled=true diff --git a/example/android/gradle/wrapper/gradle-wrapper.jar b/example/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 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 literal 0 HcmV?d00001 diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..8fad3f5a --- /dev/null +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/example/android/gradlew b/example/android/gradlew new file mode 100755 index 00000000..1b6c7873 --- /dev/null +++ b/example/android/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/example/android/gradlew.bat b/example/android/gradlew.bat new file mode 100644 index 00000000..ac1b06f9 --- /dev/null +++ b/example/android/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/example/android/settings.gradle b/example/android/settings.gradle new file mode 100644 index 00000000..c00eec9a --- /dev/null +++ b/example/android/settings.gradle @@ -0,0 +1,4 @@ +rootProject.name = 'Auth0Example' +apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) +include ':app' +includeBuild('../node_modules/react-native-gradle-plugin') diff --git a/example/app.json b/example/app.json new file mode 100644 index 00000000..0b661a9b --- /dev/null +++ b/example/app.json @@ -0,0 +1,4 @@ +{ + "name": "Auth0Example", + "displayName": "Auth0Example" +} diff --git a/example/babel.config.js b/example/babel.config.js new file mode 100644 index 00000000..adea77bd --- /dev/null +++ b/example/babel.config.js @@ -0,0 +1,17 @@ +const path = require('path'); +const pak = require('../package.json'); + +module.exports = { + presets: ['module:metro-react-native-babel-preset'], + plugins: [ + [ + 'module-resolver', + { + extensions: ['.tsx', '.ts', '.js', '.json'], + alias: { + [pak.name]: path.join(__dirname, '..', pak.source), + }, + }, + ], + ], +}; diff --git a/example/index.js b/example/index.js new file mode 100644 index 00000000..117ddcae --- /dev/null +++ b/example/index.js @@ -0,0 +1,5 @@ +import { AppRegistry } from 'react-native'; +import App from './src/App'; +import { name as appName } from './app.json'; + +AppRegistry.registerComponent(appName, () => App); diff --git a/example/ios/.xcode.env b/example/ios/.xcode.env new file mode 100644 index 00000000..3d5782c7 --- /dev/null +++ b/example/ios/.xcode.env @@ -0,0 +1,11 @@ +# This `.xcode.env` file is versioned and is used to source the environment +# used when running script phases inside Xcode. +# To customize your local environment, you can create an `.xcode.env.local` +# file that is not versioned. + +# NODE_BINARY variable contains the PATH to the node executable. +# +# Customize the NODE_BINARY variable here. +# For example, to use nvm with brew, add the following line +# . "$(brew --prefix nvm)/nvm.sh" --no-use +export NODE_BINARY=$(command -v node) diff --git a/example/ios/Auth0Example-Bridging-Header.h b/example/ios/Auth0Example-Bridging-Header.h new file mode 100644 index 00000000..e11d920b --- /dev/null +++ b/example/ios/Auth0Example-Bridging-Header.h @@ -0,0 +1,3 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// diff --git a/example/ios/Auth0Example.xcodeproj/project.pbxproj b/example/ios/Auth0Example.xcodeproj/project.pbxproj new file mode 100644 index 00000000..f374d8b3 --- /dev/null +++ b/example/ios/Auth0Example.xcodeproj/project.pbxproj @@ -0,0 +1,704 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 00E356F31AD99517003FC87E /* Auth0ExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* Auth0ExampleTests.m */; }; + 0C80B921A6F3F58F76C31292 /* libPods-Auth0Example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-Auth0Example.a */; }; + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 7699B88040F8A987B510C191 /* libPods-Auth0Example-Auth0ExampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-Auth0Example-Auth0ExampleTests.a */; }; + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 13B07F861A680F5B00A75B9A; + remoteInfo = Auth0Example; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 00E356EE1AD99517003FC87E /* Auth0ExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Auth0ExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 00E356F21AD99517003FC87E /* Auth0ExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Auth0ExampleTests.m; sourceTree = ""; }; + 13B07F961A680F5B00A75B9A /* Auth0Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Auth0Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Auth0Example/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = Auth0Example/AppDelegate.mm; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Auth0Example/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Auth0Example/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Auth0Example/main.m; sourceTree = ""; }; + 19F6CBCC0A4E27FBF8BF4A61 /* libPods-Auth0Example-Auth0ExampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Auth0Example-Auth0ExampleTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B4392A12AC88292D35C810B /* Pods-Auth0Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Auth0Example.debug.xcconfig"; path = "Target Support Files/Pods-Auth0Example/Pods-Auth0Example.debug.xcconfig"; sourceTree = ""; }; + 5709B34CF0A7D63546082F79 /* Pods-Auth0Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Auth0Example.release.xcconfig"; path = "Target Support Files/Pods-Auth0Example/Pods-Auth0Example.release.xcconfig"; sourceTree = ""; }; + 5B7EB9410499542E8C5724F5 /* Pods-Auth0Example-Auth0ExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Auth0Example-Auth0ExampleTests.debug.xcconfig"; path = "Target Support Files/Pods-Auth0Example-Auth0ExampleTests/Pods-Auth0Example-Auth0ExampleTests.debug.xcconfig"; sourceTree = ""; }; + 5DCACB8F33CDC322A6C60F78 /* libPods-Auth0Example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Auth0Example.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = Auth0Example/LaunchScreen.storyboard; sourceTree = ""; }; + 89C6BE57DB24E9ADA2F236DE /* Pods-Auth0Example-Auth0ExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Auth0Example-Auth0ExampleTests.release.xcconfig"; path = "Target Support Files/Pods-Auth0Example-Auth0ExampleTests/Pods-Auth0Example-Auth0ExampleTests.release.xcconfig"; sourceTree = ""; }; + ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 00E356EB1AD99517003FC87E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7699B88040F8A987B510C191 /* libPods-Auth0Example-Auth0ExampleTests.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0C80B921A6F3F58F76C31292 /* libPods-Auth0Example.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 00E356EF1AD99517003FC87E /* Auth0ExampleTests */ = { + isa = PBXGroup; + children = ( + 00E356F21AD99517003FC87E /* Auth0ExampleTests.m */, + 00E356F01AD99517003FC87E /* Supporting Files */, + ); + path = Auth0ExampleTests; + sourceTree = ""; + }; + 00E356F01AD99517003FC87E /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 00E356F11AD99517003FC87E /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 13B07FAE1A68108700A75B9A /* Auth0Example */ = { + isa = PBXGroup; + children = ( + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.mm */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, + 13B07FB71A68108700A75B9A /* main.m */, + ); + name = Auth0Example; + sourceTree = ""; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED297162215061F000B7C4FE /* JavaScriptCore.framework */, + 5DCACB8F33CDC322A6C60F78 /* libPods-Auth0Example.a */, + 19F6CBCC0A4E27FBF8BF4A61 /* libPods-Auth0Example-Auth0ExampleTests.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = Libraries; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* Auth0Example */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 00E356EF1AD99517003FC87E /* Auth0ExampleTests */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + BBD78D7AC51CEA395F1C20DB /* Pods */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* Auth0Example.app */, + 00E356EE1AD99517003FC87E /* Auth0ExampleTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + BBD78D7AC51CEA395F1C20DB /* Pods */ = { + isa = PBXGroup; + children = ( + 3B4392A12AC88292D35C810B /* Pods-Auth0Example.debug.xcconfig */, + 5709B34CF0A7D63546082F79 /* Pods-Auth0Example.release.xcconfig */, + 5B7EB9410499542E8C5724F5 /* Pods-Auth0Example-Auth0ExampleTests.debug.xcconfig */, + 89C6BE57DB24E9ADA2F236DE /* Pods-Auth0Example-Auth0ExampleTests.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 00E356ED1AD99517003FC87E /* Auth0ExampleTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "Auth0ExampleTests" */; + buildPhases = ( + A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */, + 00E356EA1AD99517003FC87E /* Sources */, + 00E356EB1AD99517003FC87E /* Frameworks */, + 00E356EC1AD99517003FC87E /* Resources */, + C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */, + F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 00E356F51AD99517003FC87E /* PBXTargetDependency */, + ); + name = Auth0ExampleTests; + productName = Auth0ExampleTests; + productReference = 00E356EE1AD99517003FC87E /* Auth0ExampleTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 13B07F861A680F5B00A75B9A /* Auth0Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Auth0Example" */; + buildPhases = ( + C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, + FD10A7F022414F080027D42C /* Start Packager */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */, + E235C05ADACE081382539298 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Auth0Example; + productName = Auth0Example; + productReference = 13B07F961A680F5B00A75B9A /* Auth0Example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1210; + TargetAttributes = { + 00E356ED1AD99517003FC87E = { + CreatedOnToolsVersion = 6.2; + TestTargetID = 13B07F861A680F5B00A75B9A; + }; + 13B07F861A680F5B00A75B9A = { + LastSwiftMigration = 1120; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Auth0Example" */; + compatibilityVersion = "Xcode 12.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* Auth0Example */, + 00E356ED1AD99517003FC87E /* Auth0ExampleTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 00E356EC1AD99517003FC87E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/.xcode.env", + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + }; + 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Auth0Example/Pods-Auth0Example-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Auth0Example/Pods-Auth0Example-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Auth0Example/Pods-Auth0Example-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Auth0Example-Auth0ExampleTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Auth0Example-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Auth0Example-Auth0ExampleTests/Pods-Auth0Example-Auth0ExampleTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Auth0Example-Auth0ExampleTests/Pods-Auth0Example-Auth0ExampleTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Auth0Example-Auth0ExampleTests/Pods-Auth0Example-Auth0ExampleTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Auth0Example/Pods-Auth0Example-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Auth0Example/Pods-Auth0Example-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Auth0Example/Pods-Auth0Example-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Auth0Example-Auth0ExampleTests/Pods-Auth0Example-Auth0ExampleTests-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Auth0Example-Auth0ExampleTests/Pods-Auth0Example-Auth0ExampleTests-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Auth0Example-Auth0ExampleTests/Pods-Auth0Example-Auth0ExampleTests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + FD10A7F022414F080027D42C /* Start Packager */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Start Packager"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 00E356EA1AD99517003FC87E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00E356F31AD99517003FC87E /* Auth0ExampleTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 13B07F861A680F5B00A75B9A /* Auth0Example */; + targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 00E356F61AD99517003FC87E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-Auth0Example-Auth0ExampleTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = Auth0ExampleTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Auth0Example.app/Auth0Example"; + }; + name = Debug; + }; + 00E356F71AD99517003FC87E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-Auth0Example-Auth0ExampleTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COPY_PHASE_STRIP = NO; + INFOPLIST_FILE = Auth0ExampleTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Auth0Example.app/Auth0Example"; + }; + name = Release; + }; + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-Auth0Example.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Auth0Example/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.auth0example; + PRODUCT_NAME = Auth0Example; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-Auth0Example.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = Auth0Example/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.auth0example; + PRODUCT_NAME = Auth0Example; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "Auth0ExampleTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 00E356F61AD99517003FC87E /* Debug */, + 00E356F71AD99517003FC87E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Auth0Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Auth0Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/example/ios/Auth0Example.xcodeproj/xcshareddata/xcschemes/Auth0Example.xcscheme b/example/ios/Auth0Example.xcodeproj/xcshareddata/xcschemes/Auth0Example.xcscheme new file mode 100644 index 00000000..7ca312ba --- /dev/null +++ b/example/ios/Auth0Example.xcodeproj/xcshareddata/xcschemes/Auth0Example.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Auth0Example.xcworkspace/contents.xcworkspacedata b/example/ios/Auth0Example.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..546f7c6e --- /dev/null +++ b/example/ios/Auth0Example.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/example/ios/Auth0Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/ios/Auth0Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/example/ios/Auth0Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/example/ios/Auth0Example/AppDelegate.h b/example/ios/Auth0Example/AppDelegate.h new file mode 100644 index 00000000..5d280825 --- /dev/null +++ b/example/ios/Auth0Example/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : RCTAppDelegate + +@end diff --git a/example/ios/Auth0Example/AppDelegate.mm b/example/ios/Auth0Example/AppDelegate.mm new file mode 100644 index 00000000..9e33fb37 --- /dev/null +++ b/example/ios/Auth0Example/AppDelegate.mm @@ -0,0 +1,36 @@ +#import "AppDelegate.h" + +#import + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + self.moduleName = @"Auth0Example"; + // You can add your custom initial props in the dictionary below. + // They will be passed down to the ViewController used by React Native. + self.initialProps = @{}; + + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ +#if DEBUG + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; +#else + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; +#endif +} + +/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off. +/// +/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html +/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture). +/// @return: `true` if the `concurrentRoot` feature is enabled. Otherwise, it returns `false`. +- (BOOL)concurrentRootEnabled +{ + return true; +} + +@end diff --git a/example/ios/Auth0Example/Images.xcassets/AppIcon.appiconset/Contents.json b/example/ios/Auth0Example/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..ddd7fca8 --- /dev/null +++ b/example/ios/Auth0Example/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images": [ + { + "idiom": "iphone", + "scale": "2x", + "size": "20x20" + }, + { + "idiom": "iphone", + "scale": "3x", + "size": "20x20" + }, + { + "idiom": "iphone", + "scale": "2x", + "size": "29x29" + }, + { + "idiom": "iphone", + "scale": "3x", + "size": "29x29" + }, + { + "idiom": "iphone", + "scale": "2x", + "size": "40x40" + }, + { + "idiom": "iphone", + "scale": "3x", + "size": "40x40" + }, + { + "idiom": "iphone", + "scale": "2x", + "size": "60x60" + }, + { + "idiom": "iphone", + "scale": "3x", + "size": "60x60" + }, + { + "idiom": "ios-marketing", + "scale": "1x", + "size": "1024x1024" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} diff --git a/example/ios/Auth0Example/Images.xcassets/Contents.json b/example/ios/Auth0Example/Images.xcassets/Contents.json new file mode 100644 index 00000000..97a8662e --- /dev/null +++ b/example/ios/Auth0Example/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info": { + "version": 1, + "author": "xcode" + } +} diff --git a/example/ios/Auth0Example/Info.plist b/example/ios/Auth0Example/Info.plist new file mode 100644 index 00000000..7d53f236 --- /dev/null +++ b/example/ios/Auth0Example/Info.plist @@ -0,0 +1,68 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + Auth0Example + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleURLTypes + + + CFBundleTypeRole + None + CFBundleURLName + auth0 + CFBundleURLSchemes + + $(PRODUCT_BUNDLE_IDENTIFIER).auth0 + + + + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + NSLocationWhenInUseUsageDescription + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/example/ios/Auth0Example/LaunchScreen.storyboard b/example/ios/Auth0Example/LaunchScreen.storyboard new file mode 100644 index 00000000..82720df5 --- /dev/null +++ b/example/ios/Auth0Example/LaunchScreen.storyboard @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Auth0Example/main.m b/example/ios/Auth0Example/main.m new file mode 100644 index 00000000..d645c724 --- /dev/null +++ b/example/ios/Auth0Example/main.m @@ -0,0 +1,10 @@ +#import + +#import "AppDelegate.h" + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/example/ios/Auth0ExampleTests/Auth0ExampleTests.m b/example/ios/Auth0ExampleTests/Auth0ExampleTests.m new file mode 100644 index 00000000..f2414b44 --- /dev/null +++ b/example/ios/Auth0ExampleTests/Auth0ExampleTests.m @@ -0,0 +1,66 @@ +#import +#import + +#import +#import + +#define TIMEOUT_SECONDS 600 +#define TEXT_TO_LOOK_FOR @"Welcome to React" + +@interface Auth0ExampleTests : XCTestCase + +@end + +@implementation Auth0ExampleTests + +- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL (^)(UIView *view))test +{ + if (test(view)) { + return YES; + } + for (UIView *subview in [view subviews]) { + if ([self findSubviewInView:subview matching:test]) { + return YES; + } + } + return NO; +} + +- (void)testRendersWelcomeScreen +{ + UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; + NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; + BOOL foundElement = NO; + + __block NSString *redboxError = nil; +#ifdef DEBUG + RCTSetLogFunction( + ^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { + if (level >= RCTLogLevelError) { + redboxError = message; + } + }); +#endif + + while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { + [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + + foundElement = [self findSubviewInView:vc.view + matching:^BOOL(UIView *view) { + if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { + return YES; + } + return NO; + }]; + } + +#ifdef DEBUG + RCTSetLogFunction(RCTDefaultLogFunction); +#endif + + XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); + XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); +} + +@end diff --git a/example/ios/Auth0ExampleTests/Info.plist b/example/ios/Auth0ExampleTests/Info.plist new file mode 100644 index 00000000..ba72822e --- /dev/null +++ b/example/ios/Auth0ExampleTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/example/ios/File.swift b/example/ios/File.swift new file mode 100644 index 00000000..5bede8e4 --- /dev/null +++ b/example/ios/File.swift @@ -0,0 +1,6 @@ +// +// File.swift +// Auth0Example +// + +import Foundation diff --git a/example/ios/Podfile b/example/ios/Podfile new file mode 100644 index 00000000..5a1232ad --- /dev/null +++ b/example/ios/Podfile @@ -0,0 +1,60 @@ +require_relative '../node_modules/react-native/scripts/react_native_pods' +require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' + +platform :ios, '13.0' +prepare_react_native_project! + +# If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set. +# because `react-native-flipper` depends on (FlipperKit,...) that will be excluded +# +# To fix this you can also exclude `react-native-flipper` using a `react-native.config.js` +# ```js +# module.exports = { +# dependencies: { +# ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}), +# ``` +flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled + +linkage = ENV['USE_FRAMEWORKS'] +if linkage != nil + Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green + use_frameworks! :linkage => linkage.to_sym +end + +target 'Auth0Example' do + config = use_native_modules! + + # Flags change depending on the env values. + flags = get_default_flags() + + use_react_native!( + :path => config[:reactNativePath], + # Hermes is now enabled by default. Disable by setting this flag to false. + # Upcoming versions of React Native may rely on get_default_flags(), but + # we make it explicit here to aid in the React Native upgrade process. + :hermes_enabled => flags[:hermes_enabled], + :fabric_enabled => flags[:fabric_enabled], + # Enables Flipper. + # + # Note that if you have use_frameworks! enabled, Flipper will not work and + # you should disable the next line. + :flipper_configuration => flipper_config, + # An absolute path to your application root. + :app_path => "#{Pod::Config.instance.installation_root}/.." + ) + + target 'Auth0ExampleTests' do + inherit! :complete + # Pods for testing + end + + post_install do |installer| + react_native_post_install( + installer, + # Set `mac_catalyst_enabled` to `true` in order to apply patches + # necessary for Mac Catalyst builds + :mac_catalyst_enabled => false + ) + __apply_Xcode_12_5_M1_post_install_workaround(installer) + end +end diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock new file mode 100644 index 00000000..0f2a8168 --- /dev/null +++ b/example/ios/Podfile.lock @@ -0,0 +1,643 @@ +PODS: + - A0Auth0 (3.0.0-beta.3): + - Auth0 (= 2.5.0) + - JWTDecode (= 3.1.0) + - React-Core + - SimpleKeychain (= 1.1.0) + - Auth0 (2.5.0): + - JWTDecode (~> 3.1) + - SimpleKeychain (~> 1.1) + - boost (1.76.0) + - CocoaAsyncSocket (7.6.5) + - DoubleConversion (1.1.6) + - FBLazyVector (0.71.10) + - FBReactNativeSpec (0.71.10): + - RCT-Folly (= 2021.07.22.00) + - RCTRequired (= 0.71.10) + - RCTTypeSafety (= 0.71.10) + - React-Core (= 0.71.10) + - React-jsi (= 0.71.10) + - ReactCommon/turbomodule/core (= 0.71.10) + - Flipper (0.125.0): + - Flipper-Folly (~> 2.6) + - Flipper-RSocket (~> 1.4) + - Flipper-Boost-iOSX (1.76.0.1.11) + - Flipper-DoubleConversion (3.2.0.1) + - Flipper-Fmt (7.1.7) + - Flipper-Folly (2.6.10): + - Flipper-Boost-iOSX + - Flipper-DoubleConversion + - Flipper-Fmt (= 7.1.7) + - Flipper-Glog + - libevent (~> 2.1.12) + - OpenSSL-Universal (= 1.1.1100) + - Flipper-Glog (0.5.0.5) + - Flipper-PeerTalk (0.0.4) + - Flipper-RSocket (1.4.3): + - Flipper-Folly (~> 2.6) + - FlipperKit (0.125.0): + - FlipperKit/Core (= 0.125.0) + - FlipperKit/Core (0.125.0): + - Flipper (~> 0.125.0) + - FlipperKit/CppBridge + - FlipperKit/FBCxxFollyDynamicConvert + - FlipperKit/FBDefines + - FlipperKit/FKPortForwarding + - SocketRocket (~> 0.6.0) + - FlipperKit/CppBridge (0.125.0): + - Flipper (~> 0.125.0) + - FlipperKit/FBCxxFollyDynamicConvert (0.125.0): + - Flipper-Folly (~> 2.6) + - FlipperKit/FBDefines (0.125.0) + - FlipperKit/FKPortForwarding (0.125.0): + - CocoaAsyncSocket (~> 7.6) + - Flipper-PeerTalk (~> 0.0.4) + - FlipperKit/FlipperKitHighlightOverlay (0.125.0) + - FlipperKit/FlipperKitLayoutHelpers (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutTextSearchable + - FlipperKit/FlipperKitLayoutIOSDescriptors (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutHelpers + - YogaKit (~> 1.18) + - FlipperKit/FlipperKitLayoutPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutHelpers + - FlipperKit/FlipperKitLayoutIOSDescriptors + - FlipperKit/FlipperKitLayoutTextSearchable + - YogaKit (~> 1.18) + - FlipperKit/FlipperKitLayoutTextSearchable (0.125.0) + - FlipperKit/FlipperKitNetworkPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitReactPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitUserDefaultsPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/SKIOSNetworkPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitNetworkPlugin + - fmt (6.2.1) + - glog (0.3.5) + - hermes-engine (0.71.10): + - hermes-engine/Pre-built (= 0.71.10) + - hermes-engine/Pre-built (0.71.10) + - JWTDecode (3.1.0) + - libevent (2.1.12) + - OpenSSL-Universal (1.1.1100) + - RCT-Folly (2021.07.22.00): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - RCT-Folly/Default (= 2021.07.22.00) + - RCT-Folly/Default (2021.07.22.00): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - RCT-Folly/Futures (2021.07.22.00): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - libevent + - RCTRequired (0.71.10) + - RCTTypeSafety (0.71.10): + - FBLazyVector (= 0.71.10) + - RCTRequired (= 0.71.10) + - React-Core (= 0.71.10) + - React (0.71.10): + - React-Core (= 0.71.10) + - React-Core/DevSupport (= 0.71.10) + - React-Core/RCTWebSocket (= 0.71.10) + - React-RCTActionSheet (= 0.71.10) + - React-RCTAnimation (= 0.71.10) + - React-RCTBlob (= 0.71.10) + - React-RCTImage (= 0.71.10) + - React-RCTLinking (= 0.71.10) + - React-RCTNetwork (= 0.71.10) + - React-RCTSettings (= 0.71.10) + - React-RCTText (= 0.71.10) + - React-RCTVibration (= 0.71.10) + - React-callinvoker (0.71.10) + - React-Codegen (0.71.10): + - FBReactNativeSpec + - hermes-engine + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - React-jsi + - React-jsiexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - React-Core (0.71.10): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default (= 0.71.10) + - React-cxxreact (= 0.71.10) + - React-hermes + - React-jsi (= 0.71.10) + - React-jsiexecutor (= 0.71.10) + - React-perflogger (= 0.71.10) + - Yoga + - React-Core/CoreModulesHeaders (0.71.10): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.10) + - React-hermes + - React-jsi (= 0.71.10) + - React-jsiexecutor (= 0.71.10) + - React-perflogger (= 0.71.10) + - Yoga + - React-Core/Default (0.71.10): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-cxxreact (= 0.71.10) + - React-hermes + - React-jsi (= 0.71.10) + - React-jsiexecutor (= 0.71.10) + - React-perflogger (= 0.71.10) + - Yoga + - React-Core/DevSupport (0.71.10): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default (= 0.71.10) + - React-Core/RCTWebSocket (= 0.71.10) + - React-cxxreact (= 0.71.10) + - React-hermes + - React-jsi (= 0.71.10) + - React-jsiexecutor (= 0.71.10) + - React-jsinspector (= 0.71.10) + - React-perflogger (= 0.71.10) + - Yoga + - React-Core/RCTActionSheetHeaders (0.71.10): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.10) + - React-hermes + - React-jsi (= 0.71.10) + - React-jsiexecutor (= 0.71.10) + - React-perflogger (= 0.71.10) + - Yoga + - React-Core/RCTAnimationHeaders (0.71.10): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.10) + - React-hermes + - React-jsi (= 0.71.10) + - React-jsiexecutor (= 0.71.10) + - React-perflogger (= 0.71.10) + - Yoga + - React-Core/RCTBlobHeaders (0.71.10): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.10) + - React-hermes + - React-jsi (= 0.71.10) + - React-jsiexecutor (= 0.71.10) + - React-perflogger (= 0.71.10) + - Yoga + - React-Core/RCTImageHeaders (0.71.10): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.10) + - React-hermes + - React-jsi (= 0.71.10) + - React-jsiexecutor (= 0.71.10) + - React-perflogger (= 0.71.10) + - Yoga + - React-Core/RCTLinkingHeaders (0.71.10): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.10) + - React-hermes + - React-jsi (= 0.71.10) + - React-jsiexecutor (= 0.71.10) + - React-perflogger (= 0.71.10) + - Yoga + - React-Core/RCTNetworkHeaders (0.71.10): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.10) + - React-hermes + - React-jsi (= 0.71.10) + - React-jsiexecutor (= 0.71.10) + - React-perflogger (= 0.71.10) + - Yoga + - React-Core/RCTSettingsHeaders (0.71.10): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.10) + - React-hermes + - React-jsi (= 0.71.10) + - React-jsiexecutor (= 0.71.10) + - React-perflogger (= 0.71.10) + - Yoga + - React-Core/RCTTextHeaders (0.71.10): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.10) + - React-hermes + - React-jsi (= 0.71.10) + - React-jsiexecutor (= 0.71.10) + - React-perflogger (= 0.71.10) + - Yoga + - React-Core/RCTVibrationHeaders (0.71.10): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.10) + - React-hermes + - React-jsi (= 0.71.10) + - React-jsiexecutor (= 0.71.10) + - React-perflogger (= 0.71.10) + - Yoga + - React-Core/RCTWebSocket (0.71.10): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default (= 0.71.10) + - React-cxxreact (= 0.71.10) + - React-hermes + - React-jsi (= 0.71.10) + - React-jsiexecutor (= 0.71.10) + - React-perflogger (= 0.71.10) + - Yoga + - React-CoreModules (0.71.10): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.71.10) + - React-Codegen (= 0.71.10) + - React-Core/CoreModulesHeaders (= 0.71.10) + - React-jsi (= 0.71.10) + - React-RCTBlob + - React-RCTImage (= 0.71.10) + - ReactCommon/turbomodule/core (= 0.71.10) + - React-cxxreact (0.71.10): + - boost (= 1.76.0) + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-callinvoker (= 0.71.10) + - React-jsi (= 0.71.10) + - React-jsinspector (= 0.71.10) + - React-logger (= 0.71.10) + - React-perflogger (= 0.71.10) + - React-runtimeexecutor (= 0.71.10) + - React-hermes (0.71.10): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - RCT-Folly/Futures (= 2021.07.22.00) + - React-cxxreact (= 0.71.10) + - React-jsi + - React-jsiexecutor (= 0.71.10) + - React-jsinspector (= 0.71.10) + - React-perflogger (= 0.71.10) + - React-jsi (0.71.10): + - boost (= 1.76.0) + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-jsiexecutor (0.71.10): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-cxxreact (= 0.71.10) + - React-jsi (= 0.71.10) + - React-perflogger (= 0.71.10) + - React-jsinspector (0.71.10) + - React-logger (0.71.10): + - glog + - React-perflogger (0.71.10) + - React-RCTActionSheet (0.71.10): + - React-Core/RCTActionSheetHeaders (= 0.71.10) + - React-RCTAnimation (0.71.10): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.71.10) + - React-Codegen (= 0.71.10) + - React-Core/RCTAnimationHeaders (= 0.71.10) + - React-jsi (= 0.71.10) + - ReactCommon/turbomodule/core (= 0.71.10) + - React-RCTAppDelegate (0.71.10): + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - ReactCommon/turbomodule/core + - React-RCTBlob (0.71.10): + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Codegen (= 0.71.10) + - React-Core/RCTBlobHeaders (= 0.71.10) + - React-Core/RCTWebSocket (= 0.71.10) + - React-jsi (= 0.71.10) + - React-RCTNetwork (= 0.71.10) + - ReactCommon/turbomodule/core (= 0.71.10) + - React-RCTImage (0.71.10): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.71.10) + - React-Codegen (= 0.71.10) + - React-Core/RCTImageHeaders (= 0.71.10) + - React-jsi (= 0.71.10) + - React-RCTNetwork (= 0.71.10) + - ReactCommon/turbomodule/core (= 0.71.10) + - React-RCTLinking (0.71.10): + - React-Codegen (= 0.71.10) + - React-Core/RCTLinkingHeaders (= 0.71.10) + - React-jsi (= 0.71.10) + - ReactCommon/turbomodule/core (= 0.71.10) + - React-RCTNetwork (0.71.10): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.71.10) + - React-Codegen (= 0.71.10) + - React-Core/RCTNetworkHeaders (= 0.71.10) + - React-jsi (= 0.71.10) + - ReactCommon/turbomodule/core (= 0.71.10) + - React-RCTSettings (0.71.10): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.71.10) + - React-Codegen (= 0.71.10) + - React-Core/RCTSettingsHeaders (= 0.71.10) + - React-jsi (= 0.71.10) + - ReactCommon/turbomodule/core (= 0.71.10) + - React-RCTText (0.71.10): + - React-Core/RCTTextHeaders (= 0.71.10) + - React-RCTVibration (0.71.10): + - RCT-Folly (= 2021.07.22.00) + - React-Codegen (= 0.71.10) + - React-Core/RCTVibrationHeaders (= 0.71.10) + - React-jsi (= 0.71.10) + - ReactCommon/turbomodule/core (= 0.71.10) + - React-runtimeexecutor (0.71.10): + - React-jsi (= 0.71.10) + - ReactCommon/turbomodule/bridging (0.71.10): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-callinvoker (= 0.71.10) + - React-Core (= 0.71.10) + - React-cxxreact (= 0.71.10) + - React-jsi (= 0.71.10) + - React-logger (= 0.71.10) + - React-perflogger (= 0.71.10) + - ReactCommon/turbomodule/core (0.71.10): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-callinvoker (= 0.71.10) + - React-Core (= 0.71.10) + - React-cxxreact (= 0.71.10) + - React-jsi (= 0.71.10) + - React-logger (= 0.71.10) + - React-perflogger (= 0.71.10) + - SimpleKeychain (1.1.0) + - SocketRocket (0.6.0) + - Yoga (1.14.0) + - YogaKit (1.18.1): + - Yoga (~> 1.14) + +DEPENDENCIES: + - A0Auth0 (from `../..`) + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) + - Flipper (= 0.125.0) + - Flipper-Boost-iOSX (= 1.76.0.1.11) + - Flipper-DoubleConversion (= 3.2.0.1) + - Flipper-Fmt (= 7.1.7) + - Flipper-Folly (= 2.6.10) + - Flipper-Glog (= 0.5.0.5) + - Flipper-PeerTalk (= 0.0.4) + - Flipper-RSocket (= 1.4.3) + - FlipperKit (= 0.125.0) + - FlipperKit/Core (= 0.125.0) + - FlipperKit/CppBridge (= 0.125.0) + - FlipperKit/FBCxxFollyDynamicConvert (= 0.125.0) + - FlipperKit/FBDefines (= 0.125.0) + - FlipperKit/FKPortForwarding (= 0.125.0) + - FlipperKit/FlipperKitHighlightOverlay (= 0.125.0) + - FlipperKit/FlipperKitLayoutPlugin (= 0.125.0) + - FlipperKit/FlipperKitLayoutTextSearchable (= 0.125.0) + - FlipperKit/FlipperKitNetworkPlugin (= 0.125.0) + - FlipperKit/FlipperKitReactPlugin (= 0.125.0) + - FlipperKit/FlipperKitUserDefaultsPlugin (= 0.125.0) + - FlipperKit/SKIOSNetworkPlugin (= 0.125.0) + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) + - libevent (~> 2.1.12) + - OpenSSL-Universal (= 1.1.1100) + - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Codegen (from `build/generated/ios`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/DevSupport (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) + - React-logger (from `../node_modules/react-native/ReactCommon/logger`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - Auth0 + - CocoaAsyncSocket + - Flipper + - Flipper-Boost-iOSX + - Flipper-DoubleConversion + - Flipper-Fmt + - Flipper-Folly + - Flipper-Glog + - Flipper-PeerTalk + - Flipper-RSocket + - FlipperKit + - fmt + - JWTDecode + - libevent + - OpenSSL-Universal + - SimpleKeychain + - SocketRocket + - YogaKit + +EXTERNAL SOURCES: + A0Auth0: + :path: "../.." + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + FBReactNativeSpec: + :path: "../node_modules/react-native/React/FBReactNativeSpec" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + hermes-engine: + :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTRequired: + :path: "../node_modules/react-native/Libraries/RCTRequired" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-callinvoker: + :path: "../node_modules/react-native/ReactCommon/callinvoker" + React-Codegen: + :path: build/generated/ios + React-Core: + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-hermes: + :path: "../node_modules/react-native/ReactCommon/hermes" + React-jsi: + :path: "../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../node_modules/react-native/ReactCommon/jsinspector" + React-logger: + :path: "../node_modules/react-native/ReactCommon/logger" + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTAppDelegate: + :path: "../node_modules/react-native/Libraries/AppDelegate" + React-RCTBlob: + :path: "../node_modules/react-native/Libraries/Blob" + React-RCTImage: + :path: "../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../node_modules/react-native/Libraries/Network" + React-RCTSettings: + :path: "../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../node_modules/react-native/Libraries/Vibration" + React-runtimeexecutor: + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + Yoga: + :path: "../node_modules/react-native/ReactCommon/yoga" + +SPEC CHECKSUMS: + A0Auth0: 9b09cdadf55316a7169a046ad4acaa73f0060cfa + Auth0: 72f19ad566fdf57f07bf37f828afd0c1570769a5 + boost: 57d2868c099736d80fcd648bf211b4431e51a558 + CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 + DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 + FBLazyVector: ddb55c55295ea51ed98aa7e2e08add2f826309d5 + FBReactNativeSpec: 90fc1a90b4b7a171e0a7c20ea426c1bf6ce4399c + Flipper: 26fc4b7382499f1281eb8cb921e5c3ad6de91fe0 + Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c + Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30 + Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b + Flipper-Folly: 584845625005ff068a6ebf41f857f468decd26b3 + Flipper-Glog: 70c50ce58ddaf67dc35180db05f191692570f446 + Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 + Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541 + FlipperKit: cbdee19bdd4e7f05472a66ce290f1b729ba3cb86 + fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 + glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b + hermes-engine: d27603b55a48402501ad1928c05411dae9cd6b85 + JWTDecode: 3eaab1e06b6f4dcbdd6716aff09ba4c2104ca8b7 + libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 + OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c + RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 + RCTRequired: 8ef706f91e2b643cd32c26a57700b5f24fab0585 + RCTTypeSafety: 5fbddd8eb9242b91ac0d901c01da3673f358b1b7 + React: e5d2d559e89d256a1d6da64d51adaecda9c8ddae + React-callinvoker: 352ecbafbdccca5fdf4aed99c98ae5b7fc28e39b + React-Codegen: fa660a71e24078b2e52a62ecc2f3048c2f8ae6d7 + React-Core: 4ec45c2d537fe58e6d878bec6a13e3e2bed9c182 + React-CoreModules: 63f7f9fda3d4b214040a80e3f47ab4fb9a3e88e6 + React-cxxreact: 1a729807190ebf98ce5fb0c3d2ed211e8b5f2f87 + React-hermes: eb93eb6e7921ecd4abcc6e741b327f40763e850f + React-jsi: 1995961abdff0c9af9aae8a6b24468f21811000e + React-jsiexecutor: 4bb480a183a354e4dbfb1012936b1a2bb9357de7 + React-jsinspector: cdc854f8b13abd202afa54bc12578e5afb9cfae1 + React-logger: ef2269b3afa6ba868da90496c3e17a4ec4f4cee0 + React-perflogger: 217095464d5c4bb70df0742fa86bf2a363693468 + React-RCTActionSheet: 8deae9b85a4cbc6a2243618ea62a374880a2c614 + React-RCTAnimation: 59c62353a8b59ce206044786c5d30e4754bffa64 + React-RCTAppDelegate: ef66a6904141fca96bffb00fac327a482b575f19 + React-RCTBlob: 8e518bae3d6ca97ffb7088da673fbbc53042d94d + React-RCTImage: 36c0324ff499802b9874d6803ca72026e90434f6 + React-RCTLinking: 401aec3a01b18c2c8ed93bf3a6758b87e617c58d + React-RCTNetwork: cb25b9f2737c3aa2cde0fe0bd7ff7fabf7bf9ad0 + React-RCTSettings: cb6ae9f656e1c880500c2ecbe8e72861c2262afa + React-RCTText: 7404fd01809244d79d456f92cfe6f9fbadf69209 + React-RCTVibration: d13cc2d63286c633393d3a7f6f607cc2a09ec011 + React-runtimeexecutor: a9a1cd79996c9a0846e3232ecb25c64e1cc0172e + ReactCommon: 65718685d4095d06b4b1af8042e12f1df2925c31 + SimpleKeychain: f8707c8e97b38c6a6e687b17732afc9bcef06439 + SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 + Yoga: e7ea9e590e27460d28911403b894722354d73479 + YogaKit: f782866e155069a2cca2517aafea43200b01fd5a + +PODFILE CHECKSUM: 78e8dab006d0d9a82e41a924fda07d925d4623c7 + +COCOAPODS: 1.12.1 diff --git a/example/metro.config.js b/example/metro.config.js new file mode 100644 index 00000000..b5c0064b --- /dev/null +++ b/example/metro.config.js @@ -0,0 +1,40 @@ +const path = require('path'); +const escape = require('escape-string-regexp'); +const exclusionList = require('metro-config/src/defaults/exclusionList'); +const pak = require('../package.json'); + +const root = path.resolve(__dirname, '..'); + +const modules = Object.keys({ + ...pak.peerDependencies, +}); + +module.exports = { + projectRoot: __dirname, + watchFolders: [root], + + // We need to make sure that only one version is loaded for peerDependencies + // So we block them at the root, and alias them to the versions in example's node_modules + resolver: { + blacklistRE: exclusionList( + modules.map( + (m) => + new RegExp(`^${escape(path.join(root, 'node_modules', m))}\\/.*$`) + ) + ), + + extraNodeModules: modules.reduce((acc, name) => { + acc[name] = path.join(__dirname, 'node_modules', name); + return acc; + }, {}), + }, + + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: true, + }, + }), + }, +}; diff --git a/example/package.json b/example/package.json new file mode 100644 index 00000000..7641bc1c --- /dev/null +++ b/example/package.json @@ -0,0 +1,22 @@ +{ + "name": "Auth0Example", + "version": "0.0.1", + "private": true, + "scripts": { + "android": "react-native run-android", + "ios": "react-native run-ios", + "start": "react-native start", + "pods": "pod-install --quiet" + }, + "dependencies": { + "react": "18.2.0", + "react-native": "0.71.10" + }, + "devDependencies": { + "@babel/core": "^7.20.0", + "@babel/preset-env": "^7.20.0", + "@babel/runtime": "^7.20.0", + "metro-react-native-babel-preset": "0.73.9", + "babel-plugin-module-resolver": "^4.1.0" + } +} diff --git a/example/react-native.config.js b/example/react-native.config.js new file mode 100644 index 00000000..a5166956 --- /dev/null +++ b/example/react-native.config.js @@ -0,0 +1,10 @@ +const path = require('path'); +const pak = require('../package.json'); + +module.exports = { + dependencies: { + [pak.name]: { + root: path.join(__dirname, '..'), + }, + }, +}; diff --git a/example/src/App.tsx b/example/src/App.tsx new file mode 100644 index 00000000..2e623fbf --- /dev/null +++ b/example/src/App.tsx @@ -0,0 +1,70 @@ +/** + * Sample React Native App + * https://github.com/facebook/react-native + * + * @format + * @flow strict-local + */ + +import React from 'react'; +import { Alert, Button, StyleSheet, Text, View } from 'react-native'; +import { useAuth0, Auth0Provider } from 'react-native-auth0'; +import config from './auth0-configuration'; + +const Home = () => { + const { authorize, clearSession, user, getCredentials, error } = useAuth0(); + + const onLogin = async () => { + await authorize({ scope: 'openid profile email' }, {}); + const credentials = await getCredentials(undefined, 0, {}); + Alert.alert('AccessToken: ' + credentials?.accessToken); + }; + + const loggedIn = user !== undefined && user !== null; + + const onLogout = async () => { + await clearSession({ federated: true }, {}); + }; + + return ( + + Auth0Sample - Login + {user && You are logged in as {user.name}} + {!user && You are not logged in} +

    customScheme - Mandatory: Custom scheme to build the callback URL with. The + Optional: Custom scheme to build the callback URL with. The value provided here should be passed to the customScheme option parameter of the authorize and clearSession methods. The custom scheme should be a unique, all lowercase value with - no special characters (For example: - auth0.YOUR_APP_PACKAGE_NAME_OR_BUNDLE_IDENTIFIER). + no special characters.