diff --git a/.github/workflows/test-edge-function.yml b/.github/workflows/test-edge-function.yml new file mode 100644 index 000000000..f07244480 --- /dev/null +++ b/.github/workflows/test-edge-function.yml @@ -0,0 +1,33 @@ +name: "Test edge function compatibility" +on: push +jobs: + test: + runs-on: ubuntu-latest + env: + NETLIFY_AUTH_TOKEN: ${{ secrets.netlify_auth_token }} + NETLIFY_SITE_ID: ${{ secrets.netlify_site_id }} + TEST_DEPLOYED_VERSION: true + defaults: + run: + working-directory: examples/next/with-emailpassword + steps: + - uses: actions/checkout@v2 + - run: echo $GITHUB_REF_NAME + - run: npm install git+https://github.com:supertokens/supertokens-node.git#$GITHUB_SHA + - run: npm install + - run: npm install mocha@6.1.4 jsdom-global@3.0.2 puppeteer@^11.0.0 isomorphic-fetch@^3.0.0 + - run: netlify deploy --alias 0 --build --json --auth=$NETLIFY_AUTH_TOKEN > deployInfo.json + - run: cat deployInfo.json + - run: | + ( \ + (echo "=========== Test attempt 1 ===========" && npx mocha --no-config --timeout 80000 test/**/*.test.js) || \ + (echo "=========== Test attempt 2 ===========" && npx mocha --no-config --timeout 80000 test/**/*.test.js) || \ + (echo "=========== Test attempt 3 ===========" && npx mocha --no-config --timeout 80000 test/**/*.test.js) \ + ) + - name: The job has failed + if: ${{ failure() }} + uses: actions/upload-artifact@v3 + with: + name: screenshots + path: | + ./**/*screenshot.jpeg diff --git a/.npmignore b/.npmignore index b0fd4847c..683ee5888 100644 --- a/.npmignore +++ b/.npmignore @@ -17,4 +17,5 @@ coreDriverInterfaceSupported.json examples/ add-ts-no-check.js docs/ -.prettierignore \ No newline at end of file +.prettierignore +updateLibInExample \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 19a135b7b..b9ee625bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,52 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) +## [16.3.4] - 2023-10-22 + +### Fixes + +- Fixes an issue where sometimes the `Access-Control-Expose-Headers` header value would contain duplicates + +## [16.3.3] - 2023-10-19 + +- Tests `null` values in `ProviderConfig` saved in core + +## [16.3.2] - 2023-10-16 + +### Fixes + +- `getUsersNewestFirst` and `getUsersOldestFirst` will now properly filter users by tenantId. +- Fixes issue with missed email verification claim update that caused the frontend pre built UI to call the email verify API multiple times. + +## [16.3.1] - 2023-10-12 + +### Fixes + +- Handle AWS Public URLs (ending with `.amazonaws.com`) separately while extracting TLDs for SameSite attribute. + +## [16.3.0] - 2023-10-10 + +### Added + +- Adds support for configuring multiple frontend domains to be used with the same backend +- Added a new `origin` property to `appInfo`, this can be configured to be a function which allows you to conditionally return the value of the frontend domain. This property will replace `websiteDomain` in a future release of `supertokens-node` +- `websiteDomain` inside `appInfo` is now optional. Using `origin` is recommended over using `websiteDomain`. This is not a breaking change and using `websiteDomain` will continue to work +- Added a "custom" framework you can use in framework normally not supported by our SDK +- Added a next13 app router compatible request handler. + +### Fixed + +- Fixed an issue where calling signinup for thirdparty recipe would result in a "clone is not a function" error + +### Changes + +- Using built-in fetch whenever available instead of cross-fetch +- Improved edge-function support + +## [16.2.1] - 2023-10-06 + +- Slight refactors logic to code for social providers to make it consistent across all providers + ## [16.2.0] - 2023-09-29 ### Changes @@ -90,6 +136,10 @@ Because of account linking we've introduced a new Primary user concept (see abov - returns new `recipeUserId` prop in the `status: OK` case - `signUp`: - returns new `recipeUserId` prop in the `status: OK` case + - `resetPasswordUsingToken`: + - removed from the recipe interface, making it no longer overrideable (directly) + - the related function in the index files now call `consumePasswordResetToken` and `updateEmailOrPassword` + - any necessary behaviour changes can be achieved by overriding those two function instead - `signInPOST`: - can return status `SIGN_IN_NOT_ALLOWED` - `signUpPOST`: @@ -150,6 +200,10 @@ Because of account linking we've introduced a new Primary user concept (see abov - `updateEmailOrPassword` : - now takes `recipeUserId` instead of `userId` - can return the new `EMAIL_CHANGE_NOT_ALLOWED_ERROR` status + - `resetPasswordUsingToken`: + - removed from the recipe interface, making it no longer overrideable (directly) + - the related function in the index files now call `consumePasswordResetToken` and `updateEmailOrPassword` + - any necessary behaviour changes can be achieved by overriding those two function instead - added an overrideable `createNewEmailPasswordRecipeUser` function that is called during sign up and in the “invitation link” flow - `emailPasswordSignIn`: - returns new `recipeUserId` prop in the `status: OK` case diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 20abbf353..549837928 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -52,6 +52,24 @@ You will need to setup the `supertokens-core` in order to to run the `supertoken 5. If all tests pass the output should be: ![node tests passing](https://github.com/supertokens/supertokens-logo/blob/master/images/supertokens-node-tests-passing.png) +### To be able to run and debug tests from vscode + +1. Install the extension - https://marketplace.visualstudio.com/items?itemName=hbenl.vscode-mocha-test-adapter +2. Add the following to your vscode settings: + ```json + { + // ..., + "mochaExplorer.env": { + "TEST_MODE": "testing", + "INSTALL_PATH": "../supertokens-root" + } + } + ``` +3. In `lib/tsconfig.json`, change `"sourceMap"` to `true` +4. Run `npm run build` + +You should now be able to see tests on the VSCode's testing panel and run/debug from there. + ## Pull Request 1. Before submitting a pull request make sure all tests have passed diff --git a/docs/assets/search.js b/docs/assets/search.js index 05cd5cca2..d085f3072 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = JSON.parse("{\"kinds\":{\"2\":\"Module\",\"32\":\"Variable\",\"64\":\"Function\",\"128\":\"Class\",\"256\":\"Interface\",\"512\":\"Constructor\",\"1024\":\"Property\",\"2048\":\"Method\",\"65536\":\"Type literal\",\"4194304\":\"Type alias\",\"16777216\":\"Reference\"},\"rows\":[{\"id\":0,\"kind\":2,\"name\":\"index\",\"url\":\"modules/index.html\",\"classes\":\"tsd-kind-module\"},{\"id\":1,\"kind\":64,\"name\":\"init\",\"url\":\"modules/index.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":2,\"kind\":64,\"name\":\"getAllCORSHeaders\",\"url\":\"modules/index.html#getAllCORSHeaders\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":3,\"kind\":64,\"name\":\"getUserCount\",\"url\":\"modules/index.html#getUserCount\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":4,\"kind\":64,\"name\":\"getUsersOldestFirst\",\"url\":\"modules/index.html#getUsersOldestFirst\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":5,\"kind\":64,\"name\":\"getUsersNewestFirst\",\"url\":\"modules/index.html#getUsersNewestFirst\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":6,\"kind\":64,\"name\":\"deleteUser\",\"url\":\"modules/index.html#deleteUser\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":7,\"kind\":64,\"name\":\"createUserIdMapping\",\"url\":\"modules/index.html#createUserIdMapping\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":8,\"kind\":64,\"name\":\"getUserIdMapping\",\"url\":\"modules/index.html#getUserIdMapping\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":9,\"kind\":64,\"name\":\"deleteUserIdMapping\",\"url\":\"modules/index.html#deleteUserIdMapping\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":10,\"kind\":64,\"name\":\"updateOrDeleteUserIdMappingInfo\",\"url\":\"modules/index.html#updateOrDeleteUserIdMappingInfo\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":11,\"kind\":64,\"name\":\"getUser\",\"url\":\"modules/index.html#getUser\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":12,\"kind\":64,\"name\":\"listUsersByAccountInfo\",\"url\":\"modules/index.html#listUsersByAccountInfo\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":13,\"kind\":64,\"name\":\"convertToRecipeUserId\",\"url\":\"modules/index.html#convertToRecipeUserId\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":14,\"kind\":64,\"name\":\"getRequestFromUserContext\",\"url\":\"modules/index.html#getRequestFromUserContext\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":15,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/index.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":16,\"kind\":128,\"name\":\"default\",\"url\":\"classes/index.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":17,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/index.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":18,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/index.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"index.default\"},{\"id\":19,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/index.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":20,\"kind\":1024,\"name\":\"RecipeUserId\",\"url\":\"classes/index.default.html#RecipeUserId\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":21,\"kind\":1024,\"name\":\"User\",\"url\":\"classes/index.default.html#User\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":22,\"kind\":2048,\"name\":\"getAllCORSHeaders\",\"url\":\"classes/index.default.html#getAllCORSHeaders\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":23,\"kind\":2048,\"name\":\"getUserCount\",\"url\":\"classes/index.default.html#getUserCount\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":24,\"kind\":2048,\"name\":\"getUsersOldestFirst\",\"url\":\"classes/index.default.html#getUsersOldestFirst\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":25,\"kind\":2048,\"name\":\"getUsersNewestFirst\",\"url\":\"classes/index.default.html#getUsersNewestFirst\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":26,\"kind\":2048,\"name\":\"createUserIdMapping\",\"url\":\"classes/index.default.html#createUserIdMapping\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":27,\"kind\":2048,\"name\":\"getUserIdMapping\",\"url\":\"classes/index.default.html#getUserIdMapping\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":28,\"kind\":2048,\"name\":\"deleteUserIdMapping\",\"url\":\"classes/index.default.html#deleteUserIdMapping\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":29,\"kind\":2048,\"name\":\"updateOrDeleteUserIdMappingInfo\",\"url\":\"classes/index.default.html#updateOrDeleteUserIdMappingInfo\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":30,\"kind\":2048,\"name\":\"getUser\",\"url\":\"classes/index.default.html#getUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":31,\"kind\":2048,\"name\":\"listUsersByAccountInfo\",\"url\":\"classes/index.default.html#listUsersByAccountInfo\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":32,\"kind\":2048,\"name\":\"deleteUser\",\"url\":\"classes/index.default.html#deleteUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":33,\"kind\":2048,\"name\":\"convertToRecipeUserId\",\"url\":\"classes/index.default.html#convertToRecipeUserId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":34,\"kind\":2048,\"name\":\"getRequestFromUserContext\",\"url\":\"classes/index.default.html#getRequestFromUserContext\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":35,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/index.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"index.default\"},{\"id\":36,\"kind\":2,\"name\":\"framework\",\"url\":\"modules/framework.html\",\"classes\":\"tsd-kind-module\"},{\"id\":37,\"kind\":32,\"name\":\"express\",\"url\":\"modules/framework.html#express-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":38,\"kind\":32,\"name\":\"fastify\",\"url\":\"modules/framework.html#fastify-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":39,\"kind\":32,\"name\":\"hapi\",\"url\":\"modules/framework.html#hapi-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":40,\"kind\":32,\"name\":\"loopback\",\"url\":\"modules/framework.html#loopback-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":41,\"kind\":32,\"name\":\"koa\",\"url\":\"modules/framework.html#koa-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":42,\"kind\":32,\"name\":\"awsLambda\",\"url\":\"modules/framework.html#awsLambda-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":43,\"kind\":1024,\"name\":\"default\",\"url\":\"modules/framework.html#default\",\"classes\":\"tsd-kind-property tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":44,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/framework.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":45,\"kind\":1024,\"name\":\"express\",\"url\":\"modules/framework.html#__type.express\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework.__type\"},{\"id\":46,\"kind\":1024,\"name\":\"fastify\",\"url\":\"modules/framework.html#__type.fastify\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework.__type\"},{\"id\":47,\"kind\":1024,\"name\":\"hapi\",\"url\":\"modules/framework.html#__type.hapi\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework.__type\"},{\"id\":48,\"kind\":1024,\"name\":\"loopback\",\"url\":\"modules/framework.html#__type.loopback\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework.__type\"},{\"id\":49,\"kind\":1024,\"name\":\"koa\",\"url\":\"modules/framework.html#__type.koa\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework.__type\"},{\"id\":50,\"kind\":1024,\"name\":\"awsLambda\",\"url\":\"modules/framework.html#__type.awsLambda\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework.__type\"},{\"id\":51,\"kind\":2,\"name\":\"framework/awsLambda\",\"url\":\"modules/framework_awsLambda.html\",\"classes\":\"tsd-kind-module\"},{\"id\":52,\"kind\":64,\"name\":\"middleware\",\"url\":\"modules/framework_awsLambda.html#middleware\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/awsLambda\"},{\"id\":53,\"kind\":64,\"name\":\"wrapRequest\",\"url\":\"modules/framework_awsLambda.html#wrapRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/awsLambda\"},{\"id\":54,\"kind\":64,\"name\":\"wrapResponse\",\"url\":\"modules/framework_awsLambda.html#wrapResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/awsLambda\"},{\"id\":55,\"kind\":2,\"name\":\"framework/express\",\"url\":\"modules/framework_express.html\",\"classes\":\"tsd-kind-module\"},{\"id\":56,\"kind\":64,\"name\":\"middleware\",\"url\":\"modules/framework_express.html#middleware\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/express\"},{\"id\":57,\"kind\":64,\"name\":\"errorHandler\",\"url\":\"modules/framework_express.html#errorHandler\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/express\"},{\"id\":58,\"kind\":64,\"name\":\"wrapRequest\",\"url\":\"modules/framework_express.html#wrapRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/express\"},{\"id\":59,\"kind\":64,\"name\":\"wrapResponse\",\"url\":\"modules/framework_express.html#wrapResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/express\"},{\"id\":60,\"kind\":2,\"name\":\"framework/fastify\",\"url\":\"modules/framework_fastify.html\",\"classes\":\"tsd-kind-module\"},{\"id\":61,\"kind\":64,\"name\":\"plugin\",\"url\":\"modules/framework_fastify.html#plugin\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/fastify\"},{\"id\":62,\"kind\":64,\"name\":\"errorHandler\",\"url\":\"modules/framework_fastify.html#errorHandler\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/fastify\"},{\"id\":63,\"kind\":64,\"name\":\"wrapRequest\",\"url\":\"modules/framework_fastify.html#wrapRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/fastify\"},{\"id\":64,\"kind\":64,\"name\":\"wrapResponse\",\"url\":\"modules/framework_fastify.html#wrapResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/fastify\"},{\"id\":65,\"kind\":2,\"name\":\"framework/hapi\",\"url\":\"modules/framework_hapi.html\",\"classes\":\"tsd-kind-module\"},{\"id\":66,\"kind\":32,\"name\":\"plugin\",\"url\":\"modules/framework_hapi.html#plugin\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"framework/hapi\"},{\"id\":67,\"kind\":64,\"name\":\"wrapRequest\",\"url\":\"modules/framework_hapi.html#wrapRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/hapi\"},{\"id\":68,\"kind\":64,\"name\":\"wrapResponse\",\"url\":\"modules/framework_hapi.html#wrapResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/hapi\"},{\"id\":69,\"kind\":2,\"name\":\"framework/koa\",\"url\":\"modules/framework_koa.html\",\"classes\":\"tsd-kind-module\"},{\"id\":70,\"kind\":64,\"name\":\"middleware\",\"url\":\"modules/framework_koa.html#middleware\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/koa\"},{\"id\":71,\"kind\":64,\"name\":\"wrapRequest\",\"url\":\"modules/framework_koa.html#wrapRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/koa\"},{\"id\":72,\"kind\":64,\"name\":\"wrapResponse\",\"url\":\"modules/framework_koa.html#wrapResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/koa\"},{\"id\":73,\"kind\":2,\"name\":\"framework/loopback\",\"url\":\"modules/framework_loopback.html\",\"classes\":\"tsd-kind-module\"},{\"id\":74,\"kind\":64,\"name\":\"middleware\",\"url\":\"modules/framework_loopback.html#middleware\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/loopback\"},{\"id\":75,\"kind\":64,\"name\":\"wrapRequest\",\"url\":\"modules/framework_loopback.html#wrapRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/loopback\"},{\"id\":76,\"kind\":64,\"name\":\"wrapResponse\",\"url\":\"modules/framework_loopback.html#wrapResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/loopback\"},{\"id\":77,\"kind\":2,\"name\":\"ingredients/emaildelivery\",\"url\":\"modules/ingredients_emaildelivery.html\",\"classes\":\"tsd-kind-module\"},{\"id\":78,\"kind\":128,\"name\":\"default\",\"url\":\"classes/ingredients_emaildelivery.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"ingredients/emaildelivery\"},{\"id\":79,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/ingredients_emaildelivery.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"ingredients/emaildelivery.default\"},{\"id\":80,\"kind\":1024,\"name\":\"ingredientInterfaceImpl\",\"url\":\"classes/ingredients_emaildelivery.default.html#ingredientInterfaceImpl\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"ingredients/emaildelivery.default\"},{\"id\":81,\"kind\":2,\"name\":\"ingredients/smsdelivery\",\"url\":\"modules/ingredients_smsdelivery.html\",\"classes\":\"tsd-kind-module\"},{\"id\":82,\"kind\":128,\"name\":\"default\",\"url\":\"classes/ingredients_smsdelivery.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"ingredients/smsdelivery\"},{\"id\":83,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/ingredients_smsdelivery.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"ingredients/smsdelivery.default\"},{\"id\":84,\"kind\":1024,\"name\":\"ingredientInterfaceImpl\",\"url\":\"classes/ingredients_smsdelivery.default.html#ingredientInterfaceImpl\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"ingredients/smsdelivery.default\"},{\"id\":85,\"kind\":2,\"name\":\"recipe/accountlinking\",\"url\":\"modules/recipe_accountlinking.html\",\"classes\":\"tsd-kind-module\"},{\"id\":86,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_accountlinking.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":87,\"kind\":64,\"name\":\"canCreatePrimaryUser\",\"url\":\"modules/recipe_accountlinking.html#canCreatePrimaryUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":88,\"kind\":64,\"name\":\"createPrimaryUser\",\"url\":\"modules/recipe_accountlinking.html#createPrimaryUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":89,\"kind\":64,\"name\":\"canLinkAccounts\",\"url\":\"modules/recipe_accountlinking.html#canLinkAccounts-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":90,\"kind\":64,\"name\":\"linkAccounts\",\"url\":\"modules/recipe_accountlinking.html#linkAccounts-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":91,\"kind\":64,\"name\":\"unlinkAccount\",\"url\":\"modules/recipe_accountlinking.html#unlinkAccount-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":92,\"kind\":64,\"name\":\"createPrimaryUserIdOrLinkAccounts\",\"url\":\"modules/recipe_accountlinking.html#createPrimaryUserIdOrLinkAccounts\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":93,\"kind\":64,\"name\":\"getPrimaryUserThatCanBeLinkedToRecipeUserId\",\"url\":\"modules/recipe_accountlinking.html#getPrimaryUserThatCanBeLinkedToRecipeUserId\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":94,\"kind\":64,\"name\":\"isSignUpAllowed\",\"url\":\"modules/recipe_accountlinking.html#isSignUpAllowed\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":95,\"kind\":64,\"name\":\"isSignInAllowed\",\"url\":\"modules/recipe_accountlinking.html#isSignInAllowed\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":96,\"kind\":64,\"name\":\"isEmailChangeAllowed\",\"url\":\"modules/recipe_accountlinking.html#isEmailChangeAllowed\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":97,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_accountlinking.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":98,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_accountlinking.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":99,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_accountlinking.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":100,\"kind\":2048,\"name\":\"createPrimaryUserIdOrLinkAccounts\",\"url\":\"classes/recipe_accountlinking.default.html#createPrimaryUserIdOrLinkAccounts\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":101,\"kind\":2048,\"name\":\"getPrimaryUserThatCanBeLinkedToRecipeUserId\",\"url\":\"classes/recipe_accountlinking.default.html#getPrimaryUserThatCanBeLinkedToRecipeUserId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":102,\"kind\":2048,\"name\":\"canCreatePrimaryUser\",\"url\":\"classes/recipe_accountlinking.default.html#canCreatePrimaryUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":103,\"kind\":2048,\"name\":\"createPrimaryUser\",\"url\":\"classes/recipe_accountlinking.default.html#createPrimaryUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":104,\"kind\":2048,\"name\":\"canLinkAccounts\",\"url\":\"classes/recipe_accountlinking.default.html#canLinkAccounts\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":105,\"kind\":2048,\"name\":\"linkAccounts\",\"url\":\"classes/recipe_accountlinking.default.html#linkAccounts\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":106,\"kind\":2048,\"name\":\"unlinkAccount\",\"url\":\"classes/recipe_accountlinking.default.html#unlinkAccount\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":107,\"kind\":2048,\"name\":\"isSignUpAllowed\",\"url\":\"classes/recipe_accountlinking.default.html#isSignUpAllowed\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":108,\"kind\":2048,\"name\":\"isSignInAllowed\",\"url\":\"classes/recipe_accountlinking.default.html#isSignInAllowed\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":109,\"kind\":2048,\"name\":\"isEmailChangeAllowed\",\"url\":\"classes/recipe_accountlinking.default.html#isEmailChangeAllowed\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":110,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_accountlinking.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":111,\"kind\":2,\"name\":\"recipe/dashboard\",\"url\":\"modules/recipe_dashboard.html\",\"classes\":\"tsd-kind-module\"},{\"id\":112,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_dashboard.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/dashboard\"},{\"id\":113,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_dashboard.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/dashboard\"},{\"id\":114,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_dashboard.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/dashboard.default\"},{\"id\":115,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_dashboard.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/dashboard.default\"},{\"id\":116,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_dashboard.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/dashboard.default\"},{\"id\":117,\"kind\":2,\"name\":\"recipe/emailpassword\",\"url\":\"modules/recipe_emailpassword.html\",\"classes\":\"tsd-kind-module\"},{\"id\":118,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_emailpassword.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":119,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/recipe_emailpassword.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":120,\"kind\":64,\"name\":\"signUp\",\"url\":\"modules/recipe_emailpassword.html#signUp-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":121,\"kind\":64,\"name\":\"signIn\",\"url\":\"modules/recipe_emailpassword.html#signIn-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":122,\"kind\":64,\"name\":\"createResetPasswordToken\",\"url\":\"modules/recipe_emailpassword.html#createResetPasswordToken-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":123,\"kind\":64,\"name\":\"resetPasswordUsingToken\",\"url\":\"modules/recipe_emailpassword.html#resetPasswordUsingToken\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":124,\"kind\":64,\"name\":\"consumePasswordResetToken\",\"url\":\"modules/recipe_emailpassword.html#consumePasswordResetToken-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":125,\"kind\":64,\"name\":\"updateEmailOrPassword\",\"url\":\"modules/recipe_emailpassword.html#updateEmailOrPassword-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":126,\"kind\":64,\"name\":\"createResetPasswordLink\",\"url\":\"modules/recipe_emailpassword.html#createResetPasswordLink\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":127,\"kind\":64,\"name\":\"sendResetPasswordEmail\",\"url\":\"modules/recipe_emailpassword.html#sendResetPasswordEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":128,\"kind\":64,\"name\":\"sendEmail\",\"url\":\"modules/recipe_emailpassword.html#sendEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":129,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_emailpassword.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":130,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_emailpassword.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":131,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_emailpassword.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":132,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/recipe_emailpassword.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":133,\"kind\":2048,\"name\":\"signUp\",\"url\":\"classes/recipe_emailpassword.default.html#signUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":134,\"kind\":2048,\"name\":\"signIn\",\"url\":\"classes/recipe_emailpassword.default.html#signIn\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":135,\"kind\":2048,\"name\":\"createResetPasswordToken\",\"url\":\"classes/recipe_emailpassword.default.html#createResetPasswordToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":136,\"kind\":2048,\"name\":\"resetPasswordUsingToken\",\"url\":\"classes/recipe_emailpassword.default.html#resetPasswordUsingToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":137,\"kind\":2048,\"name\":\"consumePasswordResetToken\",\"url\":\"classes/recipe_emailpassword.default.html#consumePasswordResetToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":138,\"kind\":2048,\"name\":\"updateEmailOrPassword\",\"url\":\"classes/recipe_emailpassword.default.html#updateEmailOrPassword\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":139,\"kind\":2048,\"name\":\"createResetPasswordLink\",\"url\":\"classes/recipe_emailpassword.default.html#createResetPasswordLink\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":140,\"kind\":2048,\"name\":\"sendResetPasswordEmail\",\"url\":\"classes/recipe_emailpassword.default.html#sendResetPasswordEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":141,\"kind\":2048,\"name\":\"sendEmail\",\"url\":\"classes/recipe_emailpassword.default.html#sendEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":142,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_emailpassword.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":143,\"kind\":2,\"name\":\"recipe/emailverification\",\"url\":\"modules/recipe_emailverification.html\",\"classes\":\"tsd-kind-module\"},{\"id\":144,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_emailverification.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":145,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/recipe_emailverification.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":146,\"kind\":64,\"name\":\"createEmailVerificationToken\",\"url\":\"modules/recipe_emailverification.html#createEmailVerificationToken-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":147,\"kind\":64,\"name\":\"createEmailVerificationLink\",\"url\":\"modules/recipe_emailverification.html#createEmailVerificationLink\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":148,\"kind\":64,\"name\":\"sendEmailVerificationEmail\",\"url\":\"modules/recipe_emailverification.html#sendEmailVerificationEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":149,\"kind\":64,\"name\":\"verifyEmailUsingToken\",\"url\":\"modules/recipe_emailverification.html#verifyEmailUsingToken-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":150,\"kind\":64,\"name\":\"isEmailVerified\",\"url\":\"modules/recipe_emailverification.html#isEmailVerified-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":151,\"kind\":64,\"name\":\"revokeEmailVerificationTokens\",\"url\":\"modules/recipe_emailverification.html#revokeEmailVerificationTokens-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":152,\"kind\":64,\"name\":\"unverifyEmail\",\"url\":\"modules/recipe_emailverification.html#unverifyEmail-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":153,\"kind\":64,\"name\":\"sendEmail\",\"url\":\"modules/recipe_emailverification.html#sendEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":154,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_emailverification.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":155,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_emailverification.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":156,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_emailverification.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/emailverification.default\"},{\"id\":157,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/recipe_emailverification.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":158,\"kind\":1024,\"name\":\"EmailVerificationClaim\",\"url\":\"classes/recipe_emailverification.default.html#EmailVerificationClaim\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":159,\"kind\":2048,\"name\":\"createEmailVerificationToken\",\"url\":\"classes/recipe_emailverification.default.html#createEmailVerificationToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":160,\"kind\":2048,\"name\":\"createEmailVerificationLink\",\"url\":\"classes/recipe_emailverification.default.html#createEmailVerificationLink\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":161,\"kind\":2048,\"name\":\"sendEmailVerificationEmail\",\"url\":\"classes/recipe_emailverification.default.html#sendEmailVerificationEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":162,\"kind\":2048,\"name\":\"verifyEmailUsingToken\",\"url\":\"classes/recipe_emailverification.default.html#verifyEmailUsingToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":163,\"kind\":2048,\"name\":\"isEmailVerified\",\"url\":\"classes/recipe_emailverification.default.html#isEmailVerified\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":164,\"kind\":2048,\"name\":\"revokeEmailVerificationTokens\",\"url\":\"classes/recipe_emailverification.default.html#revokeEmailVerificationTokens\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":165,\"kind\":2048,\"name\":\"unverifyEmail\",\"url\":\"classes/recipe_emailverification.default.html#unverifyEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":166,\"kind\":2048,\"name\":\"sendEmail\",\"url\":\"classes/recipe_emailverification.default.html#sendEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":167,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_emailverification.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/emailverification.default\"},{\"id\":168,\"kind\":2,\"name\":\"recipe/jwt\",\"url\":\"modules/recipe_jwt.html\",\"classes\":\"tsd-kind-module\"},{\"id\":169,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_jwt.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":170,\"kind\":64,\"name\":\"createJWT\",\"url\":\"modules/recipe_jwt.html#createJWT-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":171,\"kind\":64,\"name\":\"getJWKS\",\"url\":\"modules/recipe_jwt.html#getJWKS-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":172,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_jwt.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":173,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_jwt.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/jwt.default\"},{\"id\":174,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_jwt.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/jwt.default\"},{\"id\":175,\"kind\":2048,\"name\":\"createJWT\",\"url\":\"classes/recipe_jwt.default.html#createJWT\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/jwt.default\"},{\"id\":176,\"kind\":2048,\"name\":\"getJWKS\",\"url\":\"classes/recipe_jwt.default.html#getJWKS\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/jwt.default\"},{\"id\":177,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_jwt.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/jwt.default\"},{\"id\":178,\"kind\":2,\"name\":\"recipe/multitenancy\",\"url\":\"modules/recipe_multitenancy.html\",\"classes\":\"tsd-kind-module\"},{\"id\":179,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_multitenancy.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":180,\"kind\":64,\"name\":\"createOrUpdateTenant\",\"url\":\"modules/recipe_multitenancy.html#createOrUpdateTenant-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":181,\"kind\":64,\"name\":\"deleteTenant\",\"url\":\"modules/recipe_multitenancy.html#deleteTenant-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":182,\"kind\":64,\"name\":\"getTenant\",\"url\":\"modules/recipe_multitenancy.html#getTenant-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":183,\"kind\":64,\"name\":\"listAllTenants\",\"url\":\"modules/recipe_multitenancy.html#listAllTenants-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":184,\"kind\":64,\"name\":\"createOrUpdateThirdPartyConfig\",\"url\":\"modules/recipe_multitenancy.html#createOrUpdateThirdPartyConfig-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":185,\"kind\":64,\"name\":\"deleteThirdPartyConfig\",\"url\":\"modules/recipe_multitenancy.html#deleteThirdPartyConfig-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":186,\"kind\":64,\"name\":\"associateUserToTenant\",\"url\":\"modules/recipe_multitenancy.html#associateUserToTenant-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":187,\"kind\":64,\"name\":\"disassociateUserFromTenant\",\"url\":\"modules/recipe_multitenancy.html#disassociateUserFromTenant-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":188,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_multitenancy.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":189,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_multitenancy.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":190,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_multitenancy.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":191,\"kind\":2048,\"name\":\"createOrUpdateTenant\",\"url\":\"classes/recipe_multitenancy.default.html#createOrUpdateTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":192,\"kind\":2048,\"name\":\"deleteTenant\",\"url\":\"classes/recipe_multitenancy.default.html#deleteTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":193,\"kind\":2048,\"name\":\"getTenant\",\"url\":\"classes/recipe_multitenancy.default.html#getTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":194,\"kind\":2048,\"name\":\"listAllTenants\",\"url\":\"classes/recipe_multitenancy.default.html#listAllTenants\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":195,\"kind\":2048,\"name\":\"createOrUpdateThirdPartyConfig\",\"url\":\"classes/recipe_multitenancy.default.html#createOrUpdateThirdPartyConfig\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":196,\"kind\":2048,\"name\":\"deleteThirdPartyConfig\",\"url\":\"classes/recipe_multitenancy.default.html#deleteThirdPartyConfig\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":197,\"kind\":2048,\"name\":\"associateUserToTenant\",\"url\":\"classes/recipe_multitenancy.default.html#associateUserToTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":198,\"kind\":2048,\"name\":\"disassociateUserFromTenant\",\"url\":\"classes/recipe_multitenancy.default.html#disassociateUserFromTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":199,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_multitenancy.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":200,\"kind\":2,\"name\":\"recipe/openid\",\"url\":\"modules/recipe_openid.html\",\"classes\":\"tsd-kind-module\"},{\"id\":201,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_openid.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/openid\"},{\"id\":202,\"kind\":64,\"name\":\"getOpenIdDiscoveryConfiguration\",\"url\":\"modules/recipe_openid.html#getOpenIdDiscoveryConfiguration\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/openid\"},{\"id\":203,\"kind\":64,\"name\":\"createJWT\",\"url\":\"modules/recipe_openid.html#createJWT\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/openid\"},{\"id\":204,\"kind\":64,\"name\":\"getJWKS\",\"url\":\"modules/recipe_openid.html#getJWKS\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/openid\"},{\"id\":205,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_openid.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/openid\"},{\"id\":206,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_openid.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/openid.default\"},{\"id\":207,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_openid.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/openid.default\"},{\"id\":208,\"kind\":2048,\"name\":\"getOpenIdDiscoveryConfiguration\",\"url\":\"classes/recipe_openid.default.html#getOpenIdDiscoveryConfiguration\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/openid.default\"},{\"id\":209,\"kind\":2048,\"name\":\"createJWT\",\"url\":\"classes/recipe_openid.default.html#createJWT\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/openid.default\"},{\"id\":210,\"kind\":2048,\"name\":\"getJWKS\",\"url\":\"classes/recipe_openid.default.html#getJWKS\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/openid.default\"},{\"id\":211,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_openid.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/openid.default\"},{\"id\":212,\"kind\":2,\"name\":\"recipe/passwordless\",\"url\":\"modules/recipe_passwordless.html\",\"classes\":\"tsd-kind-module\"},{\"id\":213,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_passwordless.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":214,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/recipe_passwordless.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":215,\"kind\":64,\"name\":\"createCode\",\"url\":\"modules/recipe_passwordless.html#createCode-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":216,\"kind\":64,\"name\":\"consumeCode\",\"url\":\"modules/recipe_passwordless.html#consumeCode-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":217,\"kind\":64,\"name\":\"listCodesByDeviceId\",\"url\":\"modules/recipe_passwordless.html#listCodesByDeviceId-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":218,\"kind\":64,\"name\":\"listCodesByEmail\",\"url\":\"modules/recipe_passwordless.html#listCodesByEmail-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":219,\"kind\":64,\"name\":\"listCodesByPhoneNumber\",\"url\":\"modules/recipe_passwordless.html#listCodesByPhoneNumber-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":220,\"kind\":64,\"name\":\"listCodesByPreAuthSessionId\",\"url\":\"modules/recipe_passwordless.html#listCodesByPreAuthSessionId-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":221,\"kind\":64,\"name\":\"createNewCodeForDevice\",\"url\":\"modules/recipe_passwordless.html#createNewCodeForDevice-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":222,\"kind\":64,\"name\":\"updateUser\",\"url\":\"modules/recipe_passwordless.html#updateUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":223,\"kind\":64,\"name\":\"revokeAllCodes\",\"url\":\"modules/recipe_passwordless.html#revokeAllCodes-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":224,\"kind\":64,\"name\":\"revokeCode\",\"url\":\"modules/recipe_passwordless.html#revokeCode-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":225,\"kind\":64,\"name\":\"createMagicLink\",\"url\":\"modules/recipe_passwordless.html#createMagicLink\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":226,\"kind\":64,\"name\":\"signInUp\",\"url\":\"modules/recipe_passwordless.html#signInUp\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":227,\"kind\":64,\"name\":\"sendEmail\",\"url\":\"modules/recipe_passwordless.html#sendEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":228,\"kind\":64,\"name\":\"sendSms\",\"url\":\"modules/recipe_passwordless.html#sendSms\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":229,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_passwordless.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":230,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_passwordless.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":231,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_passwordless.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/passwordless.default\"},{\"id\":232,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/recipe_passwordless.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":233,\"kind\":2048,\"name\":\"createCode\",\"url\":\"classes/recipe_passwordless.default.html#createCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":234,\"kind\":2048,\"name\":\"createNewCodeForDevice\",\"url\":\"classes/recipe_passwordless.default.html#createNewCodeForDevice\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":235,\"kind\":2048,\"name\":\"consumeCode\",\"url\":\"classes/recipe_passwordless.default.html#consumeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":236,\"kind\":2048,\"name\":\"updateUser\",\"url\":\"classes/recipe_passwordless.default.html#updateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":237,\"kind\":2048,\"name\":\"revokeAllCodes\",\"url\":\"classes/recipe_passwordless.default.html#revokeAllCodes\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":238,\"kind\":2048,\"name\":\"revokeCode\",\"url\":\"classes/recipe_passwordless.default.html#revokeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":239,\"kind\":2048,\"name\":\"listCodesByEmail\",\"url\":\"classes/recipe_passwordless.default.html#listCodesByEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":240,\"kind\":2048,\"name\":\"listCodesByPhoneNumber\",\"url\":\"classes/recipe_passwordless.default.html#listCodesByPhoneNumber\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":241,\"kind\":2048,\"name\":\"listCodesByDeviceId\",\"url\":\"classes/recipe_passwordless.default.html#listCodesByDeviceId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":242,\"kind\":2048,\"name\":\"listCodesByPreAuthSessionId\",\"url\":\"classes/recipe_passwordless.default.html#listCodesByPreAuthSessionId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":243,\"kind\":2048,\"name\":\"createMagicLink\",\"url\":\"classes/recipe_passwordless.default.html#createMagicLink\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":244,\"kind\":2048,\"name\":\"signInUp\",\"url\":\"classes/recipe_passwordless.default.html#signInUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":245,\"kind\":2048,\"name\":\"sendEmail\",\"url\":\"classes/recipe_passwordless.default.html#sendEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":246,\"kind\":2048,\"name\":\"sendSms\",\"url\":\"classes/recipe_passwordless.default.html#sendSms\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":247,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_passwordless.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/passwordless.default\"},{\"id\":248,\"kind\":2,\"name\":\"recipe/session\",\"url\":\"modules/recipe_session.html\",\"classes\":\"tsd-kind-module\"},{\"id\":249,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_session.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":250,\"kind\":64,\"name\":\"createNewSession\",\"url\":\"modules/recipe_session.html#createNewSession-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":251,\"kind\":64,\"name\":\"createNewSessionWithoutRequestResponse\",\"url\":\"modules/recipe_session.html#createNewSessionWithoutRequestResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":252,\"kind\":64,\"name\":\"getSession\",\"url\":\"modules/recipe_session.html#getSession-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":253,\"kind\":64,\"name\":\"getSessionWithoutRequestResponse\",\"url\":\"modules/recipe_session.html#getSessionWithoutRequestResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":254,\"kind\":64,\"name\":\"getSessionInformation\",\"url\":\"modules/recipe_session.html#getSessionInformation-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":255,\"kind\":64,\"name\":\"refreshSession\",\"url\":\"modules/recipe_session.html#refreshSession-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":256,\"kind\":64,\"name\":\"refreshSessionWithoutRequestResponse\",\"url\":\"modules/recipe_session.html#refreshSessionWithoutRequestResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":257,\"kind\":64,\"name\":\"revokeAllSessionsForUser\",\"url\":\"modules/recipe_session.html#revokeAllSessionsForUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":258,\"kind\":64,\"name\":\"getAllSessionHandlesForUser\",\"url\":\"modules/recipe_session.html#getAllSessionHandlesForUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":259,\"kind\":64,\"name\":\"revokeSession\",\"url\":\"modules/recipe_session.html#revokeSession-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":260,\"kind\":64,\"name\":\"revokeMultipleSessions\",\"url\":\"modules/recipe_session.html#revokeMultipleSessions-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":261,\"kind\":64,\"name\":\"updateSessionDataInDatabase\",\"url\":\"modules/recipe_session.html#updateSessionDataInDatabase-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":262,\"kind\":64,\"name\":\"mergeIntoAccessTokenPayload\",\"url\":\"modules/recipe_session.html#mergeIntoAccessTokenPayload-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":263,\"kind\":64,\"name\":\"fetchAndSetClaim\",\"url\":\"modules/recipe_session.html#fetchAndSetClaim-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":264,\"kind\":64,\"name\":\"setClaimValue\",\"url\":\"modules/recipe_session.html#setClaimValue-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"recipe/session\"},{\"id\":265,\"kind\":64,\"name\":\"getClaimValue\",\"url\":\"modules/recipe_session.html#getClaimValue-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"recipe/session\"},{\"id\":266,\"kind\":64,\"name\":\"removeClaim\",\"url\":\"modules/recipe_session.html#removeClaim-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":267,\"kind\":64,\"name\":\"validateClaimsForSessionHandle\",\"url\":\"modules/recipe_session.html#validateClaimsForSessionHandle\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":268,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/recipe_session.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":269,\"kind\":64,\"name\":\"createJWT\",\"url\":\"modules/recipe_session.html#createJWT\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":270,\"kind\":64,\"name\":\"getJWKS\",\"url\":\"modules/recipe_session.html#getJWKS\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":271,\"kind\":64,\"name\":\"getOpenIdDiscoveryConfiguration\",\"url\":\"modules/recipe_session.html#getOpenIdDiscoveryConfiguration\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":272,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_session.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":273,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_session.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":274,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_session.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/session.default\"},{\"id\":275,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/recipe_session.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":276,\"kind\":2048,\"name\":\"createNewSession\",\"url\":\"classes/recipe_session.default.html#createNewSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":277,\"kind\":2048,\"name\":\"createNewSessionWithoutRequestResponse\",\"url\":\"classes/recipe_session.default.html#createNewSessionWithoutRequestResponse\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":278,\"kind\":2048,\"name\":\"validateClaimsForSessionHandle\",\"url\":\"classes/recipe_session.default.html#validateClaimsForSessionHandle\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":279,\"kind\":2048,\"name\":\"getSession\",\"url\":\"classes/recipe_session.default.html#getSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":280,\"kind\":2048,\"name\":\"getSessionWithoutRequestResponse\",\"url\":\"classes/recipe_session.default.html#getSessionWithoutRequestResponse\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":281,\"kind\":2048,\"name\":\"getSessionInformation\",\"url\":\"classes/recipe_session.default.html#getSessionInformation\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":282,\"kind\":2048,\"name\":\"refreshSession\",\"url\":\"classes/recipe_session.default.html#refreshSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":283,\"kind\":2048,\"name\":\"refreshSessionWithoutRequestResponse\",\"url\":\"classes/recipe_session.default.html#refreshSessionWithoutRequestResponse\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":284,\"kind\":2048,\"name\":\"revokeAllSessionsForUser\",\"url\":\"classes/recipe_session.default.html#revokeAllSessionsForUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":285,\"kind\":2048,\"name\":\"getAllSessionHandlesForUser\",\"url\":\"classes/recipe_session.default.html#getAllSessionHandlesForUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":286,\"kind\":2048,\"name\":\"revokeSession\",\"url\":\"classes/recipe_session.default.html#revokeSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":287,\"kind\":2048,\"name\":\"revokeMultipleSessions\",\"url\":\"classes/recipe_session.default.html#revokeMultipleSessions\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":288,\"kind\":2048,\"name\":\"updateSessionDataInDatabase\",\"url\":\"classes/recipe_session.default.html#updateSessionDataInDatabase\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":289,\"kind\":2048,\"name\":\"mergeIntoAccessTokenPayload\",\"url\":\"classes/recipe_session.default.html#mergeIntoAccessTokenPayload\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":290,\"kind\":2048,\"name\":\"createJWT\",\"url\":\"classes/recipe_session.default.html#createJWT\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":291,\"kind\":2048,\"name\":\"getJWKS\",\"url\":\"classes/recipe_session.default.html#getJWKS\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":292,\"kind\":2048,\"name\":\"getOpenIdDiscoveryConfiguration\",\"url\":\"classes/recipe_session.default.html#getOpenIdDiscoveryConfiguration\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":293,\"kind\":2048,\"name\":\"fetchAndSetClaim\",\"url\":\"classes/recipe_session.default.html#fetchAndSetClaim\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":294,\"kind\":2048,\"name\":\"setClaimValue\",\"url\":\"classes/recipe_session.default.html#setClaimValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":295,\"kind\":2048,\"name\":\"getClaimValue\",\"url\":\"classes/recipe_session.default.html#getClaimValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":296,\"kind\":2048,\"name\":\"removeClaim\",\"url\":\"classes/recipe_session.default.html#removeClaim\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":297,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_session.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/session.default\"},{\"id\":298,\"kind\":2,\"name\":\"recipe/thirdparty\",\"url\":\"modules/recipe_thirdparty.html\",\"classes\":\"tsd-kind-module\"},{\"id\":299,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_thirdparty.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":300,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/recipe_thirdparty.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":301,\"kind\":64,\"name\":\"getProvider\",\"url\":\"modules/recipe_thirdparty.html#getProvider-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":302,\"kind\":64,\"name\":\"manuallyCreateOrUpdateUser\",\"url\":\"modules/recipe_thirdparty.html#manuallyCreateOrUpdateUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":303,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_thirdparty.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":304,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_thirdparty.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdparty.default\"},{\"id\":305,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_thirdparty.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/thirdparty.default\"},{\"id\":306,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/recipe_thirdparty.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdparty.default\"},{\"id\":307,\"kind\":2048,\"name\":\"getProvider\",\"url\":\"classes/recipe_thirdparty.default.html#getProvider\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdparty.default\"},{\"id\":308,\"kind\":2048,\"name\":\"manuallyCreateOrUpdateUser\",\"url\":\"classes/recipe_thirdparty.default.html#manuallyCreateOrUpdateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdparty.default\"},{\"id\":309,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_thirdparty.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/thirdparty.default\"},{\"id\":310,\"kind\":2,\"name\":\"recipe/thirdpartyemailpassword\",\"url\":\"modules/recipe_thirdpartyemailpassword.html\",\"classes\":\"tsd-kind-module\"},{\"id\":311,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":312,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":313,\"kind\":64,\"name\":\"emailPasswordSignUp\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#emailPasswordSignUp-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":314,\"kind\":64,\"name\":\"emailPasswordSignIn\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#emailPasswordSignIn-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":315,\"kind\":64,\"name\":\"thirdPartyGetProvider\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#thirdPartyGetProvider-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":316,\"kind\":64,\"name\":\"thirdPartyManuallyCreateOrUpdateUser\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#thirdPartyManuallyCreateOrUpdateUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":317,\"kind\":64,\"name\":\"createResetPasswordToken\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#createResetPasswordToken-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":318,\"kind\":64,\"name\":\"resetPasswordUsingToken\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#resetPasswordUsingToken\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":319,\"kind\":64,\"name\":\"consumePasswordResetToken\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#consumePasswordResetToken-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":320,\"kind\":64,\"name\":\"updateEmailOrPassword\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#updateEmailOrPassword-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":321,\"kind\":64,\"name\":\"createResetPasswordLink\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#createResetPasswordLink\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":322,\"kind\":64,\"name\":\"sendResetPasswordEmail\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#sendResetPasswordEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":323,\"kind\":64,\"name\":\"sendEmail\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#sendEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":324,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":325,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":326,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":327,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":328,\"kind\":2048,\"name\":\"thirdPartyGetProvider\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#thirdPartyGetProvider\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":329,\"kind\":2048,\"name\":\"thirdPartyManuallyCreateOrUpdateUser\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#thirdPartyManuallyCreateOrUpdateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":330,\"kind\":2048,\"name\":\"emailPasswordSignUp\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#emailPasswordSignUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":331,\"kind\":2048,\"name\":\"emailPasswordSignIn\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#emailPasswordSignIn\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":332,\"kind\":2048,\"name\":\"createResetPasswordToken\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#createResetPasswordToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":333,\"kind\":2048,\"name\":\"resetPasswordUsingToken\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#resetPasswordUsingToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":334,\"kind\":2048,\"name\":\"consumePasswordResetToken\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#consumePasswordResetToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":335,\"kind\":2048,\"name\":\"updateEmailOrPassword\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#updateEmailOrPassword\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":336,\"kind\":2048,\"name\":\"createResetPasswordLink\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#createResetPasswordLink\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":337,\"kind\":2048,\"name\":\"sendResetPasswordEmail\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#sendResetPasswordEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":338,\"kind\":2048,\"name\":\"sendEmail\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#sendEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":339,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":340,\"kind\":2,\"name\":\"recipe/thirdpartypasswordless\",\"url\":\"modules/recipe_thirdpartypasswordless.html\",\"classes\":\"tsd-kind-module\"},{\"id\":341,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_thirdpartypasswordless.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":342,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/recipe_thirdpartypasswordless.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":343,\"kind\":64,\"name\":\"thirdPartyGetProvider\",\"url\":\"modules/recipe_thirdpartypasswordless.html#thirdPartyGetProvider-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":344,\"kind\":64,\"name\":\"thirdPartyManuallyCreateOrUpdateUser\",\"url\":\"modules/recipe_thirdpartypasswordless.html#thirdPartyManuallyCreateOrUpdateUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":345,\"kind\":64,\"name\":\"passwordlessSignInUp\",\"url\":\"modules/recipe_thirdpartypasswordless.html#passwordlessSignInUp\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":346,\"kind\":64,\"name\":\"createCode\",\"url\":\"modules/recipe_thirdpartypasswordless.html#createCode-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":347,\"kind\":64,\"name\":\"consumeCode\",\"url\":\"modules/recipe_thirdpartypasswordless.html#consumeCode-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":348,\"kind\":64,\"name\":\"listCodesByDeviceId\",\"url\":\"modules/recipe_thirdpartypasswordless.html#listCodesByDeviceId-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":349,\"kind\":64,\"name\":\"listCodesByEmail\",\"url\":\"modules/recipe_thirdpartypasswordless.html#listCodesByEmail-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":350,\"kind\":64,\"name\":\"listCodesByPhoneNumber\",\"url\":\"modules/recipe_thirdpartypasswordless.html#listCodesByPhoneNumber-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":351,\"kind\":64,\"name\":\"listCodesByPreAuthSessionId\",\"url\":\"modules/recipe_thirdpartypasswordless.html#listCodesByPreAuthSessionId-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":352,\"kind\":64,\"name\":\"createNewCodeForDevice\",\"url\":\"modules/recipe_thirdpartypasswordless.html#createNewCodeForDevice-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":353,\"kind\":64,\"name\":\"updatePasswordlessUser\",\"url\":\"modules/recipe_thirdpartypasswordless.html#updatePasswordlessUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":354,\"kind\":64,\"name\":\"revokeAllCodes\",\"url\":\"modules/recipe_thirdpartypasswordless.html#revokeAllCodes-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":355,\"kind\":64,\"name\":\"revokeCode\",\"url\":\"modules/recipe_thirdpartypasswordless.html#revokeCode-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":356,\"kind\":64,\"name\":\"createMagicLink\",\"url\":\"modules/recipe_thirdpartypasswordless.html#createMagicLink\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":357,\"kind\":64,\"name\":\"sendEmail\",\"url\":\"modules/recipe_thirdpartypasswordless.html#sendEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":358,\"kind\":64,\"name\":\"sendSms\",\"url\":\"modules/recipe_thirdpartypasswordless.html#sendSms\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":359,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":360,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":361,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":362,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":363,\"kind\":2048,\"name\":\"thirdPartyGetProvider\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#thirdPartyGetProvider\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":364,\"kind\":2048,\"name\":\"thirdPartyManuallyCreateOrUpdateUser\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#thirdPartyManuallyCreateOrUpdateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":365,\"kind\":2048,\"name\":\"createCode\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#createCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":366,\"kind\":2048,\"name\":\"createNewCodeForDevice\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#createNewCodeForDevice\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":367,\"kind\":2048,\"name\":\"consumeCode\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#consumeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":368,\"kind\":2048,\"name\":\"updatePasswordlessUser\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#updatePasswordlessUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":369,\"kind\":2048,\"name\":\"revokeAllCodes\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#revokeAllCodes\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":370,\"kind\":2048,\"name\":\"revokeCode\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#revokeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":371,\"kind\":2048,\"name\":\"listCodesByEmail\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#listCodesByEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":372,\"kind\":2048,\"name\":\"listCodesByPhoneNumber\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#listCodesByPhoneNumber\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":373,\"kind\":2048,\"name\":\"listCodesByDeviceId\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#listCodesByDeviceId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":374,\"kind\":2048,\"name\":\"listCodesByPreAuthSessionId\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#listCodesByPreAuthSessionId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":375,\"kind\":2048,\"name\":\"createMagicLink\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#createMagicLink\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":376,\"kind\":2048,\"name\":\"passwordlessSignInUp\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#passwordlessSignInUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":377,\"kind\":2048,\"name\":\"sendEmail\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#sendEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":378,\"kind\":2048,\"name\":\"sendSms\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#sendSms\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":379,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":380,\"kind\":2,\"name\":\"recipe/usermetadata\",\"url\":\"modules/recipe_usermetadata.html\",\"classes\":\"tsd-kind-module\"},{\"id\":381,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_usermetadata.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/usermetadata\"},{\"id\":382,\"kind\":64,\"name\":\"getUserMetadata\",\"url\":\"modules/recipe_usermetadata.html#getUserMetadata-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/usermetadata\"},{\"id\":383,\"kind\":64,\"name\":\"updateUserMetadata\",\"url\":\"modules/recipe_usermetadata.html#updateUserMetadata-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/usermetadata\"},{\"id\":384,\"kind\":64,\"name\":\"clearUserMetadata\",\"url\":\"modules/recipe_usermetadata.html#clearUserMetadata-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/usermetadata\"},{\"id\":385,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_usermetadata.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/usermetadata\"},{\"id\":386,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_usermetadata.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/usermetadata.default\"},{\"id\":387,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_usermetadata.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/usermetadata.default\"},{\"id\":388,\"kind\":2048,\"name\":\"getUserMetadata\",\"url\":\"classes/recipe_usermetadata.default.html#getUserMetadata\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/usermetadata.default\"},{\"id\":389,\"kind\":2048,\"name\":\"updateUserMetadata\",\"url\":\"classes/recipe_usermetadata.default.html#updateUserMetadata\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/usermetadata.default\"},{\"id\":390,\"kind\":2048,\"name\":\"clearUserMetadata\",\"url\":\"classes/recipe_usermetadata.default.html#clearUserMetadata\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/usermetadata.default\"},{\"id\":391,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_usermetadata.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/usermetadata.default\"},{\"id\":392,\"kind\":2,\"name\":\"recipe/userroles\",\"url\":\"modules/recipe_userroles.html\",\"classes\":\"tsd-kind-module\"},{\"id\":393,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_userroles.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":394,\"kind\":64,\"name\":\"addRoleToUser\",\"url\":\"modules/recipe_userroles.html#addRoleToUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":395,\"kind\":64,\"name\":\"removeUserRole\",\"url\":\"modules/recipe_userroles.html#removeUserRole-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":396,\"kind\":64,\"name\":\"getRolesForUser\",\"url\":\"modules/recipe_userroles.html#getRolesForUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":397,\"kind\":64,\"name\":\"getUsersThatHaveRole\",\"url\":\"modules/recipe_userroles.html#getUsersThatHaveRole-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":398,\"kind\":64,\"name\":\"createNewRoleOrAddPermissions\",\"url\":\"modules/recipe_userroles.html#createNewRoleOrAddPermissions-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":399,\"kind\":64,\"name\":\"getPermissionsForRole\",\"url\":\"modules/recipe_userroles.html#getPermissionsForRole-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":400,\"kind\":64,\"name\":\"removePermissionsFromRole\",\"url\":\"modules/recipe_userroles.html#removePermissionsFromRole-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":401,\"kind\":64,\"name\":\"getRolesThatHavePermission\",\"url\":\"modules/recipe_userroles.html#getRolesThatHavePermission-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":402,\"kind\":64,\"name\":\"deleteRole\",\"url\":\"modules/recipe_userroles.html#deleteRole-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":403,\"kind\":64,\"name\":\"getAllRoles\",\"url\":\"modules/recipe_userroles.html#getAllRoles-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":404,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_userroles.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":405,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_userroles.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":406,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_userroles.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/userroles.default\"},{\"id\":407,\"kind\":1024,\"name\":\"PermissionClaim\",\"url\":\"classes/recipe_userroles.default.html#PermissionClaim\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":408,\"kind\":1024,\"name\":\"UserRoleClaim\",\"url\":\"classes/recipe_userroles.default.html#UserRoleClaim\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":409,\"kind\":2048,\"name\":\"addRoleToUser\",\"url\":\"classes/recipe_userroles.default.html#addRoleToUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":410,\"kind\":2048,\"name\":\"removeUserRole\",\"url\":\"classes/recipe_userroles.default.html#removeUserRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":411,\"kind\":2048,\"name\":\"getRolesForUser\",\"url\":\"classes/recipe_userroles.default.html#getRolesForUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":412,\"kind\":2048,\"name\":\"getUsersThatHaveRole\",\"url\":\"classes/recipe_userroles.default.html#getUsersThatHaveRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":413,\"kind\":2048,\"name\":\"createNewRoleOrAddPermissions\",\"url\":\"classes/recipe_userroles.default.html#createNewRoleOrAddPermissions\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":414,\"kind\":2048,\"name\":\"getPermissionsForRole\",\"url\":\"classes/recipe_userroles.default.html#getPermissionsForRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":415,\"kind\":2048,\"name\":\"removePermissionsFromRole\",\"url\":\"classes/recipe_userroles.default.html#removePermissionsFromRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":416,\"kind\":2048,\"name\":\"getRolesThatHavePermission\",\"url\":\"classes/recipe_userroles.default.html#getRolesThatHavePermission\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":417,\"kind\":2048,\"name\":\"deleteRole\",\"url\":\"classes/recipe_userroles.default.html#deleteRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":418,\"kind\":2048,\"name\":\"getAllRoles\",\"url\":\"classes/recipe_userroles.default.html#getAllRoles\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":419,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_userroles.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/userroles.default\"},{\"id\":420,\"kind\":128,\"name\":\"RecipeUserId\",\"url\":\"classes/index.RecipeUserId.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":421,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/index.RecipeUserId.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"index.RecipeUserId\"},{\"id\":422,\"kind\":1024,\"name\":\"recipeUserId\",\"url\":\"classes/index.RecipeUserId.html#recipeUserId\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"index.RecipeUserId\"},{\"id\":423,\"kind\":2048,\"name\":\"getAsString\",\"url\":\"classes/index.RecipeUserId.html#getAsString\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"index.RecipeUserId\"},{\"id\":424,\"kind\":128,\"name\":\"User\",\"url\":\"classes/index.User.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":425,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/index.User.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":426,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/index.User.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":427,\"kind\":1024,\"name\":\"isPrimaryUser\",\"url\":\"classes/index.User.html#isPrimaryUser\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":428,\"kind\":1024,\"name\":\"tenantIds\",\"url\":\"classes/index.User.html#tenantIds\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":429,\"kind\":1024,\"name\":\"emails\",\"url\":\"classes/index.User.html#emails\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":430,\"kind\":1024,\"name\":\"phoneNumbers\",\"url\":\"classes/index.User.html#phoneNumbers\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":431,\"kind\":1024,\"name\":\"thirdParty\",\"url\":\"classes/index.User.html#thirdParty\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":432,\"kind\":1024,\"name\":\"loginMethods\",\"url\":\"classes/index.User.html#loginMethods\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":433,\"kind\":1024,\"name\":\"timeJoined\",\"url\":\"classes/index.User.html#timeJoined\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":434,\"kind\":2048,\"name\":\"toJson\",\"url\":\"classes/index.User.html#toJson\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":435,\"kind\":128,\"name\":\"BaseRequest\",\"url\":\"classes/framework.BaseRequest.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":436,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/framework.BaseRequest.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":437,\"kind\":1024,\"name\":\"wrapperUsed\",\"url\":\"classes/framework.BaseRequest.html#wrapperUsed\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":438,\"kind\":1024,\"name\":\"original\",\"url\":\"classes/framework.BaseRequest.html#original\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":439,\"kind\":1024,\"name\":\"getKeyValueFromQuery\",\"url\":\"classes/framework.BaseRequest.html#getKeyValueFromQuery\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":440,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseRequest.html#__type-4\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":441,\"kind\":1024,\"name\":\"getJSONBody\",\"url\":\"classes/framework.BaseRequest.html#getJSONBody\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":442,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseRequest.html#__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":443,\"kind\":1024,\"name\":\"getMethod\",\"url\":\"classes/framework.BaseRequest.html#getMethod\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":444,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseRequest.html#__type-5\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":445,\"kind\":1024,\"name\":\"getCookieValue\",\"url\":\"classes/framework.BaseRequest.html#getCookieValue\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":446,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseRequest.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":447,\"kind\":1024,\"name\":\"getHeaderValue\",\"url\":\"classes/framework.BaseRequest.html#getHeaderValue\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":448,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseRequest.html#__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":449,\"kind\":1024,\"name\":\"getOriginalURL\",\"url\":\"classes/framework.BaseRequest.html#getOriginalURL\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":450,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseRequest.html#__type-6\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":451,\"kind\":1024,\"name\":\"getFormData\",\"url\":\"classes/framework.BaseRequest.html#getFormData\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":452,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseRequest.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":453,\"kind\":128,\"name\":\"BaseResponse\",\"url\":\"classes/framework.BaseResponse.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":454,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/framework.BaseResponse.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":455,\"kind\":1024,\"name\":\"wrapperUsed\",\"url\":\"classes/framework.BaseResponse.html#wrapperUsed\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":456,\"kind\":1024,\"name\":\"original\",\"url\":\"classes/framework.BaseResponse.html#original\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":457,\"kind\":1024,\"name\":\"setHeader\",\"url\":\"classes/framework.BaseResponse.html#setHeader\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":458,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseResponse.html#__type-4\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":459,\"kind\":1024,\"name\":\"removeHeader\",\"url\":\"classes/framework.BaseResponse.html#removeHeader\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":460,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseResponse.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":461,\"kind\":1024,\"name\":\"setCookie\",\"url\":\"classes/framework.BaseResponse.html#setCookie\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":462,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseResponse.html#__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":463,\"kind\":1024,\"name\":\"setStatusCode\",\"url\":\"classes/framework.BaseResponse.html#setStatusCode\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":464,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseResponse.html#__type-5\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":465,\"kind\":1024,\"name\":\"sendJSONResponse\",\"url\":\"classes/framework.BaseResponse.html#sendJSONResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":466,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseResponse.html#__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":467,\"kind\":1024,\"name\":\"sendHTMLResponse\",\"url\":\"classes/framework.BaseResponse.html#sendHTMLResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":468,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseResponse.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":469,\"kind\":256,\"name\":\"SessionEvent\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"framework/awsLambda\"},{\"id\":470,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"framework/awsLambda.SessionEvent\"},{\"id\":471,\"kind\":1024,\"name\":\"supertokens\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html#supertokens\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"framework/awsLambda.SessionEvent\"},{\"id\":472,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"framework/awsLambda.SessionEvent\"},{\"id\":473,\"kind\":1024,\"name\":\"response\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html#__type.response\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEvent.__type\"},{\"id\":474,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html#__type.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEvent.__type\"},{\"id\":475,\"kind\":1024,\"name\":\"headers\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html#__type.__type-1.headers-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEvent.__type.__type\"},{\"id\":476,\"kind\":1024,\"name\":\"cookies\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html#__type.__type-1.cookies\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEvent.__type.__type\"},{\"id\":477,\"kind\":256,\"name\":\"SessionEventV2\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"framework/awsLambda\"},{\"id\":478,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"framework/awsLambda.SessionEventV2\"},{\"id\":479,\"kind\":1024,\"name\":\"supertokens\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#supertokens\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"framework/awsLambda.SessionEventV2\"},{\"id\":480,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type-5\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"framework/awsLambda.SessionEventV2\"},{\"id\":481,\"kind\":1024,\"name\":\"response\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type-5.response\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type\"},{\"id\":482,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type-5.__type-6\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type\"},{\"id\":483,\"kind\":1024,\"name\":\"headers\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type-5.__type-6.headers-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type.__type\"},{\"id\":484,\"kind\":1024,\"name\":\"cookies\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type-5.__type-6.cookies-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type.__type\"},{\"id\":485,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"framework/awsLambda.SessionEventV2\"},{\"id\":486,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type\"},{\"id\":487,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type.__type-1.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type.__type\"},{\"id\":488,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type.__type-1.__type-2.__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type.__type.__type\"},{\"id\":489,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type.__type-4\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type\"},{\"id\":490,\"kind\":256,\"name\":\"SessionRequest\",\"url\":\"interfaces/framework_express.SessionRequest.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"framework/express\"},{\"id\":491,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/framework_express.SessionRequest.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"framework/express.SessionRequest\"},{\"id\":492,\"kind\":256,\"name\":\"SessionRequest\",\"url\":\"interfaces/framework_fastify.SessionRequest.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"framework/fastify\"},{\"id\":493,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/framework_fastify.SessionRequest.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"framework/fastify.SessionRequest\"},{\"id\":494,\"kind\":256,\"name\":\"SessionRequest\",\"url\":\"interfaces/framework_hapi.SessionRequest.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"framework/hapi\"},{\"id\":495,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/framework_hapi.SessionRequest.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"framework/hapi.SessionRequest\"},{\"id\":496,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_hapi.SessionRequest.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"framework/hapi.SessionRequest\"},{\"id\":497,\"kind\":256,\"name\":\"SessionContext\",\"url\":\"interfaces/framework_koa.SessionContext.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"framework/koa\"},{\"id\":498,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/framework_koa.SessionContext.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"framework/koa.SessionContext\"},{\"id\":499,\"kind\":256,\"name\":\"SessionContext\",\"url\":\"interfaces/framework_loopback.SessionContext.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"framework/loopback\"},{\"id\":500,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/framework_loopback.SessionContext.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"framework/loopback.SessionContext\"},{\"id\":501,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":502,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/accountlinking.RecipeInterface\"},{\"id\":503,\"kind\":2048,\"name\":\"getUsers\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.getUsers\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":504,\"kind\":2048,\"name\":\"canCreatePrimaryUser\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.canCreatePrimaryUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":505,\"kind\":2048,\"name\":\"createPrimaryUser\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.createPrimaryUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":506,\"kind\":2048,\"name\":\"canLinkAccounts\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.canLinkAccounts\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":507,\"kind\":2048,\"name\":\"linkAccounts\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.linkAccounts\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":508,\"kind\":2048,\"name\":\"unlinkAccount\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.unlinkAccount\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":509,\"kind\":2048,\"name\":\"getUser\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.getUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":510,\"kind\":2048,\"name\":\"listUsersByAccountInfo\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.listUsersByAccountInfo\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":511,\"kind\":2048,\"name\":\"deleteUser\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.deleteUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":512,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_dashboard.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/dashboard\"},{\"id\":513,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_dashboard.html#RecipeInterface.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/dashboard.RecipeInterface\"},{\"id\":514,\"kind\":2048,\"name\":\"getDashboardBundleLocation\",\"url\":\"modules/recipe_dashboard.html#RecipeInterface.__type-2.getDashboardBundleLocation\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.RecipeInterface.__type\"},{\"id\":515,\"kind\":2048,\"name\":\"shouldAllowAccess\",\"url\":\"modules/recipe_dashboard.html#RecipeInterface.__type-2.shouldAllowAccess\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.RecipeInterface.__type\"},{\"id\":516,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_dashboard.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/dashboard\"},{\"id\":517,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/dashboard.APIOptions\"},{\"id\":518,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIOptions.__type\"},{\"id\":519,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIOptions.__type\"},{\"id\":520,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIOptions.__type\"},{\"id\":521,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIOptions.__type\"},{\"id\":522,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIOptions.__type\"},{\"id\":523,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIOptions.__type\"},{\"id\":524,\"kind\":1024,\"name\":\"appInfo\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1.appInfo\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIOptions.__type\"},{\"id\":525,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_dashboard.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/dashboard\"},{\"id\":526,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_dashboard.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/dashboard.APIInterface\"},{\"id\":527,\"kind\":1024,\"name\":\"dashboardGET\",\"url\":\"modules/recipe_dashboard.html#APIInterface.__type.dashboardGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIInterface.__type\"},{\"id\":528,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":529,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/emailpassword.RecipeInterface\"},{\"id\":530,\"kind\":2048,\"name\":\"signUp\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface.__type-2.signUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.RecipeInterface.__type\"},{\"id\":531,\"kind\":2048,\"name\":\"createNewRecipeUser\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface.__type-2.createNewRecipeUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.RecipeInterface.__type\"},{\"id\":532,\"kind\":2048,\"name\":\"signIn\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface.__type-2.signIn\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.RecipeInterface.__type\"},{\"id\":533,\"kind\":2048,\"name\":\"createResetPasswordToken\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface.__type-2.createResetPasswordToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.RecipeInterface.__type\"},{\"id\":534,\"kind\":2048,\"name\":\"consumePasswordResetToken\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface.__type-2.consumePasswordResetToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.RecipeInterface.__type\"},{\"id\":535,\"kind\":2048,\"name\":\"updateEmailOrPassword\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface.__type-2.updateEmailOrPassword\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.RecipeInterface.__type\"},{\"id\":536,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_emailpassword.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":537,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/emailpassword.APIOptions\"},{\"id\":538,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":539,\"kind\":1024,\"name\":\"appInfo\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.appInfo\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":540,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":541,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":542,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":543,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":544,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":545,\"kind\":1024,\"name\":\"emailDelivery\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.emailDelivery\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":546,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_emailpassword.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":547,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_emailpassword.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/emailpassword.APIInterface\"},{\"id\":548,\"kind\":1024,\"name\":\"emailExistsGET\",\"url\":\"modules/recipe_emailpassword.html#APIInterface.__type.emailExistsGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIInterface.__type\"},{\"id\":549,\"kind\":1024,\"name\":\"generatePasswordResetTokenPOST\",\"url\":\"modules/recipe_emailpassword.html#APIInterface.__type.generatePasswordResetTokenPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIInterface.__type\"},{\"id\":550,\"kind\":1024,\"name\":\"passwordResetPOST\",\"url\":\"modules/recipe_emailpassword.html#APIInterface.__type.passwordResetPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIInterface.__type\"},{\"id\":551,\"kind\":1024,\"name\":\"signInPOST\",\"url\":\"modules/recipe_emailpassword.html#APIInterface.__type.signInPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIInterface.__type\"},{\"id\":552,\"kind\":1024,\"name\":\"signUpPOST\",\"url\":\"modules/recipe_emailpassword.html#APIInterface.__type.signUpPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIInterface.__type\"},{\"id\":553,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_emailverification.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":554,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_emailverification.html#RecipeInterface.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/emailverification.RecipeInterface\"},{\"id\":555,\"kind\":2048,\"name\":\"createEmailVerificationToken\",\"url\":\"modules/recipe_emailverification.html#RecipeInterface.__type-2.createEmailVerificationToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.RecipeInterface.__type\"},{\"id\":556,\"kind\":2048,\"name\":\"verifyEmailUsingToken\",\"url\":\"modules/recipe_emailverification.html#RecipeInterface.__type-2.verifyEmailUsingToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.RecipeInterface.__type\"},{\"id\":557,\"kind\":2048,\"name\":\"isEmailVerified\",\"url\":\"modules/recipe_emailverification.html#RecipeInterface.__type-2.isEmailVerified\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.RecipeInterface.__type\"},{\"id\":558,\"kind\":2048,\"name\":\"revokeEmailVerificationTokens\",\"url\":\"modules/recipe_emailverification.html#RecipeInterface.__type-2.revokeEmailVerificationTokens\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.RecipeInterface.__type\"},{\"id\":559,\"kind\":2048,\"name\":\"unverifyEmail\",\"url\":\"modules/recipe_emailverification.html#RecipeInterface.__type-2.unverifyEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.RecipeInterface.__type\"},{\"id\":560,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_emailverification.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":561,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/emailverification.APIOptions\"},{\"id\":562,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":563,\"kind\":1024,\"name\":\"appInfo\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.appInfo\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":564,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":565,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":566,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":567,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":568,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":569,\"kind\":1024,\"name\":\"emailDelivery\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.emailDelivery\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":570,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_emailverification.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":571,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_emailverification.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/emailverification.APIInterface\"},{\"id\":572,\"kind\":1024,\"name\":\"verifyEmailPOST\",\"url\":\"modules/recipe_emailverification.html#APIInterface.__type.verifyEmailPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIInterface.__type\"},{\"id\":573,\"kind\":1024,\"name\":\"isEmailVerifiedGET\",\"url\":\"modules/recipe_emailverification.html#APIInterface.__type.isEmailVerifiedGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIInterface.__type\"},{\"id\":574,\"kind\":1024,\"name\":\"generateEmailVerifyTokenPOST\",\"url\":\"modules/recipe_emailverification.html#APIInterface.__type.generateEmailVerifyTokenPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIInterface.__type\"},{\"id\":575,\"kind\":4194304,\"name\":\"UserEmailInfo\",\"url\":\"modules/recipe_emailverification.html#UserEmailInfo\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":576,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_emailverification.html#UserEmailInfo.__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/emailverification.UserEmailInfo\"},{\"id\":577,\"kind\":1024,\"name\":\"recipeUserId\",\"url\":\"modules/recipe_emailverification.html#UserEmailInfo.__type-3.recipeUserId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.UserEmailInfo.__type\"},{\"id\":578,\"kind\":1024,\"name\":\"email\",\"url\":\"modules/recipe_emailverification.html#UserEmailInfo.__type-3.email\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.UserEmailInfo.__type\"},{\"id\":579,\"kind\":32,\"name\":\"EmailVerificationClaim\",\"url\":\"modules/recipe_emailverification.html#EmailVerificationClaim\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":580,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_jwt.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":581,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_jwt.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/jwt.APIInterface\"},{\"id\":582,\"kind\":1024,\"name\":\"getJWKSGET\",\"url\":\"modules/recipe_jwt.html#APIInterface.__type.getJWKSGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.APIInterface.__type\"},{\"id\":583,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_jwt.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":584,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_jwt.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/jwt.APIOptions\"},{\"id\":585,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_jwt.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.APIOptions.__type\"},{\"id\":586,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_jwt.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.APIOptions.__type\"},{\"id\":587,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_jwt.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.APIOptions.__type\"},{\"id\":588,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_jwt.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.APIOptions.__type\"},{\"id\":589,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_jwt.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.APIOptions.__type\"},{\"id\":590,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_jwt.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.APIOptions.__type\"},{\"id\":591,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_jwt.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":592,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_jwt.html#RecipeInterface.__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/jwt.RecipeInterface\"},{\"id\":593,\"kind\":2048,\"name\":\"createJWT\",\"url\":\"modules/recipe_jwt.html#RecipeInterface.__type-3.createJWT\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.RecipeInterface.__type\"},{\"id\":594,\"kind\":2048,\"name\":\"getJWKS\",\"url\":\"modules/recipe_jwt.html#RecipeInterface.__type-3.getJWKS\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.RecipeInterface.__type\"},{\"id\":595,\"kind\":4194304,\"name\":\"JsonWebKey\",\"url\":\"modules/recipe_jwt.html#JsonWebKey\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":596,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_jwt.html#JsonWebKey.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/jwt.JsonWebKey\"},{\"id\":597,\"kind\":1024,\"name\":\"kty\",\"url\":\"modules/recipe_jwt.html#JsonWebKey.__type-2.kty\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.JsonWebKey.__type\"},{\"id\":598,\"kind\":1024,\"name\":\"kid\",\"url\":\"modules/recipe_jwt.html#JsonWebKey.__type-2.kid\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.JsonWebKey.__type\"},{\"id\":599,\"kind\":1024,\"name\":\"n\",\"url\":\"modules/recipe_jwt.html#JsonWebKey.__type-2.n\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.JsonWebKey.__type\"},{\"id\":600,\"kind\":1024,\"name\":\"e\",\"url\":\"modules/recipe_jwt.html#JsonWebKey.__type-2.e\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.JsonWebKey.__type\"},{\"id\":601,\"kind\":1024,\"name\":\"alg\",\"url\":\"modules/recipe_jwt.html#JsonWebKey.__type-2.alg\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.JsonWebKey.__type\"},{\"id\":602,\"kind\":1024,\"name\":\"use\",\"url\":\"modules/recipe_jwt.html#JsonWebKey.__type-2.use\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.JsonWebKey.__type\"},{\"id\":603,\"kind\":32,\"name\":\"AllowedDomainsClaim\",\"url\":\"modules/recipe_multitenancy.html#AllowedDomainsClaim\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":604,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":605,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/multitenancy.RecipeInterface\"},{\"id\":606,\"kind\":2048,\"name\":\"getTenantId\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.getTenantId\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":607,\"kind\":2048,\"name\":\"createOrUpdateTenant\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.createOrUpdateTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":608,\"kind\":2048,\"name\":\"deleteTenant\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.deleteTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":609,\"kind\":2048,\"name\":\"getTenant\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.getTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":610,\"kind\":2048,\"name\":\"listAllTenants\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.listAllTenants\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":611,\"kind\":2048,\"name\":\"createOrUpdateThirdPartyConfig\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.createOrUpdateThirdPartyConfig\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":612,\"kind\":2048,\"name\":\"deleteThirdPartyConfig\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.deleteThirdPartyConfig\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":613,\"kind\":2048,\"name\":\"associateUserToTenant\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.associateUserToTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":614,\"kind\":2048,\"name\":\"disassociateUserFromTenant\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.disassociateUserFromTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":615,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_multitenancy.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":616,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/multitenancy.APIOptions\"},{\"id\":617,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIOptions.__type\"},{\"id\":618,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIOptions.__type\"},{\"id\":619,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIOptions.__type\"},{\"id\":620,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIOptions.__type\"},{\"id\":621,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIOptions.__type\"},{\"id\":622,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIOptions.__type\"},{\"id\":623,\"kind\":1024,\"name\":\"staticThirdPartyProviders\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1.staticThirdPartyProviders\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIOptions.__type\"},{\"id\":624,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_multitenancy.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":625,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_multitenancy.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/multitenancy.APIInterface\"},{\"id\":626,\"kind\":2048,\"name\":\"loginMethodsGET\",\"url\":\"modules/recipe_multitenancy.html#APIInterface.__type.loginMethodsGET\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIInterface.__type\"},{\"id\":627,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":628,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/passwordless.RecipeInterface\"},{\"id\":629,\"kind\":2048,\"name\":\"createCode\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.createCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":630,\"kind\":2048,\"name\":\"createNewCodeForDevice\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.createNewCodeForDevice\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":631,\"kind\":2048,\"name\":\"consumeCode\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.consumeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":632,\"kind\":2048,\"name\":\"updateUser\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.updateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":633,\"kind\":2048,\"name\":\"revokeAllCodes\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.revokeAllCodes\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":634,\"kind\":2048,\"name\":\"revokeCode\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.revokeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":635,\"kind\":2048,\"name\":\"listCodesByEmail\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.listCodesByEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":636,\"kind\":2048,\"name\":\"listCodesByPhoneNumber\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.listCodesByPhoneNumber\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":637,\"kind\":2048,\"name\":\"listCodesByDeviceId\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.listCodesByDeviceId\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":638,\"kind\":2048,\"name\":\"listCodesByPreAuthSessionId\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.listCodesByPreAuthSessionId\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":639,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_passwordless.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":640,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/passwordless.APIOptions\"},{\"id\":641,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":642,\"kind\":1024,\"name\":\"appInfo\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.appInfo\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":643,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":644,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":645,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":646,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":647,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":648,\"kind\":1024,\"name\":\"emailDelivery\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.emailDelivery\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":649,\"kind\":1024,\"name\":\"smsDelivery\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.smsDelivery\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":650,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_passwordless.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":651,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_passwordless.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/passwordless.APIInterface\"},{\"id\":652,\"kind\":2048,\"name\":\"createCodePOST\",\"url\":\"modules/recipe_passwordless.html#APIInterface.__type.createCodePOST\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIInterface.__type\"},{\"id\":653,\"kind\":2048,\"name\":\"resendCodePOST\",\"url\":\"modules/recipe_passwordless.html#APIInterface.__type.resendCodePOST\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIInterface.__type\"},{\"id\":654,\"kind\":2048,\"name\":\"consumeCodePOST\",\"url\":\"modules/recipe_passwordless.html#APIInterface.__type.consumeCodePOST\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIInterface.__type\"},{\"id\":655,\"kind\":2048,\"name\":\"emailExistsGET\",\"url\":\"modules/recipe_passwordless.html#APIInterface.__type.emailExistsGET\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIInterface.__type\"},{\"id\":656,\"kind\":2048,\"name\":\"phoneNumberExistsGET\",\"url\":\"modules/recipe_passwordless.html#APIInterface.__type.phoneNumberExistsGET\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIInterface.__type\"},{\"id\":657,\"kind\":256,\"name\":\"VerifySessionOptions\",\"url\":\"interfaces/recipe_session.VerifySessionOptions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":658,\"kind\":1024,\"name\":\"antiCsrfCheck\",\"url\":\"interfaces/recipe_session.VerifySessionOptions.html#antiCsrfCheck\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"recipe/session.VerifySessionOptions\"},{\"id\":659,\"kind\":1024,\"name\":\"sessionRequired\",\"url\":\"interfaces/recipe_session.VerifySessionOptions.html#sessionRequired\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"recipe/session.VerifySessionOptions\"},{\"id\":660,\"kind\":1024,\"name\":\"checkDatabase\",\"url\":\"interfaces/recipe_session.VerifySessionOptions.html#checkDatabase\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"recipe/session.VerifySessionOptions\"},{\"id\":661,\"kind\":2048,\"name\":\"overrideGlobalClaimValidators\",\"url\":\"interfaces/recipe_session.VerifySessionOptions.html#overrideGlobalClaimValidators\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.VerifySessionOptions\"},{\"id\":662,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_session.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":663,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/session.RecipeInterface\"},{\"id\":664,\"kind\":2048,\"name\":\"createNewSession\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.createNewSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":665,\"kind\":2048,\"name\":\"getGlobalClaimValidators\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.getGlobalClaimValidators\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":666,\"kind\":2048,\"name\":\"getSession\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.getSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":667,\"kind\":2048,\"name\":\"refreshSession\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.refreshSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":668,\"kind\":2048,\"name\":\"getSessionInformation\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.getSessionInformation\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":669,\"kind\":2048,\"name\":\"revokeAllSessionsForUser\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.revokeAllSessionsForUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":670,\"kind\":2048,\"name\":\"getAllSessionHandlesForUser\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.getAllSessionHandlesForUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":671,\"kind\":2048,\"name\":\"revokeSession\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.revokeSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":672,\"kind\":2048,\"name\":\"revokeMultipleSessions\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.revokeMultipleSessions\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":673,\"kind\":2048,\"name\":\"updateSessionDataInDatabase\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.updateSessionDataInDatabase\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":674,\"kind\":2048,\"name\":\"mergeIntoAccessTokenPayload\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.mergeIntoAccessTokenPayload\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":675,\"kind\":2048,\"name\":\"regenerateAccessToken\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.regenerateAccessToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":676,\"kind\":2048,\"name\":\"validateClaims\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.validateClaims\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":677,\"kind\":2048,\"name\":\"fetchAndSetClaim\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.fetchAndSetClaim\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":678,\"kind\":2048,\"name\":\"setClaimValue\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.setClaimValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal tsd-has-type-parameter\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":679,\"kind\":2048,\"name\":\"getClaimValue\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.getClaimValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal tsd-has-type-parameter\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":680,\"kind\":2048,\"name\":\"removeClaim\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.removeClaim\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":681,\"kind\":256,\"name\":\"SessionContainer\",\"url\":\"interfaces/recipe_session.SessionContainer.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":682,\"kind\":2048,\"name\":\"revokeSession\",\"url\":\"interfaces/recipe_session.SessionContainer.html#revokeSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":683,\"kind\":2048,\"name\":\"getSessionDataFromDatabase\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getSessionDataFromDatabase\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":684,\"kind\":2048,\"name\":\"updateSessionDataInDatabase\",\"url\":\"interfaces/recipe_session.SessionContainer.html#updateSessionDataInDatabase\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":685,\"kind\":2048,\"name\":\"getUserId\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getUserId\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":686,\"kind\":2048,\"name\":\"getRecipeUserId\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getRecipeUserId\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":687,\"kind\":2048,\"name\":\"getTenantId\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getTenantId\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":688,\"kind\":2048,\"name\":\"getAccessTokenPayload\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getAccessTokenPayload\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":689,\"kind\":2048,\"name\":\"getHandle\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getHandle\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":690,\"kind\":2048,\"name\":\"getAllSessionTokensDangerously\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getAllSessionTokensDangerously\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":691,\"kind\":2048,\"name\":\"getAccessToken\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getAccessToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":692,\"kind\":2048,\"name\":\"mergeIntoAccessTokenPayload\",\"url\":\"interfaces/recipe_session.SessionContainer.html#mergeIntoAccessTokenPayload\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":693,\"kind\":2048,\"name\":\"getTimeCreated\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getTimeCreated\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":694,\"kind\":2048,\"name\":\"getExpiry\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getExpiry\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":695,\"kind\":2048,\"name\":\"assertClaims\",\"url\":\"interfaces/recipe_session.SessionContainer.html#assertClaims\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":696,\"kind\":2048,\"name\":\"fetchAndSetClaim\",\"url\":\"interfaces/recipe_session.SessionContainer.html#fetchAndSetClaim\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface tsd-has-type-parameter\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":697,\"kind\":2048,\"name\":\"setClaimValue\",\"url\":\"interfaces/recipe_session.SessionContainer.html#setClaimValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface tsd-has-type-parameter\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":698,\"kind\":2048,\"name\":\"getClaimValue\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getClaimValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface tsd-has-type-parameter\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":699,\"kind\":2048,\"name\":\"removeClaim\",\"url\":\"interfaces/recipe_session.SessionContainer.html#removeClaim\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":700,\"kind\":2048,\"name\":\"attachToRequestResponse\",\"url\":\"interfaces/recipe_session.SessionContainer.html#attachToRequestResponse\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":701,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_session.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":702,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_session.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/session.APIInterface\"},{\"id\":703,\"kind\":1024,\"name\":\"refreshPOST\",\"url\":\"modules/recipe_session.html#APIInterface.__type.refreshPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIInterface.__type\"},{\"id\":704,\"kind\":1024,\"name\":\"signOutPOST\",\"url\":\"modules/recipe_session.html#APIInterface.__type.signOutPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIInterface.__type\"},{\"id\":705,\"kind\":2048,\"name\":\"verifySession\",\"url\":\"modules/recipe_session.html#APIInterface.__type.verifySession\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIInterface.__type\"},{\"id\":706,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_session.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":707,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_session.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/session.APIOptions\"},{\"id\":708,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_session.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIOptions.__type\"},{\"id\":709,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_session.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIOptions.__type\"},{\"id\":710,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_session.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIOptions.__type\"},{\"id\":711,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_session.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIOptions.__type\"},{\"id\":712,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_session.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIOptions.__type\"},{\"id\":713,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_session.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIOptions.__type\"},{\"id\":714,\"kind\":4194304,\"name\":\"SessionInformation\",\"url\":\"modules/recipe_session.html#SessionInformation\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":715,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/session.SessionInformation\"},{\"id\":716,\"kind\":1024,\"name\":\"sessionHandle\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.sessionHandle\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":717,\"kind\":1024,\"name\":\"userId\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.userId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":718,\"kind\":1024,\"name\":\"recipeUserId\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.recipeUserId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":719,\"kind\":1024,\"name\":\"sessionDataInDatabase\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.sessionDataInDatabase\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":720,\"kind\":1024,\"name\":\"expiry\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.expiry\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":721,\"kind\":1024,\"name\":\"customClaimsInAccessTokenPayload\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.customClaimsInAccessTokenPayload\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":722,\"kind\":1024,\"name\":\"timeCreated\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.timeCreated\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":723,\"kind\":1024,\"name\":\"tenantId\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.tenantId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":724,\"kind\":4194304,\"name\":\"SessionClaimValidator\",\"url\":\"modules/recipe_session.html#SessionClaimValidator\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":725,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_thirdparty.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":726,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdparty.html#RecipeInterface.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdparty.RecipeInterface\"},{\"id\":727,\"kind\":2048,\"name\":\"getProvider\",\"url\":\"modules/recipe_thirdparty.html#RecipeInterface.__type-2.getProvider\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.RecipeInterface.__type\"},{\"id\":728,\"kind\":2048,\"name\":\"signInUp\",\"url\":\"modules/recipe_thirdparty.html#RecipeInterface.__type-2.signInUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.RecipeInterface.__type\"},{\"id\":729,\"kind\":2048,\"name\":\"manuallyCreateOrUpdateUser\",\"url\":\"modules/recipe_thirdparty.html#RecipeInterface.__type-2.manuallyCreateOrUpdateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.RecipeInterface.__type\"},{\"id\":730,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_thirdparty.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":731,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdparty.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdparty.APIInterface\"},{\"id\":732,\"kind\":1024,\"name\":\"authorisationUrlGET\",\"url\":\"modules/recipe_thirdparty.html#APIInterface.__type.authorisationUrlGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIInterface.__type\"},{\"id\":733,\"kind\":1024,\"name\":\"signInUpPOST\",\"url\":\"modules/recipe_thirdparty.html#APIInterface.__type.signInUpPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIInterface.__type\"},{\"id\":734,\"kind\":1024,\"name\":\"appleRedirectHandlerPOST\",\"url\":\"modules/recipe_thirdparty.html#APIInterface.__type.appleRedirectHandlerPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIInterface.__type\"},{\"id\":735,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_thirdparty.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":736,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdparty.APIOptions\"},{\"id\":737,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":738,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":739,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":740,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":741,\"kind\":1024,\"name\":\"providers\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.providers\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":742,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":743,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":744,\"kind\":1024,\"name\":\"appInfo\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.appInfo\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":745,\"kind\":4194304,\"name\":\"TypeProvider\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":746,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider.__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdparty.TypeProvider\"},{\"id\":747,\"kind\":1024,\"name\":\"id\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider.__type-3.id\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.TypeProvider.__type\"},{\"id\":748,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider.__type-3.config-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.TypeProvider.__type\"},{\"id\":749,\"kind\":2048,\"name\":\"getConfigForClientType\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider.__type-3.getConfigForClientType\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.TypeProvider.__type\"},{\"id\":750,\"kind\":2048,\"name\":\"getAuthorisationRedirectURL\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider.__type-3.getAuthorisationRedirectURL\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.TypeProvider.__type\"},{\"id\":751,\"kind\":2048,\"name\":\"exchangeAuthCodeForOAuthTokens\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider.__type-3.exchangeAuthCodeForOAuthTokens\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.TypeProvider.__type\"},{\"id\":752,\"kind\":2048,\"name\":\"getUserInfo\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider.__type-3.getUserInfo\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.TypeProvider.__type\"},{\"id\":753,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":754,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface\"},{\"id\":755,\"kind\":2048,\"name\":\"thirdPartyGetProvider\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.thirdPartyGetProvider\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":756,\"kind\":2048,\"name\":\"thirdPartySignInUp\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.thirdPartySignInUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":757,\"kind\":2048,\"name\":\"thirdPartyManuallyCreateOrUpdateUser\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.thirdPartyManuallyCreateOrUpdateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":758,\"kind\":2048,\"name\":\"emailPasswordSignUp\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.emailPasswordSignUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":759,\"kind\":2048,\"name\":\"createNewEmailPasswordRecipeUser\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.createNewEmailPasswordRecipeUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":760,\"kind\":2048,\"name\":\"emailPasswordSignIn\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.emailPasswordSignIn\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":761,\"kind\":2048,\"name\":\"createResetPasswordToken\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.createResetPasswordToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":762,\"kind\":2048,\"name\":\"consumePasswordResetToken\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.consumePasswordResetToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":763,\"kind\":2048,\"name\":\"updateEmailOrPassword\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.updateEmailOrPassword\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":764,\"kind\":16777216,\"name\":\"TypeProvider\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#TypeProvider\",\"classes\":\"tsd-kind-reference tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":765,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":766,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface\"},{\"id\":767,\"kind\":1024,\"name\":\"authorisationUrlGET\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.authorisationUrlGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":768,\"kind\":1024,\"name\":\"emailPasswordEmailExistsGET\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.emailPasswordEmailExistsGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":769,\"kind\":1024,\"name\":\"generatePasswordResetTokenPOST\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.generatePasswordResetTokenPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":770,\"kind\":1024,\"name\":\"passwordResetPOST\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.passwordResetPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":771,\"kind\":1024,\"name\":\"thirdPartySignInUpPOST\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.thirdPartySignInUpPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":772,\"kind\":1024,\"name\":\"emailPasswordSignInPOST\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.emailPasswordSignInPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":773,\"kind\":1024,\"name\":\"emailPasswordSignUpPOST\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.emailPasswordSignUpPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":774,\"kind\":1024,\"name\":\"appleRedirectHandlerPOST\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.appleRedirectHandlerPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":775,\"kind\":4194304,\"name\":\"EmailPasswordAPIOptions\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#EmailPasswordAPIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":776,\"kind\":4194304,\"name\":\"ThirdPartyAPIOptions\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#ThirdPartyAPIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":777,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":778,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface\"},{\"id\":779,\"kind\":2048,\"name\":\"thirdPartySignInUp\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.thirdPartySignInUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":780,\"kind\":2048,\"name\":\"thirdPartyManuallyCreateOrUpdateUser\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.thirdPartyManuallyCreateOrUpdateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":781,\"kind\":2048,\"name\":\"thirdPartyGetProvider\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.thirdPartyGetProvider\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":782,\"kind\":2048,\"name\":\"createCode\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.createCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":783,\"kind\":2048,\"name\":\"createNewCodeForDevice\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.createNewCodeForDevice\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":784,\"kind\":2048,\"name\":\"consumeCode\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.consumeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":785,\"kind\":2048,\"name\":\"updatePasswordlessUser\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.updatePasswordlessUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":786,\"kind\":2048,\"name\":\"revokeAllCodes\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.revokeAllCodes\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":787,\"kind\":2048,\"name\":\"revokeCode\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.revokeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":788,\"kind\":2048,\"name\":\"listCodesByEmail\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.listCodesByEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":789,\"kind\":2048,\"name\":\"listCodesByPhoneNumber\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.listCodesByPhoneNumber\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":790,\"kind\":2048,\"name\":\"listCodesByDeviceId\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.listCodesByDeviceId\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":791,\"kind\":2048,\"name\":\"listCodesByPreAuthSessionId\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.listCodesByPreAuthSessionId\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":792,\"kind\":16777216,\"name\":\"TypeProvider\",\"url\":\"modules/recipe_thirdpartypasswordless.html#TypeProvider\",\"classes\":\"tsd-kind-reference tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":793,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":794,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface\"},{\"id\":795,\"kind\":1024,\"name\":\"authorisationUrlGET\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.authorisationUrlGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":796,\"kind\":1024,\"name\":\"thirdPartySignInUpPOST\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.thirdPartySignInUpPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":797,\"kind\":1024,\"name\":\"appleRedirectHandlerPOST\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.appleRedirectHandlerPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":798,\"kind\":1024,\"name\":\"createCodePOST\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.createCodePOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":799,\"kind\":1024,\"name\":\"resendCodePOST\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.resendCodePOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":800,\"kind\":1024,\"name\":\"consumeCodePOST\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.consumeCodePOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":801,\"kind\":1024,\"name\":\"passwordlessUserEmailExistsGET\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.passwordlessUserEmailExistsGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":802,\"kind\":1024,\"name\":\"passwordlessUserPhoneNumberExistsGET\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.passwordlessUserPhoneNumberExistsGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":803,\"kind\":4194304,\"name\":\"PasswordlessAPIOptions\",\"url\":\"modules/recipe_thirdpartypasswordless.html#PasswordlessAPIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":804,\"kind\":4194304,\"name\":\"ThirdPartyAPIOptions\",\"url\":\"modules/recipe_thirdpartypasswordless.html#ThirdPartyAPIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":805,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_usermetadata.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/usermetadata\"},{\"id\":806,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_usermetadata.html#RecipeInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/usermetadata.RecipeInterface\"},{\"id\":807,\"kind\":2048,\"name\":\"getUserMetadata\",\"url\":\"modules/recipe_usermetadata.html#RecipeInterface.__type.getUserMetadata\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/usermetadata.RecipeInterface.__type\"},{\"id\":808,\"kind\":2048,\"name\":\"updateUserMetadata\",\"url\":\"modules/recipe_usermetadata.html#RecipeInterface.__type.updateUserMetadata\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/usermetadata.RecipeInterface.__type\"},{\"id\":809,\"kind\":2048,\"name\":\"clearUserMetadata\",\"url\":\"modules/recipe_usermetadata.html#RecipeInterface.__type.clearUserMetadata\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/usermetadata.RecipeInterface.__type\"},{\"id\":810,\"kind\":256,\"name\":\"JSONObject\",\"url\":\"interfaces/recipe_usermetadata.JSONObject.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"recipe/usermetadata\"},{\"id\":811,\"kind\":32,\"name\":\"UserRoleClaim\",\"url\":\"modules/recipe_userroles.html#UserRoleClaim\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":812,\"kind\":32,\"name\":\"PermissionClaim\",\"url\":\"modules/recipe_userroles.html#PermissionClaim\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":813,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_userroles.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":814,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/userroles.RecipeInterface\"},{\"id\":815,\"kind\":2048,\"name\":\"addRoleToUser\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.addRoleToUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":816,\"kind\":2048,\"name\":\"removeUserRole\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.removeUserRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":817,\"kind\":2048,\"name\":\"getRolesForUser\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.getRolesForUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":818,\"kind\":2048,\"name\":\"getUsersThatHaveRole\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.getUsersThatHaveRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":819,\"kind\":2048,\"name\":\"createNewRoleOrAddPermissions\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.createNewRoleOrAddPermissions\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":820,\"kind\":2048,\"name\":\"getPermissionsForRole\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.getPermissionsForRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":821,\"kind\":2048,\"name\":\"removePermissionsFromRole\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.removePermissionsFromRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":822,\"kind\":2048,\"name\":\"getRolesThatHavePermission\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.getRolesThatHavePermission\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":823,\"kind\":2048,\"name\":\"deleteRole\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.deleteRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":824,\"kind\":2048,\"name\":\"getAllRoles\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.getAllRoles\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"}],\"index\":{\"version\":\"2.3.9\",\"fields\":[\"name\",\"parent\"],\"fieldVectors\":[[\"name/0\",[0,37.462]],[\"parent/0\",[]],[\"name/1\",[1,32.989]],[\"parent/1\",[0,3.701]],[\"name/2\",[2,58.003]],[\"parent/2\",[0,3.701]],[\"name/3\",[3,58.003]],[\"parent/3\",[0,3.701]],[\"name/4\",[4,58.003]],[\"parent/4\",[0,3.701]],[\"name/5\",[5,58.003]],[\"parent/5\",[0,3.701]],[\"name/6\",[6,54.638]],[\"parent/6\",[0,3.701]],[\"name/7\",[7,58.003]],[\"parent/7\",[0,3.701]],[\"name/8\",[8,58.003]],[\"parent/8\",[0,3.701]],[\"name/9\",[9,58.003]],[\"parent/9\",[0,3.701]],[\"name/10\",[10,58.003]],[\"parent/10\",[0,3.701]],[\"name/11\",[11,54.638]],[\"parent/11\",[0,3.701]],[\"name/12\",[12,54.638]],[\"parent/12\",[0,3.701]],[\"name/13\",[13,58.003]],[\"parent/13\",[0,3.701]],[\"name/14\",[14,58.003]],[\"parent/14\",[0,3.701]],[\"name/15\",[15,39.132]],[\"parent/15\",[0,3.701]],[\"name/16\",[16,37.988]],[\"parent/16\",[0,3.701]],[\"name/17\",[1,32.989]],[\"parent/17\",[17,3.701]],[\"name/18\",[18,24.058]],[\"parent/18\",[17,3.701]],[\"name/19\",[15,39.132]],[\"parent/19\",[17,3.701]],[\"name/20\",[19,50.118]],[\"parent/20\",[17,3.701]],[\"name/21\",[20,58.003]],[\"parent/21\",[17,3.701]],[\"name/22\",[2,58.003]],[\"parent/22\",[17,3.701]],[\"name/23\",[3,58.003]],[\"parent/23\",[17,3.701]],[\"name/24\",[4,58.003]],[\"parent/24\",[17,3.701]],[\"name/25\",[5,58.003]],[\"parent/25\",[17,3.701]],[\"name/26\",[7,58.003]],[\"parent/26\",[17,3.701]],[\"name/27\",[8,58.003]],[\"parent/27\",[17,3.701]],[\"name/28\",[9,58.003]],[\"parent/28\",[17,3.701]],[\"name/29\",[10,58.003]],[\"parent/29\",[17,3.701]],[\"name/30\",[11,54.638]],[\"parent/30\",[17,3.701]],[\"name/31\",[12,54.638]],[\"parent/31\",[17,3.701]],[\"name/32\",[6,54.638]],[\"parent/32\",[17,3.701]],[\"name/33\",[13,58.003]],[\"parent/33\",[17,3.701]],[\"name/34\",[14,58.003]],[\"parent/34\",[17,3.701]],[\"name/35\",[21,36.485]],[\"parent/35\",[17,3.701]],[\"name/36\",[22,42.742]],[\"parent/36\",[]],[\"name/37\",[23,58.003]],[\"parent/37\",[22,4.222]],[\"name/38\",[24,58.003]],[\"parent/38\",[22,4.222]],[\"name/39\",[25,58.003]],[\"parent/39\",[22,4.222]],[\"name/40\",[26,58.003]],[\"parent/40\",[22,4.222]],[\"name/41\",[27,58.003]],[\"parent/41\",[22,4.222]],[\"name/42\",[28,58.003]],[\"parent/42\",[22,4.222]],[\"name/43\",[16,37.988]],[\"parent/43\",[22,4.222]],[\"name/44\",[18,24.058]],[\"parent/44\",[22,4.222]],[\"name/45\",[23,58.003]],[\"parent/45\",[29,4.786]],[\"name/46\",[24,58.003]],[\"parent/46\",[29,4.786]],[\"name/47\",[25,58.003]],[\"parent/47\",[29,4.786]],[\"name/48\",[26,58.003]],[\"parent/48\",[29,4.786]],[\"name/49\",[27,58.003]],[\"parent/49\",[29,4.786]],[\"name/50\",[28,58.003]],[\"parent/50\",[29,4.786]],[\"name/51\",[30,48.448]],[\"parent/51\",[]],[\"name/52\",[31,52.125]],[\"parent/52\",[30,4.786]],[\"name/53\",[32,48.448]],[\"parent/53\",[30,4.786]],[\"name/54\",[33,48.448]],[\"parent/54\",[30,4.786]],[\"name/55\",[34,48.448]],[\"parent/55\",[]],[\"name/56\",[31,52.125]],[\"parent/56\",[34,4.786]],[\"name/57\",[35,58.003]],[\"parent/57\",[34,4.786]],[\"name/58\",[32,48.448]],[\"parent/58\",[34,4.786]],[\"name/59\",[33,48.448]],[\"parent/59\",[34,4.786]],[\"name/60\",[36,48.448]],[\"parent/60\",[]],[\"name/61\",[37,58.003]],[\"parent/61\",[36,4.786]],[\"name/62\",[35,58.003]],[\"parent/62\",[36,4.786]],[\"name/63\",[32,48.448]],[\"parent/63\",[36,4.786]],[\"name/64\",[33,48.448]],[\"parent/64\",[36,4.786]],[\"name/65\",[38,50.118]],[\"parent/65\",[]],[\"name/66\",[37,58.003]],[\"parent/66\",[38,4.951]],[\"name/67\",[32,48.448]],[\"parent/67\",[38,4.951]],[\"name/68\",[33,48.448]],[\"parent/68\",[38,4.951]],[\"name/69\",[39,50.118]],[\"parent/69\",[]],[\"name/70\",[31,52.125]],[\"parent/70\",[39,4.951]],[\"name/71\",[32,48.448]],[\"parent/71\",[39,4.951]],[\"name/72\",[33,48.448]],[\"parent/72\",[39,4.951]],[\"name/73\",[40,50.118]],[\"parent/73\",[]],[\"name/74\",[31,52.125]],[\"parent/74\",[40,4.951]],[\"name/75\",[32,48.448]],[\"parent/75\",[40,4.951]],[\"name/76\",[33,48.448]],[\"parent/76\",[40,4.951]],[\"name/77\",[41,58.003]],[\"parent/77\",[]],[\"name/78\",[16,37.988]],[\"parent/78\",[41,5.73]],[\"name/79\",[21,36.485]],[\"parent/79\",[42,5.73]],[\"name/80\",[43,58.003]],[\"parent/80\",[42,5.73]],[\"name/81\",[44,58.003]],[\"parent/81\",[]],[\"name/82\",[16,37.988]],[\"parent/82\",[44,5.73]],[\"name/83\",[21,36.485]],[\"parent/83\",[45,5.73]],[\"name/84\",[43,58.003]],[\"parent/84\",[45,5.73]],[\"name/85\",[46,40.424]],[\"parent/85\",[]],[\"name/86\",[1,32.989]],[\"parent/86\",[46,3.993]],[\"name/87\",[47,54.638]],[\"parent/87\",[46,3.993]],[\"name/88\",[48,54.638]],[\"parent/88\",[46,3.993]],[\"name/89\",[49,54.638]],[\"parent/89\",[46,3.993]],[\"name/90\",[50,54.638]],[\"parent/90\",[46,3.993]],[\"name/91\",[51,54.638]],[\"parent/91\",[46,3.993]],[\"name/92\",[52,58.003]],[\"parent/92\",[46,3.993]],[\"name/93\",[53,58.003]],[\"parent/93\",[46,3.993]],[\"name/94\",[54,58.003]],[\"parent/94\",[46,3.993]],[\"name/95\",[55,58.003]],[\"parent/95\",[46,3.993]],[\"name/96\",[56,58.003]],[\"parent/96\",[46,3.993]],[\"name/97\",[16,37.988]],[\"parent/97\",[46,3.993]],[\"name/98\",[1,32.989]],[\"parent/98\",[57,4.064]],[\"name/99\",[18,24.058]],[\"parent/99\",[57,4.064]],[\"name/100\",[52,58.003]],[\"parent/100\",[57,4.064]],[\"name/101\",[53,58.003]],[\"parent/101\",[57,4.064]],[\"name/102\",[47,54.638]],[\"parent/102\",[57,4.064]],[\"name/103\",[48,54.638]],[\"parent/103\",[57,4.064]],[\"name/104\",[49,54.638]],[\"parent/104\",[57,4.064]],[\"name/105\",[50,54.638]],[\"parent/105\",[57,4.064]],[\"name/106\",[51,54.638]],[\"parent/106\",[57,4.064]],[\"name/107\",[54,58.003]],[\"parent/107\",[57,4.064]],[\"name/108\",[55,58.003]],[\"parent/108\",[57,4.064]],[\"name/109\",[56,58.003]],[\"parent/109\",[57,4.064]],[\"name/110\",[21,36.485]],[\"parent/110\",[57,4.064]],[\"name/111\",[58,48.448]],[\"parent/111\",[]],[\"name/112\",[1,32.989]],[\"parent/112\",[58,4.786]],[\"name/113\",[16,37.988]],[\"parent/113\",[58,4.786]],[\"name/114\",[1,32.989]],[\"parent/114\",[59,5.398]],[\"name/115\",[18,24.058]],[\"parent/115\",[59,5.398]],[\"name/116\",[21,36.485]],[\"parent/116\",[59,5.398]],[\"name/117\",[60,39.132]],[\"parent/117\",[]],[\"name/118\",[1,32.989]],[\"parent/118\",[60,3.866]],[\"name/119\",[15,39.132]],[\"parent/119\",[60,3.866]],[\"name/120\",[61,54.638]],[\"parent/120\",[60,3.866]],[\"name/121\",[62,54.638]],[\"parent/121\",[60,3.866]],[\"name/122\",[63,48.448]],[\"parent/122\",[60,3.866]],[\"name/123\",[64,52.125]],[\"parent/123\",[60,3.866]],[\"name/124\",[65,48.448]],[\"parent/124\",[60,3.866]],[\"name/125\",[66,48.448]],[\"parent/125\",[60,3.866]],[\"name/126\",[67,52.125]],[\"parent/126\",[60,3.866]],[\"name/127\",[68,52.125]],[\"parent/127\",[60,3.866]],[\"name/128\",[69,43.652]],[\"parent/128\",[60,3.866]],[\"name/129\",[16,37.988]],[\"parent/129\",[60,3.866]],[\"name/130\",[1,32.989]],[\"parent/130\",[70,4.064]],[\"name/131\",[18,24.058]],[\"parent/131\",[70,4.064]],[\"name/132\",[15,39.132]],[\"parent/132\",[70,4.064]],[\"name/133\",[61,54.638]],[\"parent/133\",[70,4.064]],[\"name/134\",[62,54.638]],[\"parent/134\",[70,4.064]],[\"name/135\",[63,48.448]],[\"parent/135\",[70,4.064]],[\"name/136\",[64,52.125]],[\"parent/136\",[70,4.064]],[\"name/137\",[65,48.448]],[\"parent/137\",[70,4.064]],[\"name/138\",[66,48.448]],[\"parent/138\",[70,4.064]],[\"name/139\",[67,52.125]],[\"parent/139\",[70,4.064]],[\"name/140\",[68,52.125]],[\"parent/140\",[70,4.064]],[\"name/141\",[69,43.652]],[\"parent/141\",[70,4.064]],[\"name/142\",[21,36.485]],[\"parent/142\",[70,4.064]],[\"name/143\",[71,38.544]],[\"parent/143\",[]],[\"name/144\",[1,32.989]],[\"parent/144\",[71,3.808]],[\"name/145\",[15,39.132]],[\"parent/145\",[71,3.808]],[\"name/146\",[72,54.638]],[\"parent/146\",[71,3.808]],[\"name/147\",[73,58.003]],[\"parent/147\",[71,3.808]],[\"name/148\",[74,58.003]],[\"parent/148\",[71,3.808]],[\"name/149\",[75,54.638]],[\"parent/149\",[71,3.808]],[\"name/150\",[76,54.638]],[\"parent/150\",[71,3.808]],[\"name/151\",[77,54.638]],[\"parent/151\",[71,3.808]],[\"name/152\",[78,54.638]],[\"parent/152\",[71,3.808]],[\"name/153\",[69,43.652]],[\"parent/153\",[71,3.808]],[\"name/154\",[16,37.988]],[\"parent/154\",[71,3.808]],[\"name/155\",[1,32.989]],[\"parent/155\",[79,4.064]],[\"name/156\",[18,24.058]],[\"parent/156\",[79,4.064]],[\"name/157\",[15,39.132]],[\"parent/157\",[79,4.064]],[\"name/158\",[80,58.003]],[\"parent/158\",[79,4.064]],[\"name/159\",[72,54.638]],[\"parent/159\",[79,4.064]],[\"name/160\",[73,58.003]],[\"parent/160\",[79,4.064]],[\"name/161\",[74,58.003]],[\"parent/161\",[79,4.064]],[\"name/162\",[75,54.638]],[\"parent/162\",[79,4.064]],[\"name/163\",[76,54.638]],[\"parent/163\",[79,4.064]],[\"name/164\",[77,54.638]],[\"parent/164\",[79,4.064]],[\"name/165\",[78,54.638]],[\"parent/165\",[79,4.064]],[\"name/166\",[69,43.652]],[\"parent/166\",[79,4.064]],[\"name/167\",[21,36.485]],[\"parent/167\",[79,4.064]],[\"name/168\",[81,44.653]],[\"parent/168\",[]],[\"name/169\",[1,32.989]],[\"parent/169\",[81,4.411]],[\"name/170\",[82,47.017]],[\"parent/170\",[81,4.411]],[\"name/171\",[83,47.017]],[\"parent/171\",[81,4.411]],[\"name/172\",[16,37.988]],[\"parent/172\",[81,4.411]],[\"name/173\",[1,32.989]],[\"parent/173\",[84,4.951]],[\"name/174\",[18,24.058]],[\"parent/174\",[84,4.951]],[\"name/175\",[82,47.017]],[\"parent/175\",[84,4.951]],[\"name/176\",[83,47.017]],[\"parent/176\",[84,4.951]],[\"name/177\",[21,36.485]],[\"parent/177\",[84,4.951]],[\"name/178\",[85,39.758]],[\"parent/178\",[]],[\"name/179\",[1,32.989]],[\"parent/179\",[85,3.928]],[\"name/180\",[86,54.638]],[\"parent/180\",[85,3.928]],[\"name/181\",[87,54.638]],[\"parent/181\",[85,3.928]],[\"name/182\",[88,54.638]],[\"parent/182\",[85,3.928]],[\"name/183\",[89,54.638]],[\"parent/183\",[85,3.928]],[\"name/184\",[90,54.638]],[\"parent/184\",[85,3.928]],[\"name/185\",[91,54.638]],[\"parent/185\",[85,3.928]],[\"name/186\",[92,54.638]],[\"parent/186\",[85,3.928]],[\"name/187\",[93,54.638]],[\"parent/187\",[85,3.928]],[\"name/188\",[16,37.988]],[\"parent/188\",[85,3.928]],[\"name/189\",[1,32.989]],[\"parent/189\",[94,4.222]],[\"name/190\",[18,24.058]],[\"parent/190\",[94,4.222]],[\"name/191\",[86,54.638]],[\"parent/191\",[94,4.222]],[\"name/192\",[87,54.638]],[\"parent/192\",[94,4.222]],[\"name/193\",[88,54.638]],[\"parent/193\",[94,4.222]],[\"name/194\",[89,54.638]],[\"parent/194\",[94,4.222]],[\"name/195\",[90,54.638]],[\"parent/195\",[94,4.222]],[\"name/196\",[91,54.638]],[\"parent/196\",[94,4.222]],[\"name/197\",[92,54.638]],[\"parent/197\",[94,4.222]],[\"name/198\",[93,54.638]],[\"parent/198\",[94,4.222]],[\"name/199\",[21,36.485]],[\"parent/199\",[94,4.222]],[\"name/200\",[95,48.448]],[\"parent/200\",[]],[\"name/201\",[1,32.989]],[\"parent/201\",[95,4.786]],[\"name/202\",[96,52.125]],[\"parent/202\",[95,4.786]],[\"name/203\",[82,47.017]],[\"parent/203\",[95,4.786]],[\"name/204\",[83,47.017]],[\"parent/204\",[95,4.786]],[\"name/205\",[16,37.988]],[\"parent/205\",[95,4.786]],[\"name/206\",[1,32.989]],[\"parent/206\",[97,4.786]],[\"name/207\",[18,24.058]],[\"parent/207\",[97,4.786]],[\"name/208\",[96,52.125]],[\"parent/208\",[97,4.786]],[\"name/209\",[82,47.017]],[\"parent/209\",[97,4.786]],[\"name/210\",[83,47.017]],[\"parent/210\",[97,4.786]],[\"name/211\",[21,36.485]],[\"parent/211\",[97,4.786]],[\"name/212\",[98,36.485]],[\"parent/212\",[]],[\"name/213\",[1,32.989]],[\"parent/213\",[98,3.604]],[\"name/214\",[15,39.132]],[\"parent/214\",[98,3.604]],[\"name/215\",[99,48.448]],[\"parent/215\",[98,3.604]],[\"name/216\",[100,48.448]],[\"parent/216\",[98,3.604]],[\"name/217\",[101,48.448]],[\"parent/217\",[98,3.604]],[\"name/218\",[102,48.448]],[\"parent/218\",[98,3.604]],[\"name/219\",[103,48.448]],[\"parent/219\",[98,3.604]],[\"name/220\",[104,48.448]],[\"parent/220\",[98,3.604]],[\"name/221\",[105,48.448]],[\"parent/221\",[98,3.604]],[\"name/222\",[106,54.638]],[\"parent/222\",[98,3.604]],[\"name/223\",[107,48.448]],[\"parent/223\",[98,3.604]],[\"name/224\",[108,48.448]],[\"parent/224\",[98,3.604]],[\"name/225\",[109,52.125]],[\"parent/225\",[98,3.604]],[\"name/226\",[110,54.638]],[\"parent/226\",[98,3.604]],[\"name/227\",[69,43.652]],[\"parent/227\",[98,3.604]],[\"name/228\",[111,52.125]],[\"parent/228\",[98,3.604]],[\"name/229\",[16,37.988]],[\"parent/229\",[98,3.604]],[\"name/230\",[1,32.989]],[\"parent/230\",[112,3.753]],[\"name/231\",[18,24.058]],[\"parent/231\",[112,3.753]],[\"name/232\",[15,39.132]],[\"parent/232\",[112,3.753]],[\"name/233\",[99,48.448]],[\"parent/233\",[112,3.753]],[\"name/234\",[105,48.448]],[\"parent/234\",[112,3.753]],[\"name/235\",[100,48.448]],[\"parent/235\",[112,3.753]],[\"name/236\",[106,54.638]],[\"parent/236\",[112,3.753]],[\"name/237\",[107,48.448]],[\"parent/237\",[112,3.753]],[\"name/238\",[108,48.448]],[\"parent/238\",[112,3.753]],[\"name/239\",[102,48.448]],[\"parent/239\",[112,3.753]],[\"name/240\",[103,48.448]],[\"parent/240\",[112,3.753]],[\"name/241\",[101,48.448]],[\"parent/241\",[112,3.753]],[\"name/242\",[104,48.448]],[\"parent/242\",[112,3.753]],[\"name/243\",[109,52.125]],[\"parent/243\",[112,3.753]],[\"name/244\",[110,54.638]],[\"parent/244\",[112,3.753]],[\"name/245\",[69,43.652]],[\"parent/245\",[112,3.753]],[\"name/246\",[111,52.125]],[\"parent/246\",[112,3.753]],[\"name/247\",[21,36.485]],[\"parent/247\",[112,3.753]],[\"name/248\",[113,32.354]],[\"parent/248\",[]],[\"name/249\",[1,32.989]],[\"parent/249\",[113,3.196]],[\"name/250\",[114,54.638]],[\"parent/250\",[113,3.196]],[\"name/251\",[115,58.003]],[\"parent/251\",[113,3.196]],[\"name/252\",[116,54.638]],[\"parent/252\",[113,3.196]],[\"name/253\",[117,58.003]],[\"parent/253\",[113,3.196]],[\"name/254\",[118,54.638]],[\"parent/254\",[113,3.196]],[\"name/255\",[119,54.638]],[\"parent/255\",[113,3.196]],[\"name/256\",[120,58.003]],[\"parent/256\",[113,3.196]],[\"name/257\",[121,54.638]],[\"parent/257\",[113,3.196]],[\"name/258\",[122,54.638]],[\"parent/258\",[113,3.196]],[\"name/259\",[123,52.125]],[\"parent/259\",[113,3.196]],[\"name/260\",[124,54.638]],[\"parent/260\",[113,3.196]],[\"name/261\",[125,52.125]],[\"parent/261\",[113,3.196]],[\"name/262\",[126,52.125]],[\"parent/262\",[113,3.196]],[\"name/263\",[127,52.125]],[\"parent/263\",[113,3.196]],[\"name/264\",[128,52.125]],[\"parent/264\",[113,3.196]],[\"name/265\",[129,52.125]],[\"parent/265\",[113,3.196]],[\"name/266\",[130,52.125]],[\"parent/266\",[113,3.196]],[\"name/267\",[131,58.003]],[\"parent/267\",[113,3.196]],[\"name/268\",[15,39.132]],[\"parent/268\",[113,3.196]],[\"name/269\",[82,47.017]],[\"parent/269\",[113,3.196]],[\"name/270\",[83,47.017]],[\"parent/270\",[113,3.196]],[\"name/271\",[96,52.125]],[\"parent/271\",[113,3.196]],[\"name/272\",[16,37.988]],[\"parent/272\",[113,3.196]],[\"name/273\",[1,32.989]],[\"parent/273\",[132,3.436]],[\"name/274\",[18,24.058]],[\"parent/274\",[132,3.436]],[\"name/275\",[15,39.132]],[\"parent/275\",[132,3.436]],[\"name/276\",[114,54.638]],[\"parent/276\",[132,3.436]],[\"name/277\",[115,58.003]],[\"parent/277\",[132,3.436]],[\"name/278\",[131,58.003]],[\"parent/278\",[132,3.436]],[\"name/279\",[116,54.638]],[\"parent/279\",[132,3.436]],[\"name/280\",[117,58.003]],[\"parent/280\",[132,3.436]],[\"name/281\",[118,54.638]],[\"parent/281\",[132,3.436]],[\"name/282\",[119,54.638]],[\"parent/282\",[132,3.436]],[\"name/283\",[120,58.003]],[\"parent/283\",[132,3.436]],[\"name/284\",[121,54.638]],[\"parent/284\",[132,3.436]],[\"name/285\",[122,54.638]],[\"parent/285\",[132,3.436]],[\"name/286\",[123,52.125]],[\"parent/286\",[132,3.436]],[\"name/287\",[124,54.638]],[\"parent/287\",[132,3.436]],[\"name/288\",[125,52.125]],[\"parent/288\",[132,3.436]],[\"name/289\",[126,52.125]],[\"parent/289\",[132,3.436]],[\"name/290\",[82,47.017]],[\"parent/290\",[132,3.436]],[\"name/291\",[83,47.017]],[\"parent/291\",[132,3.436]],[\"name/292\",[96,52.125]],[\"parent/292\",[132,3.436]],[\"name/293\",[127,52.125]],[\"parent/293\",[132,3.436]],[\"name/294\",[128,52.125]],[\"parent/294\",[132,3.436]],[\"name/295\",[129,52.125]],[\"parent/295\",[132,3.436]],[\"name/296\",[130,52.125]],[\"parent/296\",[132,3.436]],[\"name/297\",[21,36.485]],[\"parent/297\",[132,3.436]],[\"name/298\",[133,43.652]],[\"parent/298\",[]],[\"name/299\",[1,32.989]],[\"parent/299\",[133,4.312]],[\"name/300\",[15,39.132]],[\"parent/300\",[133,4.312]],[\"name/301\",[134,54.638]],[\"parent/301\",[133,4.312]],[\"name/302\",[135,54.638]],[\"parent/302\",[133,4.312]],[\"name/303\",[16,37.988]],[\"parent/303\",[133,4.312]],[\"name/304\",[1,32.989]],[\"parent/304\",[136,4.786]],[\"name/305\",[18,24.058]],[\"parent/305\",[136,4.786]],[\"name/306\",[15,39.132]],[\"parent/306\",[136,4.786]],[\"name/307\",[134,54.638]],[\"parent/307\",[136,4.786]],[\"name/308\",[135,54.638]],[\"parent/308\",[136,4.786]],[\"name/309\",[21,36.485]],[\"parent/309\",[136,4.786]],[\"name/310\",[137,36.962]],[\"parent/310\",[]],[\"name/311\",[1,32.989]],[\"parent/311\",[137,3.651]],[\"name/312\",[15,39.132]],[\"parent/312\",[137,3.651]],[\"name/313\",[138,54.638]],[\"parent/313\",[137,3.651]],[\"name/314\",[139,54.638]],[\"parent/314\",[137,3.651]],[\"name/315\",[140,48.448]],[\"parent/315\",[137,3.651]],[\"name/316\",[141,48.448]],[\"parent/316\",[137,3.651]],[\"name/317\",[63,48.448]],[\"parent/317\",[137,3.651]],[\"name/318\",[64,52.125]],[\"parent/318\",[137,3.651]],[\"name/319\",[65,48.448]],[\"parent/319\",[137,3.651]],[\"name/320\",[66,48.448]],[\"parent/320\",[137,3.651]],[\"name/321\",[67,52.125]],[\"parent/321\",[137,3.651]],[\"name/322\",[68,52.125]],[\"parent/322\",[137,3.651]],[\"name/323\",[69,43.652]],[\"parent/323\",[137,3.651]],[\"name/324\",[16,37.988]],[\"parent/324\",[137,3.651]],[\"name/325\",[1,32.989]],[\"parent/325\",[142,3.928]],[\"name/326\",[18,24.058]],[\"parent/326\",[142,3.928]],[\"name/327\",[15,39.132]],[\"parent/327\",[142,3.928]],[\"name/328\",[140,48.448]],[\"parent/328\",[142,3.928]],[\"name/329\",[141,48.448]],[\"parent/329\",[142,3.928]],[\"name/330\",[138,54.638]],[\"parent/330\",[142,3.928]],[\"name/331\",[139,54.638]],[\"parent/331\",[142,3.928]],[\"name/332\",[63,48.448]],[\"parent/332\",[142,3.928]],[\"name/333\",[64,52.125]],[\"parent/333\",[142,3.928]],[\"name/334\",[65,48.448]],[\"parent/334\",[142,3.928]],[\"name/335\",[66,48.448]],[\"parent/335\",[142,3.928]],[\"name/336\",[67,52.125]],[\"parent/336\",[142,3.928]],[\"name/337\",[68,52.125]],[\"parent/337\",[142,3.928]],[\"name/338\",[69,43.652]],[\"parent/338\",[142,3.928]],[\"name/339\",[21,36.485]],[\"parent/339\",[142,3.928]],[\"name/340\",[143,34.779]],[\"parent/340\",[]],[\"name/341\",[1,32.989]],[\"parent/341\",[143,3.436]],[\"name/342\",[15,39.132]],[\"parent/342\",[143,3.436]],[\"name/343\",[140,48.448]],[\"parent/343\",[143,3.436]],[\"name/344\",[141,48.448]],[\"parent/344\",[143,3.436]],[\"name/345\",[144,58.003]],[\"parent/345\",[143,3.436]],[\"name/346\",[99,48.448]],[\"parent/346\",[143,3.436]],[\"name/347\",[100,48.448]],[\"parent/347\",[143,3.436]],[\"name/348\",[101,48.448]],[\"parent/348\",[143,3.436]],[\"name/349\",[102,48.448]],[\"parent/349\",[143,3.436]],[\"name/350\",[103,48.448]],[\"parent/350\",[143,3.436]],[\"name/351\",[104,48.448]],[\"parent/351\",[143,3.436]],[\"name/352\",[105,48.448]],[\"parent/352\",[143,3.436]],[\"name/353\",[145,54.638]],[\"parent/353\",[143,3.436]],[\"name/354\",[107,48.448]],[\"parent/354\",[143,3.436]],[\"name/355\",[108,48.448]],[\"parent/355\",[143,3.436]],[\"name/356\",[109,52.125]],[\"parent/356\",[143,3.436]],[\"name/357\",[69,43.652]],[\"parent/357\",[143,3.436]],[\"name/358\",[111,52.125]],[\"parent/358\",[143,3.436]],[\"name/359\",[16,37.988]],[\"parent/359\",[143,3.436]],[\"name/360\",[1,32.989]],[\"parent/360\",[146,3.651]],[\"name/361\",[18,24.058]],[\"parent/361\",[146,3.651]],[\"name/362\",[15,39.132]],[\"parent/362\",[146,3.651]],[\"name/363\",[140,48.448]],[\"parent/363\",[146,3.651]],[\"name/364\",[141,48.448]],[\"parent/364\",[146,3.651]],[\"name/365\",[99,48.448]],[\"parent/365\",[146,3.651]],[\"name/366\",[105,48.448]],[\"parent/366\",[146,3.651]],[\"name/367\",[100,48.448]],[\"parent/367\",[146,3.651]],[\"name/368\",[145,54.638]],[\"parent/368\",[146,3.651]],[\"name/369\",[107,48.448]],[\"parent/369\",[146,3.651]],[\"name/370\",[108,48.448]],[\"parent/370\",[146,3.651]],[\"name/371\",[102,48.448]],[\"parent/371\",[146,3.651]],[\"name/372\",[103,48.448]],[\"parent/372\",[146,3.651]],[\"name/373\",[101,48.448]],[\"parent/373\",[146,3.651]],[\"name/374\",[104,48.448]],[\"parent/374\",[146,3.651]],[\"name/375\",[109,52.125]],[\"parent/375\",[146,3.651]],[\"name/376\",[144,58.003]],[\"parent/376\",[146,3.651]],[\"name/377\",[69,43.652]],[\"parent/377\",[146,3.651]],[\"name/378\",[111,52.125]],[\"parent/378\",[146,3.651]],[\"name/379\",[21,36.485]],[\"parent/379\",[146,3.651]],[\"name/380\",[147,45.765]],[\"parent/380\",[]],[\"name/381\",[1,32.989]],[\"parent/381\",[147,4.521]],[\"name/382\",[148,54.638]],[\"parent/382\",[147,4.521]],[\"name/383\",[149,54.638]],[\"parent/383\",[147,4.521]],[\"name/384\",[150,54.638]],[\"parent/384\",[147,4.521]],[\"name/385\",[16,37.988]],[\"parent/385\",[147,4.521]],[\"name/386\",[1,32.989]],[\"parent/386\",[151,4.786]],[\"name/387\",[18,24.058]],[\"parent/387\",[151,4.786]],[\"name/388\",[148,54.638]],[\"parent/388\",[151,4.786]],[\"name/389\",[149,54.638]],[\"parent/389\",[151,4.786]],[\"name/390\",[150,54.638]],[\"parent/390\",[151,4.786]],[\"name/391\",[21,36.485]],[\"parent/391\",[151,4.786]],[\"name/392\",[152,39.132]],[\"parent/392\",[]],[\"name/393\",[1,32.989]],[\"parent/393\",[152,3.866]],[\"name/394\",[153,54.638]],[\"parent/394\",[152,3.866]],[\"name/395\",[154,54.638]],[\"parent/395\",[152,3.866]],[\"name/396\",[155,54.638]],[\"parent/396\",[152,3.866]],[\"name/397\",[156,54.638]],[\"parent/397\",[152,3.866]],[\"name/398\",[157,54.638]],[\"parent/398\",[152,3.866]],[\"name/399\",[158,54.638]],[\"parent/399\",[152,3.866]],[\"name/400\",[159,54.638]],[\"parent/400\",[152,3.866]],[\"name/401\",[160,54.638]],[\"parent/401\",[152,3.866]],[\"name/402\",[161,54.638]],[\"parent/402\",[152,3.866]],[\"name/403\",[162,54.638]],[\"parent/403\",[152,3.866]],[\"name/404\",[16,37.988]],[\"parent/404\",[152,3.866]],[\"name/405\",[1,32.989]],[\"parent/405\",[163,3.928]],[\"name/406\",[18,24.058]],[\"parent/406\",[163,3.928]],[\"name/407\",[164,58.003]],[\"parent/407\",[163,3.928]],[\"name/408\",[165,58.003]],[\"parent/408\",[163,3.928]],[\"name/409\",[153,54.638]],[\"parent/409\",[163,3.928]],[\"name/410\",[154,54.638]],[\"parent/410\",[163,3.928]],[\"name/411\",[155,54.638]],[\"parent/411\",[163,3.928]],[\"name/412\",[156,54.638]],[\"parent/412\",[163,3.928]],[\"name/413\",[157,54.638]],[\"parent/413\",[163,3.928]],[\"name/414\",[158,54.638]],[\"parent/414\",[163,3.928]],[\"name/415\",[159,54.638]],[\"parent/415\",[163,3.928]],[\"name/416\",[160,54.638]],[\"parent/416\",[163,3.928]],[\"name/417\",[161,54.638]],[\"parent/417\",[163,3.928]],[\"name/418\",[162,54.638]],[\"parent/418\",[163,3.928]],[\"name/419\",[21,36.485]],[\"parent/419\",[163,3.928]],[\"name/420\",[19,50.118]],[\"parent/420\",[0,3.701]],[\"name/421\",[21,36.485]],[\"parent/421\",[166,5.398]],[\"name/422\",[19,50.118]],[\"parent/422\",[166,5.398]],[\"name/423\",[167,63.111]],[\"parent/423\",[166,5.398]],[\"name/424\",[20,58.003]],[\"parent/424\",[0,3.701]],[\"name/425\",[21,36.485]],[\"parent/425\",[168,4.312]],[\"name/426\",[169,58.003]],[\"parent/426\",[168,4.312]],[\"name/427\",[170,63.111]],[\"parent/427\",[168,4.312]],[\"name/428\",[171,63.111]],[\"parent/428\",[168,4.312]],[\"name/429\",[172,63.111]],[\"parent/429\",[168,4.312]],[\"name/430\",[173,63.111]],[\"parent/430\",[168,4.312]],[\"name/431\",[174,63.111]],[\"parent/431\",[168,4.312]],[\"name/432\",[175,63.111]],[\"parent/432\",[168,4.312]],[\"name/433\",[176,63.111]],[\"parent/433\",[168,4.312]],[\"name/434\",[177,63.111]],[\"parent/434\",[168,4.312]],[\"name/435\",[178,63.111]],[\"parent/435\",[22,4.222]],[\"name/436\",[21,36.485]],[\"parent/436\",[179,3.808]],[\"name/437\",[180,58.003]],[\"parent/437\",[179,3.808]],[\"name/438\",[181,58.003]],[\"parent/438\",[179,3.808]],[\"name/439\",[182,63.111]],[\"parent/439\",[179,3.808]],[\"name/440\",[18,24.058]],[\"parent/440\",[179,3.808]],[\"name/441\",[183,63.111]],[\"parent/441\",[179,3.808]],[\"name/442\",[18,24.058]],[\"parent/442\",[179,3.808]],[\"name/443\",[184,63.111]],[\"parent/443\",[179,3.808]],[\"name/444\",[18,24.058]],[\"parent/444\",[179,3.808]],[\"name/445\",[185,63.111]],[\"parent/445\",[179,3.808]],[\"name/446\",[18,24.058]],[\"parent/446\",[179,3.808]],[\"name/447\",[186,63.111]],[\"parent/447\",[179,3.808]],[\"name/448\",[18,24.058]],[\"parent/448\",[179,3.808]],[\"name/449\",[187,63.111]],[\"parent/449\",[179,3.808]],[\"name/450\",[18,24.058]],[\"parent/450\",[179,3.808]],[\"name/451\",[188,63.111]],[\"parent/451\",[179,3.808]],[\"name/452\",[18,24.058]],[\"parent/452\",[179,3.808]],[\"name/453\",[189,63.111]],[\"parent/453\",[22,4.222]],[\"name/454\",[21,36.485]],[\"parent/454\",[190,3.928]],[\"name/455\",[180,58.003]],[\"parent/455\",[190,3.928]],[\"name/456\",[181,58.003]],[\"parent/456\",[190,3.928]],[\"name/457\",[191,63.111]],[\"parent/457\",[190,3.928]],[\"name/458\",[18,24.058]],[\"parent/458\",[190,3.928]],[\"name/459\",[192,63.111]],[\"parent/459\",[190,3.928]],[\"name/460\",[18,24.058]],[\"parent/460\",[190,3.928]],[\"name/461\",[193,63.111]],[\"parent/461\",[190,3.928]],[\"name/462\",[18,24.058]],[\"parent/462\",[190,3.928]],[\"name/463\",[194,63.111]],[\"parent/463\",[190,3.928]],[\"name/464\",[18,24.058]],[\"parent/464\",[190,3.928]],[\"name/465\",[195,63.111]],[\"parent/465\",[190,3.928]],[\"name/466\",[18,24.058]],[\"parent/466\",[190,3.928]],[\"name/467\",[196,63.111]],[\"parent/467\",[190,3.928]],[\"name/468\",[18,24.058]],[\"parent/468\",[190,3.928]],[\"name/469\",[197,63.111]],[\"parent/469\",[30,4.786]],[\"name/470\",[198,47.017]],[\"parent/470\",[199,5.398]],[\"name/471\",[200,58.003]],[\"parent/471\",[199,5.398]],[\"name/472\",[18,24.058]],[\"parent/472\",[199,5.398]],[\"name/473\",[201,58.003]],[\"parent/473\",[202,5.73]],[\"name/474\",[18,24.058]],[\"parent/474\",[202,5.73]],[\"name/475\",[203,58.003]],[\"parent/475\",[204,5.73]],[\"name/476\",[205,58.003]],[\"parent/476\",[204,5.73]],[\"name/477\",[206,63.111]],[\"parent/477\",[30,4.786]],[\"name/478\",[198,47.017]],[\"parent/478\",[207,5.149]],[\"name/479\",[200,58.003]],[\"parent/479\",[207,5.149]],[\"name/480\",[18,24.058]],[\"parent/480\",[207,5.149]],[\"name/481\",[201,58.003]],[\"parent/481\",[208,5.149]],[\"name/482\",[18,24.058]],[\"parent/482\",[208,5.149]],[\"name/483\",[203,58.003]],[\"parent/483\",[209,5.398]],[\"name/484\",[205,58.003]],[\"parent/484\",[209,5.398]],[\"name/485\",[18,24.058]],[\"parent/485\",[207,5.149]],[\"name/486\",[18,24.058]],[\"parent/486\",[208,5.149]],[\"name/487\",[18,24.058]],[\"parent/487\",[209,5.398]],[\"name/488\",[18,24.058]],[\"parent/488\",[210,6.235]],[\"name/489\",[18,24.058]],[\"parent/489\",[208,5.149]],[\"name/490\",[211,54.638]],[\"parent/490\",[34,4.786]],[\"name/491\",[198,47.017]],[\"parent/491\",[212,6.235]],[\"name/492\",[211,54.638]],[\"parent/492\",[36,4.786]],[\"name/493\",[198,47.017]],[\"parent/493\",[213,6.235]],[\"name/494\",[211,54.638]],[\"parent/494\",[38,4.951]],[\"name/495\",[198,47.017]],[\"parent/495\",[214,5.73]],[\"name/496\",[18,24.058]],[\"parent/496\",[214,5.73]],[\"name/497\",[215,58.003]],[\"parent/497\",[39,4.951]],[\"name/498\",[198,47.017]],[\"parent/498\",[216,6.235]],[\"name/499\",[215,58.003]],[\"parent/499\",[40,4.951]],[\"name/500\",[198,47.017]],[\"parent/500\",[217,6.235]],[\"name/501\",[218,41.139]],[\"parent/501\",[46,3.993]],[\"name/502\",[18,24.058]],[\"parent/502\",[219,6.235]],[\"name/503\",[220,63.111]],[\"parent/503\",[221,4.411]],[\"name/504\",[47,54.638]],[\"parent/504\",[221,4.411]],[\"name/505\",[48,54.638]],[\"parent/505\",[221,4.411]],[\"name/506\",[49,54.638]],[\"parent/506\",[221,4.411]],[\"name/507\",[50,54.638]],[\"parent/507\",[221,4.411]],[\"name/508\",[51,54.638]],[\"parent/508\",[221,4.411]],[\"name/509\",[11,54.638]],[\"parent/509\",[221,4.411]],[\"name/510\",[12,54.638]],[\"parent/510\",[221,4.411]],[\"name/511\",[6,54.638]],[\"parent/511\",[221,4.411]],[\"name/512\",[218,41.139]],[\"parent/512\",[58,4.786]],[\"name/513\",[18,24.058]],[\"parent/513\",[222,6.235]],[\"name/514\",[223,63.111]],[\"parent/514\",[224,5.73]],[\"name/515\",[225,63.111]],[\"parent/515\",[224,5.73]],[\"name/516\",[226,45.765]],[\"parent/516\",[58,4.786]],[\"name/517\",[18,24.058]],[\"parent/517\",[227,6.235]],[\"name/518\",[228,45.765]],[\"parent/518\",[229,4.645]],[\"name/519\",[230,44.653]],[\"parent/519\",[229,4.645]],[\"name/520\",[231,45.765]],[\"parent/520\",[229,4.645]],[\"name/521\",[232,45.765]],[\"parent/521\",[229,4.645]],[\"name/522\",[233,45.765]],[\"parent/522\",[229,4.645]],[\"name/523\",[234,45.765]],[\"parent/523\",[229,4.645]],[\"name/524\",[235,50.118]],[\"parent/524\",[229,4.645]],[\"name/525\",[236,43.652]],[\"parent/525\",[58,4.786]],[\"name/526\",[18,24.058]],[\"parent/526\",[237,6.235]],[\"name/527\",[238,63.111]],[\"parent/527\",[239,6.235]],[\"name/528\",[218,41.139]],[\"parent/528\",[60,3.866]],[\"name/529\",[18,24.058]],[\"parent/529\",[240,6.235]],[\"name/530\",[61,54.638]],[\"parent/530\",[241,4.786]],[\"name/531\",[242,63.111]],[\"parent/531\",[241,4.786]],[\"name/532\",[62,54.638]],[\"parent/532\",[241,4.786]],[\"name/533\",[63,48.448]],[\"parent/533\",[241,4.786]],[\"name/534\",[65,48.448]],[\"parent/534\",[241,4.786]],[\"name/535\",[66,48.448]],[\"parent/535\",[241,4.786]],[\"name/536\",[226,45.765]],[\"parent/536\",[60,3.866]],[\"name/537\",[18,24.058]],[\"parent/537\",[243,6.235]],[\"name/538\",[228,45.765]],[\"parent/538\",[244,4.521]],[\"name/539\",[235,50.118]],[\"parent/539\",[244,4.521]],[\"name/540\",[230,44.653]],[\"parent/540\",[244,4.521]],[\"name/541\",[231,45.765]],[\"parent/541\",[244,4.521]],[\"name/542\",[234,45.765]],[\"parent/542\",[244,4.521]],[\"name/543\",[232,45.765]],[\"parent/543\",[244,4.521]],[\"name/544\",[233,45.765]],[\"parent/544\",[244,4.521]],[\"name/545\",[245,54.638]],[\"parent/545\",[244,4.521]],[\"name/546\",[236,43.652]],[\"parent/546\",[60,3.866]],[\"name/547\",[18,24.058]],[\"parent/547\",[246,6.235]],[\"name/548\",[247,58.003]],[\"parent/548\",[248,4.951]],[\"name/549\",[249,58.003]],[\"parent/549\",[248,4.951]],[\"name/550\",[250,58.003]],[\"parent/550\",[248,4.951]],[\"name/551\",[251,63.111]],[\"parent/551\",[248,4.951]],[\"name/552\",[252,63.111]],[\"parent/552\",[248,4.951]],[\"name/553\",[218,41.139]],[\"parent/553\",[71,3.808]],[\"name/554\",[18,24.058]],[\"parent/554\",[253,6.235]],[\"name/555\",[72,54.638]],[\"parent/555\",[254,4.951]],[\"name/556\",[75,54.638]],[\"parent/556\",[254,4.951]],[\"name/557\",[76,54.638]],[\"parent/557\",[254,4.951]],[\"name/558\",[77,54.638]],[\"parent/558\",[254,4.951]],[\"name/559\",[78,54.638]],[\"parent/559\",[254,4.951]],[\"name/560\",[226,45.765]],[\"parent/560\",[71,3.808]],[\"name/561\",[18,24.058]],[\"parent/561\",[255,6.235]],[\"name/562\",[228,45.765]],[\"parent/562\",[256,4.521]],[\"name/563\",[235,50.118]],[\"parent/563\",[256,4.521]],[\"name/564\",[230,44.653]],[\"parent/564\",[256,4.521]],[\"name/565\",[231,45.765]],[\"parent/565\",[256,4.521]],[\"name/566\",[234,45.765]],[\"parent/566\",[256,4.521]],[\"name/567\",[232,45.765]],[\"parent/567\",[256,4.521]],[\"name/568\",[233,45.765]],[\"parent/568\",[256,4.521]],[\"name/569\",[245,54.638]],[\"parent/569\",[256,4.521]],[\"name/570\",[236,43.652]],[\"parent/570\",[71,3.808]],[\"name/571\",[18,24.058]],[\"parent/571\",[257,6.235]],[\"name/572\",[258,63.111]],[\"parent/572\",[259,5.398]],[\"name/573\",[260,63.111]],[\"parent/573\",[259,5.398]],[\"name/574\",[261,63.111]],[\"parent/574\",[259,5.398]],[\"name/575\",[262,63.111]],[\"parent/575\",[71,3.808]],[\"name/576\",[18,24.058]],[\"parent/576\",[263,6.235]],[\"name/577\",[19,50.118]],[\"parent/577\",[264,5.73]],[\"name/578\",[265,63.111]],[\"parent/578\",[264,5.73]],[\"name/579\",[80,58.003]],[\"parent/579\",[71,3.808]],[\"name/580\",[236,43.652]],[\"parent/580\",[81,4.411]],[\"name/581\",[18,24.058]],[\"parent/581\",[266,6.235]],[\"name/582\",[267,63.111]],[\"parent/582\",[268,6.235]],[\"name/583\",[226,45.765]],[\"parent/583\",[81,4.411]],[\"name/584\",[18,24.058]],[\"parent/584\",[269,6.235]],[\"name/585\",[228,45.765]],[\"parent/585\",[270,4.786]],[\"name/586\",[230,44.653]],[\"parent/586\",[270,4.786]],[\"name/587\",[231,45.765]],[\"parent/587\",[270,4.786]],[\"name/588\",[234,45.765]],[\"parent/588\",[270,4.786]],[\"name/589\",[232,45.765]],[\"parent/589\",[270,4.786]],[\"name/590\",[233,45.765]],[\"parent/590\",[270,4.786]],[\"name/591\",[218,41.139]],[\"parent/591\",[81,4.411]],[\"name/592\",[18,24.058]],[\"parent/592\",[271,6.235]],[\"name/593\",[82,47.017]],[\"parent/593\",[272,5.73]],[\"name/594\",[83,47.017]],[\"parent/594\",[272,5.73]],[\"name/595\",[273,63.111]],[\"parent/595\",[81,4.411]],[\"name/596\",[18,24.058]],[\"parent/596\",[274,6.235]],[\"name/597\",[275,63.111]],[\"parent/597\",[276,4.786]],[\"name/598\",[277,63.111]],[\"parent/598\",[276,4.786]],[\"name/599\",[278,63.111]],[\"parent/599\",[276,4.786]],[\"name/600\",[279,63.111]],[\"parent/600\",[276,4.786]],[\"name/601\",[280,63.111]],[\"parent/601\",[276,4.786]],[\"name/602\",[281,63.111]],[\"parent/602\",[276,4.786]],[\"name/603\",[282,63.111]],[\"parent/603\",[85,3.928]],[\"name/604\",[218,41.139]],[\"parent/604\",[85,3.928]],[\"name/605\",[18,24.058]],[\"parent/605\",[283,6.235]],[\"name/606\",[284,58.003]],[\"parent/606\",[285,4.411]],[\"name/607\",[86,54.638]],[\"parent/607\",[285,4.411]],[\"name/608\",[87,54.638]],[\"parent/608\",[285,4.411]],[\"name/609\",[88,54.638]],[\"parent/609\",[285,4.411]],[\"name/610\",[89,54.638]],[\"parent/610\",[285,4.411]],[\"name/611\",[90,54.638]],[\"parent/611\",[285,4.411]],[\"name/612\",[91,54.638]],[\"parent/612\",[285,4.411]],[\"name/613\",[92,54.638]],[\"parent/613\",[285,4.411]],[\"name/614\",[93,54.638]],[\"parent/614\",[285,4.411]],[\"name/615\",[226,45.765]],[\"parent/615\",[85,3.928]],[\"name/616\",[18,24.058]],[\"parent/616\",[286,6.235]],[\"name/617\",[228,45.765]],[\"parent/617\",[287,4.645]],[\"name/618\",[230,44.653]],[\"parent/618\",[287,4.645]],[\"name/619\",[231,45.765]],[\"parent/619\",[287,4.645]],[\"name/620\",[234,45.765]],[\"parent/620\",[287,4.645]],[\"name/621\",[232,45.765]],[\"parent/621\",[287,4.645]],[\"name/622\",[233,45.765]],[\"parent/622\",[287,4.645]],[\"name/623\",[288,63.111]],[\"parent/623\",[287,4.645]],[\"name/624\",[236,43.652]],[\"parent/624\",[85,3.928]],[\"name/625\",[18,24.058]],[\"parent/625\",[289,6.235]],[\"name/626\",[290,63.111]],[\"parent/626\",[291,6.235]],[\"name/627\",[218,41.139]],[\"parent/627\",[98,3.604]],[\"name/628\",[18,24.058]],[\"parent/628\",[292,6.235]],[\"name/629\",[99,48.448]],[\"parent/629\",[293,4.312]],[\"name/630\",[105,48.448]],[\"parent/630\",[293,4.312]],[\"name/631\",[100,48.448]],[\"parent/631\",[293,4.312]],[\"name/632\",[106,54.638]],[\"parent/632\",[293,4.312]],[\"name/633\",[107,48.448]],[\"parent/633\",[293,4.312]],[\"name/634\",[108,48.448]],[\"parent/634\",[293,4.312]],[\"name/635\",[102,48.448]],[\"parent/635\",[293,4.312]],[\"name/636\",[103,48.448]],[\"parent/636\",[293,4.312]],[\"name/637\",[101,48.448]],[\"parent/637\",[293,4.312]],[\"name/638\",[104,48.448]],[\"parent/638\",[293,4.312]],[\"name/639\",[226,45.765]],[\"parent/639\",[98,3.604]],[\"name/640\",[18,24.058]],[\"parent/640\",[294,6.235]],[\"name/641\",[228,45.765]],[\"parent/641\",[295,4.411]],[\"name/642\",[235,50.118]],[\"parent/642\",[295,4.411]],[\"name/643\",[230,44.653]],[\"parent/643\",[295,4.411]],[\"name/644\",[231,45.765]],[\"parent/644\",[295,4.411]],[\"name/645\",[234,45.765]],[\"parent/645\",[295,4.411]],[\"name/646\",[232,45.765]],[\"parent/646\",[295,4.411]],[\"name/647\",[233,45.765]],[\"parent/647\",[295,4.411]],[\"name/648\",[245,54.638]],[\"parent/648\",[295,4.411]],[\"name/649\",[296,63.111]],[\"parent/649\",[295,4.411]],[\"name/650\",[236,43.652]],[\"parent/650\",[98,3.604]],[\"name/651\",[18,24.058]],[\"parent/651\",[297,6.235]],[\"name/652\",[298,58.003]],[\"parent/652\",[299,4.951]],[\"name/653\",[300,58.003]],[\"parent/653\",[299,4.951]],[\"name/654\",[301,58.003]],[\"parent/654\",[299,4.951]],[\"name/655\",[247,58.003]],[\"parent/655\",[299,4.951]],[\"name/656\",[302,63.111]],[\"parent/656\",[299,4.951]],[\"name/657\",[303,63.111]],[\"parent/657\",[113,3.196]],[\"name/658\",[304,63.111]],[\"parent/658\",[305,5.149]],[\"name/659\",[306,63.111]],[\"parent/659\",[305,5.149]],[\"name/660\",[307,63.111]],[\"parent/660\",[305,5.149]],[\"name/661\",[308,63.111]],[\"parent/661\",[305,5.149]],[\"name/662\",[218,41.139]],[\"parent/662\",[113,3.196]],[\"name/663\",[18,24.058]],[\"parent/663\",[309,6.235]],[\"name/664\",[114,54.638]],[\"parent/664\",[310,3.808]],[\"name/665\",[311,63.111]],[\"parent/665\",[310,3.808]],[\"name/666\",[116,54.638]],[\"parent/666\",[310,3.808]],[\"name/667\",[119,54.638]],[\"parent/667\",[310,3.808]],[\"name/668\",[118,54.638]],[\"parent/668\",[310,3.808]],[\"name/669\",[121,54.638]],[\"parent/669\",[310,3.808]],[\"name/670\",[122,54.638]],[\"parent/670\",[310,3.808]],[\"name/671\",[123,52.125]],[\"parent/671\",[310,3.808]],[\"name/672\",[124,54.638]],[\"parent/672\",[310,3.808]],[\"name/673\",[125,52.125]],[\"parent/673\",[310,3.808]],[\"name/674\",[126,52.125]],[\"parent/674\",[310,3.808]],[\"name/675\",[312,63.111]],[\"parent/675\",[310,3.808]],[\"name/676\",[313,63.111]],[\"parent/676\",[310,3.808]],[\"name/677\",[127,52.125]],[\"parent/677\",[310,3.808]],[\"name/678\",[128,52.125]],[\"parent/678\",[310,3.808]],[\"name/679\",[129,52.125]],[\"parent/679\",[310,3.808]],[\"name/680\",[130,52.125]],[\"parent/680\",[310,3.808]],[\"name/681\",[314,63.111]],[\"parent/681\",[113,3.196]],[\"name/682\",[123,52.125]],[\"parent/682\",[315,3.701]],[\"name/683\",[316,63.111]],[\"parent/683\",[315,3.701]],[\"name/684\",[125,52.125]],[\"parent/684\",[315,3.701]],[\"name/685\",[317,63.111]],[\"parent/685\",[315,3.701]],[\"name/686\",[318,63.111]],[\"parent/686\",[315,3.701]],[\"name/687\",[284,58.003]],[\"parent/687\",[315,3.701]],[\"name/688\",[319,63.111]],[\"parent/688\",[315,3.701]],[\"name/689\",[320,63.111]],[\"parent/689\",[315,3.701]],[\"name/690\",[321,63.111]],[\"parent/690\",[315,3.701]],[\"name/691\",[322,63.111]],[\"parent/691\",[315,3.701]],[\"name/692\",[126,52.125]],[\"parent/692\",[315,3.701]],[\"name/693\",[323,63.111]],[\"parent/693\",[315,3.701]],[\"name/694\",[324,63.111]],[\"parent/694\",[315,3.701]],[\"name/695\",[325,63.111]],[\"parent/695\",[315,3.701]],[\"name/696\",[127,52.125]],[\"parent/696\",[315,3.701]],[\"name/697\",[128,52.125]],[\"parent/697\",[315,3.701]],[\"name/698\",[129,52.125]],[\"parent/698\",[315,3.701]],[\"name/699\",[130,52.125]],[\"parent/699\",[315,3.701]],[\"name/700\",[326,63.111]],[\"parent/700\",[315,3.701]],[\"name/701\",[236,43.652]],[\"parent/701\",[113,3.196]],[\"name/702\",[18,24.058]],[\"parent/702\",[327,6.235]],[\"name/703\",[328,63.111]],[\"parent/703\",[329,5.398]],[\"name/704\",[330,63.111]],[\"parent/704\",[329,5.398]],[\"name/705\",[331,63.111]],[\"parent/705\",[329,5.398]],[\"name/706\",[226,45.765]],[\"parent/706\",[113,3.196]],[\"name/707\",[18,24.058]],[\"parent/707\",[332,6.235]],[\"name/708\",[228,45.765]],[\"parent/708\",[333,4.786]],[\"name/709\",[230,44.653]],[\"parent/709\",[333,4.786]],[\"name/710\",[231,45.765]],[\"parent/710\",[333,4.786]],[\"name/711\",[234,45.765]],[\"parent/711\",[333,4.786]],[\"name/712\",[232,45.765]],[\"parent/712\",[333,4.786]],[\"name/713\",[233,45.765]],[\"parent/713\",[333,4.786]],[\"name/714\",[334,63.111]],[\"parent/714\",[113,3.196]],[\"name/715\",[18,24.058]],[\"parent/715\",[335,6.235]],[\"name/716\",[336,63.111]],[\"parent/716\",[337,4.521]],[\"name/717\",[338,63.111]],[\"parent/717\",[337,4.521]],[\"name/718\",[19,50.118]],[\"parent/718\",[337,4.521]],[\"name/719\",[339,63.111]],[\"parent/719\",[337,4.521]],[\"name/720\",[340,63.111]],[\"parent/720\",[337,4.521]],[\"name/721\",[341,63.111]],[\"parent/721\",[337,4.521]],[\"name/722\",[342,63.111]],[\"parent/722\",[337,4.521]],[\"name/723\",[343,63.111]],[\"parent/723\",[337,4.521]],[\"name/724\",[344,63.111]],[\"parent/724\",[113,3.196]],[\"name/725\",[218,41.139]],[\"parent/725\",[133,4.312]],[\"name/726\",[18,24.058]],[\"parent/726\",[345,6.235]],[\"name/727\",[134,54.638]],[\"parent/727\",[346,5.398]],[\"name/728\",[110,54.638]],[\"parent/728\",[346,5.398]],[\"name/729\",[135,54.638]],[\"parent/729\",[346,5.398]],[\"name/730\",[236,43.652]],[\"parent/730\",[133,4.312]],[\"name/731\",[18,24.058]],[\"parent/731\",[347,6.235]],[\"name/732\",[348,54.638]],[\"parent/732\",[349,5.398]],[\"name/733\",[350,63.111]],[\"parent/733\",[349,5.398]],[\"name/734\",[351,54.638]],[\"parent/734\",[349,5.398]],[\"name/735\",[226,45.765]],[\"parent/735\",[133,4.312]],[\"name/736\",[18,24.058]],[\"parent/736\",[352,6.235]],[\"name/737\",[228,45.765]],[\"parent/737\",[353,4.521]],[\"name/738\",[230,44.653]],[\"parent/738\",[353,4.521]],[\"name/739\",[231,45.765]],[\"parent/739\",[353,4.521]],[\"name/740\",[234,45.765]],[\"parent/740\",[353,4.521]],[\"name/741\",[354,63.111]],[\"parent/741\",[353,4.521]],[\"name/742\",[232,45.765]],[\"parent/742\",[353,4.521]],[\"name/743\",[233,45.765]],[\"parent/743\",[353,4.521]],[\"name/744\",[235,50.118]],[\"parent/744\",[353,4.521]],[\"name/745\",[355,54.638]],[\"parent/745\",[133,4.312]],[\"name/746\",[18,24.058]],[\"parent/746\",[356,6.235]],[\"name/747\",[169,58.003]],[\"parent/747\",[357,4.786]],[\"name/748\",[230,44.653]],[\"parent/748\",[357,4.786]],[\"name/749\",[358,63.111]],[\"parent/749\",[357,4.786]],[\"name/750\",[359,63.111]],[\"parent/750\",[357,4.786]],[\"name/751\",[360,63.111]],[\"parent/751\",[357,4.786]],[\"name/752\",[361,63.111]],[\"parent/752\",[357,4.786]],[\"name/753\",[218,41.139]],[\"parent/753\",[137,3.651]],[\"name/754\",[18,24.058]],[\"parent/754\",[362,6.235]],[\"name/755\",[140,48.448]],[\"parent/755\",[363,4.411]],[\"name/756\",[364,58.003]],[\"parent/756\",[363,4.411]],[\"name/757\",[141,48.448]],[\"parent/757\",[363,4.411]],[\"name/758\",[138,54.638]],[\"parent/758\",[363,4.411]],[\"name/759\",[365,63.111]],[\"parent/759\",[363,4.411]],[\"name/760\",[139,54.638]],[\"parent/760\",[363,4.411]],[\"name/761\",[63,48.448]],[\"parent/761\",[363,4.411]],[\"name/762\",[65,48.448]],[\"parent/762\",[363,4.411]],[\"name/763\",[66,48.448]],[\"parent/763\",[363,4.411]],[\"name/764\",[355,54.638]],[\"parent/764\",[137,3.651]],[\"name/765\",[236,43.652]],[\"parent/765\",[137,3.651]],[\"name/766\",[18,24.058]],[\"parent/766\",[366,6.235]],[\"name/767\",[348,54.638]],[\"parent/767\",[367,4.521]],[\"name/768\",[368,63.111]],[\"parent/768\",[367,4.521]],[\"name/769\",[249,58.003]],[\"parent/769\",[367,4.521]],[\"name/770\",[250,58.003]],[\"parent/770\",[367,4.521]],[\"name/771\",[369,58.003]],[\"parent/771\",[367,4.521]],[\"name/772\",[370,63.111]],[\"parent/772\",[367,4.521]],[\"name/773\",[371,63.111]],[\"parent/773\",[367,4.521]],[\"name/774\",[351,54.638]],[\"parent/774\",[367,4.521]],[\"name/775\",[372,63.111]],[\"parent/775\",[137,3.651]],[\"name/776\",[373,58.003]],[\"parent/776\",[137,3.651]],[\"name/777\",[218,41.139]],[\"parent/777\",[143,3.436]],[\"name/778\",[18,24.058]],[\"parent/778\",[374,6.235]],[\"name/779\",[364,58.003]],[\"parent/779\",[375,4.064]],[\"name/780\",[141,48.448]],[\"parent/780\",[375,4.064]],[\"name/781\",[140,48.448]],[\"parent/781\",[375,4.064]],[\"name/782\",[99,48.448]],[\"parent/782\",[375,4.064]],[\"name/783\",[105,48.448]],[\"parent/783\",[375,4.064]],[\"name/784\",[100,48.448]],[\"parent/784\",[375,4.064]],[\"name/785\",[145,54.638]],[\"parent/785\",[375,4.064]],[\"name/786\",[107,48.448]],[\"parent/786\",[375,4.064]],[\"name/787\",[108,48.448]],[\"parent/787\",[375,4.064]],[\"name/788\",[102,48.448]],[\"parent/788\",[375,4.064]],[\"name/789\",[103,48.448]],[\"parent/789\",[375,4.064]],[\"name/790\",[101,48.448]],[\"parent/790\",[375,4.064]],[\"name/791\",[104,48.448]],[\"parent/791\",[375,4.064]],[\"name/792\",[355,54.638]],[\"parent/792\",[143,3.436]],[\"name/793\",[236,43.652]],[\"parent/793\",[143,3.436]],[\"name/794\",[18,24.058]],[\"parent/794\",[376,6.235]],[\"name/795\",[348,54.638]],[\"parent/795\",[377,4.521]],[\"name/796\",[369,58.003]],[\"parent/796\",[377,4.521]],[\"name/797\",[351,54.638]],[\"parent/797\",[377,4.521]],[\"name/798\",[298,58.003]],[\"parent/798\",[377,4.521]],[\"name/799\",[300,58.003]],[\"parent/799\",[377,4.521]],[\"name/800\",[301,58.003]],[\"parent/800\",[377,4.521]],[\"name/801\",[378,63.111]],[\"parent/801\",[377,4.521]],[\"name/802\",[379,63.111]],[\"parent/802\",[377,4.521]],[\"name/803\",[380,63.111]],[\"parent/803\",[143,3.436]],[\"name/804\",[373,58.003]],[\"parent/804\",[143,3.436]],[\"name/805\",[218,41.139]],[\"parent/805\",[147,4.521]],[\"name/806\",[18,24.058]],[\"parent/806\",[381,6.235]],[\"name/807\",[148,54.638]],[\"parent/807\",[382,5.398]],[\"name/808\",[149,54.638]],[\"parent/808\",[382,5.398]],[\"name/809\",[150,54.638]],[\"parent/809\",[382,5.398]],[\"name/810\",[383,63.111]],[\"parent/810\",[147,4.521]],[\"name/811\",[165,58.003]],[\"parent/811\",[152,3.866]],[\"name/812\",[164,58.003]],[\"parent/812\",[152,3.866]],[\"name/813\",[218,41.139]],[\"parent/813\",[152,3.866]],[\"name/814\",[18,24.058]],[\"parent/814\",[384,6.235]],[\"name/815\",[153,54.638]],[\"parent/815\",[385,4.312]],[\"name/816\",[154,54.638]],[\"parent/816\",[385,4.312]],[\"name/817\",[155,54.638]],[\"parent/817\",[385,4.312]],[\"name/818\",[156,54.638]],[\"parent/818\",[385,4.312]],[\"name/819\",[157,54.638]],[\"parent/819\",[385,4.312]],[\"name/820\",[158,54.638]],[\"parent/820\",[385,4.312]],[\"name/821\",[159,54.638]],[\"parent/821\",[385,4.312]],[\"name/822\",[160,54.638]],[\"parent/822\",[385,4.312]],[\"name/823\",[161,54.638]],[\"parent/823\",[385,4.312]],[\"name/824\",[162,54.638]],[\"parent/824\",[385,4.312]]],\"invertedIndex\":[[\"__type\",{\"_index\":18,\"name\":{\"18\":{},\"44\":{},\"99\":{},\"115\":{},\"131\":{},\"156\":{},\"174\":{},\"190\":{},\"207\":{},\"231\":{},\"274\":{},\"305\":{},\"326\":{},\"361\":{},\"387\":{},\"406\":{},\"440\":{},\"442\":{},\"444\":{},\"446\":{},\"448\":{},\"450\":{},\"452\":{},\"458\":{},\"460\":{},\"462\":{},\"464\":{},\"466\":{},\"468\":{},\"472\":{},\"474\":{},\"480\":{},\"482\":{},\"485\":{},\"486\":{},\"487\":{},\"488\":{},\"489\":{},\"496\":{},\"502\":{},\"513\":{},\"517\":{},\"526\":{},\"529\":{},\"537\":{},\"547\":{},\"554\":{},\"561\":{},\"571\":{},\"576\":{},\"581\":{},\"584\":{},\"592\":{},\"596\":{},\"605\":{},\"616\":{},\"625\":{},\"628\":{},\"640\":{},\"651\":{},\"663\":{},\"702\":{},\"707\":{},\"715\":{},\"726\":{},\"731\":{},\"736\":{},\"746\":{},\"754\":{},\"766\":{},\"778\":{},\"794\":{},\"806\":{},\"814\":{}},\"parent\":{}}],[\"addroletouser\",{\"_index\":153,\"name\":{\"394\":{},\"409\":{},\"815\":{}},\"parent\":{}}],[\"alg\",{\"_index\":280,\"name\":{\"601\":{}},\"parent\":{}}],[\"alloweddomainsclaim\",{\"_index\":282,\"name\":{\"603\":{}},\"parent\":{}}],[\"anticsrfcheck\",{\"_index\":304,\"name\":{\"658\":{}},\"parent\":{}}],[\"apiinterface\",{\"_index\":236,\"name\":{\"525\":{},\"546\":{},\"570\":{},\"580\":{},\"624\":{},\"650\":{},\"701\":{},\"730\":{},\"765\":{},\"793\":{}},\"parent\":{}}],[\"apioptions\",{\"_index\":226,\"name\":{\"516\":{},\"536\":{},\"560\":{},\"583\":{},\"615\":{},\"639\":{},\"706\":{},\"735\":{}},\"parent\":{}}],[\"appinfo\",{\"_index\":235,\"name\":{\"524\":{},\"539\":{},\"563\":{},\"642\":{},\"744\":{}},\"parent\":{}}],[\"appleredirecthandlerpost\",{\"_index\":351,\"name\":{\"734\":{},\"774\":{},\"797\":{}},\"parent\":{}}],[\"assertclaims\",{\"_index\":325,\"name\":{\"695\":{}},\"parent\":{}}],[\"associateusertotenant\",{\"_index\":92,\"name\":{\"186\":{},\"197\":{},\"613\":{}},\"parent\":{}}],[\"attachtorequestresponse\",{\"_index\":326,\"name\":{\"700\":{}},\"parent\":{}}],[\"authorisationurlget\",{\"_index\":348,\"name\":{\"732\":{},\"767\":{},\"795\":{}},\"parent\":{}}],[\"awslambda\",{\"_index\":28,\"name\":{\"42\":{},\"50\":{}},\"parent\":{}}],[\"baserequest\",{\"_index\":178,\"name\":{\"435\":{}},\"parent\":{}}],[\"baseresponse\",{\"_index\":189,\"name\":{\"453\":{}},\"parent\":{}}],[\"cancreateprimaryuser\",{\"_index\":47,\"name\":{\"87\":{},\"102\":{},\"504\":{}},\"parent\":{}}],[\"canlinkaccounts\",{\"_index\":49,\"name\":{\"89\":{},\"104\":{},\"506\":{}},\"parent\":{}}],[\"checkdatabase\",{\"_index\":307,\"name\":{\"660\":{}},\"parent\":{}}],[\"clearusermetadata\",{\"_index\":150,\"name\":{\"384\":{},\"390\":{},\"809\":{}},\"parent\":{}}],[\"config\",{\"_index\":230,\"name\":{\"519\":{},\"540\":{},\"564\":{},\"586\":{},\"618\":{},\"643\":{},\"709\":{},\"738\":{},\"748\":{}},\"parent\":{}}],[\"constructor\",{\"_index\":21,\"name\":{\"35\":{},\"79\":{},\"83\":{},\"110\":{},\"116\":{},\"142\":{},\"167\":{},\"177\":{},\"199\":{},\"211\":{},\"247\":{},\"297\":{},\"309\":{},\"339\":{},\"379\":{},\"391\":{},\"419\":{},\"421\":{},\"425\":{},\"436\":{},\"454\":{}},\"parent\":{}}],[\"consumecode\",{\"_index\":100,\"name\":{\"216\":{},\"235\":{},\"347\":{},\"367\":{},\"631\":{},\"784\":{}},\"parent\":{}}],[\"consumecodepost\",{\"_index\":301,\"name\":{\"654\":{},\"800\":{}},\"parent\":{}}],[\"consumepasswordresettoken\",{\"_index\":65,\"name\":{\"124\":{},\"137\":{},\"319\":{},\"334\":{},\"534\":{},\"762\":{}},\"parent\":{}}],[\"converttorecipeuserid\",{\"_index\":13,\"name\":{\"13\":{},\"33\":{}},\"parent\":{}}],[\"cookies\",{\"_index\":205,\"name\":{\"476\":{},\"484\":{}},\"parent\":{}}],[\"createcode\",{\"_index\":99,\"name\":{\"215\":{},\"233\":{},\"346\":{},\"365\":{},\"629\":{},\"782\":{}},\"parent\":{}}],[\"createcodepost\",{\"_index\":298,\"name\":{\"652\":{},\"798\":{}},\"parent\":{}}],[\"createemailverificationlink\",{\"_index\":73,\"name\":{\"147\":{},\"160\":{}},\"parent\":{}}],[\"createemailverificationtoken\",{\"_index\":72,\"name\":{\"146\":{},\"159\":{},\"555\":{}},\"parent\":{}}],[\"createjwt\",{\"_index\":82,\"name\":{\"170\":{},\"175\":{},\"203\":{},\"209\":{},\"269\":{},\"290\":{},\"593\":{}},\"parent\":{}}],[\"createmagiclink\",{\"_index\":109,\"name\":{\"225\":{},\"243\":{},\"356\":{},\"375\":{}},\"parent\":{}}],[\"createnewcodefordevice\",{\"_index\":105,\"name\":{\"221\":{},\"234\":{},\"352\":{},\"366\":{},\"630\":{},\"783\":{}},\"parent\":{}}],[\"createnewemailpasswordrecipeuser\",{\"_index\":365,\"name\":{\"759\":{}},\"parent\":{}}],[\"createnewrecipeuser\",{\"_index\":242,\"name\":{\"531\":{}},\"parent\":{}}],[\"createnewroleoraddpermissions\",{\"_index\":157,\"name\":{\"398\":{},\"413\":{},\"819\":{}},\"parent\":{}}],[\"createnewsession\",{\"_index\":114,\"name\":{\"250\":{},\"276\":{},\"664\":{}},\"parent\":{}}],[\"createnewsessionwithoutrequestresponse\",{\"_index\":115,\"name\":{\"251\":{},\"277\":{}},\"parent\":{}}],[\"createorupdatetenant\",{\"_index\":86,\"name\":{\"180\":{},\"191\":{},\"607\":{}},\"parent\":{}}],[\"createorupdatethirdpartyconfig\",{\"_index\":90,\"name\":{\"184\":{},\"195\":{},\"611\":{}},\"parent\":{}}],[\"createprimaryuser\",{\"_index\":48,\"name\":{\"88\":{},\"103\":{},\"505\":{}},\"parent\":{}}],[\"createprimaryuseridorlinkaccounts\",{\"_index\":52,\"name\":{\"92\":{},\"100\":{}},\"parent\":{}}],[\"createresetpasswordlink\",{\"_index\":67,\"name\":{\"126\":{},\"139\":{},\"321\":{},\"336\":{}},\"parent\":{}}],[\"createresetpasswordtoken\",{\"_index\":63,\"name\":{\"122\":{},\"135\":{},\"317\":{},\"332\":{},\"533\":{},\"761\":{}},\"parent\":{}}],[\"createuseridmapping\",{\"_index\":7,\"name\":{\"7\":{},\"26\":{}},\"parent\":{}}],[\"customclaimsinaccesstokenpayload\",{\"_index\":341,\"name\":{\"721\":{}},\"parent\":{}}],[\"dashboardget\",{\"_index\":238,\"name\":{\"527\":{}},\"parent\":{}}],[\"default\",{\"_index\":16,\"name\":{\"16\":{},\"43\":{},\"78\":{},\"82\":{},\"97\":{},\"113\":{},\"129\":{},\"154\":{},\"172\":{},\"188\":{},\"205\":{},\"229\":{},\"272\":{},\"303\":{},\"324\":{},\"359\":{},\"385\":{},\"404\":{}},\"parent\":{}}],[\"deleterole\",{\"_index\":161,\"name\":{\"402\":{},\"417\":{},\"823\":{}},\"parent\":{}}],[\"deletetenant\",{\"_index\":87,\"name\":{\"181\":{},\"192\":{},\"608\":{}},\"parent\":{}}],[\"deletethirdpartyconfig\",{\"_index\":91,\"name\":{\"185\":{},\"196\":{},\"612\":{}},\"parent\":{}}],[\"deleteuser\",{\"_index\":6,\"name\":{\"6\":{},\"32\":{},\"511\":{}},\"parent\":{}}],[\"deleteuseridmapping\",{\"_index\":9,\"name\":{\"9\":{},\"28\":{}},\"parent\":{}}],[\"disassociateuserfromtenant\",{\"_index\":93,\"name\":{\"187\":{},\"198\":{},\"614\":{}},\"parent\":{}}],[\"e\",{\"_index\":279,\"name\":{\"600\":{}},\"parent\":{}}],[\"email\",{\"_index\":265,\"name\":{\"578\":{}},\"parent\":{}}],[\"emaildelivery\",{\"_index\":245,\"name\":{\"545\":{},\"569\":{},\"648\":{}},\"parent\":{}}],[\"emailexistsget\",{\"_index\":247,\"name\":{\"548\":{},\"655\":{}},\"parent\":{}}],[\"emailpasswordapioptions\",{\"_index\":372,\"name\":{\"775\":{}},\"parent\":{}}],[\"emailpasswordemailexistsget\",{\"_index\":368,\"name\":{\"768\":{}},\"parent\":{}}],[\"emailpasswordsignin\",{\"_index\":139,\"name\":{\"314\":{},\"331\":{},\"760\":{}},\"parent\":{}}],[\"emailpasswordsigninpost\",{\"_index\":370,\"name\":{\"772\":{}},\"parent\":{}}],[\"emailpasswordsignup\",{\"_index\":138,\"name\":{\"313\":{},\"330\":{},\"758\":{}},\"parent\":{}}],[\"emailpasswordsignuppost\",{\"_index\":371,\"name\":{\"773\":{}},\"parent\":{}}],[\"emails\",{\"_index\":172,\"name\":{\"429\":{}},\"parent\":{}}],[\"emailverificationclaim\",{\"_index\":80,\"name\":{\"158\":{},\"579\":{}},\"parent\":{}}],[\"error\",{\"_index\":15,\"name\":{\"15\":{},\"19\":{},\"119\":{},\"132\":{},\"145\":{},\"157\":{},\"214\":{},\"232\":{},\"268\":{},\"275\":{},\"300\":{},\"306\":{},\"312\":{},\"327\":{},\"342\":{},\"362\":{}},\"parent\":{}}],[\"errorhandler\",{\"_index\":35,\"name\":{\"57\":{},\"62\":{}},\"parent\":{}}],[\"exchangeauthcodeforoauthtokens\",{\"_index\":360,\"name\":{\"751\":{}},\"parent\":{}}],[\"expiry\",{\"_index\":340,\"name\":{\"720\":{}},\"parent\":{}}],[\"express\",{\"_index\":23,\"name\":{\"37\":{},\"45\":{}},\"parent\":{}}],[\"fastify\",{\"_index\":24,\"name\":{\"38\":{},\"46\":{}},\"parent\":{}}],[\"fetchandsetclaim\",{\"_index\":127,\"name\":{\"263\":{},\"293\":{},\"677\":{},\"696\":{}},\"parent\":{}}],[\"framework\",{\"_index\":22,\"name\":{\"36\":{}},\"parent\":{\"37\":{},\"38\":{},\"39\":{},\"40\":{},\"41\":{},\"42\":{},\"43\":{},\"44\":{},\"435\":{},\"453\":{}}}],[\"framework.__type\",{\"_index\":29,\"name\":{},\"parent\":{\"45\":{},\"46\":{},\"47\":{},\"48\":{},\"49\":{},\"50\":{}}}],[\"framework.baserequest\",{\"_index\":179,\"name\":{},\"parent\":{\"436\":{},\"437\":{},\"438\":{},\"439\":{},\"440\":{},\"441\":{},\"442\":{},\"443\":{},\"444\":{},\"445\":{},\"446\":{},\"447\":{},\"448\":{},\"449\":{},\"450\":{},\"451\":{},\"452\":{}}}],[\"framework.baseresponse\",{\"_index\":190,\"name\":{},\"parent\":{\"454\":{},\"455\":{},\"456\":{},\"457\":{},\"458\":{},\"459\":{},\"460\":{},\"461\":{},\"462\":{},\"463\":{},\"464\":{},\"465\":{},\"466\":{},\"467\":{},\"468\":{}}}],[\"framework/awslambda\",{\"_index\":30,\"name\":{\"51\":{}},\"parent\":{\"52\":{},\"53\":{},\"54\":{},\"469\":{},\"477\":{}}}],[\"framework/awslambda.sessionevent\",{\"_index\":199,\"name\":{},\"parent\":{\"470\":{},\"471\":{},\"472\":{}}}],[\"framework/awslambda.sessionevent.__type\",{\"_index\":202,\"name\":{},\"parent\":{\"473\":{},\"474\":{}}}],[\"framework/awslambda.sessionevent.__type.__type\",{\"_index\":204,\"name\":{},\"parent\":{\"475\":{},\"476\":{}}}],[\"framework/awslambda.sessioneventv2\",{\"_index\":207,\"name\":{},\"parent\":{\"478\":{},\"479\":{},\"480\":{},\"485\":{}}}],[\"framework/awslambda.sessioneventv2.__type\",{\"_index\":208,\"name\":{},\"parent\":{\"481\":{},\"482\":{},\"486\":{},\"489\":{}}}],[\"framework/awslambda.sessioneventv2.__type.__type\",{\"_index\":209,\"name\":{},\"parent\":{\"483\":{},\"484\":{},\"487\":{}}}],[\"framework/awslambda.sessioneventv2.__type.__type.__type\",{\"_index\":210,\"name\":{},\"parent\":{\"488\":{}}}],[\"framework/express\",{\"_index\":34,\"name\":{\"55\":{}},\"parent\":{\"56\":{},\"57\":{},\"58\":{},\"59\":{},\"490\":{}}}],[\"framework/express.sessionrequest\",{\"_index\":212,\"name\":{},\"parent\":{\"491\":{}}}],[\"framework/fastify\",{\"_index\":36,\"name\":{\"60\":{}},\"parent\":{\"61\":{},\"62\":{},\"63\":{},\"64\":{},\"492\":{}}}],[\"framework/fastify.sessionrequest\",{\"_index\":213,\"name\":{},\"parent\":{\"493\":{}}}],[\"framework/hapi\",{\"_index\":38,\"name\":{\"65\":{}},\"parent\":{\"66\":{},\"67\":{},\"68\":{},\"494\":{}}}],[\"framework/hapi.sessionrequest\",{\"_index\":214,\"name\":{},\"parent\":{\"495\":{},\"496\":{}}}],[\"framework/koa\",{\"_index\":39,\"name\":{\"69\":{}},\"parent\":{\"70\":{},\"71\":{},\"72\":{},\"497\":{}}}],[\"framework/koa.sessioncontext\",{\"_index\":216,\"name\":{},\"parent\":{\"498\":{}}}],[\"framework/loopback\",{\"_index\":40,\"name\":{\"73\":{}},\"parent\":{\"74\":{},\"75\":{},\"76\":{},\"499\":{}}}],[\"framework/loopback.sessioncontext\",{\"_index\":217,\"name\":{},\"parent\":{\"500\":{}}}],[\"generateemailverifytokenpost\",{\"_index\":261,\"name\":{\"574\":{}},\"parent\":{}}],[\"generatepasswordresettokenpost\",{\"_index\":249,\"name\":{\"549\":{},\"769\":{}},\"parent\":{}}],[\"getaccesstoken\",{\"_index\":322,\"name\":{\"691\":{}},\"parent\":{}}],[\"getaccesstokenpayload\",{\"_index\":319,\"name\":{\"688\":{}},\"parent\":{}}],[\"getallcorsheaders\",{\"_index\":2,\"name\":{\"2\":{},\"22\":{}},\"parent\":{}}],[\"getallroles\",{\"_index\":162,\"name\":{\"403\":{},\"418\":{},\"824\":{}},\"parent\":{}}],[\"getallsessionhandlesforuser\",{\"_index\":122,\"name\":{\"258\":{},\"285\":{},\"670\":{}},\"parent\":{}}],[\"getallsessiontokensdangerously\",{\"_index\":321,\"name\":{\"690\":{}},\"parent\":{}}],[\"getasstring\",{\"_index\":167,\"name\":{\"423\":{}},\"parent\":{}}],[\"getauthorisationredirecturl\",{\"_index\":359,\"name\":{\"750\":{}},\"parent\":{}}],[\"getclaimvalue\",{\"_index\":129,\"name\":{\"265\":{},\"295\":{},\"679\":{},\"698\":{}},\"parent\":{}}],[\"getconfigforclienttype\",{\"_index\":358,\"name\":{\"749\":{}},\"parent\":{}}],[\"getcookievalue\",{\"_index\":185,\"name\":{\"445\":{}},\"parent\":{}}],[\"getdashboardbundlelocation\",{\"_index\":223,\"name\":{\"514\":{}},\"parent\":{}}],[\"getexpiry\",{\"_index\":324,\"name\":{\"694\":{}},\"parent\":{}}],[\"getformdata\",{\"_index\":188,\"name\":{\"451\":{}},\"parent\":{}}],[\"getglobalclaimvalidators\",{\"_index\":311,\"name\":{\"665\":{}},\"parent\":{}}],[\"gethandle\",{\"_index\":320,\"name\":{\"689\":{}},\"parent\":{}}],[\"getheadervalue\",{\"_index\":186,\"name\":{\"447\":{}},\"parent\":{}}],[\"getjsonbody\",{\"_index\":183,\"name\":{\"441\":{}},\"parent\":{}}],[\"getjwks\",{\"_index\":83,\"name\":{\"171\":{},\"176\":{},\"204\":{},\"210\":{},\"270\":{},\"291\":{},\"594\":{}},\"parent\":{}}],[\"getjwksget\",{\"_index\":267,\"name\":{\"582\":{}},\"parent\":{}}],[\"getkeyvaluefromquery\",{\"_index\":182,\"name\":{\"439\":{}},\"parent\":{}}],[\"getmethod\",{\"_index\":184,\"name\":{\"443\":{}},\"parent\":{}}],[\"getopeniddiscoveryconfiguration\",{\"_index\":96,\"name\":{\"202\":{},\"208\":{},\"271\":{},\"292\":{}},\"parent\":{}}],[\"getoriginalurl\",{\"_index\":187,\"name\":{\"449\":{}},\"parent\":{}}],[\"getpermissionsforrole\",{\"_index\":158,\"name\":{\"399\":{},\"414\":{},\"820\":{}},\"parent\":{}}],[\"getprimaryuserthatcanbelinkedtorecipeuserid\",{\"_index\":53,\"name\":{\"93\":{},\"101\":{}},\"parent\":{}}],[\"getprovider\",{\"_index\":134,\"name\":{\"301\":{},\"307\":{},\"727\":{}},\"parent\":{}}],[\"getrecipeuserid\",{\"_index\":318,\"name\":{\"686\":{}},\"parent\":{}}],[\"getrequestfromusercontext\",{\"_index\":14,\"name\":{\"14\":{},\"34\":{}},\"parent\":{}}],[\"getrolesforuser\",{\"_index\":155,\"name\":{\"396\":{},\"411\":{},\"817\":{}},\"parent\":{}}],[\"getrolesthathavepermission\",{\"_index\":160,\"name\":{\"401\":{},\"416\":{},\"822\":{}},\"parent\":{}}],[\"getsession\",{\"_index\":116,\"name\":{\"252\":{},\"279\":{},\"666\":{}},\"parent\":{}}],[\"getsessiondatafromdatabase\",{\"_index\":316,\"name\":{\"683\":{}},\"parent\":{}}],[\"getsessioninformation\",{\"_index\":118,\"name\":{\"254\":{},\"281\":{},\"668\":{}},\"parent\":{}}],[\"getsessionwithoutrequestresponse\",{\"_index\":117,\"name\":{\"253\":{},\"280\":{}},\"parent\":{}}],[\"gettenant\",{\"_index\":88,\"name\":{\"182\":{},\"193\":{},\"609\":{}},\"parent\":{}}],[\"gettenantid\",{\"_index\":284,\"name\":{\"606\":{},\"687\":{}},\"parent\":{}}],[\"gettimecreated\",{\"_index\":323,\"name\":{\"693\":{}},\"parent\":{}}],[\"getuser\",{\"_index\":11,\"name\":{\"11\":{},\"30\":{},\"509\":{}},\"parent\":{}}],[\"getusercount\",{\"_index\":3,\"name\":{\"3\":{},\"23\":{}},\"parent\":{}}],[\"getuserid\",{\"_index\":317,\"name\":{\"685\":{}},\"parent\":{}}],[\"getuseridmapping\",{\"_index\":8,\"name\":{\"8\":{},\"27\":{}},\"parent\":{}}],[\"getuserinfo\",{\"_index\":361,\"name\":{\"752\":{}},\"parent\":{}}],[\"getusermetadata\",{\"_index\":148,\"name\":{\"382\":{},\"388\":{},\"807\":{}},\"parent\":{}}],[\"getusers\",{\"_index\":220,\"name\":{\"503\":{}},\"parent\":{}}],[\"getusersnewestfirst\",{\"_index\":5,\"name\":{\"5\":{},\"25\":{}},\"parent\":{}}],[\"getusersoldestfirst\",{\"_index\":4,\"name\":{\"4\":{},\"24\":{}},\"parent\":{}}],[\"getusersthathaverole\",{\"_index\":156,\"name\":{\"397\":{},\"412\":{},\"818\":{}},\"parent\":{}}],[\"hapi\",{\"_index\":25,\"name\":{\"39\":{},\"47\":{}},\"parent\":{}}],[\"headers\",{\"_index\":203,\"name\":{\"475\":{},\"483\":{}},\"parent\":{}}],[\"id\",{\"_index\":169,\"name\":{\"426\":{},\"747\":{}},\"parent\":{}}],[\"index\",{\"_index\":0,\"name\":{\"0\":{}},\"parent\":{\"1\":{},\"2\":{},\"3\":{},\"4\":{},\"5\":{},\"6\":{},\"7\":{},\"8\":{},\"9\":{},\"10\":{},\"11\":{},\"12\":{},\"13\":{},\"14\":{},\"15\":{},\"16\":{},\"420\":{},\"424\":{}}}],[\"index.default\",{\"_index\":17,\"name\":{},\"parent\":{\"17\":{},\"18\":{},\"19\":{},\"20\":{},\"21\":{},\"22\":{},\"23\":{},\"24\":{},\"25\":{},\"26\":{},\"27\":{},\"28\":{},\"29\":{},\"30\":{},\"31\":{},\"32\":{},\"33\":{},\"34\":{},\"35\":{}}}],[\"index.recipeuserid\",{\"_index\":166,\"name\":{},\"parent\":{\"421\":{},\"422\":{},\"423\":{}}}],[\"index.user\",{\"_index\":168,\"name\":{},\"parent\":{\"425\":{},\"426\":{},\"427\":{},\"428\":{},\"429\":{},\"430\":{},\"431\":{},\"432\":{},\"433\":{},\"434\":{}}}],[\"ingredientinterfaceimpl\",{\"_index\":43,\"name\":{\"80\":{},\"84\":{}},\"parent\":{}}],[\"ingredients/emaildelivery\",{\"_index\":41,\"name\":{\"77\":{}},\"parent\":{\"78\":{}}}],[\"ingredients/emaildelivery.default\",{\"_index\":42,\"name\":{},\"parent\":{\"79\":{},\"80\":{}}}],[\"ingredients/smsdelivery\",{\"_index\":44,\"name\":{\"81\":{}},\"parent\":{\"82\":{}}}],[\"ingredients/smsdelivery.default\",{\"_index\":45,\"name\":{},\"parent\":{\"83\":{},\"84\":{}}}],[\"init\",{\"_index\":1,\"name\":{\"1\":{},\"17\":{},\"86\":{},\"98\":{},\"112\":{},\"114\":{},\"118\":{},\"130\":{},\"144\":{},\"155\":{},\"169\":{},\"173\":{},\"179\":{},\"189\":{},\"201\":{},\"206\":{},\"213\":{},\"230\":{},\"249\":{},\"273\":{},\"299\":{},\"304\":{},\"311\":{},\"325\":{},\"341\":{},\"360\":{},\"381\":{},\"386\":{},\"393\":{},\"405\":{}},\"parent\":{}}],[\"isemailchangeallowed\",{\"_index\":56,\"name\":{\"96\":{},\"109\":{}},\"parent\":{}}],[\"isemailverified\",{\"_index\":76,\"name\":{\"150\":{},\"163\":{},\"557\":{}},\"parent\":{}}],[\"isemailverifiedget\",{\"_index\":260,\"name\":{\"573\":{}},\"parent\":{}}],[\"isinserverlessenv\",{\"_index\":234,\"name\":{\"523\":{},\"542\":{},\"566\":{},\"588\":{},\"620\":{},\"645\":{},\"711\":{},\"740\":{}},\"parent\":{}}],[\"isprimaryuser\",{\"_index\":170,\"name\":{\"427\":{}},\"parent\":{}}],[\"issigninallowed\",{\"_index\":55,\"name\":{\"95\":{},\"108\":{}},\"parent\":{}}],[\"issignupallowed\",{\"_index\":54,\"name\":{\"94\":{},\"107\":{}},\"parent\":{}}],[\"jsonobject\",{\"_index\":383,\"name\":{\"810\":{}},\"parent\":{}}],[\"jsonwebkey\",{\"_index\":273,\"name\":{\"595\":{}},\"parent\":{}}],[\"kid\",{\"_index\":277,\"name\":{\"598\":{}},\"parent\":{}}],[\"koa\",{\"_index\":27,\"name\":{\"41\":{},\"49\":{}},\"parent\":{}}],[\"kty\",{\"_index\":275,\"name\":{\"597\":{}},\"parent\":{}}],[\"linkaccounts\",{\"_index\":50,\"name\":{\"90\":{},\"105\":{},\"507\":{}},\"parent\":{}}],[\"listalltenants\",{\"_index\":89,\"name\":{\"183\":{},\"194\":{},\"610\":{}},\"parent\":{}}],[\"listcodesbydeviceid\",{\"_index\":101,\"name\":{\"217\":{},\"241\":{},\"348\":{},\"373\":{},\"637\":{},\"790\":{}},\"parent\":{}}],[\"listcodesbyemail\",{\"_index\":102,\"name\":{\"218\":{},\"239\":{},\"349\":{},\"371\":{},\"635\":{},\"788\":{}},\"parent\":{}}],[\"listcodesbyphonenumber\",{\"_index\":103,\"name\":{\"219\":{},\"240\":{},\"350\":{},\"372\":{},\"636\":{},\"789\":{}},\"parent\":{}}],[\"listcodesbypreauthsessionid\",{\"_index\":104,\"name\":{\"220\":{},\"242\":{},\"351\":{},\"374\":{},\"638\":{},\"791\":{}},\"parent\":{}}],[\"listusersbyaccountinfo\",{\"_index\":12,\"name\":{\"12\":{},\"31\":{},\"510\":{}},\"parent\":{}}],[\"loginmethods\",{\"_index\":175,\"name\":{\"432\":{}},\"parent\":{}}],[\"loginmethodsget\",{\"_index\":290,\"name\":{\"626\":{}},\"parent\":{}}],[\"loopback\",{\"_index\":26,\"name\":{\"40\":{},\"48\":{}},\"parent\":{}}],[\"manuallycreateorupdateuser\",{\"_index\":135,\"name\":{\"302\":{},\"308\":{},\"729\":{}},\"parent\":{}}],[\"mergeintoaccesstokenpayload\",{\"_index\":126,\"name\":{\"262\":{},\"289\":{},\"674\":{},\"692\":{}},\"parent\":{}}],[\"middleware\",{\"_index\":31,\"name\":{\"52\":{},\"56\":{},\"70\":{},\"74\":{}},\"parent\":{}}],[\"n\",{\"_index\":278,\"name\":{\"599\":{}},\"parent\":{}}],[\"original\",{\"_index\":181,\"name\":{\"438\":{},\"456\":{}},\"parent\":{}}],[\"overrideglobalclaimvalidators\",{\"_index\":308,\"name\":{\"661\":{}},\"parent\":{}}],[\"passwordlessapioptions\",{\"_index\":380,\"name\":{\"803\":{}},\"parent\":{}}],[\"passwordlesssigninup\",{\"_index\":144,\"name\":{\"345\":{},\"376\":{}},\"parent\":{}}],[\"passwordlessuseremailexistsget\",{\"_index\":378,\"name\":{\"801\":{}},\"parent\":{}}],[\"passwordlessuserphonenumberexistsget\",{\"_index\":379,\"name\":{\"802\":{}},\"parent\":{}}],[\"passwordresetpost\",{\"_index\":250,\"name\":{\"550\":{},\"770\":{}},\"parent\":{}}],[\"permissionclaim\",{\"_index\":164,\"name\":{\"407\":{},\"812\":{}},\"parent\":{}}],[\"phonenumberexistsget\",{\"_index\":302,\"name\":{\"656\":{}},\"parent\":{}}],[\"phonenumbers\",{\"_index\":173,\"name\":{\"430\":{}},\"parent\":{}}],[\"plugin\",{\"_index\":37,\"name\":{\"61\":{},\"66\":{}},\"parent\":{}}],[\"providers\",{\"_index\":354,\"name\":{\"741\":{}},\"parent\":{}}],[\"recipe/accountlinking\",{\"_index\":46,\"name\":{\"85\":{}},\"parent\":{\"86\":{},\"87\":{},\"88\":{},\"89\":{},\"90\":{},\"91\":{},\"92\":{},\"93\":{},\"94\":{},\"95\":{},\"96\":{},\"97\":{},\"501\":{}}}],[\"recipe/accountlinking.default\",{\"_index\":57,\"name\":{},\"parent\":{\"98\":{},\"99\":{},\"100\":{},\"101\":{},\"102\":{},\"103\":{},\"104\":{},\"105\":{},\"106\":{},\"107\":{},\"108\":{},\"109\":{},\"110\":{}}}],[\"recipe/accountlinking.recipeinterface\",{\"_index\":219,\"name\":{},\"parent\":{\"502\":{}}}],[\"recipe/accountlinking.recipeinterface.__type\",{\"_index\":221,\"name\":{},\"parent\":{\"503\":{},\"504\":{},\"505\":{},\"506\":{},\"507\":{},\"508\":{},\"509\":{},\"510\":{},\"511\":{}}}],[\"recipe/dashboard\",{\"_index\":58,\"name\":{\"111\":{}},\"parent\":{\"112\":{},\"113\":{},\"512\":{},\"516\":{},\"525\":{}}}],[\"recipe/dashboard.apiinterface\",{\"_index\":237,\"name\":{},\"parent\":{\"526\":{}}}],[\"recipe/dashboard.apiinterface.__type\",{\"_index\":239,\"name\":{},\"parent\":{\"527\":{}}}],[\"recipe/dashboard.apioptions\",{\"_index\":227,\"name\":{},\"parent\":{\"517\":{}}}],[\"recipe/dashboard.apioptions.__type\",{\"_index\":229,\"name\":{},\"parent\":{\"518\":{},\"519\":{},\"520\":{},\"521\":{},\"522\":{},\"523\":{},\"524\":{}}}],[\"recipe/dashboard.default\",{\"_index\":59,\"name\":{},\"parent\":{\"114\":{},\"115\":{},\"116\":{}}}],[\"recipe/dashboard.recipeinterface\",{\"_index\":222,\"name\":{},\"parent\":{\"513\":{}}}],[\"recipe/dashboard.recipeinterface.__type\",{\"_index\":224,\"name\":{},\"parent\":{\"514\":{},\"515\":{}}}],[\"recipe/emailpassword\",{\"_index\":60,\"name\":{\"117\":{}},\"parent\":{\"118\":{},\"119\":{},\"120\":{},\"121\":{},\"122\":{},\"123\":{},\"124\":{},\"125\":{},\"126\":{},\"127\":{},\"128\":{},\"129\":{},\"528\":{},\"536\":{},\"546\":{}}}],[\"recipe/emailpassword.apiinterface\",{\"_index\":246,\"name\":{},\"parent\":{\"547\":{}}}],[\"recipe/emailpassword.apiinterface.__type\",{\"_index\":248,\"name\":{},\"parent\":{\"548\":{},\"549\":{},\"550\":{},\"551\":{},\"552\":{}}}],[\"recipe/emailpassword.apioptions\",{\"_index\":243,\"name\":{},\"parent\":{\"537\":{}}}],[\"recipe/emailpassword.apioptions.__type\",{\"_index\":244,\"name\":{},\"parent\":{\"538\":{},\"539\":{},\"540\":{},\"541\":{},\"542\":{},\"543\":{},\"544\":{},\"545\":{}}}],[\"recipe/emailpassword.default\",{\"_index\":70,\"name\":{},\"parent\":{\"130\":{},\"131\":{},\"132\":{},\"133\":{},\"134\":{},\"135\":{},\"136\":{},\"137\":{},\"138\":{},\"139\":{},\"140\":{},\"141\":{},\"142\":{}}}],[\"recipe/emailpassword.recipeinterface\",{\"_index\":240,\"name\":{},\"parent\":{\"529\":{}}}],[\"recipe/emailpassword.recipeinterface.__type\",{\"_index\":241,\"name\":{},\"parent\":{\"530\":{},\"531\":{},\"532\":{},\"533\":{},\"534\":{},\"535\":{}}}],[\"recipe/emailverification\",{\"_index\":71,\"name\":{\"143\":{}},\"parent\":{\"144\":{},\"145\":{},\"146\":{},\"147\":{},\"148\":{},\"149\":{},\"150\":{},\"151\":{},\"152\":{},\"153\":{},\"154\":{},\"553\":{},\"560\":{},\"570\":{},\"575\":{},\"579\":{}}}],[\"recipe/emailverification.apiinterface\",{\"_index\":257,\"name\":{},\"parent\":{\"571\":{}}}],[\"recipe/emailverification.apiinterface.__type\",{\"_index\":259,\"name\":{},\"parent\":{\"572\":{},\"573\":{},\"574\":{}}}],[\"recipe/emailverification.apioptions\",{\"_index\":255,\"name\":{},\"parent\":{\"561\":{}}}],[\"recipe/emailverification.apioptions.__type\",{\"_index\":256,\"name\":{},\"parent\":{\"562\":{},\"563\":{},\"564\":{},\"565\":{},\"566\":{},\"567\":{},\"568\":{},\"569\":{}}}],[\"recipe/emailverification.default\",{\"_index\":79,\"name\":{},\"parent\":{\"155\":{},\"156\":{},\"157\":{},\"158\":{},\"159\":{},\"160\":{},\"161\":{},\"162\":{},\"163\":{},\"164\":{},\"165\":{},\"166\":{},\"167\":{}}}],[\"recipe/emailverification.recipeinterface\",{\"_index\":253,\"name\":{},\"parent\":{\"554\":{}}}],[\"recipe/emailverification.recipeinterface.__type\",{\"_index\":254,\"name\":{},\"parent\":{\"555\":{},\"556\":{},\"557\":{},\"558\":{},\"559\":{}}}],[\"recipe/emailverification.useremailinfo\",{\"_index\":263,\"name\":{},\"parent\":{\"576\":{}}}],[\"recipe/emailverification.useremailinfo.__type\",{\"_index\":264,\"name\":{},\"parent\":{\"577\":{},\"578\":{}}}],[\"recipe/jwt\",{\"_index\":81,\"name\":{\"168\":{}},\"parent\":{\"169\":{},\"170\":{},\"171\":{},\"172\":{},\"580\":{},\"583\":{},\"591\":{},\"595\":{}}}],[\"recipe/jwt.apiinterface\",{\"_index\":266,\"name\":{},\"parent\":{\"581\":{}}}],[\"recipe/jwt.apiinterface.__type\",{\"_index\":268,\"name\":{},\"parent\":{\"582\":{}}}],[\"recipe/jwt.apioptions\",{\"_index\":269,\"name\":{},\"parent\":{\"584\":{}}}],[\"recipe/jwt.apioptions.__type\",{\"_index\":270,\"name\":{},\"parent\":{\"585\":{},\"586\":{},\"587\":{},\"588\":{},\"589\":{},\"590\":{}}}],[\"recipe/jwt.default\",{\"_index\":84,\"name\":{},\"parent\":{\"173\":{},\"174\":{},\"175\":{},\"176\":{},\"177\":{}}}],[\"recipe/jwt.jsonwebkey\",{\"_index\":274,\"name\":{},\"parent\":{\"596\":{}}}],[\"recipe/jwt.jsonwebkey.__type\",{\"_index\":276,\"name\":{},\"parent\":{\"597\":{},\"598\":{},\"599\":{},\"600\":{},\"601\":{},\"602\":{}}}],[\"recipe/jwt.recipeinterface\",{\"_index\":271,\"name\":{},\"parent\":{\"592\":{}}}],[\"recipe/jwt.recipeinterface.__type\",{\"_index\":272,\"name\":{},\"parent\":{\"593\":{},\"594\":{}}}],[\"recipe/multitenancy\",{\"_index\":85,\"name\":{\"178\":{}},\"parent\":{\"179\":{},\"180\":{},\"181\":{},\"182\":{},\"183\":{},\"184\":{},\"185\":{},\"186\":{},\"187\":{},\"188\":{},\"603\":{},\"604\":{},\"615\":{},\"624\":{}}}],[\"recipe/multitenancy.apiinterface\",{\"_index\":289,\"name\":{},\"parent\":{\"625\":{}}}],[\"recipe/multitenancy.apiinterface.__type\",{\"_index\":291,\"name\":{},\"parent\":{\"626\":{}}}],[\"recipe/multitenancy.apioptions\",{\"_index\":286,\"name\":{},\"parent\":{\"616\":{}}}],[\"recipe/multitenancy.apioptions.__type\",{\"_index\":287,\"name\":{},\"parent\":{\"617\":{},\"618\":{},\"619\":{},\"620\":{},\"621\":{},\"622\":{},\"623\":{}}}],[\"recipe/multitenancy.default\",{\"_index\":94,\"name\":{},\"parent\":{\"189\":{},\"190\":{},\"191\":{},\"192\":{},\"193\":{},\"194\":{},\"195\":{},\"196\":{},\"197\":{},\"198\":{},\"199\":{}}}],[\"recipe/multitenancy.recipeinterface\",{\"_index\":283,\"name\":{},\"parent\":{\"605\":{}}}],[\"recipe/multitenancy.recipeinterface.__type\",{\"_index\":285,\"name\":{},\"parent\":{\"606\":{},\"607\":{},\"608\":{},\"609\":{},\"610\":{},\"611\":{},\"612\":{},\"613\":{},\"614\":{}}}],[\"recipe/openid\",{\"_index\":95,\"name\":{\"200\":{}},\"parent\":{\"201\":{},\"202\":{},\"203\":{},\"204\":{},\"205\":{}}}],[\"recipe/openid.default\",{\"_index\":97,\"name\":{},\"parent\":{\"206\":{},\"207\":{},\"208\":{},\"209\":{},\"210\":{},\"211\":{}}}],[\"recipe/passwordless\",{\"_index\":98,\"name\":{\"212\":{}},\"parent\":{\"213\":{},\"214\":{},\"215\":{},\"216\":{},\"217\":{},\"218\":{},\"219\":{},\"220\":{},\"221\":{},\"222\":{},\"223\":{},\"224\":{},\"225\":{},\"226\":{},\"227\":{},\"228\":{},\"229\":{},\"627\":{},\"639\":{},\"650\":{}}}],[\"recipe/passwordless.apiinterface\",{\"_index\":297,\"name\":{},\"parent\":{\"651\":{}}}],[\"recipe/passwordless.apiinterface.__type\",{\"_index\":299,\"name\":{},\"parent\":{\"652\":{},\"653\":{},\"654\":{},\"655\":{},\"656\":{}}}],[\"recipe/passwordless.apioptions\",{\"_index\":294,\"name\":{},\"parent\":{\"640\":{}}}],[\"recipe/passwordless.apioptions.__type\",{\"_index\":295,\"name\":{},\"parent\":{\"641\":{},\"642\":{},\"643\":{},\"644\":{},\"645\":{},\"646\":{},\"647\":{},\"648\":{},\"649\":{}}}],[\"recipe/passwordless.default\",{\"_index\":112,\"name\":{},\"parent\":{\"230\":{},\"231\":{},\"232\":{},\"233\":{},\"234\":{},\"235\":{},\"236\":{},\"237\":{},\"238\":{},\"239\":{},\"240\":{},\"241\":{},\"242\":{},\"243\":{},\"244\":{},\"245\":{},\"246\":{},\"247\":{}}}],[\"recipe/passwordless.recipeinterface\",{\"_index\":292,\"name\":{},\"parent\":{\"628\":{}}}],[\"recipe/passwordless.recipeinterface.__type\",{\"_index\":293,\"name\":{},\"parent\":{\"629\":{},\"630\":{},\"631\":{},\"632\":{},\"633\":{},\"634\":{},\"635\":{},\"636\":{},\"637\":{},\"638\":{}}}],[\"recipe/session\",{\"_index\":113,\"name\":{\"248\":{}},\"parent\":{\"249\":{},\"250\":{},\"251\":{},\"252\":{},\"253\":{},\"254\":{},\"255\":{},\"256\":{},\"257\":{},\"258\":{},\"259\":{},\"260\":{},\"261\":{},\"262\":{},\"263\":{},\"264\":{},\"265\":{},\"266\":{},\"267\":{},\"268\":{},\"269\":{},\"270\":{},\"271\":{},\"272\":{},\"657\":{},\"662\":{},\"681\":{},\"701\":{},\"706\":{},\"714\":{},\"724\":{}}}],[\"recipe/session.apiinterface\",{\"_index\":327,\"name\":{},\"parent\":{\"702\":{}}}],[\"recipe/session.apiinterface.__type\",{\"_index\":329,\"name\":{},\"parent\":{\"703\":{},\"704\":{},\"705\":{}}}],[\"recipe/session.apioptions\",{\"_index\":332,\"name\":{},\"parent\":{\"707\":{}}}],[\"recipe/session.apioptions.__type\",{\"_index\":333,\"name\":{},\"parent\":{\"708\":{},\"709\":{},\"710\":{},\"711\":{},\"712\":{},\"713\":{}}}],[\"recipe/session.default\",{\"_index\":132,\"name\":{},\"parent\":{\"273\":{},\"274\":{},\"275\":{},\"276\":{},\"277\":{},\"278\":{},\"279\":{},\"280\":{},\"281\":{},\"282\":{},\"283\":{},\"284\":{},\"285\":{},\"286\":{},\"287\":{},\"288\":{},\"289\":{},\"290\":{},\"291\":{},\"292\":{},\"293\":{},\"294\":{},\"295\":{},\"296\":{},\"297\":{}}}],[\"recipe/session.recipeinterface\",{\"_index\":309,\"name\":{},\"parent\":{\"663\":{}}}],[\"recipe/session.recipeinterface.__type\",{\"_index\":310,\"name\":{},\"parent\":{\"664\":{},\"665\":{},\"666\":{},\"667\":{},\"668\":{},\"669\":{},\"670\":{},\"671\":{},\"672\":{},\"673\":{},\"674\":{},\"675\":{},\"676\":{},\"677\":{},\"678\":{},\"679\":{},\"680\":{}}}],[\"recipe/session.sessioncontainer\",{\"_index\":315,\"name\":{},\"parent\":{\"682\":{},\"683\":{},\"684\":{},\"685\":{},\"686\":{},\"687\":{},\"688\":{},\"689\":{},\"690\":{},\"691\":{},\"692\":{},\"693\":{},\"694\":{},\"695\":{},\"696\":{},\"697\":{},\"698\":{},\"699\":{},\"700\":{}}}],[\"recipe/session.sessioninformation\",{\"_index\":335,\"name\":{},\"parent\":{\"715\":{}}}],[\"recipe/session.sessioninformation.__type\",{\"_index\":337,\"name\":{},\"parent\":{\"716\":{},\"717\":{},\"718\":{},\"719\":{},\"720\":{},\"721\":{},\"722\":{},\"723\":{}}}],[\"recipe/session.verifysessionoptions\",{\"_index\":305,\"name\":{},\"parent\":{\"658\":{},\"659\":{},\"660\":{},\"661\":{}}}],[\"recipe/thirdparty\",{\"_index\":133,\"name\":{\"298\":{}},\"parent\":{\"299\":{},\"300\":{},\"301\":{},\"302\":{},\"303\":{},\"725\":{},\"730\":{},\"735\":{},\"745\":{}}}],[\"recipe/thirdparty.apiinterface\",{\"_index\":347,\"name\":{},\"parent\":{\"731\":{}}}],[\"recipe/thirdparty.apiinterface.__type\",{\"_index\":349,\"name\":{},\"parent\":{\"732\":{},\"733\":{},\"734\":{}}}],[\"recipe/thirdparty.apioptions\",{\"_index\":352,\"name\":{},\"parent\":{\"736\":{}}}],[\"recipe/thirdparty.apioptions.__type\",{\"_index\":353,\"name\":{},\"parent\":{\"737\":{},\"738\":{},\"739\":{},\"740\":{},\"741\":{},\"742\":{},\"743\":{},\"744\":{}}}],[\"recipe/thirdparty.default\",{\"_index\":136,\"name\":{},\"parent\":{\"304\":{},\"305\":{},\"306\":{},\"307\":{},\"308\":{},\"309\":{}}}],[\"recipe/thirdparty.recipeinterface\",{\"_index\":345,\"name\":{},\"parent\":{\"726\":{}}}],[\"recipe/thirdparty.recipeinterface.__type\",{\"_index\":346,\"name\":{},\"parent\":{\"727\":{},\"728\":{},\"729\":{}}}],[\"recipe/thirdparty.typeprovider\",{\"_index\":356,\"name\":{},\"parent\":{\"746\":{}}}],[\"recipe/thirdparty.typeprovider.__type\",{\"_index\":357,\"name\":{},\"parent\":{\"747\":{},\"748\":{},\"749\":{},\"750\":{},\"751\":{},\"752\":{}}}],[\"recipe/thirdpartyemailpassword\",{\"_index\":137,\"name\":{\"310\":{}},\"parent\":{\"311\":{},\"312\":{},\"313\":{},\"314\":{},\"315\":{},\"316\":{},\"317\":{},\"318\":{},\"319\":{},\"320\":{},\"321\":{},\"322\":{},\"323\":{},\"324\":{},\"753\":{},\"764\":{},\"765\":{},\"775\":{},\"776\":{}}}],[\"recipe/thirdpartyemailpassword.apiinterface\",{\"_index\":366,\"name\":{},\"parent\":{\"766\":{}}}],[\"recipe/thirdpartyemailpassword.apiinterface.__type\",{\"_index\":367,\"name\":{},\"parent\":{\"767\":{},\"768\":{},\"769\":{},\"770\":{},\"771\":{},\"772\":{},\"773\":{},\"774\":{}}}],[\"recipe/thirdpartyemailpassword.default\",{\"_index\":142,\"name\":{},\"parent\":{\"325\":{},\"326\":{},\"327\":{},\"328\":{},\"329\":{},\"330\":{},\"331\":{},\"332\":{},\"333\":{},\"334\":{},\"335\":{},\"336\":{},\"337\":{},\"338\":{},\"339\":{}}}],[\"recipe/thirdpartyemailpassword.recipeinterface\",{\"_index\":362,\"name\":{},\"parent\":{\"754\":{}}}],[\"recipe/thirdpartyemailpassword.recipeinterface.__type\",{\"_index\":363,\"name\":{},\"parent\":{\"755\":{},\"756\":{},\"757\":{},\"758\":{},\"759\":{},\"760\":{},\"761\":{},\"762\":{},\"763\":{}}}],[\"recipe/thirdpartypasswordless\",{\"_index\":143,\"name\":{\"340\":{}},\"parent\":{\"341\":{},\"342\":{},\"343\":{},\"344\":{},\"345\":{},\"346\":{},\"347\":{},\"348\":{},\"349\":{},\"350\":{},\"351\":{},\"352\":{},\"353\":{},\"354\":{},\"355\":{},\"356\":{},\"357\":{},\"358\":{},\"359\":{},\"777\":{},\"792\":{},\"793\":{},\"803\":{},\"804\":{}}}],[\"recipe/thirdpartypasswordless.apiinterface\",{\"_index\":376,\"name\":{},\"parent\":{\"794\":{}}}],[\"recipe/thirdpartypasswordless.apiinterface.__type\",{\"_index\":377,\"name\":{},\"parent\":{\"795\":{},\"796\":{},\"797\":{},\"798\":{},\"799\":{},\"800\":{},\"801\":{},\"802\":{}}}],[\"recipe/thirdpartypasswordless.default\",{\"_index\":146,\"name\":{},\"parent\":{\"360\":{},\"361\":{},\"362\":{},\"363\":{},\"364\":{},\"365\":{},\"366\":{},\"367\":{},\"368\":{},\"369\":{},\"370\":{},\"371\":{},\"372\":{},\"373\":{},\"374\":{},\"375\":{},\"376\":{},\"377\":{},\"378\":{},\"379\":{}}}],[\"recipe/thirdpartypasswordless.recipeinterface\",{\"_index\":374,\"name\":{},\"parent\":{\"778\":{}}}],[\"recipe/thirdpartypasswordless.recipeinterface.__type\",{\"_index\":375,\"name\":{},\"parent\":{\"779\":{},\"780\":{},\"781\":{},\"782\":{},\"783\":{},\"784\":{},\"785\":{},\"786\":{},\"787\":{},\"788\":{},\"789\":{},\"790\":{},\"791\":{}}}],[\"recipe/usermetadata\",{\"_index\":147,\"name\":{\"380\":{}},\"parent\":{\"381\":{},\"382\":{},\"383\":{},\"384\":{},\"385\":{},\"805\":{},\"810\":{}}}],[\"recipe/usermetadata.default\",{\"_index\":151,\"name\":{},\"parent\":{\"386\":{},\"387\":{},\"388\":{},\"389\":{},\"390\":{},\"391\":{}}}],[\"recipe/usermetadata.recipeinterface\",{\"_index\":381,\"name\":{},\"parent\":{\"806\":{}}}],[\"recipe/usermetadata.recipeinterface.__type\",{\"_index\":382,\"name\":{},\"parent\":{\"807\":{},\"808\":{},\"809\":{}}}],[\"recipe/userroles\",{\"_index\":152,\"name\":{\"392\":{}},\"parent\":{\"393\":{},\"394\":{},\"395\":{},\"396\":{},\"397\":{},\"398\":{},\"399\":{},\"400\":{},\"401\":{},\"402\":{},\"403\":{},\"404\":{},\"811\":{},\"812\":{},\"813\":{}}}],[\"recipe/userroles.default\",{\"_index\":163,\"name\":{},\"parent\":{\"405\":{},\"406\":{},\"407\":{},\"408\":{},\"409\":{},\"410\":{},\"411\":{},\"412\":{},\"413\":{},\"414\":{},\"415\":{},\"416\":{},\"417\":{},\"418\":{},\"419\":{}}}],[\"recipe/userroles.recipeinterface\",{\"_index\":384,\"name\":{},\"parent\":{\"814\":{}}}],[\"recipe/userroles.recipeinterface.__type\",{\"_index\":385,\"name\":{},\"parent\":{\"815\":{},\"816\":{},\"817\":{},\"818\":{},\"819\":{},\"820\":{},\"821\":{},\"822\":{},\"823\":{},\"824\":{}}}],[\"recipeid\",{\"_index\":231,\"name\":{\"520\":{},\"541\":{},\"565\":{},\"587\":{},\"619\":{},\"644\":{},\"710\":{},\"739\":{}},\"parent\":{}}],[\"recipeimplementation\",{\"_index\":228,\"name\":{\"518\":{},\"538\":{},\"562\":{},\"585\":{},\"617\":{},\"641\":{},\"708\":{},\"737\":{}},\"parent\":{}}],[\"recipeinterface\",{\"_index\":218,\"name\":{\"501\":{},\"512\":{},\"528\":{},\"553\":{},\"591\":{},\"604\":{},\"627\":{},\"662\":{},\"725\":{},\"753\":{},\"777\":{},\"805\":{},\"813\":{}},\"parent\":{}}],[\"recipeuserid\",{\"_index\":19,\"name\":{\"20\":{},\"420\":{},\"422\":{},\"577\":{},\"718\":{}},\"parent\":{}}],[\"refreshpost\",{\"_index\":328,\"name\":{\"703\":{}},\"parent\":{}}],[\"refreshsession\",{\"_index\":119,\"name\":{\"255\":{},\"282\":{},\"667\":{}},\"parent\":{}}],[\"refreshsessionwithoutrequestresponse\",{\"_index\":120,\"name\":{\"256\":{},\"283\":{}},\"parent\":{}}],[\"regenerateaccesstoken\",{\"_index\":312,\"name\":{\"675\":{}},\"parent\":{}}],[\"removeclaim\",{\"_index\":130,\"name\":{\"266\":{},\"296\":{},\"680\":{},\"699\":{}},\"parent\":{}}],[\"removeheader\",{\"_index\":192,\"name\":{\"459\":{}},\"parent\":{}}],[\"removepermissionsfromrole\",{\"_index\":159,\"name\":{\"400\":{},\"415\":{},\"821\":{}},\"parent\":{}}],[\"removeuserrole\",{\"_index\":154,\"name\":{\"395\":{},\"410\":{},\"816\":{}},\"parent\":{}}],[\"req\",{\"_index\":232,\"name\":{\"521\":{},\"543\":{},\"567\":{},\"589\":{},\"621\":{},\"646\":{},\"712\":{},\"742\":{}},\"parent\":{}}],[\"res\",{\"_index\":233,\"name\":{\"522\":{},\"544\":{},\"568\":{},\"590\":{},\"622\":{},\"647\":{},\"713\":{},\"743\":{}},\"parent\":{}}],[\"resendcodepost\",{\"_index\":300,\"name\":{\"653\":{},\"799\":{}},\"parent\":{}}],[\"resetpasswordusingtoken\",{\"_index\":64,\"name\":{\"123\":{},\"136\":{},\"318\":{},\"333\":{}},\"parent\":{}}],[\"response\",{\"_index\":201,\"name\":{\"473\":{},\"481\":{}},\"parent\":{}}],[\"revokeallcodes\",{\"_index\":107,\"name\":{\"223\":{},\"237\":{},\"354\":{},\"369\":{},\"633\":{},\"786\":{}},\"parent\":{}}],[\"revokeallsessionsforuser\",{\"_index\":121,\"name\":{\"257\":{},\"284\":{},\"669\":{}},\"parent\":{}}],[\"revokecode\",{\"_index\":108,\"name\":{\"224\":{},\"238\":{},\"355\":{},\"370\":{},\"634\":{},\"787\":{}},\"parent\":{}}],[\"revokeemailverificationtokens\",{\"_index\":77,\"name\":{\"151\":{},\"164\":{},\"558\":{}},\"parent\":{}}],[\"revokemultiplesessions\",{\"_index\":124,\"name\":{\"260\":{},\"287\":{},\"672\":{}},\"parent\":{}}],[\"revokesession\",{\"_index\":123,\"name\":{\"259\":{},\"286\":{},\"671\":{},\"682\":{}},\"parent\":{}}],[\"sendemail\",{\"_index\":69,\"name\":{\"128\":{},\"141\":{},\"153\":{},\"166\":{},\"227\":{},\"245\":{},\"323\":{},\"338\":{},\"357\":{},\"377\":{}},\"parent\":{}}],[\"sendemailverificationemail\",{\"_index\":74,\"name\":{\"148\":{},\"161\":{}},\"parent\":{}}],[\"sendhtmlresponse\",{\"_index\":196,\"name\":{\"467\":{}},\"parent\":{}}],[\"sendjsonresponse\",{\"_index\":195,\"name\":{\"465\":{}},\"parent\":{}}],[\"sendresetpasswordemail\",{\"_index\":68,\"name\":{\"127\":{},\"140\":{},\"322\":{},\"337\":{}},\"parent\":{}}],[\"sendsms\",{\"_index\":111,\"name\":{\"228\":{},\"246\":{},\"358\":{},\"378\":{}},\"parent\":{}}],[\"session\",{\"_index\":198,\"name\":{\"470\":{},\"478\":{},\"491\":{},\"493\":{},\"495\":{},\"498\":{},\"500\":{}},\"parent\":{}}],[\"sessionclaimvalidator\",{\"_index\":344,\"name\":{\"724\":{}},\"parent\":{}}],[\"sessioncontainer\",{\"_index\":314,\"name\":{\"681\":{}},\"parent\":{}}],[\"sessioncontext\",{\"_index\":215,\"name\":{\"497\":{},\"499\":{}},\"parent\":{}}],[\"sessiondataindatabase\",{\"_index\":339,\"name\":{\"719\":{}},\"parent\":{}}],[\"sessionevent\",{\"_index\":197,\"name\":{\"469\":{}},\"parent\":{}}],[\"sessioneventv2\",{\"_index\":206,\"name\":{\"477\":{}},\"parent\":{}}],[\"sessionhandle\",{\"_index\":336,\"name\":{\"716\":{}},\"parent\":{}}],[\"sessioninformation\",{\"_index\":334,\"name\":{\"714\":{}},\"parent\":{}}],[\"sessionrequest\",{\"_index\":211,\"name\":{\"490\":{},\"492\":{},\"494\":{}},\"parent\":{}}],[\"sessionrequired\",{\"_index\":306,\"name\":{\"659\":{}},\"parent\":{}}],[\"setclaimvalue\",{\"_index\":128,\"name\":{\"264\":{},\"294\":{},\"678\":{},\"697\":{}},\"parent\":{}}],[\"setcookie\",{\"_index\":193,\"name\":{\"461\":{}},\"parent\":{}}],[\"setheader\",{\"_index\":191,\"name\":{\"457\":{}},\"parent\":{}}],[\"setstatuscode\",{\"_index\":194,\"name\":{\"463\":{}},\"parent\":{}}],[\"shouldallowaccess\",{\"_index\":225,\"name\":{\"515\":{}},\"parent\":{}}],[\"signin\",{\"_index\":62,\"name\":{\"121\":{},\"134\":{},\"532\":{}},\"parent\":{}}],[\"signinpost\",{\"_index\":251,\"name\":{\"551\":{}},\"parent\":{}}],[\"signinup\",{\"_index\":110,\"name\":{\"226\":{},\"244\":{},\"728\":{}},\"parent\":{}}],[\"signinuppost\",{\"_index\":350,\"name\":{\"733\":{}},\"parent\":{}}],[\"signoutpost\",{\"_index\":330,\"name\":{\"704\":{}},\"parent\":{}}],[\"signup\",{\"_index\":61,\"name\":{\"120\":{},\"133\":{},\"530\":{}},\"parent\":{}}],[\"signuppost\",{\"_index\":252,\"name\":{\"552\":{}},\"parent\":{}}],[\"smsdelivery\",{\"_index\":296,\"name\":{\"649\":{}},\"parent\":{}}],[\"staticthirdpartyproviders\",{\"_index\":288,\"name\":{\"623\":{}},\"parent\":{}}],[\"supertokens\",{\"_index\":200,\"name\":{\"471\":{},\"479\":{}},\"parent\":{}}],[\"tenantid\",{\"_index\":343,\"name\":{\"723\":{}},\"parent\":{}}],[\"tenantids\",{\"_index\":171,\"name\":{\"428\":{}},\"parent\":{}}],[\"thirdparty\",{\"_index\":174,\"name\":{\"431\":{}},\"parent\":{}}],[\"thirdpartyapioptions\",{\"_index\":373,\"name\":{\"776\":{},\"804\":{}},\"parent\":{}}],[\"thirdpartygetprovider\",{\"_index\":140,\"name\":{\"315\":{},\"328\":{},\"343\":{},\"363\":{},\"755\":{},\"781\":{}},\"parent\":{}}],[\"thirdpartymanuallycreateorupdateuser\",{\"_index\":141,\"name\":{\"316\":{},\"329\":{},\"344\":{},\"364\":{},\"757\":{},\"780\":{}},\"parent\":{}}],[\"thirdpartysigninup\",{\"_index\":364,\"name\":{\"756\":{},\"779\":{}},\"parent\":{}}],[\"thirdpartysigninuppost\",{\"_index\":369,\"name\":{\"771\":{},\"796\":{}},\"parent\":{}}],[\"timecreated\",{\"_index\":342,\"name\":{\"722\":{}},\"parent\":{}}],[\"timejoined\",{\"_index\":176,\"name\":{\"433\":{}},\"parent\":{}}],[\"tojson\",{\"_index\":177,\"name\":{\"434\":{}},\"parent\":{}}],[\"typeprovider\",{\"_index\":355,\"name\":{\"745\":{},\"764\":{},\"792\":{}},\"parent\":{}}],[\"unlinkaccount\",{\"_index\":51,\"name\":{\"91\":{},\"106\":{},\"508\":{}},\"parent\":{}}],[\"unverifyemail\",{\"_index\":78,\"name\":{\"152\":{},\"165\":{},\"559\":{}},\"parent\":{}}],[\"updateemailorpassword\",{\"_index\":66,\"name\":{\"125\":{},\"138\":{},\"320\":{},\"335\":{},\"535\":{},\"763\":{}},\"parent\":{}}],[\"updateordeleteuseridmappinginfo\",{\"_index\":10,\"name\":{\"10\":{},\"29\":{}},\"parent\":{}}],[\"updatepasswordlessuser\",{\"_index\":145,\"name\":{\"353\":{},\"368\":{},\"785\":{}},\"parent\":{}}],[\"updatesessiondataindatabase\",{\"_index\":125,\"name\":{\"261\":{},\"288\":{},\"673\":{},\"684\":{}},\"parent\":{}}],[\"updateuser\",{\"_index\":106,\"name\":{\"222\":{},\"236\":{},\"632\":{}},\"parent\":{}}],[\"updateusermetadata\",{\"_index\":149,\"name\":{\"383\":{},\"389\":{},\"808\":{}},\"parent\":{}}],[\"use\",{\"_index\":281,\"name\":{\"602\":{}},\"parent\":{}}],[\"user\",{\"_index\":20,\"name\":{\"21\":{},\"424\":{}},\"parent\":{}}],[\"useremailinfo\",{\"_index\":262,\"name\":{\"575\":{}},\"parent\":{}}],[\"userid\",{\"_index\":338,\"name\":{\"717\":{}},\"parent\":{}}],[\"userroleclaim\",{\"_index\":165,\"name\":{\"408\":{},\"811\":{}},\"parent\":{}}],[\"validateclaims\",{\"_index\":313,\"name\":{\"676\":{}},\"parent\":{}}],[\"validateclaimsforsessionhandle\",{\"_index\":131,\"name\":{\"267\":{},\"278\":{}},\"parent\":{}}],[\"verifyemailpost\",{\"_index\":258,\"name\":{\"572\":{}},\"parent\":{}}],[\"verifyemailusingtoken\",{\"_index\":75,\"name\":{\"149\":{},\"162\":{},\"556\":{}},\"parent\":{}}],[\"verifysession\",{\"_index\":331,\"name\":{\"705\":{}},\"parent\":{}}],[\"verifysessionoptions\",{\"_index\":303,\"name\":{\"657\":{}},\"parent\":{}}],[\"wrapperused\",{\"_index\":180,\"name\":{\"437\":{},\"455\":{}},\"parent\":{}}],[\"wraprequest\",{\"_index\":32,\"name\":{\"53\":{},\"58\":{},\"63\":{},\"67\":{},\"71\":{},\"75\":{}},\"parent\":{}}],[\"wrapresponse\",{\"_index\":33,\"name\":{\"54\":{},\"59\":{},\"64\":{},\"68\":{},\"72\":{},\"76\":{}},\"parent\":{}}]],\"pipeline\":[]}}"); \ No newline at end of file +window.searchData = JSON.parse("{\"kinds\":{\"2\":\"Module\",\"32\":\"Variable\",\"64\":\"Function\",\"128\":\"Class\",\"256\":\"Interface\",\"512\":\"Constructor\",\"1024\":\"Property\",\"2048\":\"Method\",\"65536\":\"Type literal\",\"262144\":\"Accessor\",\"4194304\":\"Type alias\",\"16777216\":\"Reference\"},\"rows\":[{\"id\":0,\"kind\":2,\"name\":\"index\",\"url\":\"modules/index.html\",\"classes\":\"tsd-kind-module\"},{\"id\":1,\"kind\":64,\"name\":\"init\",\"url\":\"modules/index.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":2,\"kind\":64,\"name\":\"getAllCORSHeaders\",\"url\":\"modules/index.html#getAllCORSHeaders\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":3,\"kind\":64,\"name\":\"getUserCount\",\"url\":\"modules/index.html#getUserCount\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":4,\"kind\":64,\"name\":\"getUsersOldestFirst\",\"url\":\"modules/index.html#getUsersOldestFirst\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":5,\"kind\":64,\"name\":\"getUsersNewestFirst\",\"url\":\"modules/index.html#getUsersNewestFirst\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":6,\"kind\":64,\"name\":\"deleteUser\",\"url\":\"modules/index.html#deleteUser\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":7,\"kind\":64,\"name\":\"createUserIdMapping\",\"url\":\"modules/index.html#createUserIdMapping\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":8,\"kind\":64,\"name\":\"getUserIdMapping\",\"url\":\"modules/index.html#getUserIdMapping\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":9,\"kind\":64,\"name\":\"deleteUserIdMapping\",\"url\":\"modules/index.html#deleteUserIdMapping\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":10,\"kind\":64,\"name\":\"updateOrDeleteUserIdMappingInfo\",\"url\":\"modules/index.html#updateOrDeleteUserIdMappingInfo\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":11,\"kind\":64,\"name\":\"getUser\",\"url\":\"modules/index.html#getUser\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":12,\"kind\":64,\"name\":\"listUsersByAccountInfo\",\"url\":\"modules/index.html#listUsersByAccountInfo\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":13,\"kind\":64,\"name\":\"convertToRecipeUserId\",\"url\":\"modules/index.html#convertToRecipeUserId\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":14,\"kind\":64,\"name\":\"getRequestFromUserContext\",\"url\":\"modules/index.html#getRequestFromUserContext\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":15,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/index.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":16,\"kind\":128,\"name\":\"default\",\"url\":\"classes/index.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":17,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/index.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":18,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/index.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"index.default\"},{\"id\":19,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/index.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":20,\"kind\":1024,\"name\":\"RecipeUserId\",\"url\":\"classes/index.default.html#RecipeUserId\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":21,\"kind\":1024,\"name\":\"User\",\"url\":\"classes/index.default.html#User\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":22,\"kind\":2048,\"name\":\"getAllCORSHeaders\",\"url\":\"classes/index.default.html#getAllCORSHeaders\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":23,\"kind\":2048,\"name\":\"getUserCount\",\"url\":\"classes/index.default.html#getUserCount\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":24,\"kind\":2048,\"name\":\"getUsersOldestFirst\",\"url\":\"classes/index.default.html#getUsersOldestFirst\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":25,\"kind\":2048,\"name\":\"getUsersNewestFirst\",\"url\":\"classes/index.default.html#getUsersNewestFirst\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":26,\"kind\":2048,\"name\":\"createUserIdMapping\",\"url\":\"classes/index.default.html#createUserIdMapping\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":27,\"kind\":2048,\"name\":\"getUserIdMapping\",\"url\":\"classes/index.default.html#getUserIdMapping\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":28,\"kind\":2048,\"name\":\"deleteUserIdMapping\",\"url\":\"classes/index.default.html#deleteUserIdMapping\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":29,\"kind\":2048,\"name\":\"updateOrDeleteUserIdMappingInfo\",\"url\":\"classes/index.default.html#updateOrDeleteUserIdMappingInfo\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":30,\"kind\":2048,\"name\":\"getUser\",\"url\":\"classes/index.default.html#getUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":31,\"kind\":2048,\"name\":\"listUsersByAccountInfo\",\"url\":\"classes/index.default.html#listUsersByAccountInfo\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":32,\"kind\":2048,\"name\":\"deleteUser\",\"url\":\"classes/index.default.html#deleteUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":33,\"kind\":2048,\"name\":\"convertToRecipeUserId\",\"url\":\"classes/index.default.html#convertToRecipeUserId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":34,\"kind\":2048,\"name\":\"getRequestFromUserContext\",\"url\":\"classes/index.default.html#getRequestFromUserContext\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"index.default\"},{\"id\":35,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/index.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"index.default\"},{\"id\":36,\"kind\":2,\"name\":\"framework\",\"url\":\"modules/framework.html\",\"classes\":\"tsd-kind-module\"},{\"id\":37,\"kind\":32,\"name\":\"express\",\"url\":\"modules/framework.html#express-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":38,\"kind\":32,\"name\":\"fastify\",\"url\":\"modules/framework.html#fastify-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":39,\"kind\":32,\"name\":\"hapi\",\"url\":\"modules/framework.html#hapi-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":40,\"kind\":32,\"name\":\"loopback\",\"url\":\"modules/framework.html#loopback-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":41,\"kind\":32,\"name\":\"koa\",\"url\":\"modules/framework.html#koa-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":42,\"kind\":32,\"name\":\"awsLambda\",\"url\":\"modules/framework.html#awsLambda-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":43,\"kind\":1024,\"name\":\"default\",\"url\":\"modules/framework.html#default\",\"classes\":\"tsd-kind-property tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":44,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/framework.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":45,\"kind\":1024,\"name\":\"express\",\"url\":\"modules/framework.html#__type.express\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework.__type\"},{\"id\":46,\"kind\":1024,\"name\":\"fastify\",\"url\":\"modules/framework.html#__type.fastify\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework.__type\"},{\"id\":47,\"kind\":1024,\"name\":\"hapi\",\"url\":\"modules/framework.html#__type.hapi\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework.__type\"},{\"id\":48,\"kind\":1024,\"name\":\"loopback\",\"url\":\"modules/framework.html#__type.loopback\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework.__type\"},{\"id\":49,\"kind\":1024,\"name\":\"koa\",\"url\":\"modules/framework.html#__type.koa\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework.__type\"},{\"id\":50,\"kind\":1024,\"name\":\"awsLambda\",\"url\":\"modules/framework.html#__type.awsLambda\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework.__type\"},{\"id\":51,\"kind\":2,\"name\":\"framework/awsLambda\",\"url\":\"modules/framework_awsLambda.html\",\"classes\":\"tsd-kind-module\"},{\"id\":52,\"kind\":64,\"name\":\"middleware\",\"url\":\"modules/framework_awsLambda.html#middleware\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/awsLambda\"},{\"id\":53,\"kind\":64,\"name\":\"wrapRequest\",\"url\":\"modules/framework_awsLambda.html#wrapRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/awsLambda\"},{\"id\":54,\"kind\":64,\"name\":\"wrapResponse\",\"url\":\"modules/framework_awsLambda.html#wrapResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/awsLambda\"},{\"id\":55,\"kind\":2,\"name\":\"framework/custom\",\"url\":\"modules/framework_custom.html\",\"classes\":\"tsd-kind-module\"},{\"id\":56,\"kind\":64,\"name\":\"middleware\",\"url\":\"modules/framework_custom.html#middleware\",\"classes\":\"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"framework/custom\"},{\"id\":57,\"kind\":64,\"name\":\"errorHandler\",\"url\":\"modules/framework_custom.html#errorHandler\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/custom\"},{\"id\":58,\"kind\":2,\"name\":\"framework/express\",\"url\":\"modules/framework_express.html\",\"classes\":\"tsd-kind-module\"},{\"id\":59,\"kind\":64,\"name\":\"middleware\",\"url\":\"modules/framework_express.html#middleware\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/express\"},{\"id\":60,\"kind\":64,\"name\":\"errorHandler\",\"url\":\"modules/framework_express.html#errorHandler\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/express\"},{\"id\":61,\"kind\":64,\"name\":\"wrapRequest\",\"url\":\"modules/framework_express.html#wrapRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/express\"},{\"id\":62,\"kind\":64,\"name\":\"wrapResponse\",\"url\":\"modules/framework_express.html#wrapResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/express\"},{\"id\":63,\"kind\":2,\"name\":\"framework/fastify\",\"url\":\"modules/framework_fastify.html\",\"classes\":\"tsd-kind-module\"},{\"id\":64,\"kind\":64,\"name\":\"plugin\",\"url\":\"modules/framework_fastify.html#plugin\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/fastify\"},{\"id\":65,\"kind\":64,\"name\":\"errorHandler\",\"url\":\"modules/framework_fastify.html#errorHandler\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/fastify\"},{\"id\":66,\"kind\":64,\"name\":\"wrapRequest\",\"url\":\"modules/framework_fastify.html#wrapRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/fastify\"},{\"id\":67,\"kind\":64,\"name\":\"wrapResponse\",\"url\":\"modules/framework_fastify.html#wrapResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/fastify\"},{\"id\":68,\"kind\":2,\"name\":\"framework/hapi\",\"url\":\"modules/framework_hapi.html\",\"classes\":\"tsd-kind-module\"},{\"id\":69,\"kind\":32,\"name\":\"plugin\",\"url\":\"modules/framework_hapi.html#plugin\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"framework/hapi\"},{\"id\":70,\"kind\":64,\"name\":\"wrapRequest\",\"url\":\"modules/framework_hapi.html#wrapRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/hapi\"},{\"id\":71,\"kind\":64,\"name\":\"wrapResponse\",\"url\":\"modules/framework_hapi.html#wrapResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/hapi\"},{\"id\":72,\"kind\":2,\"name\":\"framework/koa\",\"url\":\"modules/framework_koa.html\",\"classes\":\"tsd-kind-module\"},{\"id\":73,\"kind\":64,\"name\":\"middleware\",\"url\":\"modules/framework_koa.html#middleware\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/koa\"},{\"id\":74,\"kind\":64,\"name\":\"wrapRequest\",\"url\":\"modules/framework_koa.html#wrapRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/koa\"},{\"id\":75,\"kind\":64,\"name\":\"wrapResponse\",\"url\":\"modules/framework_koa.html#wrapResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/koa\"},{\"id\":76,\"kind\":2,\"name\":\"framework/loopback\",\"url\":\"modules/framework_loopback.html\",\"classes\":\"tsd-kind-module\"},{\"id\":77,\"kind\":64,\"name\":\"middleware\",\"url\":\"modules/framework_loopback.html#middleware\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/loopback\"},{\"id\":78,\"kind\":64,\"name\":\"wrapRequest\",\"url\":\"modules/framework_loopback.html#wrapRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/loopback\"},{\"id\":79,\"kind\":64,\"name\":\"wrapResponse\",\"url\":\"modules/framework_loopback.html#wrapResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"framework/loopback\"},{\"id\":80,\"kind\":2,\"name\":\"ingredients/emaildelivery\",\"url\":\"modules/ingredients_emaildelivery.html\",\"classes\":\"tsd-kind-module\"},{\"id\":81,\"kind\":128,\"name\":\"default\",\"url\":\"classes/ingredients_emaildelivery.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"ingredients/emaildelivery\"},{\"id\":82,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/ingredients_emaildelivery.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"ingredients/emaildelivery.default\"},{\"id\":83,\"kind\":1024,\"name\":\"ingredientInterfaceImpl\",\"url\":\"classes/ingredients_emaildelivery.default.html#ingredientInterfaceImpl\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"ingredients/emaildelivery.default\"},{\"id\":84,\"kind\":2,\"name\":\"ingredients/smsdelivery\",\"url\":\"modules/ingredients_smsdelivery.html\",\"classes\":\"tsd-kind-module\"},{\"id\":85,\"kind\":128,\"name\":\"default\",\"url\":\"classes/ingredients_smsdelivery.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"ingredients/smsdelivery\"},{\"id\":86,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/ingredients_smsdelivery.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"ingredients/smsdelivery.default\"},{\"id\":87,\"kind\":1024,\"name\":\"ingredientInterfaceImpl\",\"url\":\"classes/ingredients_smsdelivery.default.html#ingredientInterfaceImpl\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"ingredients/smsdelivery.default\"},{\"id\":88,\"kind\":2,\"name\":\"recipe/accountlinking\",\"url\":\"modules/recipe_accountlinking.html\",\"classes\":\"tsd-kind-module\"},{\"id\":89,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_accountlinking.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":90,\"kind\":64,\"name\":\"canCreatePrimaryUser\",\"url\":\"modules/recipe_accountlinking.html#canCreatePrimaryUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":91,\"kind\":64,\"name\":\"createPrimaryUser\",\"url\":\"modules/recipe_accountlinking.html#createPrimaryUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":92,\"kind\":64,\"name\":\"canLinkAccounts\",\"url\":\"modules/recipe_accountlinking.html#canLinkAccounts-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":93,\"kind\":64,\"name\":\"linkAccounts\",\"url\":\"modules/recipe_accountlinking.html#linkAccounts-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":94,\"kind\":64,\"name\":\"unlinkAccount\",\"url\":\"modules/recipe_accountlinking.html#unlinkAccount-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":95,\"kind\":64,\"name\":\"createPrimaryUserIdOrLinkAccounts\",\"url\":\"modules/recipe_accountlinking.html#createPrimaryUserIdOrLinkAccounts\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":96,\"kind\":64,\"name\":\"getPrimaryUserThatCanBeLinkedToRecipeUserId\",\"url\":\"modules/recipe_accountlinking.html#getPrimaryUserThatCanBeLinkedToRecipeUserId\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":97,\"kind\":64,\"name\":\"isSignUpAllowed\",\"url\":\"modules/recipe_accountlinking.html#isSignUpAllowed\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":98,\"kind\":64,\"name\":\"isSignInAllowed\",\"url\":\"modules/recipe_accountlinking.html#isSignInAllowed\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":99,\"kind\":64,\"name\":\"isEmailChangeAllowed\",\"url\":\"modules/recipe_accountlinking.html#isEmailChangeAllowed\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":100,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_accountlinking.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":101,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_accountlinking.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":102,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_accountlinking.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":103,\"kind\":2048,\"name\":\"createPrimaryUserIdOrLinkAccounts\",\"url\":\"classes/recipe_accountlinking.default.html#createPrimaryUserIdOrLinkAccounts\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":104,\"kind\":2048,\"name\":\"getPrimaryUserThatCanBeLinkedToRecipeUserId\",\"url\":\"classes/recipe_accountlinking.default.html#getPrimaryUserThatCanBeLinkedToRecipeUserId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":105,\"kind\":2048,\"name\":\"canCreatePrimaryUser\",\"url\":\"classes/recipe_accountlinking.default.html#canCreatePrimaryUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":106,\"kind\":2048,\"name\":\"createPrimaryUser\",\"url\":\"classes/recipe_accountlinking.default.html#createPrimaryUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":107,\"kind\":2048,\"name\":\"canLinkAccounts\",\"url\":\"classes/recipe_accountlinking.default.html#canLinkAccounts\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":108,\"kind\":2048,\"name\":\"linkAccounts\",\"url\":\"classes/recipe_accountlinking.default.html#linkAccounts\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":109,\"kind\":2048,\"name\":\"unlinkAccount\",\"url\":\"classes/recipe_accountlinking.default.html#unlinkAccount\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":110,\"kind\":2048,\"name\":\"isSignUpAllowed\",\"url\":\"classes/recipe_accountlinking.default.html#isSignUpAllowed\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":111,\"kind\":2048,\"name\":\"isSignInAllowed\",\"url\":\"classes/recipe_accountlinking.default.html#isSignInAllowed\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":112,\"kind\":2048,\"name\":\"isEmailChangeAllowed\",\"url\":\"classes/recipe_accountlinking.default.html#isEmailChangeAllowed\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":113,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_accountlinking.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/accountlinking.default\"},{\"id\":114,\"kind\":2,\"name\":\"recipe/dashboard\",\"url\":\"modules/recipe_dashboard.html\",\"classes\":\"tsd-kind-module\"},{\"id\":115,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_dashboard.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/dashboard\"},{\"id\":116,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_dashboard.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/dashboard\"},{\"id\":117,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_dashboard.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/dashboard.default\"},{\"id\":118,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_dashboard.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/dashboard.default\"},{\"id\":119,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_dashboard.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/dashboard.default\"},{\"id\":120,\"kind\":2,\"name\":\"recipe/emailpassword\",\"url\":\"modules/recipe_emailpassword.html\",\"classes\":\"tsd-kind-module\"},{\"id\":121,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_emailpassword.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":122,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/recipe_emailpassword.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":123,\"kind\":64,\"name\":\"signUp\",\"url\":\"modules/recipe_emailpassword.html#signUp-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":124,\"kind\":64,\"name\":\"signIn\",\"url\":\"modules/recipe_emailpassword.html#signIn-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":125,\"kind\":64,\"name\":\"createResetPasswordToken\",\"url\":\"modules/recipe_emailpassword.html#createResetPasswordToken-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":126,\"kind\":64,\"name\":\"resetPasswordUsingToken\",\"url\":\"modules/recipe_emailpassword.html#resetPasswordUsingToken\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":127,\"kind\":64,\"name\":\"consumePasswordResetToken\",\"url\":\"modules/recipe_emailpassword.html#consumePasswordResetToken-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":128,\"kind\":64,\"name\":\"updateEmailOrPassword\",\"url\":\"modules/recipe_emailpassword.html#updateEmailOrPassword-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":129,\"kind\":64,\"name\":\"createResetPasswordLink\",\"url\":\"modules/recipe_emailpassword.html#createResetPasswordLink\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":130,\"kind\":64,\"name\":\"sendResetPasswordEmail\",\"url\":\"modules/recipe_emailpassword.html#sendResetPasswordEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":131,\"kind\":64,\"name\":\"sendEmail\",\"url\":\"modules/recipe_emailpassword.html#sendEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":132,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_emailpassword.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":133,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_emailpassword.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":134,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_emailpassword.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":135,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/recipe_emailpassword.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":136,\"kind\":2048,\"name\":\"signUp\",\"url\":\"classes/recipe_emailpassword.default.html#signUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":137,\"kind\":2048,\"name\":\"signIn\",\"url\":\"classes/recipe_emailpassword.default.html#signIn\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":138,\"kind\":2048,\"name\":\"createResetPasswordToken\",\"url\":\"classes/recipe_emailpassword.default.html#createResetPasswordToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":139,\"kind\":2048,\"name\":\"resetPasswordUsingToken\",\"url\":\"classes/recipe_emailpassword.default.html#resetPasswordUsingToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":140,\"kind\":2048,\"name\":\"consumePasswordResetToken\",\"url\":\"classes/recipe_emailpassword.default.html#consumePasswordResetToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":141,\"kind\":2048,\"name\":\"updateEmailOrPassword\",\"url\":\"classes/recipe_emailpassword.default.html#updateEmailOrPassword\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":142,\"kind\":2048,\"name\":\"createResetPasswordLink\",\"url\":\"classes/recipe_emailpassword.default.html#createResetPasswordLink\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":143,\"kind\":2048,\"name\":\"sendResetPasswordEmail\",\"url\":\"classes/recipe_emailpassword.default.html#sendResetPasswordEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":144,\"kind\":2048,\"name\":\"sendEmail\",\"url\":\"classes/recipe_emailpassword.default.html#sendEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":145,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_emailpassword.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/emailpassword.default\"},{\"id\":146,\"kind\":2,\"name\":\"recipe/emailverification\",\"url\":\"modules/recipe_emailverification.html\",\"classes\":\"tsd-kind-module\"},{\"id\":147,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_emailverification.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":148,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/recipe_emailverification.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":149,\"kind\":64,\"name\":\"createEmailVerificationToken\",\"url\":\"modules/recipe_emailverification.html#createEmailVerificationToken-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":150,\"kind\":64,\"name\":\"createEmailVerificationLink\",\"url\":\"modules/recipe_emailverification.html#createEmailVerificationLink\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":151,\"kind\":64,\"name\":\"sendEmailVerificationEmail\",\"url\":\"modules/recipe_emailverification.html#sendEmailVerificationEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":152,\"kind\":64,\"name\":\"verifyEmailUsingToken\",\"url\":\"modules/recipe_emailverification.html#verifyEmailUsingToken-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":153,\"kind\":64,\"name\":\"isEmailVerified\",\"url\":\"modules/recipe_emailverification.html#isEmailVerified-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":154,\"kind\":64,\"name\":\"revokeEmailVerificationTokens\",\"url\":\"modules/recipe_emailverification.html#revokeEmailVerificationTokens-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":155,\"kind\":64,\"name\":\"unverifyEmail\",\"url\":\"modules/recipe_emailverification.html#unverifyEmail-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":156,\"kind\":64,\"name\":\"sendEmail\",\"url\":\"modules/recipe_emailverification.html#sendEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":157,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_emailverification.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":158,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_emailverification.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":159,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_emailverification.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/emailverification.default\"},{\"id\":160,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/recipe_emailverification.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":161,\"kind\":1024,\"name\":\"EmailVerificationClaim\",\"url\":\"classes/recipe_emailverification.default.html#EmailVerificationClaim\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":162,\"kind\":2048,\"name\":\"createEmailVerificationToken\",\"url\":\"classes/recipe_emailverification.default.html#createEmailVerificationToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":163,\"kind\":2048,\"name\":\"createEmailVerificationLink\",\"url\":\"classes/recipe_emailverification.default.html#createEmailVerificationLink\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":164,\"kind\":2048,\"name\":\"sendEmailVerificationEmail\",\"url\":\"classes/recipe_emailverification.default.html#sendEmailVerificationEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":165,\"kind\":2048,\"name\":\"verifyEmailUsingToken\",\"url\":\"classes/recipe_emailverification.default.html#verifyEmailUsingToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":166,\"kind\":2048,\"name\":\"isEmailVerified\",\"url\":\"classes/recipe_emailverification.default.html#isEmailVerified\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":167,\"kind\":2048,\"name\":\"revokeEmailVerificationTokens\",\"url\":\"classes/recipe_emailverification.default.html#revokeEmailVerificationTokens\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":168,\"kind\":2048,\"name\":\"unverifyEmail\",\"url\":\"classes/recipe_emailverification.default.html#unverifyEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":169,\"kind\":2048,\"name\":\"sendEmail\",\"url\":\"classes/recipe_emailverification.default.html#sendEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/emailverification.default\"},{\"id\":170,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_emailverification.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/emailverification.default\"},{\"id\":171,\"kind\":2,\"name\":\"recipe/jwt\",\"url\":\"modules/recipe_jwt.html\",\"classes\":\"tsd-kind-module\"},{\"id\":172,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_jwt.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":173,\"kind\":64,\"name\":\"createJWT\",\"url\":\"modules/recipe_jwt.html#createJWT-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":174,\"kind\":64,\"name\":\"getJWKS\",\"url\":\"modules/recipe_jwt.html#getJWKS-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":175,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_jwt.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":176,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_jwt.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/jwt.default\"},{\"id\":177,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_jwt.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/jwt.default\"},{\"id\":178,\"kind\":2048,\"name\":\"createJWT\",\"url\":\"classes/recipe_jwt.default.html#createJWT\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/jwt.default\"},{\"id\":179,\"kind\":2048,\"name\":\"getJWKS\",\"url\":\"classes/recipe_jwt.default.html#getJWKS\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/jwt.default\"},{\"id\":180,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_jwt.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/jwt.default\"},{\"id\":181,\"kind\":2,\"name\":\"recipe/multitenancy\",\"url\":\"modules/recipe_multitenancy.html\",\"classes\":\"tsd-kind-module\"},{\"id\":182,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_multitenancy.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":183,\"kind\":64,\"name\":\"createOrUpdateTenant\",\"url\":\"modules/recipe_multitenancy.html#createOrUpdateTenant-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":184,\"kind\":64,\"name\":\"deleteTenant\",\"url\":\"modules/recipe_multitenancy.html#deleteTenant-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":185,\"kind\":64,\"name\":\"getTenant\",\"url\":\"modules/recipe_multitenancy.html#getTenant-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":186,\"kind\":64,\"name\":\"listAllTenants\",\"url\":\"modules/recipe_multitenancy.html#listAllTenants-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":187,\"kind\":64,\"name\":\"createOrUpdateThirdPartyConfig\",\"url\":\"modules/recipe_multitenancy.html#createOrUpdateThirdPartyConfig-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":188,\"kind\":64,\"name\":\"deleteThirdPartyConfig\",\"url\":\"modules/recipe_multitenancy.html#deleteThirdPartyConfig-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":189,\"kind\":64,\"name\":\"associateUserToTenant\",\"url\":\"modules/recipe_multitenancy.html#associateUserToTenant-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":190,\"kind\":64,\"name\":\"disassociateUserFromTenant\",\"url\":\"modules/recipe_multitenancy.html#disassociateUserFromTenant-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":191,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_multitenancy.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":192,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_multitenancy.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":193,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_multitenancy.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":194,\"kind\":2048,\"name\":\"createOrUpdateTenant\",\"url\":\"classes/recipe_multitenancy.default.html#createOrUpdateTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":195,\"kind\":2048,\"name\":\"deleteTenant\",\"url\":\"classes/recipe_multitenancy.default.html#deleteTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":196,\"kind\":2048,\"name\":\"getTenant\",\"url\":\"classes/recipe_multitenancy.default.html#getTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":197,\"kind\":2048,\"name\":\"listAllTenants\",\"url\":\"classes/recipe_multitenancy.default.html#listAllTenants\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":198,\"kind\":2048,\"name\":\"createOrUpdateThirdPartyConfig\",\"url\":\"classes/recipe_multitenancy.default.html#createOrUpdateThirdPartyConfig\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":199,\"kind\":2048,\"name\":\"deleteThirdPartyConfig\",\"url\":\"classes/recipe_multitenancy.default.html#deleteThirdPartyConfig\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":200,\"kind\":2048,\"name\":\"associateUserToTenant\",\"url\":\"classes/recipe_multitenancy.default.html#associateUserToTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":201,\"kind\":2048,\"name\":\"disassociateUserFromTenant\",\"url\":\"classes/recipe_multitenancy.default.html#disassociateUserFromTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":202,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_multitenancy.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/multitenancy.default\"},{\"id\":203,\"kind\":2,\"name\":\"recipe/openid\",\"url\":\"modules/recipe_openid.html\",\"classes\":\"tsd-kind-module\"},{\"id\":204,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_openid.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/openid\"},{\"id\":205,\"kind\":64,\"name\":\"getOpenIdDiscoveryConfiguration\",\"url\":\"modules/recipe_openid.html#getOpenIdDiscoveryConfiguration\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/openid\"},{\"id\":206,\"kind\":64,\"name\":\"createJWT\",\"url\":\"modules/recipe_openid.html#createJWT\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/openid\"},{\"id\":207,\"kind\":64,\"name\":\"getJWKS\",\"url\":\"modules/recipe_openid.html#getJWKS\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/openid\"},{\"id\":208,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_openid.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/openid\"},{\"id\":209,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_openid.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/openid.default\"},{\"id\":210,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_openid.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/openid.default\"},{\"id\":211,\"kind\":2048,\"name\":\"getOpenIdDiscoveryConfiguration\",\"url\":\"classes/recipe_openid.default.html#getOpenIdDiscoveryConfiguration\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/openid.default\"},{\"id\":212,\"kind\":2048,\"name\":\"createJWT\",\"url\":\"classes/recipe_openid.default.html#createJWT\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/openid.default\"},{\"id\":213,\"kind\":2048,\"name\":\"getJWKS\",\"url\":\"classes/recipe_openid.default.html#getJWKS\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/openid.default\"},{\"id\":214,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_openid.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/openid.default\"},{\"id\":215,\"kind\":2,\"name\":\"recipe/passwordless\",\"url\":\"modules/recipe_passwordless.html\",\"classes\":\"tsd-kind-module\"},{\"id\":216,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_passwordless.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":217,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/recipe_passwordless.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":218,\"kind\":64,\"name\":\"createCode\",\"url\":\"modules/recipe_passwordless.html#createCode-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":219,\"kind\":64,\"name\":\"consumeCode\",\"url\":\"modules/recipe_passwordless.html#consumeCode-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":220,\"kind\":64,\"name\":\"listCodesByDeviceId\",\"url\":\"modules/recipe_passwordless.html#listCodesByDeviceId-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":221,\"kind\":64,\"name\":\"listCodesByEmail\",\"url\":\"modules/recipe_passwordless.html#listCodesByEmail-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":222,\"kind\":64,\"name\":\"listCodesByPhoneNumber\",\"url\":\"modules/recipe_passwordless.html#listCodesByPhoneNumber-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":223,\"kind\":64,\"name\":\"listCodesByPreAuthSessionId\",\"url\":\"modules/recipe_passwordless.html#listCodesByPreAuthSessionId-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":224,\"kind\":64,\"name\":\"createNewCodeForDevice\",\"url\":\"modules/recipe_passwordless.html#createNewCodeForDevice-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":225,\"kind\":64,\"name\":\"updateUser\",\"url\":\"modules/recipe_passwordless.html#updateUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":226,\"kind\":64,\"name\":\"revokeAllCodes\",\"url\":\"modules/recipe_passwordless.html#revokeAllCodes-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":227,\"kind\":64,\"name\":\"revokeCode\",\"url\":\"modules/recipe_passwordless.html#revokeCode-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":228,\"kind\":64,\"name\":\"createMagicLink\",\"url\":\"modules/recipe_passwordless.html#createMagicLink\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":229,\"kind\":64,\"name\":\"signInUp\",\"url\":\"modules/recipe_passwordless.html#signInUp\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":230,\"kind\":64,\"name\":\"sendEmail\",\"url\":\"modules/recipe_passwordless.html#sendEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":231,\"kind\":64,\"name\":\"sendSms\",\"url\":\"modules/recipe_passwordless.html#sendSms\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":232,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_passwordless.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":233,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_passwordless.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":234,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_passwordless.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/passwordless.default\"},{\"id\":235,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/recipe_passwordless.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":236,\"kind\":2048,\"name\":\"createCode\",\"url\":\"classes/recipe_passwordless.default.html#createCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":237,\"kind\":2048,\"name\":\"createNewCodeForDevice\",\"url\":\"classes/recipe_passwordless.default.html#createNewCodeForDevice\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":238,\"kind\":2048,\"name\":\"consumeCode\",\"url\":\"classes/recipe_passwordless.default.html#consumeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":239,\"kind\":2048,\"name\":\"updateUser\",\"url\":\"classes/recipe_passwordless.default.html#updateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":240,\"kind\":2048,\"name\":\"revokeAllCodes\",\"url\":\"classes/recipe_passwordless.default.html#revokeAllCodes\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":241,\"kind\":2048,\"name\":\"revokeCode\",\"url\":\"classes/recipe_passwordless.default.html#revokeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":242,\"kind\":2048,\"name\":\"listCodesByEmail\",\"url\":\"classes/recipe_passwordless.default.html#listCodesByEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":243,\"kind\":2048,\"name\":\"listCodesByPhoneNumber\",\"url\":\"classes/recipe_passwordless.default.html#listCodesByPhoneNumber\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":244,\"kind\":2048,\"name\":\"listCodesByDeviceId\",\"url\":\"classes/recipe_passwordless.default.html#listCodesByDeviceId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":245,\"kind\":2048,\"name\":\"listCodesByPreAuthSessionId\",\"url\":\"classes/recipe_passwordless.default.html#listCodesByPreAuthSessionId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":246,\"kind\":2048,\"name\":\"createMagicLink\",\"url\":\"classes/recipe_passwordless.default.html#createMagicLink\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":247,\"kind\":2048,\"name\":\"signInUp\",\"url\":\"classes/recipe_passwordless.default.html#signInUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":248,\"kind\":2048,\"name\":\"sendEmail\",\"url\":\"classes/recipe_passwordless.default.html#sendEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":249,\"kind\":2048,\"name\":\"sendSms\",\"url\":\"classes/recipe_passwordless.default.html#sendSms\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/passwordless.default\"},{\"id\":250,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_passwordless.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/passwordless.default\"},{\"id\":251,\"kind\":2,\"name\":\"recipe/session\",\"url\":\"modules/recipe_session.html\",\"classes\":\"tsd-kind-module\"},{\"id\":252,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_session.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":253,\"kind\":64,\"name\":\"createNewSession\",\"url\":\"modules/recipe_session.html#createNewSession-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":254,\"kind\":64,\"name\":\"createNewSessionWithoutRequestResponse\",\"url\":\"modules/recipe_session.html#createNewSessionWithoutRequestResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":255,\"kind\":64,\"name\":\"getSession\",\"url\":\"modules/recipe_session.html#getSession-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":256,\"kind\":64,\"name\":\"getSessionWithoutRequestResponse\",\"url\":\"modules/recipe_session.html#getSessionWithoutRequestResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":257,\"kind\":64,\"name\":\"getSessionInformation\",\"url\":\"modules/recipe_session.html#getSessionInformation-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":258,\"kind\":64,\"name\":\"refreshSession\",\"url\":\"modules/recipe_session.html#refreshSession-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":259,\"kind\":64,\"name\":\"refreshSessionWithoutRequestResponse\",\"url\":\"modules/recipe_session.html#refreshSessionWithoutRequestResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":260,\"kind\":64,\"name\":\"revokeAllSessionsForUser\",\"url\":\"modules/recipe_session.html#revokeAllSessionsForUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":261,\"kind\":64,\"name\":\"getAllSessionHandlesForUser\",\"url\":\"modules/recipe_session.html#getAllSessionHandlesForUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":262,\"kind\":64,\"name\":\"revokeSession\",\"url\":\"modules/recipe_session.html#revokeSession-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":263,\"kind\":64,\"name\":\"revokeMultipleSessions\",\"url\":\"modules/recipe_session.html#revokeMultipleSessions-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":264,\"kind\":64,\"name\":\"updateSessionDataInDatabase\",\"url\":\"modules/recipe_session.html#updateSessionDataInDatabase-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":265,\"kind\":64,\"name\":\"mergeIntoAccessTokenPayload\",\"url\":\"modules/recipe_session.html#mergeIntoAccessTokenPayload-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":266,\"kind\":64,\"name\":\"fetchAndSetClaim\",\"url\":\"modules/recipe_session.html#fetchAndSetClaim-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":267,\"kind\":64,\"name\":\"setClaimValue\",\"url\":\"modules/recipe_session.html#setClaimValue-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"recipe/session\"},{\"id\":268,\"kind\":64,\"name\":\"getClaimValue\",\"url\":\"modules/recipe_session.html#getClaimValue-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"recipe/session\"},{\"id\":269,\"kind\":64,\"name\":\"removeClaim\",\"url\":\"modules/recipe_session.html#removeClaim-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":270,\"kind\":64,\"name\":\"validateClaimsForSessionHandle\",\"url\":\"modules/recipe_session.html#validateClaimsForSessionHandle\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":271,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/recipe_session.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":272,\"kind\":64,\"name\":\"createJWT\",\"url\":\"modules/recipe_session.html#createJWT\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":273,\"kind\":64,\"name\":\"getJWKS\",\"url\":\"modules/recipe_session.html#getJWKS\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":274,\"kind\":64,\"name\":\"getOpenIdDiscoveryConfiguration\",\"url\":\"modules/recipe_session.html#getOpenIdDiscoveryConfiguration\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":275,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_session.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":276,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_session.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":277,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_session.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/session.default\"},{\"id\":278,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/recipe_session.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":279,\"kind\":2048,\"name\":\"createNewSession\",\"url\":\"classes/recipe_session.default.html#createNewSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":280,\"kind\":2048,\"name\":\"createNewSessionWithoutRequestResponse\",\"url\":\"classes/recipe_session.default.html#createNewSessionWithoutRequestResponse\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":281,\"kind\":2048,\"name\":\"validateClaimsForSessionHandle\",\"url\":\"classes/recipe_session.default.html#validateClaimsForSessionHandle\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":282,\"kind\":2048,\"name\":\"getSession\",\"url\":\"classes/recipe_session.default.html#getSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":283,\"kind\":2048,\"name\":\"getSessionWithoutRequestResponse\",\"url\":\"classes/recipe_session.default.html#getSessionWithoutRequestResponse\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":284,\"kind\":2048,\"name\":\"getSessionInformation\",\"url\":\"classes/recipe_session.default.html#getSessionInformation\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":285,\"kind\":2048,\"name\":\"refreshSession\",\"url\":\"classes/recipe_session.default.html#refreshSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":286,\"kind\":2048,\"name\":\"refreshSessionWithoutRequestResponse\",\"url\":\"classes/recipe_session.default.html#refreshSessionWithoutRequestResponse\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":287,\"kind\":2048,\"name\":\"revokeAllSessionsForUser\",\"url\":\"classes/recipe_session.default.html#revokeAllSessionsForUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":288,\"kind\":2048,\"name\":\"getAllSessionHandlesForUser\",\"url\":\"classes/recipe_session.default.html#getAllSessionHandlesForUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":289,\"kind\":2048,\"name\":\"revokeSession\",\"url\":\"classes/recipe_session.default.html#revokeSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":290,\"kind\":2048,\"name\":\"revokeMultipleSessions\",\"url\":\"classes/recipe_session.default.html#revokeMultipleSessions\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":291,\"kind\":2048,\"name\":\"updateSessionDataInDatabase\",\"url\":\"classes/recipe_session.default.html#updateSessionDataInDatabase\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":292,\"kind\":2048,\"name\":\"mergeIntoAccessTokenPayload\",\"url\":\"classes/recipe_session.default.html#mergeIntoAccessTokenPayload\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":293,\"kind\":2048,\"name\":\"createJWT\",\"url\":\"classes/recipe_session.default.html#createJWT\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":294,\"kind\":2048,\"name\":\"getJWKS\",\"url\":\"classes/recipe_session.default.html#getJWKS\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":295,\"kind\":2048,\"name\":\"getOpenIdDiscoveryConfiguration\",\"url\":\"classes/recipe_session.default.html#getOpenIdDiscoveryConfiguration\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":296,\"kind\":2048,\"name\":\"fetchAndSetClaim\",\"url\":\"classes/recipe_session.default.html#fetchAndSetClaim\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":297,\"kind\":2048,\"name\":\"setClaimValue\",\"url\":\"classes/recipe_session.default.html#setClaimValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":298,\"kind\":2048,\"name\":\"getClaimValue\",\"url\":\"classes/recipe_session.default.html#getClaimValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":299,\"kind\":2048,\"name\":\"removeClaim\",\"url\":\"classes/recipe_session.default.html#removeClaim\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/session.default\"},{\"id\":300,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_session.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/session.default\"},{\"id\":301,\"kind\":2,\"name\":\"recipe/thirdparty\",\"url\":\"modules/recipe_thirdparty.html\",\"classes\":\"tsd-kind-module\"},{\"id\":302,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_thirdparty.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":303,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/recipe_thirdparty.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":304,\"kind\":64,\"name\":\"getProvider\",\"url\":\"modules/recipe_thirdparty.html#getProvider-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":305,\"kind\":64,\"name\":\"manuallyCreateOrUpdateUser\",\"url\":\"modules/recipe_thirdparty.html#manuallyCreateOrUpdateUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":306,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_thirdparty.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":307,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_thirdparty.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdparty.default\"},{\"id\":308,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_thirdparty.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/thirdparty.default\"},{\"id\":309,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/recipe_thirdparty.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdparty.default\"},{\"id\":310,\"kind\":2048,\"name\":\"getProvider\",\"url\":\"classes/recipe_thirdparty.default.html#getProvider\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdparty.default\"},{\"id\":311,\"kind\":2048,\"name\":\"manuallyCreateOrUpdateUser\",\"url\":\"classes/recipe_thirdparty.default.html#manuallyCreateOrUpdateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdparty.default\"},{\"id\":312,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_thirdparty.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/thirdparty.default\"},{\"id\":313,\"kind\":2,\"name\":\"recipe/thirdpartyemailpassword\",\"url\":\"modules/recipe_thirdpartyemailpassword.html\",\"classes\":\"tsd-kind-module\"},{\"id\":314,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":315,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":316,\"kind\":64,\"name\":\"emailPasswordSignUp\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#emailPasswordSignUp-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":317,\"kind\":64,\"name\":\"emailPasswordSignIn\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#emailPasswordSignIn-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":318,\"kind\":64,\"name\":\"thirdPartyGetProvider\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#thirdPartyGetProvider-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":319,\"kind\":64,\"name\":\"thirdPartyManuallyCreateOrUpdateUser\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#thirdPartyManuallyCreateOrUpdateUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":320,\"kind\":64,\"name\":\"createResetPasswordToken\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#createResetPasswordToken-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":321,\"kind\":64,\"name\":\"resetPasswordUsingToken\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#resetPasswordUsingToken\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":322,\"kind\":64,\"name\":\"consumePasswordResetToken\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#consumePasswordResetToken-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":323,\"kind\":64,\"name\":\"updateEmailOrPassword\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#updateEmailOrPassword-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":324,\"kind\":64,\"name\":\"createResetPasswordLink\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#createResetPasswordLink\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":325,\"kind\":64,\"name\":\"sendResetPasswordEmail\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#sendResetPasswordEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":326,\"kind\":64,\"name\":\"sendEmail\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#sendEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":327,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":328,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":329,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":330,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":331,\"kind\":2048,\"name\":\"thirdPartyGetProvider\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#thirdPartyGetProvider\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":332,\"kind\":2048,\"name\":\"thirdPartyManuallyCreateOrUpdateUser\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#thirdPartyManuallyCreateOrUpdateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":333,\"kind\":2048,\"name\":\"emailPasswordSignUp\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#emailPasswordSignUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":334,\"kind\":2048,\"name\":\"emailPasswordSignIn\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#emailPasswordSignIn\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":335,\"kind\":2048,\"name\":\"createResetPasswordToken\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#createResetPasswordToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":336,\"kind\":2048,\"name\":\"resetPasswordUsingToken\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#resetPasswordUsingToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":337,\"kind\":2048,\"name\":\"consumePasswordResetToken\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#consumePasswordResetToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":338,\"kind\":2048,\"name\":\"updateEmailOrPassword\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#updateEmailOrPassword\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":339,\"kind\":2048,\"name\":\"createResetPasswordLink\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#createResetPasswordLink\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":340,\"kind\":2048,\"name\":\"sendResetPasswordEmail\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#sendResetPasswordEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":341,\"kind\":2048,\"name\":\"sendEmail\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#sendEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":342,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_thirdpartyemailpassword.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/thirdpartyemailpassword.default\"},{\"id\":343,\"kind\":2,\"name\":\"recipe/thirdpartypasswordless\",\"url\":\"modules/recipe_thirdpartypasswordless.html\",\"classes\":\"tsd-kind-module\"},{\"id\":344,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_thirdpartypasswordless.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":345,\"kind\":32,\"name\":\"Error\",\"url\":\"modules/recipe_thirdpartypasswordless.html#Error\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":346,\"kind\":64,\"name\":\"thirdPartyGetProvider\",\"url\":\"modules/recipe_thirdpartypasswordless.html#thirdPartyGetProvider-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":347,\"kind\":64,\"name\":\"thirdPartyManuallyCreateOrUpdateUser\",\"url\":\"modules/recipe_thirdpartypasswordless.html#thirdPartyManuallyCreateOrUpdateUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":348,\"kind\":64,\"name\":\"passwordlessSignInUp\",\"url\":\"modules/recipe_thirdpartypasswordless.html#passwordlessSignInUp\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":349,\"kind\":64,\"name\":\"createCode\",\"url\":\"modules/recipe_thirdpartypasswordless.html#createCode-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":350,\"kind\":64,\"name\":\"consumeCode\",\"url\":\"modules/recipe_thirdpartypasswordless.html#consumeCode-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":351,\"kind\":64,\"name\":\"listCodesByDeviceId\",\"url\":\"modules/recipe_thirdpartypasswordless.html#listCodesByDeviceId-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":352,\"kind\":64,\"name\":\"listCodesByEmail\",\"url\":\"modules/recipe_thirdpartypasswordless.html#listCodesByEmail-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":353,\"kind\":64,\"name\":\"listCodesByPhoneNumber\",\"url\":\"modules/recipe_thirdpartypasswordless.html#listCodesByPhoneNumber-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":354,\"kind\":64,\"name\":\"listCodesByPreAuthSessionId\",\"url\":\"modules/recipe_thirdpartypasswordless.html#listCodesByPreAuthSessionId-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":355,\"kind\":64,\"name\":\"createNewCodeForDevice\",\"url\":\"modules/recipe_thirdpartypasswordless.html#createNewCodeForDevice-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":356,\"kind\":64,\"name\":\"updatePasswordlessUser\",\"url\":\"modules/recipe_thirdpartypasswordless.html#updatePasswordlessUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":357,\"kind\":64,\"name\":\"revokeAllCodes\",\"url\":\"modules/recipe_thirdpartypasswordless.html#revokeAllCodes-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":358,\"kind\":64,\"name\":\"revokeCode\",\"url\":\"modules/recipe_thirdpartypasswordless.html#revokeCode-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":359,\"kind\":64,\"name\":\"createMagicLink\",\"url\":\"modules/recipe_thirdpartypasswordless.html#createMagicLink\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":360,\"kind\":64,\"name\":\"sendEmail\",\"url\":\"modules/recipe_thirdpartypasswordless.html#sendEmail\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":361,\"kind\":64,\"name\":\"sendSms\",\"url\":\"modules/recipe_thirdpartypasswordless.html#sendSms\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":362,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":363,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":364,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":365,\"kind\":1024,\"name\":\"Error\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#Error\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":366,\"kind\":2048,\"name\":\"thirdPartyGetProvider\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#thirdPartyGetProvider\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":367,\"kind\":2048,\"name\":\"thirdPartyManuallyCreateOrUpdateUser\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#thirdPartyManuallyCreateOrUpdateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":368,\"kind\":2048,\"name\":\"createCode\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#createCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":369,\"kind\":2048,\"name\":\"createNewCodeForDevice\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#createNewCodeForDevice\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":370,\"kind\":2048,\"name\":\"consumeCode\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#consumeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":371,\"kind\":2048,\"name\":\"updatePasswordlessUser\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#updatePasswordlessUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":372,\"kind\":2048,\"name\":\"revokeAllCodes\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#revokeAllCodes\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":373,\"kind\":2048,\"name\":\"revokeCode\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#revokeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":374,\"kind\":2048,\"name\":\"listCodesByEmail\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#listCodesByEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":375,\"kind\":2048,\"name\":\"listCodesByPhoneNumber\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#listCodesByPhoneNumber\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":376,\"kind\":2048,\"name\":\"listCodesByDeviceId\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#listCodesByDeviceId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":377,\"kind\":2048,\"name\":\"listCodesByPreAuthSessionId\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#listCodesByPreAuthSessionId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":378,\"kind\":2048,\"name\":\"createMagicLink\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#createMagicLink\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":379,\"kind\":2048,\"name\":\"passwordlessSignInUp\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#passwordlessSignInUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":380,\"kind\":2048,\"name\":\"sendEmail\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#sendEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":381,\"kind\":2048,\"name\":\"sendSms\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#sendSms\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":382,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_thirdpartypasswordless.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/thirdpartypasswordless.default\"},{\"id\":383,\"kind\":2,\"name\":\"recipe/usermetadata\",\"url\":\"modules/recipe_usermetadata.html\",\"classes\":\"tsd-kind-module\"},{\"id\":384,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_usermetadata.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/usermetadata\"},{\"id\":385,\"kind\":64,\"name\":\"getUserMetadata\",\"url\":\"modules/recipe_usermetadata.html#getUserMetadata-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/usermetadata\"},{\"id\":386,\"kind\":64,\"name\":\"updateUserMetadata\",\"url\":\"modules/recipe_usermetadata.html#updateUserMetadata-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/usermetadata\"},{\"id\":387,\"kind\":64,\"name\":\"clearUserMetadata\",\"url\":\"modules/recipe_usermetadata.html#clearUserMetadata-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/usermetadata\"},{\"id\":388,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_usermetadata.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/usermetadata\"},{\"id\":389,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_usermetadata.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/usermetadata.default\"},{\"id\":390,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_usermetadata.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/usermetadata.default\"},{\"id\":391,\"kind\":2048,\"name\":\"getUserMetadata\",\"url\":\"classes/recipe_usermetadata.default.html#getUserMetadata\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/usermetadata.default\"},{\"id\":392,\"kind\":2048,\"name\":\"updateUserMetadata\",\"url\":\"classes/recipe_usermetadata.default.html#updateUserMetadata\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/usermetadata.default\"},{\"id\":393,\"kind\":2048,\"name\":\"clearUserMetadata\",\"url\":\"classes/recipe_usermetadata.default.html#clearUserMetadata\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/usermetadata.default\"},{\"id\":394,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_usermetadata.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/usermetadata.default\"},{\"id\":395,\"kind\":2,\"name\":\"recipe/userroles\",\"url\":\"modules/recipe_userroles.html\",\"classes\":\"tsd-kind-module\"},{\"id\":396,\"kind\":64,\"name\":\"init\",\"url\":\"modules/recipe_userroles.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":397,\"kind\":64,\"name\":\"addRoleToUser\",\"url\":\"modules/recipe_userroles.html#addRoleToUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":398,\"kind\":64,\"name\":\"removeUserRole\",\"url\":\"modules/recipe_userroles.html#removeUserRole-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":399,\"kind\":64,\"name\":\"getRolesForUser\",\"url\":\"modules/recipe_userroles.html#getRolesForUser-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":400,\"kind\":64,\"name\":\"getUsersThatHaveRole\",\"url\":\"modules/recipe_userroles.html#getUsersThatHaveRole-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":401,\"kind\":64,\"name\":\"createNewRoleOrAddPermissions\",\"url\":\"modules/recipe_userroles.html#createNewRoleOrAddPermissions-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":402,\"kind\":64,\"name\":\"getPermissionsForRole\",\"url\":\"modules/recipe_userroles.html#getPermissionsForRole-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":403,\"kind\":64,\"name\":\"removePermissionsFromRole\",\"url\":\"modules/recipe_userroles.html#removePermissionsFromRole-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":404,\"kind\":64,\"name\":\"getRolesThatHavePermission\",\"url\":\"modules/recipe_userroles.html#getRolesThatHavePermission-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":405,\"kind\":64,\"name\":\"deleteRole\",\"url\":\"modules/recipe_userroles.html#deleteRole-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":406,\"kind\":64,\"name\":\"getAllRoles\",\"url\":\"modules/recipe_userroles.html#getAllRoles-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":407,\"kind\":128,\"name\":\"default\",\"url\":\"classes/recipe_userroles.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":408,\"kind\":1024,\"name\":\"init\",\"url\":\"classes/recipe_userroles.default.html#init\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":409,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/recipe_userroles.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"recipe/userroles.default\"},{\"id\":410,\"kind\":1024,\"name\":\"PermissionClaim\",\"url\":\"classes/recipe_userroles.default.html#PermissionClaim\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":411,\"kind\":1024,\"name\":\"UserRoleClaim\",\"url\":\"classes/recipe_userroles.default.html#UserRoleClaim\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":412,\"kind\":2048,\"name\":\"addRoleToUser\",\"url\":\"classes/recipe_userroles.default.html#addRoleToUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":413,\"kind\":2048,\"name\":\"removeUserRole\",\"url\":\"classes/recipe_userroles.default.html#removeUserRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":414,\"kind\":2048,\"name\":\"getRolesForUser\",\"url\":\"classes/recipe_userroles.default.html#getRolesForUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":415,\"kind\":2048,\"name\":\"getUsersThatHaveRole\",\"url\":\"classes/recipe_userroles.default.html#getUsersThatHaveRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":416,\"kind\":2048,\"name\":\"createNewRoleOrAddPermissions\",\"url\":\"classes/recipe_userroles.default.html#createNewRoleOrAddPermissions\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":417,\"kind\":2048,\"name\":\"getPermissionsForRole\",\"url\":\"classes/recipe_userroles.default.html#getPermissionsForRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":418,\"kind\":2048,\"name\":\"removePermissionsFromRole\",\"url\":\"classes/recipe_userroles.default.html#removePermissionsFromRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":419,\"kind\":2048,\"name\":\"getRolesThatHavePermission\",\"url\":\"classes/recipe_userroles.default.html#getRolesThatHavePermission\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":420,\"kind\":2048,\"name\":\"deleteRole\",\"url\":\"classes/recipe_userroles.default.html#deleteRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":421,\"kind\":2048,\"name\":\"getAllRoles\",\"url\":\"classes/recipe_userroles.default.html#getAllRoles\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"recipe/userroles.default\"},{\"id\":422,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/recipe_userroles.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"recipe/userroles.default\"},{\"id\":423,\"kind\":128,\"name\":\"RecipeUserId\",\"url\":\"classes/index.RecipeUserId.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":424,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/index.RecipeUserId.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"index.RecipeUserId\"},{\"id\":425,\"kind\":1024,\"name\":\"recipeUserId\",\"url\":\"classes/index.RecipeUserId.html#recipeUserId\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"index.RecipeUserId\"},{\"id\":426,\"kind\":2048,\"name\":\"getAsString\",\"url\":\"classes/index.RecipeUserId.html#getAsString\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"index.RecipeUserId\"},{\"id\":427,\"kind\":128,\"name\":\"User\",\"url\":\"classes/index.User.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"index\"},{\"id\":428,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/index.User.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":429,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/index.User.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":430,\"kind\":1024,\"name\":\"isPrimaryUser\",\"url\":\"classes/index.User.html#isPrimaryUser\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":431,\"kind\":1024,\"name\":\"tenantIds\",\"url\":\"classes/index.User.html#tenantIds\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":432,\"kind\":1024,\"name\":\"emails\",\"url\":\"classes/index.User.html#emails\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":433,\"kind\":1024,\"name\":\"phoneNumbers\",\"url\":\"classes/index.User.html#phoneNumbers\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":434,\"kind\":1024,\"name\":\"thirdParty\",\"url\":\"classes/index.User.html#thirdParty\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":435,\"kind\":1024,\"name\":\"loginMethods\",\"url\":\"classes/index.User.html#loginMethods\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":436,\"kind\":1024,\"name\":\"timeJoined\",\"url\":\"classes/index.User.html#timeJoined\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":437,\"kind\":2048,\"name\":\"toJson\",\"url\":\"classes/index.User.html#toJson\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"index.User\"},{\"id\":438,\"kind\":128,\"name\":\"BaseRequest\",\"url\":\"classes/framework.BaseRequest.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":439,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/framework.BaseRequest.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":440,\"kind\":1024,\"name\":\"wrapperUsed\",\"url\":\"classes/framework.BaseRequest.html#wrapperUsed\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":441,\"kind\":1024,\"name\":\"original\",\"url\":\"classes/framework.BaseRequest.html#original\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":442,\"kind\":1024,\"name\":\"getKeyValueFromQuery\",\"url\":\"classes/framework.BaseRequest.html#getKeyValueFromQuery\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":443,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseRequest.html#__type-4\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":444,\"kind\":1024,\"name\":\"getJSONBody\",\"url\":\"classes/framework.BaseRequest.html#getJSONBody\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":445,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseRequest.html#__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":446,\"kind\":1024,\"name\":\"getMethod\",\"url\":\"classes/framework.BaseRequest.html#getMethod\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":447,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseRequest.html#__type-5\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":448,\"kind\":1024,\"name\":\"getCookieValue\",\"url\":\"classes/framework.BaseRequest.html#getCookieValue\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":449,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseRequest.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":450,\"kind\":1024,\"name\":\"getHeaderValue\",\"url\":\"classes/framework.BaseRequest.html#getHeaderValue\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":451,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseRequest.html#__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":452,\"kind\":1024,\"name\":\"getOriginalURL\",\"url\":\"classes/framework.BaseRequest.html#getOriginalURL\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":453,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseRequest.html#__type-6\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":454,\"kind\":1024,\"name\":\"getFormData\",\"url\":\"classes/framework.BaseRequest.html#getFormData\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":455,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseRequest.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseRequest\"},{\"id\":456,\"kind\":128,\"name\":\"BaseResponse\",\"url\":\"classes/framework.BaseResponse.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"framework\"},{\"id\":457,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/framework.BaseResponse.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":458,\"kind\":1024,\"name\":\"wrapperUsed\",\"url\":\"classes/framework.BaseResponse.html#wrapperUsed\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":459,\"kind\":1024,\"name\":\"original\",\"url\":\"classes/framework.BaseResponse.html#original\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":460,\"kind\":1024,\"name\":\"setHeader\",\"url\":\"classes/framework.BaseResponse.html#setHeader\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":461,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseResponse.html#__type-4\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":462,\"kind\":1024,\"name\":\"removeHeader\",\"url\":\"classes/framework.BaseResponse.html#removeHeader\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":463,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseResponse.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":464,\"kind\":1024,\"name\":\"setCookie\",\"url\":\"classes/framework.BaseResponse.html#setCookie\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":465,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseResponse.html#__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":466,\"kind\":1024,\"name\":\"setStatusCode\",\"url\":\"classes/framework.BaseResponse.html#setStatusCode\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":467,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseResponse.html#__type-5\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":468,\"kind\":1024,\"name\":\"sendJSONResponse\",\"url\":\"classes/framework.BaseResponse.html#sendJSONResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":469,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseResponse.html#__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":470,\"kind\":1024,\"name\":\"sendHTMLResponse\",\"url\":\"classes/framework.BaseResponse.html#sendHTMLResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":471,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/framework.BaseResponse.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"framework.BaseResponse\"},{\"id\":472,\"kind\":256,\"name\":\"SessionEvent\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"framework/awsLambda\"},{\"id\":473,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"framework/awsLambda.SessionEvent\"},{\"id\":474,\"kind\":1024,\"name\":\"supertokens\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html#supertokens\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"framework/awsLambda.SessionEvent\"},{\"id\":475,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"framework/awsLambda.SessionEvent\"},{\"id\":476,\"kind\":1024,\"name\":\"response\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html#__type.response\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEvent.__type\"},{\"id\":477,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html#__type.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEvent.__type\"},{\"id\":478,\"kind\":1024,\"name\":\"headers\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html#__type.__type-1.headers-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEvent.__type.__type\"},{\"id\":479,\"kind\":1024,\"name\":\"cookies\",\"url\":\"interfaces/framework_awsLambda.SessionEvent.html#__type.__type-1.cookies\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEvent.__type.__type\"},{\"id\":480,\"kind\":256,\"name\":\"SessionEventV2\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"framework/awsLambda\"},{\"id\":481,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"framework/awsLambda.SessionEventV2\"},{\"id\":482,\"kind\":1024,\"name\":\"supertokens\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#supertokens\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"framework/awsLambda.SessionEventV2\"},{\"id\":483,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type-5\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"framework/awsLambda.SessionEventV2\"},{\"id\":484,\"kind\":1024,\"name\":\"response\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type-5.response\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type\"},{\"id\":485,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type-5.__type-6\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type\"},{\"id\":486,\"kind\":1024,\"name\":\"headers\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type-5.__type-6.headers-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type.__type\"},{\"id\":487,\"kind\":1024,\"name\":\"cookies\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type-5.__type-6.cookies-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type.__type\"},{\"id\":488,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"framework/awsLambda.SessionEventV2\"},{\"id\":489,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type\"},{\"id\":490,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type.__type-1.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type.__type\"},{\"id\":491,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type.__type-1.__type-2.__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type.__type.__type\"},{\"id\":492,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_awsLambda.SessionEventV2.html#__type.__type-4\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"framework/awsLambda.SessionEventV2.__type\"},{\"id\":493,\"kind\":128,\"name\":\"PreParsedRequest\",\"url\":\"classes/framework_custom.PreParsedRequest.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"framework/custom\"},{\"id\":494,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/framework_custom.PreParsedRequest.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.PreParsedRequest\"},{\"id\":495,\"kind\":1024,\"name\":\"request\",\"url\":\"classes/framework_custom.PreParsedRequest.html#request\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"framework/custom.PreParsedRequest\"},{\"id\":496,\"kind\":1024,\"name\":\"_session\",\"url\":\"classes/framework_custom.PreParsedRequest.html#_session\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"framework/custom.PreParsedRequest\"},{\"id\":497,\"kind\":262144,\"name\":\"session\",\"url\":\"classes/framework_custom.PreParsedRequest.html#session\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"framework/custom.PreParsedRequest\"},{\"id\":498,\"kind\":2048,\"name\":\"getFormData\",\"url\":\"classes/framework_custom.PreParsedRequest.html#getFormData\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.PreParsedRequest\"},{\"id\":499,\"kind\":2048,\"name\":\"getKeyValueFromQuery\",\"url\":\"classes/framework_custom.PreParsedRequest.html#getKeyValueFromQuery\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.PreParsedRequest\"},{\"id\":500,\"kind\":2048,\"name\":\"getJSONBody\",\"url\":\"classes/framework_custom.PreParsedRequest.html#getJSONBody\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.PreParsedRequest\"},{\"id\":501,\"kind\":2048,\"name\":\"getMethod\",\"url\":\"classes/framework_custom.PreParsedRequest.html#getMethod\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.PreParsedRequest\"},{\"id\":502,\"kind\":2048,\"name\":\"getCookieValue\",\"url\":\"classes/framework_custom.PreParsedRequest.html#getCookieValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.PreParsedRequest\"},{\"id\":503,\"kind\":2048,\"name\":\"getHeaderValue\",\"url\":\"classes/framework_custom.PreParsedRequest.html#getHeaderValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.PreParsedRequest\"},{\"id\":504,\"kind\":2048,\"name\":\"getOriginalURL\",\"url\":\"classes/framework_custom.PreParsedRequest.html#getOriginalURL\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.PreParsedRequest\"},{\"id\":505,\"kind\":1024,\"name\":\"wrapperUsed\",\"url\":\"classes/framework_custom.PreParsedRequest.html#wrapperUsed\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"framework/custom.PreParsedRequest\"},{\"id\":506,\"kind\":1024,\"name\":\"original\",\"url\":\"classes/framework_custom.PreParsedRequest.html#original\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"framework/custom.PreParsedRequest\"},{\"id\":507,\"kind\":128,\"name\":\"CollectingResponse\",\"url\":\"classes/framework_custom.CollectingResponse.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"framework/custom\"},{\"id\":508,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/framework_custom.CollectingResponse.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.CollectingResponse\"},{\"id\":509,\"kind\":1024,\"name\":\"statusCode\",\"url\":\"classes/framework_custom.CollectingResponse.html#statusCode\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework/custom.CollectingResponse\"},{\"id\":510,\"kind\":1024,\"name\":\"headers\",\"url\":\"classes/framework_custom.CollectingResponse.html#headers\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework/custom.CollectingResponse\"},{\"id\":511,\"kind\":1024,\"name\":\"cookies\",\"url\":\"classes/framework_custom.CollectingResponse.html#cookies\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework/custom.CollectingResponse\"},{\"id\":512,\"kind\":1024,\"name\":\"body\",\"url\":\"classes/framework_custom.CollectingResponse.html#body\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"framework/custom.CollectingResponse\"},{\"id\":513,\"kind\":2048,\"name\":\"sendHTMLResponse\",\"url\":\"classes/framework_custom.CollectingResponse.html#sendHTMLResponse\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.CollectingResponse\"},{\"id\":514,\"kind\":2048,\"name\":\"setHeader\",\"url\":\"classes/framework_custom.CollectingResponse.html#setHeader\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.CollectingResponse\"},{\"id\":515,\"kind\":2048,\"name\":\"removeHeader\",\"url\":\"classes/framework_custom.CollectingResponse.html#removeHeader\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.CollectingResponse\"},{\"id\":516,\"kind\":2048,\"name\":\"setCookie\",\"url\":\"classes/framework_custom.CollectingResponse.html#setCookie\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.CollectingResponse\"},{\"id\":517,\"kind\":2048,\"name\":\"setStatusCode\",\"url\":\"classes/framework_custom.CollectingResponse.html#setStatusCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.CollectingResponse\"},{\"id\":518,\"kind\":2048,\"name\":\"sendJSONResponse\",\"url\":\"classes/framework_custom.CollectingResponse.html#sendJSONResponse\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"framework/custom.CollectingResponse\"},{\"id\":519,\"kind\":1024,\"name\":\"wrapperUsed\",\"url\":\"classes/framework_custom.CollectingResponse.html#wrapperUsed\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"framework/custom.CollectingResponse\"},{\"id\":520,\"kind\":1024,\"name\":\"original\",\"url\":\"classes/framework_custom.CollectingResponse.html#original\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"framework/custom.CollectingResponse\"},{\"id\":521,\"kind\":256,\"name\":\"SessionRequest\",\"url\":\"interfaces/framework_express.SessionRequest.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"framework/express\"},{\"id\":522,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/framework_express.SessionRequest.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"framework/express.SessionRequest\"},{\"id\":523,\"kind\":256,\"name\":\"SessionRequest\",\"url\":\"interfaces/framework_fastify.SessionRequest.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"framework/fastify\"},{\"id\":524,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/framework_fastify.SessionRequest.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"framework/fastify.SessionRequest\"},{\"id\":525,\"kind\":256,\"name\":\"SessionRequest\",\"url\":\"interfaces/framework_hapi.SessionRequest.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"framework/hapi\"},{\"id\":526,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/framework_hapi.SessionRequest.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"framework/hapi.SessionRequest\"},{\"id\":527,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/framework_hapi.SessionRequest.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"framework/hapi.SessionRequest\"},{\"id\":528,\"kind\":256,\"name\":\"SessionContext\",\"url\":\"interfaces/framework_koa.SessionContext.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"framework/koa\"},{\"id\":529,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/framework_koa.SessionContext.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"framework/koa.SessionContext\"},{\"id\":530,\"kind\":256,\"name\":\"SessionContext\",\"url\":\"interfaces/framework_loopback.SessionContext.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"framework/loopback\"},{\"id\":531,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/framework_loopback.SessionContext.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"framework/loopback.SessionContext\"},{\"id\":532,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/accountlinking\"},{\"id\":533,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/accountlinking.RecipeInterface\"},{\"id\":534,\"kind\":2048,\"name\":\"getUsers\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.getUsers\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":535,\"kind\":2048,\"name\":\"canCreatePrimaryUser\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.canCreatePrimaryUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":536,\"kind\":2048,\"name\":\"createPrimaryUser\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.createPrimaryUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":537,\"kind\":2048,\"name\":\"canLinkAccounts\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.canLinkAccounts\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":538,\"kind\":2048,\"name\":\"linkAccounts\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.linkAccounts\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":539,\"kind\":2048,\"name\":\"unlinkAccount\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.unlinkAccount\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":540,\"kind\":2048,\"name\":\"getUser\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.getUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":541,\"kind\":2048,\"name\":\"listUsersByAccountInfo\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.listUsersByAccountInfo\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":542,\"kind\":2048,\"name\":\"deleteUser\",\"url\":\"modules/recipe_accountlinking.html#RecipeInterface.__type.deleteUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/accountlinking.RecipeInterface.__type\"},{\"id\":543,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_dashboard.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/dashboard\"},{\"id\":544,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_dashboard.html#RecipeInterface.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/dashboard.RecipeInterface\"},{\"id\":545,\"kind\":2048,\"name\":\"getDashboardBundleLocation\",\"url\":\"modules/recipe_dashboard.html#RecipeInterface.__type-2.getDashboardBundleLocation\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.RecipeInterface.__type\"},{\"id\":546,\"kind\":2048,\"name\":\"shouldAllowAccess\",\"url\":\"modules/recipe_dashboard.html#RecipeInterface.__type-2.shouldAllowAccess\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.RecipeInterface.__type\"},{\"id\":547,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_dashboard.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/dashboard\"},{\"id\":548,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/dashboard.APIOptions\"},{\"id\":549,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIOptions.__type\"},{\"id\":550,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIOptions.__type\"},{\"id\":551,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIOptions.__type\"},{\"id\":552,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIOptions.__type\"},{\"id\":553,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIOptions.__type\"},{\"id\":554,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIOptions.__type\"},{\"id\":555,\"kind\":1024,\"name\":\"appInfo\",\"url\":\"modules/recipe_dashboard.html#APIOptions.__type-1.appInfo\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIOptions.__type\"},{\"id\":556,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_dashboard.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/dashboard\"},{\"id\":557,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_dashboard.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/dashboard.APIInterface\"},{\"id\":558,\"kind\":1024,\"name\":\"dashboardGET\",\"url\":\"modules/recipe_dashboard.html#APIInterface.__type.dashboardGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/dashboard.APIInterface.__type\"},{\"id\":559,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":560,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/emailpassword.RecipeInterface\"},{\"id\":561,\"kind\":2048,\"name\":\"signUp\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface.__type-2.signUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.RecipeInterface.__type\"},{\"id\":562,\"kind\":2048,\"name\":\"createNewRecipeUser\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface.__type-2.createNewRecipeUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.RecipeInterface.__type\"},{\"id\":563,\"kind\":2048,\"name\":\"signIn\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface.__type-2.signIn\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.RecipeInterface.__type\"},{\"id\":564,\"kind\":2048,\"name\":\"createResetPasswordToken\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface.__type-2.createResetPasswordToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.RecipeInterface.__type\"},{\"id\":565,\"kind\":2048,\"name\":\"consumePasswordResetToken\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface.__type-2.consumePasswordResetToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.RecipeInterface.__type\"},{\"id\":566,\"kind\":2048,\"name\":\"updateEmailOrPassword\",\"url\":\"modules/recipe_emailpassword.html#RecipeInterface.__type-2.updateEmailOrPassword\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.RecipeInterface.__type\"},{\"id\":567,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_emailpassword.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":568,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/emailpassword.APIOptions\"},{\"id\":569,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":570,\"kind\":1024,\"name\":\"appInfo\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.appInfo\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":571,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":572,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":573,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":574,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":575,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":576,\"kind\":1024,\"name\":\"emailDelivery\",\"url\":\"modules/recipe_emailpassword.html#APIOptions.__type-1.emailDelivery\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIOptions.__type\"},{\"id\":577,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_emailpassword.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/emailpassword\"},{\"id\":578,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_emailpassword.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/emailpassword.APIInterface\"},{\"id\":579,\"kind\":1024,\"name\":\"emailExistsGET\",\"url\":\"modules/recipe_emailpassword.html#APIInterface.__type.emailExistsGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIInterface.__type\"},{\"id\":580,\"kind\":1024,\"name\":\"generatePasswordResetTokenPOST\",\"url\":\"modules/recipe_emailpassword.html#APIInterface.__type.generatePasswordResetTokenPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIInterface.__type\"},{\"id\":581,\"kind\":1024,\"name\":\"passwordResetPOST\",\"url\":\"modules/recipe_emailpassword.html#APIInterface.__type.passwordResetPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIInterface.__type\"},{\"id\":582,\"kind\":1024,\"name\":\"signInPOST\",\"url\":\"modules/recipe_emailpassword.html#APIInterface.__type.signInPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIInterface.__type\"},{\"id\":583,\"kind\":1024,\"name\":\"signUpPOST\",\"url\":\"modules/recipe_emailpassword.html#APIInterface.__type.signUpPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailpassword.APIInterface.__type\"},{\"id\":584,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_emailverification.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":585,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_emailverification.html#RecipeInterface.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/emailverification.RecipeInterface\"},{\"id\":586,\"kind\":2048,\"name\":\"createEmailVerificationToken\",\"url\":\"modules/recipe_emailverification.html#RecipeInterface.__type-2.createEmailVerificationToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.RecipeInterface.__type\"},{\"id\":587,\"kind\":2048,\"name\":\"verifyEmailUsingToken\",\"url\":\"modules/recipe_emailverification.html#RecipeInterface.__type-2.verifyEmailUsingToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.RecipeInterface.__type\"},{\"id\":588,\"kind\":2048,\"name\":\"isEmailVerified\",\"url\":\"modules/recipe_emailverification.html#RecipeInterface.__type-2.isEmailVerified\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.RecipeInterface.__type\"},{\"id\":589,\"kind\":2048,\"name\":\"revokeEmailVerificationTokens\",\"url\":\"modules/recipe_emailverification.html#RecipeInterface.__type-2.revokeEmailVerificationTokens\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.RecipeInterface.__type\"},{\"id\":590,\"kind\":2048,\"name\":\"unverifyEmail\",\"url\":\"modules/recipe_emailverification.html#RecipeInterface.__type-2.unverifyEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.RecipeInterface.__type\"},{\"id\":591,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_emailverification.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":592,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/emailverification.APIOptions\"},{\"id\":593,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":594,\"kind\":1024,\"name\":\"appInfo\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.appInfo\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":595,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":596,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":597,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":598,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":599,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":600,\"kind\":1024,\"name\":\"emailDelivery\",\"url\":\"modules/recipe_emailverification.html#APIOptions.__type-1.emailDelivery\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIOptions.__type\"},{\"id\":601,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_emailverification.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":602,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_emailverification.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/emailverification.APIInterface\"},{\"id\":603,\"kind\":1024,\"name\":\"verifyEmailPOST\",\"url\":\"modules/recipe_emailverification.html#APIInterface.__type.verifyEmailPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIInterface.__type\"},{\"id\":604,\"kind\":1024,\"name\":\"isEmailVerifiedGET\",\"url\":\"modules/recipe_emailverification.html#APIInterface.__type.isEmailVerifiedGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIInterface.__type\"},{\"id\":605,\"kind\":1024,\"name\":\"generateEmailVerifyTokenPOST\",\"url\":\"modules/recipe_emailverification.html#APIInterface.__type.generateEmailVerifyTokenPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.APIInterface.__type\"},{\"id\":606,\"kind\":4194304,\"name\":\"UserEmailInfo\",\"url\":\"modules/recipe_emailverification.html#UserEmailInfo\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":607,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_emailverification.html#UserEmailInfo.__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/emailverification.UserEmailInfo\"},{\"id\":608,\"kind\":1024,\"name\":\"recipeUserId\",\"url\":\"modules/recipe_emailverification.html#UserEmailInfo.__type-3.recipeUserId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.UserEmailInfo.__type\"},{\"id\":609,\"kind\":1024,\"name\":\"email\",\"url\":\"modules/recipe_emailverification.html#UserEmailInfo.__type-3.email\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/emailverification.UserEmailInfo.__type\"},{\"id\":610,\"kind\":32,\"name\":\"EmailVerificationClaim\",\"url\":\"modules/recipe_emailverification.html#EmailVerificationClaim\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/emailverification\"},{\"id\":611,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_jwt.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":612,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_jwt.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/jwt.APIInterface\"},{\"id\":613,\"kind\":1024,\"name\":\"getJWKSGET\",\"url\":\"modules/recipe_jwt.html#APIInterface.__type.getJWKSGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.APIInterface.__type\"},{\"id\":614,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_jwt.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":615,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_jwt.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/jwt.APIOptions\"},{\"id\":616,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_jwt.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.APIOptions.__type\"},{\"id\":617,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_jwt.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.APIOptions.__type\"},{\"id\":618,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_jwt.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.APIOptions.__type\"},{\"id\":619,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_jwt.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.APIOptions.__type\"},{\"id\":620,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_jwt.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.APIOptions.__type\"},{\"id\":621,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_jwt.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.APIOptions.__type\"},{\"id\":622,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_jwt.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":623,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_jwt.html#RecipeInterface.__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/jwt.RecipeInterface\"},{\"id\":624,\"kind\":2048,\"name\":\"createJWT\",\"url\":\"modules/recipe_jwt.html#RecipeInterface.__type-3.createJWT\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.RecipeInterface.__type\"},{\"id\":625,\"kind\":2048,\"name\":\"getJWKS\",\"url\":\"modules/recipe_jwt.html#RecipeInterface.__type-3.getJWKS\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.RecipeInterface.__type\"},{\"id\":626,\"kind\":4194304,\"name\":\"JsonWebKey\",\"url\":\"modules/recipe_jwt.html#JsonWebKey\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/jwt\"},{\"id\":627,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_jwt.html#JsonWebKey.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/jwt.JsonWebKey\"},{\"id\":628,\"kind\":1024,\"name\":\"kty\",\"url\":\"modules/recipe_jwt.html#JsonWebKey.__type-2.kty\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.JsonWebKey.__type\"},{\"id\":629,\"kind\":1024,\"name\":\"kid\",\"url\":\"modules/recipe_jwt.html#JsonWebKey.__type-2.kid\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.JsonWebKey.__type\"},{\"id\":630,\"kind\":1024,\"name\":\"n\",\"url\":\"modules/recipe_jwt.html#JsonWebKey.__type-2.n\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.JsonWebKey.__type\"},{\"id\":631,\"kind\":1024,\"name\":\"e\",\"url\":\"modules/recipe_jwt.html#JsonWebKey.__type-2.e\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.JsonWebKey.__type\"},{\"id\":632,\"kind\":1024,\"name\":\"alg\",\"url\":\"modules/recipe_jwt.html#JsonWebKey.__type-2.alg\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.JsonWebKey.__type\"},{\"id\":633,\"kind\":1024,\"name\":\"use\",\"url\":\"modules/recipe_jwt.html#JsonWebKey.__type-2.use\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/jwt.JsonWebKey.__type\"},{\"id\":634,\"kind\":32,\"name\":\"AllowedDomainsClaim\",\"url\":\"modules/recipe_multitenancy.html#AllowedDomainsClaim\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":635,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":636,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/multitenancy.RecipeInterface\"},{\"id\":637,\"kind\":2048,\"name\":\"getTenantId\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.getTenantId\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":638,\"kind\":2048,\"name\":\"createOrUpdateTenant\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.createOrUpdateTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":639,\"kind\":2048,\"name\":\"deleteTenant\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.deleteTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":640,\"kind\":2048,\"name\":\"getTenant\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.getTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":641,\"kind\":2048,\"name\":\"listAllTenants\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.listAllTenants\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":642,\"kind\":2048,\"name\":\"createOrUpdateThirdPartyConfig\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.createOrUpdateThirdPartyConfig\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":643,\"kind\":2048,\"name\":\"deleteThirdPartyConfig\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.deleteThirdPartyConfig\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":644,\"kind\":2048,\"name\":\"associateUserToTenant\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.associateUserToTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":645,\"kind\":2048,\"name\":\"disassociateUserFromTenant\",\"url\":\"modules/recipe_multitenancy.html#RecipeInterface.__type-2.disassociateUserFromTenant\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.RecipeInterface.__type\"},{\"id\":646,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_multitenancy.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":647,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/multitenancy.APIOptions\"},{\"id\":648,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIOptions.__type\"},{\"id\":649,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIOptions.__type\"},{\"id\":650,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIOptions.__type\"},{\"id\":651,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIOptions.__type\"},{\"id\":652,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIOptions.__type\"},{\"id\":653,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIOptions.__type\"},{\"id\":654,\"kind\":1024,\"name\":\"staticThirdPartyProviders\",\"url\":\"modules/recipe_multitenancy.html#APIOptions.__type-1.staticThirdPartyProviders\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIOptions.__type\"},{\"id\":655,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_multitenancy.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/multitenancy\"},{\"id\":656,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_multitenancy.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/multitenancy.APIInterface\"},{\"id\":657,\"kind\":2048,\"name\":\"loginMethodsGET\",\"url\":\"modules/recipe_multitenancy.html#APIInterface.__type.loginMethodsGET\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/multitenancy.APIInterface.__type\"},{\"id\":658,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":659,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/passwordless.RecipeInterface\"},{\"id\":660,\"kind\":2048,\"name\":\"createCode\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.createCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":661,\"kind\":2048,\"name\":\"createNewCodeForDevice\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.createNewCodeForDevice\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":662,\"kind\":2048,\"name\":\"consumeCode\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.consumeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":663,\"kind\":2048,\"name\":\"updateUser\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.updateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":664,\"kind\":2048,\"name\":\"revokeAllCodes\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.revokeAllCodes\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":665,\"kind\":2048,\"name\":\"revokeCode\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.revokeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":666,\"kind\":2048,\"name\":\"listCodesByEmail\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.listCodesByEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":667,\"kind\":2048,\"name\":\"listCodesByPhoneNumber\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.listCodesByPhoneNumber\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":668,\"kind\":2048,\"name\":\"listCodesByDeviceId\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.listCodesByDeviceId\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":669,\"kind\":2048,\"name\":\"listCodesByPreAuthSessionId\",\"url\":\"modules/recipe_passwordless.html#RecipeInterface.__type-2.listCodesByPreAuthSessionId\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.RecipeInterface.__type\"},{\"id\":670,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_passwordless.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":671,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/passwordless.APIOptions\"},{\"id\":672,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":673,\"kind\":1024,\"name\":\"appInfo\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.appInfo\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":674,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":675,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":676,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":677,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":678,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":679,\"kind\":1024,\"name\":\"emailDelivery\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.emailDelivery\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":680,\"kind\":1024,\"name\":\"smsDelivery\",\"url\":\"modules/recipe_passwordless.html#APIOptions.__type-1.smsDelivery\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIOptions.__type\"},{\"id\":681,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_passwordless.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/passwordless\"},{\"id\":682,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_passwordless.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/passwordless.APIInterface\"},{\"id\":683,\"kind\":2048,\"name\":\"createCodePOST\",\"url\":\"modules/recipe_passwordless.html#APIInterface.__type.createCodePOST\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIInterface.__type\"},{\"id\":684,\"kind\":2048,\"name\":\"resendCodePOST\",\"url\":\"modules/recipe_passwordless.html#APIInterface.__type.resendCodePOST\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIInterface.__type\"},{\"id\":685,\"kind\":2048,\"name\":\"consumeCodePOST\",\"url\":\"modules/recipe_passwordless.html#APIInterface.__type.consumeCodePOST\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIInterface.__type\"},{\"id\":686,\"kind\":2048,\"name\":\"emailExistsGET\",\"url\":\"modules/recipe_passwordless.html#APIInterface.__type.emailExistsGET\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIInterface.__type\"},{\"id\":687,\"kind\":2048,\"name\":\"phoneNumberExistsGET\",\"url\":\"modules/recipe_passwordless.html#APIInterface.__type.phoneNumberExistsGET\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/passwordless.APIInterface.__type\"},{\"id\":688,\"kind\":256,\"name\":\"VerifySessionOptions\",\"url\":\"interfaces/recipe_session.VerifySessionOptions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":689,\"kind\":1024,\"name\":\"antiCsrfCheck\",\"url\":\"interfaces/recipe_session.VerifySessionOptions.html#antiCsrfCheck\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"recipe/session.VerifySessionOptions\"},{\"id\":690,\"kind\":1024,\"name\":\"sessionRequired\",\"url\":\"interfaces/recipe_session.VerifySessionOptions.html#sessionRequired\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"recipe/session.VerifySessionOptions\"},{\"id\":691,\"kind\":1024,\"name\":\"checkDatabase\",\"url\":\"interfaces/recipe_session.VerifySessionOptions.html#checkDatabase\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"recipe/session.VerifySessionOptions\"},{\"id\":692,\"kind\":2048,\"name\":\"overrideGlobalClaimValidators\",\"url\":\"interfaces/recipe_session.VerifySessionOptions.html#overrideGlobalClaimValidators\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.VerifySessionOptions\"},{\"id\":693,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_session.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":694,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/session.RecipeInterface\"},{\"id\":695,\"kind\":2048,\"name\":\"createNewSession\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.createNewSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":696,\"kind\":2048,\"name\":\"getGlobalClaimValidators\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.getGlobalClaimValidators\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":697,\"kind\":2048,\"name\":\"getSession\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.getSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":698,\"kind\":2048,\"name\":\"refreshSession\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.refreshSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":699,\"kind\":2048,\"name\":\"getSessionInformation\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.getSessionInformation\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":700,\"kind\":2048,\"name\":\"revokeAllSessionsForUser\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.revokeAllSessionsForUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":701,\"kind\":2048,\"name\":\"getAllSessionHandlesForUser\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.getAllSessionHandlesForUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":702,\"kind\":2048,\"name\":\"revokeSession\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.revokeSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":703,\"kind\":2048,\"name\":\"revokeMultipleSessions\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.revokeMultipleSessions\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":704,\"kind\":2048,\"name\":\"updateSessionDataInDatabase\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.updateSessionDataInDatabase\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":705,\"kind\":2048,\"name\":\"mergeIntoAccessTokenPayload\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.mergeIntoAccessTokenPayload\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":706,\"kind\":2048,\"name\":\"regenerateAccessToken\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.regenerateAccessToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":707,\"kind\":2048,\"name\":\"validateClaims\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.validateClaims\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":708,\"kind\":2048,\"name\":\"fetchAndSetClaim\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.fetchAndSetClaim\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":709,\"kind\":2048,\"name\":\"setClaimValue\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.setClaimValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal tsd-has-type-parameter\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":710,\"kind\":2048,\"name\":\"getClaimValue\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.getClaimValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal tsd-has-type-parameter\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":711,\"kind\":2048,\"name\":\"removeClaim\",\"url\":\"modules/recipe_session.html#RecipeInterface.__type-2.removeClaim\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.RecipeInterface.__type\"},{\"id\":712,\"kind\":256,\"name\":\"SessionContainer\",\"url\":\"interfaces/recipe_session.SessionContainer.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":713,\"kind\":2048,\"name\":\"revokeSession\",\"url\":\"interfaces/recipe_session.SessionContainer.html#revokeSession\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":714,\"kind\":2048,\"name\":\"getSessionDataFromDatabase\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getSessionDataFromDatabase\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":715,\"kind\":2048,\"name\":\"updateSessionDataInDatabase\",\"url\":\"interfaces/recipe_session.SessionContainer.html#updateSessionDataInDatabase\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":716,\"kind\":2048,\"name\":\"getUserId\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getUserId\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":717,\"kind\":2048,\"name\":\"getRecipeUserId\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getRecipeUserId\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":718,\"kind\":2048,\"name\":\"getTenantId\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getTenantId\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":719,\"kind\":2048,\"name\":\"getAccessTokenPayload\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getAccessTokenPayload\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":720,\"kind\":2048,\"name\":\"getHandle\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getHandle\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":721,\"kind\":2048,\"name\":\"getAllSessionTokensDangerously\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getAllSessionTokensDangerously\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":722,\"kind\":2048,\"name\":\"getAccessToken\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getAccessToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":723,\"kind\":2048,\"name\":\"mergeIntoAccessTokenPayload\",\"url\":\"interfaces/recipe_session.SessionContainer.html#mergeIntoAccessTokenPayload\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":724,\"kind\":2048,\"name\":\"getTimeCreated\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getTimeCreated\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":725,\"kind\":2048,\"name\":\"getExpiry\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getExpiry\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":726,\"kind\":2048,\"name\":\"assertClaims\",\"url\":\"interfaces/recipe_session.SessionContainer.html#assertClaims\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":727,\"kind\":2048,\"name\":\"fetchAndSetClaim\",\"url\":\"interfaces/recipe_session.SessionContainer.html#fetchAndSetClaim\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface tsd-has-type-parameter\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":728,\"kind\":2048,\"name\":\"setClaimValue\",\"url\":\"interfaces/recipe_session.SessionContainer.html#setClaimValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface tsd-has-type-parameter\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":729,\"kind\":2048,\"name\":\"getClaimValue\",\"url\":\"interfaces/recipe_session.SessionContainer.html#getClaimValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface tsd-has-type-parameter\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":730,\"kind\":2048,\"name\":\"removeClaim\",\"url\":\"interfaces/recipe_session.SessionContainer.html#removeClaim\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":731,\"kind\":2048,\"name\":\"attachToRequestResponse\",\"url\":\"interfaces/recipe_session.SessionContainer.html#attachToRequestResponse\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"recipe/session.SessionContainer\"},{\"id\":732,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_session.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":733,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_session.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/session.APIInterface\"},{\"id\":734,\"kind\":1024,\"name\":\"refreshPOST\",\"url\":\"modules/recipe_session.html#APIInterface.__type.refreshPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIInterface.__type\"},{\"id\":735,\"kind\":1024,\"name\":\"signOutPOST\",\"url\":\"modules/recipe_session.html#APIInterface.__type.signOutPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIInterface.__type\"},{\"id\":736,\"kind\":2048,\"name\":\"verifySession\",\"url\":\"modules/recipe_session.html#APIInterface.__type.verifySession\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIInterface.__type\"},{\"id\":737,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_session.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":738,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_session.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/session.APIOptions\"},{\"id\":739,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_session.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIOptions.__type\"},{\"id\":740,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_session.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIOptions.__type\"},{\"id\":741,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_session.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIOptions.__type\"},{\"id\":742,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_session.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIOptions.__type\"},{\"id\":743,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_session.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIOptions.__type\"},{\"id\":744,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_session.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.APIOptions.__type\"},{\"id\":745,\"kind\":4194304,\"name\":\"SessionInformation\",\"url\":\"modules/recipe_session.html#SessionInformation\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":746,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/session.SessionInformation\"},{\"id\":747,\"kind\":1024,\"name\":\"sessionHandle\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.sessionHandle\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":748,\"kind\":1024,\"name\":\"userId\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.userId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":749,\"kind\":1024,\"name\":\"recipeUserId\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.recipeUserId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":750,\"kind\":1024,\"name\":\"sessionDataInDatabase\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.sessionDataInDatabase\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":751,\"kind\":1024,\"name\":\"expiry\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.expiry\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":752,\"kind\":1024,\"name\":\"customClaimsInAccessTokenPayload\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.customClaimsInAccessTokenPayload\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":753,\"kind\":1024,\"name\":\"timeCreated\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.timeCreated\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":754,\"kind\":1024,\"name\":\"tenantId\",\"url\":\"modules/recipe_session.html#SessionInformation.__type-3.tenantId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/session.SessionInformation.__type\"},{\"id\":755,\"kind\":4194304,\"name\":\"SessionClaimValidator\",\"url\":\"modules/recipe_session.html#SessionClaimValidator\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/session\"},{\"id\":756,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_thirdparty.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":757,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdparty.html#RecipeInterface.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdparty.RecipeInterface\"},{\"id\":758,\"kind\":2048,\"name\":\"getProvider\",\"url\":\"modules/recipe_thirdparty.html#RecipeInterface.__type-2.getProvider\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.RecipeInterface.__type\"},{\"id\":759,\"kind\":2048,\"name\":\"signInUp\",\"url\":\"modules/recipe_thirdparty.html#RecipeInterface.__type-2.signInUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.RecipeInterface.__type\"},{\"id\":760,\"kind\":2048,\"name\":\"manuallyCreateOrUpdateUser\",\"url\":\"modules/recipe_thirdparty.html#RecipeInterface.__type-2.manuallyCreateOrUpdateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.RecipeInterface.__type\"},{\"id\":761,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_thirdparty.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":762,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdparty.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdparty.APIInterface\"},{\"id\":763,\"kind\":1024,\"name\":\"authorisationUrlGET\",\"url\":\"modules/recipe_thirdparty.html#APIInterface.__type.authorisationUrlGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIInterface.__type\"},{\"id\":764,\"kind\":1024,\"name\":\"signInUpPOST\",\"url\":\"modules/recipe_thirdparty.html#APIInterface.__type.signInUpPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIInterface.__type\"},{\"id\":765,\"kind\":1024,\"name\":\"appleRedirectHandlerPOST\",\"url\":\"modules/recipe_thirdparty.html#APIInterface.__type.appleRedirectHandlerPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIInterface.__type\"},{\"id\":766,\"kind\":4194304,\"name\":\"APIOptions\",\"url\":\"modules/recipe_thirdparty.html#APIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":767,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdparty.APIOptions\"},{\"id\":768,\"kind\":1024,\"name\":\"recipeImplementation\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.recipeImplementation\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":769,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.config\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":770,\"kind\":1024,\"name\":\"recipeId\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.recipeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":771,\"kind\":1024,\"name\":\"isInServerlessEnv\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.isInServerlessEnv\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":772,\"kind\":1024,\"name\":\"providers\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.providers\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":773,\"kind\":1024,\"name\":\"req\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.req\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":774,\"kind\":1024,\"name\":\"res\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.res\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":775,\"kind\":1024,\"name\":\"appInfo\",\"url\":\"modules/recipe_thirdparty.html#APIOptions.__type-1.appInfo\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.APIOptions.__type\"},{\"id\":776,\"kind\":4194304,\"name\":\"TypeProvider\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdparty\"},{\"id\":777,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider.__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdparty.TypeProvider\"},{\"id\":778,\"kind\":1024,\"name\":\"id\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider.__type-3.id\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.TypeProvider.__type\"},{\"id\":779,\"kind\":1024,\"name\":\"config\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider.__type-3.config-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.TypeProvider.__type\"},{\"id\":780,\"kind\":2048,\"name\":\"getConfigForClientType\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider.__type-3.getConfigForClientType\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.TypeProvider.__type\"},{\"id\":781,\"kind\":2048,\"name\":\"getAuthorisationRedirectURL\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider.__type-3.getAuthorisationRedirectURL\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.TypeProvider.__type\"},{\"id\":782,\"kind\":2048,\"name\":\"exchangeAuthCodeForOAuthTokens\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider.__type-3.exchangeAuthCodeForOAuthTokens\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.TypeProvider.__type\"},{\"id\":783,\"kind\":2048,\"name\":\"getUserInfo\",\"url\":\"modules/recipe_thirdparty.html#TypeProvider.__type-3.getUserInfo\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdparty.TypeProvider.__type\"},{\"id\":784,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":785,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface\"},{\"id\":786,\"kind\":2048,\"name\":\"thirdPartyGetProvider\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.thirdPartyGetProvider\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":787,\"kind\":2048,\"name\":\"thirdPartySignInUp\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.thirdPartySignInUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":788,\"kind\":2048,\"name\":\"thirdPartyManuallyCreateOrUpdateUser\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.thirdPartyManuallyCreateOrUpdateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":789,\"kind\":2048,\"name\":\"emailPasswordSignUp\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.emailPasswordSignUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":790,\"kind\":2048,\"name\":\"createNewEmailPasswordRecipeUser\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.createNewEmailPasswordRecipeUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":791,\"kind\":2048,\"name\":\"emailPasswordSignIn\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.emailPasswordSignIn\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":792,\"kind\":2048,\"name\":\"createResetPasswordToken\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.createResetPasswordToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":793,\"kind\":2048,\"name\":\"consumePasswordResetToken\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.consumePasswordResetToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":794,\"kind\":2048,\"name\":\"updateEmailOrPassword\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#RecipeInterface.__type-1.updateEmailOrPassword\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.RecipeInterface.__type\"},{\"id\":795,\"kind\":16777216,\"name\":\"TypeProvider\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#TypeProvider\",\"classes\":\"tsd-kind-reference tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":796,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":797,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface\"},{\"id\":798,\"kind\":1024,\"name\":\"authorisationUrlGET\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.authorisationUrlGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":799,\"kind\":1024,\"name\":\"emailPasswordEmailExistsGET\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.emailPasswordEmailExistsGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":800,\"kind\":1024,\"name\":\"generatePasswordResetTokenPOST\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.generatePasswordResetTokenPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":801,\"kind\":1024,\"name\":\"passwordResetPOST\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.passwordResetPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":802,\"kind\":1024,\"name\":\"thirdPartySignInUpPOST\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.thirdPartySignInUpPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":803,\"kind\":1024,\"name\":\"emailPasswordSignInPOST\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.emailPasswordSignInPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":804,\"kind\":1024,\"name\":\"emailPasswordSignUpPOST\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.emailPasswordSignUpPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":805,\"kind\":1024,\"name\":\"appleRedirectHandlerPOST\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#APIInterface.__type.appleRedirectHandlerPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartyemailpassword.APIInterface.__type\"},{\"id\":806,\"kind\":4194304,\"name\":\"EmailPasswordAPIOptions\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#EmailPasswordAPIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":807,\"kind\":4194304,\"name\":\"ThirdPartyAPIOptions\",\"url\":\"modules/recipe_thirdpartyemailpassword.html#ThirdPartyAPIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartyemailpassword\"},{\"id\":808,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":809,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface\"},{\"id\":810,\"kind\":2048,\"name\":\"thirdPartySignInUp\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.thirdPartySignInUp\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":811,\"kind\":2048,\"name\":\"thirdPartyManuallyCreateOrUpdateUser\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.thirdPartyManuallyCreateOrUpdateUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":812,\"kind\":2048,\"name\":\"thirdPartyGetProvider\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.thirdPartyGetProvider\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":813,\"kind\":2048,\"name\":\"createCode\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.createCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":814,\"kind\":2048,\"name\":\"createNewCodeForDevice\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.createNewCodeForDevice\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":815,\"kind\":2048,\"name\":\"consumeCode\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.consumeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":816,\"kind\":2048,\"name\":\"updatePasswordlessUser\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.updatePasswordlessUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":817,\"kind\":2048,\"name\":\"revokeAllCodes\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.revokeAllCodes\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":818,\"kind\":2048,\"name\":\"revokeCode\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.revokeCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":819,\"kind\":2048,\"name\":\"listCodesByEmail\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.listCodesByEmail\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":820,\"kind\":2048,\"name\":\"listCodesByPhoneNumber\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.listCodesByPhoneNumber\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":821,\"kind\":2048,\"name\":\"listCodesByDeviceId\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.listCodesByDeviceId\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":822,\"kind\":2048,\"name\":\"listCodesByPreAuthSessionId\",\"url\":\"modules/recipe_thirdpartypasswordless.html#RecipeInterface.__type-1.listCodesByPreAuthSessionId\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.RecipeInterface.__type\"},{\"id\":823,\"kind\":16777216,\"name\":\"TypeProvider\",\"url\":\"modules/recipe_thirdpartypasswordless.html#TypeProvider\",\"classes\":\"tsd-kind-reference tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":824,\"kind\":4194304,\"name\":\"APIInterface\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":825,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface\"},{\"id\":826,\"kind\":1024,\"name\":\"authorisationUrlGET\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.authorisationUrlGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":827,\"kind\":1024,\"name\":\"thirdPartySignInUpPOST\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.thirdPartySignInUpPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":828,\"kind\":1024,\"name\":\"appleRedirectHandlerPOST\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.appleRedirectHandlerPOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":829,\"kind\":1024,\"name\":\"createCodePOST\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.createCodePOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":830,\"kind\":1024,\"name\":\"resendCodePOST\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.resendCodePOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":831,\"kind\":1024,\"name\":\"consumeCodePOST\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.consumeCodePOST\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":832,\"kind\":1024,\"name\":\"passwordlessUserEmailExistsGET\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.passwordlessUserEmailExistsGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":833,\"kind\":1024,\"name\":\"passwordlessUserPhoneNumberExistsGET\",\"url\":\"modules/recipe_thirdpartypasswordless.html#APIInterface.__type.passwordlessUserPhoneNumberExistsGET\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"recipe/thirdpartypasswordless.APIInterface.__type\"},{\"id\":834,\"kind\":4194304,\"name\":\"PasswordlessAPIOptions\",\"url\":\"modules/recipe_thirdpartypasswordless.html#PasswordlessAPIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":835,\"kind\":4194304,\"name\":\"ThirdPartyAPIOptions\",\"url\":\"modules/recipe_thirdpartypasswordless.html#ThirdPartyAPIOptions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/thirdpartypasswordless\"},{\"id\":836,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_usermetadata.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/usermetadata\"},{\"id\":837,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_usermetadata.html#RecipeInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/usermetadata.RecipeInterface\"},{\"id\":838,\"kind\":2048,\"name\":\"getUserMetadata\",\"url\":\"modules/recipe_usermetadata.html#RecipeInterface.__type.getUserMetadata\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/usermetadata.RecipeInterface.__type\"},{\"id\":839,\"kind\":2048,\"name\":\"updateUserMetadata\",\"url\":\"modules/recipe_usermetadata.html#RecipeInterface.__type.updateUserMetadata\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/usermetadata.RecipeInterface.__type\"},{\"id\":840,\"kind\":2048,\"name\":\"clearUserMetadata\",\"url\":\"modules/recipe_usermetadata.html#RecipeInterface.__type.clearUserMetadata\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/usermetadata.RecipeInterface.__type\"},{\"id\":841,\"kind\":256,\"name\":\"JSONObject\",\"url\":\"interfaces/recipe_usermetadata.JSONObject.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"recipe/usermetadata\"},{\"id\":842,\"kind\":32,\"name\":\"UserRoleClaim\",\"url\":\"modules/recipe_userroles.html#UserRoleClaim\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":843,\"kind\":32,\"name\":\"PermissionClaim\",\"url\":\"modules/recipe_userroles.html#PermissionClaim\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":844,\"kind\":4194304,\"name\":\"RecipeInterface\",\"url\":\"modules/recipe_userroles.html#RecipeInterface\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-module\",\"parent\":\"recipe/userroles\"},{\"id\":845,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"recipe/userroles.RecipeInterface\"},{\"id\":846,\"kind\":2048,\"name\":\"addRoleToUser\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.addRoleToUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":847,\"kind\":2048,\"name\":\"removeUserRole\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.removeUserRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":848,\"kind\":2048,\"name\":\"getRolesForUser\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.getRolesForUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":849,\"kind\":2048,\"name\":\"getUsersThatHaveRole\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.getUsersThatHaveRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":850,\"kind\":2048,\"name\":\"createNewRoleOrAddPermissions\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.createNewRoleOrAddPermissions\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":851,\"kind\":2048,\"name\":\"getPermissionsForRole\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.getPermissionsForRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":852,\"kind\":2048,\"name\":\"removePermissionsFromRole\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.removePermissionsFromRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":853,\"kind\":2048,\"name\":\"getRolesThatHavePermission\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.getRolesThatHavePermission\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":854,\"kind\":2048,\"name\":\"deleteRole\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.deleteRole\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"},{\"id\":855,\"kind\":2048,\"name\":\"getAllRoles\",\"url\":\"modules/recipe_userroles.html#RecipeInterface.__type.getAllRoles\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"recipe/userroles.RecipeInterface.__type\"}],\"index\":{\"version\":\"2.3.9\",\"fields\":[\"name\",\"parent\"],\"fieldVectors\":[[\"name/0\",[0,37.83]],[\"parent/0\",[]],[\"name/1\",[1,33.357]],[\"parent/1\",[0,3.737]],[\"name/2\",[2,58.371]],[\"parent/2\",[0,3.737]],[\"name/3\",[3,58.371]],[\"parent/3\",[0,3.737]],[\"name/4\",[4,58.371]],[\"parent/4\",[0,3.737]],[\"name/5\",[5,58.371]],[\"parent/5\",[0,3.737]],[\"name/6\",[6,55.007]],[\"parent/6\",[0,3.737]],[\"name/7\",[7,58.371]],[\"parent/7\",[0,3.737]],[\"name/8\",[8,58.371]],[\"parent/8\",[0,3.737]],[\"name/9\",[9,58.371]],[\"parent/9\",[0,3.737]],[\"name/10\",[10,58.371]],[\"parent/10\",[0,3.737]],[\"name/11\",[11,55.007]],[\"parent/11\",[0,3.737]],[\"name/12\",[12,55.007]],[\"parent/12\",[0,3.737]],[\"name/13\",[13,58.371]],[\"parent/13\",[0,3.737]],[\"name/14\",[14,58.371]],[\"parent/14\",[0,3.737]],[\"name/15\",[15,39.501]],[\"parent/15\",[0,3.737]],[\"name/16\",[16,38.357]],[\"parent/16\",[0,3.737]],[\"name/17\",[1,33.357]],[\"parent/17\",[17,3.737]],[\"name/18\",[18,24.426]],[\"parent/18\",[17,3.737]],[\"name/19\",[15,39.501]],[\"parent/19\",[17,3.737]],[\"name/20\",[19,50.487]],[\"parent/20\",[17,3.737]],[\"name/21\",[20,58.371]],[\"parent/21\",[17,3.737]],[\"name/22\",[2,58.371]],[\"parent/22\",[17,3.737]],[\"name/23\",[3,58.371]],[\"parent/23\",[17,3.737]],[\"name/24\",[4,58.371]],[\"parent/24\",[17,3.737]],[\"name/25\",[5,58.371]],[\"parent/25\",[17,3.737]],[\"name/26\",[7,58.371]],[\"parent/26\",[17,3.737]],[\"name/27\",[8,58.371]],[\"parent/27\",[17,3.737]],[\"name/28\",[9,58.371]],[\"parent/28\",[17,3.737]],[\"name/29\",[10,58.371]],[\"parent/29\",[17,3.737]],[\"name/30\",[11,55.007]],[\"parent/30\",[17,3.737]],[\"name/31\",[12,55.007]],[\"parent/31\",[17,3.737]],[\"name/32\",[6,55.007]],[\"parent/32\",[17,3.737]],[\"name/33\",[13,58.371]],[\"parent/33\",[17,3.737]],[\"name/34\",[14,58.371]],[\"parent/34\",[17,3.737]],[\"name/35\",[21,35.964]],[\"parent/35\",[17,3.737]],[\"name/36\",[22,43.111]],[\"parent/36\",[]],[\"name/37\",[23,58.371]],[\"parent/37\",[22,4.259]],[\"name/38\",[24,58.371]],[\"parent/38\",[22,4.259]],[\"name/39\",[25,58.371]],[\"parent/39\",[22,4.259]],[\"name/40\",[26,58.371]],[\"parent/40\",[22,4.259]],[\"name/41\",[27,58.371]],[\"parent/41\",[22,4.259]],[\"name/42\",[28,58.371]],[\"parent/42\",[22,4.259]],[\"name/43\",[16,38.357]],[\"parent/43\",[22,4.259]],[\"name/44\",[18,24.426]],[\"parent/44\",[22,4.259]],[\"name/45\",[23,58.371]],[\"parent/45\",[29,4.822]],[\"name/46\",[24,58.371]],[\"parent/46\",[29,4.822]],[\"name/47\",[25,58.371]],[\"parent/47\",[29,4.822]],[\"name/48\",[26,58.371]],[\"parent/48\",[29,4.822]],[\"name/49\",[27,58.371]],[\"parent/49\",[29,4.822]],[\"name/50\",[28,58.371]],[\"parent/50\",[29,4.822]],[\"name/51\",[30,48.816]],[\"parent/51\",[]],[\"name/52\",[31,50.487]],[\"parent/52\",[30,4.822]],[\"name/53\",[32,48.816]],[\"parent/53\",[30,4.822]],[\"name/54\",[33,48.816]],[\"parent/54\",[30,4.822]],[\"name/55\",[34,50.487]],[\"parent/55\",[]],[\"name/56\",[31,50.487]],[\"parent/56\",[34,4.987]],[\"name/57\",[35,55.007]],[\"parent/57\",[34,4.987]],[\"name/58\",[36,48.816]],[\"parent/58\",[]],[\"name/59\",[31,50.487]],[\"parent/59\",[36,4.822]],[\"name/60\",[35,55.007]],[\"parent/60\",[36,4.822]],[\"name/61\",[32,48.816]],[\"parent/61\",[36,4.822]],[\"name/62\",[33,48.816]],[\"parent/62\",[36,4.822]],[\"name/63\",[37,48.816]],[\"parent/63\",[]],[\"name/64\",[38,58.371]],[\"parent/64\",[37,4.822]],[\"name/65\",[35,55.007]],[\"parent/65\",[37,4.822]],[\"name/66\",[32,48.816]],[\"parent/66\",[37,4.822]],[\"name/67\",[33,48.816]],[\"parent/67\",[37,4.822]],[\"name/68\",[39,50.487]],[\"parent/68\",[]],[\"name/69\",[38,58.371]],[\"parent/69\",[39,4.987]],[\"name/70\",[32,48.816]],[\"parent/70\",[39,4.987]],[\"name/71\",[33,48.816]],[\"parent/71\",[39,4.987]],[\"name/72\",[40,50.487]],[\"parent/72\",[]],[\"name/73\",[31,50.487]],[\"parent/73\",[40,4.987]],[\"name/74\",[32,48.816]],[\"parent/74\",[40,4.987]],[\"name/75\",[33,48.816]],[\"parent/75\",[40,4.987]],[\"name/76\",[41,50.487]],[\"parent/76\",[]],[\"name/77\",[31,50.487]],[\"parent/77\",[41,4.987]],[\"name/78\",[32,48.816]],[\"parent/78\",[41,4.987]],[\"name/79\",[33,48.816]],[\"parent/79\",[41,4.987]],[\"name/80\",[42,58.371]],[\"parent/80\",[]],[\"name/81\",[16,38.357]],[\"parent/81\",[42,5.766]],[\"name/82\",[21,35.964]],[\"parent/82\",[43,5.766]],[\"name/83\",[44,58.371]],[\"parent/83\",[43,5.766]],[\"name/84\",[45,58.371]],[\"parent/84\",[]],[\"name/85\",[16,38.357]],[\"parent/85\",[45,5.766]],[\"name/86\",[21,35.964]],[\"parent/86\",[46,5.766]],[\"name/87\",[44,58.371]],[\"parent/87\",[46,5.766]],[\"name/88\",[47,40.793]],[\"parent/88\",[]],[\"name/89\",[1,33.357]],[\"parent/89\",[47,4.03]],[\"name/90\",[48,55.007]],[\"parent/90\",[47,4.03]],[\"name/91\",[49,55.007]],[\"parent/91\",[47,4.03]],[\"name/92\",[50,55.007]],[\"parent/92\",[47,4.03]],[\"name/93\",[51,55.007]],[\"parent/93\",[47,4.03]],[\"name/94\",[52,55.007]],[\"parent/94\",[47,4.03]],[\"name/95\",[53,58.371]],[\"parent/95\",[47,4.03]],[\"name/96\",[54,58.371]],[\"parent/96\",[47,4.03]],[\"name/97\",[55,58.371]],[\"parent/97\",[47,4.03]],[\"name/98\",[56,58.371]],[\"parent/98\",[47,4.03]],[\"name/99\",[57,58.371]],[\"parent/99\",[47,4.03]],[\"name/100\",[16,38.357]],[\"parent/100\",[47,4.03]],[\"name/101\",[1,33.357]],[\"parent/101\",[58,4.1]],[\"name/102\",[18,24.426]],[\"parent/102\",[58,4.1]],[\"name/103\",[53,58.371]],[\"parent/103\",[58,4.1]],[\"name/104\",[54,58.371]],[\"parent/104\",[58,4.1]],[\"name/105\",[48,55.007]],[\"parent/105\",[58,4.1]],[\"name/106\",[49,55.007]],[\"parent/106\",[58,4.1]],[\"name/107\",[50,55.007]],[\"parent/107\",[58,4.1]],[\"name/108\",[51,55.007]],[\"parent/108\",[58,4.1]],[\"name/109\",[52,55.007]],[\"parent/109\",[58,4.1]],[\"name/110\",[55,58.371]],[\"parent/110\",[58,4.1]],[\"name/111\",[56,58.371]],[\"parent/111\",[58,4.1]],[\"name/112\",[57,58.371]],[\"parent/112\",[58,4.1]],[\"name/113\",[21,35.964]],[\"parent/113\",[58,4.1]],[\"name/114\",[59,48.816]],[\"parent/114\",[]],[\"name/115\",[1,33.357]],[\"parent/115\",[59,4.822]],[\"name/116\",[16,38.357]],[\"parent/116\",[59,4.822]],[\"name/117\",[1,33.357]],[\"parent/117\",[60,5.434]],[\"name/118\",[18,24.426]],[\"parent/118\",[60,5.434]],[\"name/119\",[21,35.964]],[\"parent/119\",[60,5.434]],[\"name/120\",[61,39.501]],[\"parent/120\",[]],[\"name/121\",[1,33.357]],[\"parent/121\",[61,3.902]],[\"name/122\",[15,39.501]],[\"parent/122\",[61,3.902]],[\"name/123\",[62,55.007]],[\"parent/123\",[61,3.902]],[\"name/124\",[63,55.007]],[\"parent/124\",[61,3.902]],[\"name/125\",[64,48.816]],[\"parent/125\",[61,3.902]],[\"name/126\",[65,52.494]],[\"parent/126\",[61,3.902]],[\"name/127\",[66,48.816]],[\"parent/127\",[61,3.902]],[\"name/128\",[67,48.816]],[\"parent/128\",[61,3.902]],[\"name/129\",[68,52.494]],[\"parent/129\",[61,3.902]],[\"name/130\",[69,52.494]],[\"parent/130\",[61,3.902]],[\"name/131\",[70,44.021]],[\"parent/131\",[61,3.902]],[\"name/132\",[16,38.357]],[\"parent/132\",[61,3.902]],[\"name/133\",[1,33.357]],[\"parent/133\",[71,4.1]],[\"name/134\",[18,24.426]],[\"parent/134\",[71,4.1]],[\"name/135\",[15,39.501]],[\"parent/135\",[71,4.1]],[\"name/136\",[62,55.007]],[\"parent/136\",[71,4.1]],[\"name/137\",[63,55.007]],[\"parent/137\",[71,4.1]],[\"name/138\",[64,48.816]],[\"parent/138\",[71,4.1]],[\"name/139\",[65,52.494]],[\"parent/139\",[71,4.1]],[\"name/140\",[66,48.816]],[\"parent/140\",[71,4.1]],[\"name/141\",[67,48.816]],[\"parent/141\",[71,4.1]],[\"name/142\",[68,52.494]],[\"parent/142\",[71,4.1]],[\"name/143\",[69,52.494]],[\"parent/143\",[71,4.1]],[\"name/144\",[70,44.021]],[\"parent/144\",[71,4.1]],[\"name/145\",[21,35.964]],[\"parent/145\",[71,4.1]],[\"name/146\",[72,38.912]],[\"parent/146\",[]],[\"name/147\",[1,33.357]],[\"parent/147\",[72,3.844]],[\"name/148\",[15,39.501]],[\"parent/148\",[72,3.844]],[\"name/149\",[73,55.007]],[\"parent/149\",[72,3.844]],[\"name/150\",[74,58.371]],[\"parent/150\",[72,3.844]],[\"name/151\",[75,58.371]],[\"parent/151\",[72,3.844]],[\"name/152\",[76,55.007]],[\"parent/152\",[72,3.844]],[\"name/153\",[77,55.007]],[\"parent/153\",[72,3.844]],[\"name/154\",[78,55.007]],[\"parent/154\",[72,3.844]],[\"name/155\",[79,55.007]],[\"parent/155\",[72,3.844]],[\"name/156\",[70,44.021]],[\"parent/156\",[72,3.844]],[\"name/157\",[16,38.357]],[\"parent/157\",[72,3.844]],[\"name/158\",[1,33.357]],[\"parent/158\",[80,4.1]],[\"name/159\",[18,24.426]],[\"parent/159\",[80,4.1]],[\"name/160\",[15,39.501]],[\"parent/160\",[80,4.1]],[\"name/161\",[81,58.371]],[\"parent/161\",[80,4.1]],[\"name/162\",[73,55.007]],[\"parent/162\",[80,4.1]],[\"name/163\",[74,58.371]],[\"parent/163\",[80,4.1]],[\"name/164\",[75,58.371]],[\"parent/164\",[80,4.1]],[\"name/165\",[76,55.007]],[\"parent/165\",[80,4.1]],[\"name/166\",[77,55.007]],[\"parent/166\",[80,4.1]],[\"name/167\",[78,55.007]],[\"parent/167\",[80,4.1]],[\"name/168\",[79,55.007]],[\"parent/168\",[80,4.1]],[\"name/169\",[70,44.021]],[\"parent/169\",[80,4.1]],[\"name/170\",[21,35.964]],[\"parent/170\",[80,4.1]],[\"name/171\",[82,45.021]],[\"parent/171\",[]],[\"name/172\",[1,33.357]],[\"parent/172\",[82,4.447]],[\"name/173\",[83,47.385]],[\"parent/173\",[82,4.447]],[\"name/174\",[84,47.385]],[\"parent/174\",[82,4.447]],[\"name/175\",[16,38.357]],[\"parent/175\",[82,4.447]],[\"name/176\",[1,33.357]],[\"parent/176\",[85,4.987]],[\"name/177\",[18,24.426]],[\"parent/177\",[85,4.987]],[\"name/178\",[83,47.385]],[\"parent/178\",[85,4.987]],[\"name/179\",[84,47.385]],[\"parent/179\",[85,4.987]],[\"name/180\",[21,35.964]],[\"parent/180\",[85,4.987]],[\"name/181\",[86,40.126]],[\"parent/181\",[]],[\"name/182\",[1,33.357]],[\"parent/182\",[86,3.964]],[\"name/183\",[87,55.007]],[\"parent/183\",[86,3.964]],[\"name/184\",[88,55.007]],[\"parent/184\",[86,3.964]],[\"name/185\",[89,55.007]],[\"parent/185\",[86,3.964]],[\"name/186\",[90,55.007]],[\"parent/186\",[86,3.964]],[\"name/187\",[91,55.007]],[\"parent/187\",[86,3.964]],[\"name/188\",[92,55.007]],[\"parent/188\",[86,3.964]],[\"name/189\",[93,55.007]],[\"parent/189\",[86,3.964]],[\"name/190\",[94,55.007]],[\"parent/190\",[86,3.964]],[\"name/191\",[16,38.357]],[\"parent/191\",[86,3.964]],[\"name/192\",[1,33.357]],[\"parent/192\",[95,4.259]],[\"name/193\",[18,24.426]],[\"parent/193\",[95,4.259]],[\"name/194\",[87,55.007]],[\"parent/194\",[95,4.259]],[\"name/195\",[88,55.007]],[\"parent/195\",[95,4.259]],[\"name/196\",[89,55.007]],[\"parent/196\",[95,4.259]],[\"name/197\",[90,55.007]],[\"parent/197\",[95,4.259]],[\"name/198\",[91,55.007]],[\"parent/198\",[95,4.259]],[\"name/199\",[92,55.007]],[\"parent/199\",[95,4.259]],[\"name/200\",[93,55.007]],[\"parent/200\",[95,4.259]],[\"name/201\",[94,55.007]],[\"parent/201\",[95,4.259]],[\"name/202\",[21,35.964]],[\"parent/202\",[95,4.259]],[\"name/203\",[96,48.816]],[\"parent/203\",[]],[\"name/204\",[1,33.357]],[\"parent/204\",[96,4.822]],[\"name/205\",[97,52.494]],[\"parent/205\",[96,4.822]],[\"name/206\",[83,47.385]],[\"parent/206\",[96,4.822]],[\"name/207\",[84,47.385]],[\"parent/207\",[96,4.822]],[\"name/208\",[16,38.357]],[\"parent/208\",[96,4.822]],[\"name/209\",[1,33.357]],[\"parent/209\",[98,4.822]],[\"name/210\",[18,24.426]],[\"parent/210\",[98,4.822]],[\"name/211\",[97,52.494]],[\"parent/211\",[98,4.822]],[\"name/212\",[83,47.385]],[\"parent/212\",[98,4.822]],[\"name/213\",[84,47.385]],[\"parent/213\",[98,4.822]],[\"name/214\",[21,35.964]],[\"parent/214\",[98,4.822]],[\"name/215\",[99,36.854]],[\"parent/215\",[]],[\"name/216\",[1,33.357]],[\"parent/216\",[99,3.641]],[\"name/217\",[15,39.501]],[\"parent/217\",[99,3.641]],[\"name/218\",[100,48.816]],[\"parent/218\",[99,3.641]],[\"name/219\",[101,48.816]],[\"parent/219\",[99,3.641]],[\"name/220\",[102,48.816]],[\"parent/220\",[99,3.641]],[\"name/221\",[103,48.816]],[\"parent/221\",[99,3.641]],[\"name/222\",[104,48.816]],[\"parent/222\",[99,3.641]],[\"name/223\",[105,48.816]],[\"parent/223\",[99,3.641]],[\"name/224\",[106,48.816]],[\"parent/224\",[99,3.641]],[\"name/225\",[107,55.007]],[\"parent/225\",[99,3.641]],[\"name/226\",[108,48.816]],[\"parent/226\",[99,3.641]],[\"name/227\",[109,48.816]],[\"parent/227\",[99,3.641]],[\"name/228\",[110,52.494]],[\"parent/228\",[99,3.641]],[\"name/229\",[111,55.007]],[\"parent/229\",[99,3.641]],[\"name/230\",[70,44.021]],[\"parent/230\",[99,3.641]],[\"name/231\",[112,52.494]],[\"parent/231\",[99,3.641]],[\"name/232\",[16,38.357]],[\"parent/232\",[99,3.641]],[\"name/233\",[1,33.357]],[\"parent/233\",[113,3.789]],[\"name/234\",[18,24.426]],[\"parent/234\",[113,3.789]],[\"name/235\",[15,39.501]],[\"parent/235\",[113,3.789]],[\"name/236\",[100,48.816]],[\"parent/236\",[113,3.789]],[\"name/237\",[106,48.816]],[\"parent/237\",[113,3.789]],[\"name/238\",[101,48.816]],[\"parent/238\",[113,3.789]],[\"name/239\",[107,55.007]],[\"parent/239\",[113,3.789]],[\"name/240\",[108,48.816]],[\"parent/240\",[113,3.789]],[\"name/241\",[109,48.816]],[\"parent/241\",[113,3.789]],[\"name/242\",[103,48.816]],[\"parent/242\",[113,3.789]],[\"name/243\",[104,48.816]],[\"parent/243\",[113,3.789]],[\"name/244\",[102,48.816]],[\"parent/244\",[113,3.789]],[\"name/245\",[105,48.816]],[\"parent/245\",[113,3.789]],[\"name/246\",[110,52.494]],[\"parent/246\",[113,3.789]],[\"name/247\",[111,55.007]],[\"parent/247\",[113,3.789]],[\"name/248\",[70,44.021]],[\"parent/248\",[113,3.789]],[\"name/249\",[112,52.494]],[\"parent/249\",[113,3.789]],[\"name/250\",[21,35.964]],[\"parent/250\",[113,3.789]],[\"name/251\",[114,32.722]],[\"parent/251\",[]],[\"name/252\",[1,33.357]],[\"parent/252\",[114,3.232]],[\"name/253\",[115,55.007]],[\"parent/253\",[114,3.232]],[\"name/254\",[116,58.371]],[\"parent/254\",[114,3.232]],[\"name/255\",[117,55.007]],[\"parent/255\",[114,3.232]],[\"name/256\",[118,58.371]],[\"parent/256\",[114,3.232]],[\"name/257\",[119,55.007]],[\"parent/257\",[114,3.232]],[\"name/258\",[120,55.007]],[\"parent/258\",[114,3.232]],[\"name/259\",[121,58.371]],[\"parent/259\",[114,3.232]],[\"name/260\",[122,55.007]],[\"parent/260\",[114,3.232]],[\"name/261\",[123,55.007]],[\"parent/261\",[114,3.232]],[\"name/262\",[124,52.494]],[\"parent/262\",[114,3.232]],[\"name/263\",[125,55.007]],[\"parent/263\",[114,3.232]],[\"name/264\",[126,52.494]],[\"parent/264\",[114,3.232]],[\"name/265\",[127,52.494]],[\"parent/265\",[114,3.232]],[\"name/266\",[128,52.494]],[\"parent/266\",[114,3.232]],[\"name/267\",[129,52.494]],[\"parent/267\",[114,3.232]],[\"name/268\",[130,52.494]],[\"parent/268\",[114,3.232]],[\"name/269\",[131,52.494]],[\"parent/269\",[114,3.232]],[\"name/270\",[132,58.371]],[\"parent/270\",[114,3.232]],[\"name/271\",[15,39.501]],[\"parent/271\",[114,3.232]],[\"name/272\",[83,47.385]],[\"parent/272\",[114,3.232]],[\"name/273\",[84,47.385]],[\"parent/273\",[114,3.232]],[\"name/274\",[97,52.494]],[\"parent/274\",[114,3.232]],[\"name/275\",[16,38.357]],[\"parent/275\",[114,3.232]],[\"name/276\",[1,33.357]],[\"parent/276\",[133,3.472]],[\"name/277\",[18,24.426]],[\"parent/277\",[133,3.472]],[\"name/278\",[15,39.501]],[\"parent/278\",[133,3.472]],[\"name/279\",[115,55.007]],[\"parent/279\",[133,3.472]],[\"name/280\",[116,58.371]],[\"parent/280\",[133,3.472]],[\"name/281\",[132,58.371]],[\"parent/281\",[133,3.472]],[\"name/282\",[117,55.007]],[\"parent/282\",[133,3.472]],[\"name/283\",[118,58.371]],[\"parent/283\",[133,3.472]],[\"name/284\",[119,55.007]],[\"parent/284\",[133,3.472]],[\"name/285\",[120,55.007]],[\"parent/285\",[133,3.472]],[\"name/286\",[121,58.371]],[\"parent/286\",[133,3.472]],[\"name/287\",[122,55.007]],[\"parent/287\",[133,3.472]],[\"name/288\",[123,55.007]],[\"parent/288\",[133,3.472]],[\"name/289\",[124,52.494]],[\"parent/289\",[133,3.472]],[\"name/290\",[125,55.007]],[\"parent/290\",[133,3.472]],[\"name/291\",[126,52.494]],[\"parent/291\",[133,3.472]],[\"name/292\",[127,52.494]],[\"parent/292\",[133,3.472]],[\"name/293\",[83,47.385]],[\"parent/293\",[133,3.472]],[\"name/294\",[84,47.385]],[\"parent/294\",[133,3.472]],[\"name/295\",[97,52.494]],[\"parent/295\",[133,3.472]],[\"name/296\",[128,52.494]],[\"parent/296\",[133,3.472]],[\"name/297\",[129,52.494]],[\"parent/297\",[133,3.472]],[\"name/298\",[130,52.494]],[\"parent/298\",[133,3.472]],[\"name/299\",[131,52.494]],[\"parent/299\",[133,3.472]],[\"name/300\",[21,35.964]],[\"parent/300\",[133,3.472]],[\"name/301\",[134,44.021]],[\"parent/301\",[]],[\"name/302\",[1,33.357]],[\"parent/302\",[134,4.349]],[\"name/303\",[15,39.501]],[\"parent/303\",[134,4.349]],[\"name/304\",[135,55.007]],[\"parent/304\",[134,4.349]],[\"name/305\",[136,55.007]],[\"parent/305\",[134,4.349]],[\"name/306\",[16,38.357]],[\"parent/306\",[134,4.349]],[\"name/307\",[1,33.357]],[\"parent/307\",[137,4.822]],[\"name/308\",[18,24.426]],[\"parent/308\",[137,4.822]],[\"name/309\",[15,39.501]],[\"parent/309\",[137,4.822]],[\"name/310\",[135,55.007]],[\"parent/310\",[137,4.822]],[\"name/311\",[136,55.007]],[\"parent/311\",[137,4.822]],[\"name/312\",[21,35.964]],[\"parent/312\",[137,4.822]],[\"name/313\",[138,37.33]],[\"parent/313\",[]],[\"name/314\",[1,33.357]],[\"parent/314\",[138,3.688]],[\"name/315\",[15,39.501]],[\"parent/315\",[138,3.688]],[\"name/316\",[139,55.007]],[\"parent/316\",[138,3.688]],[\"name/317\",[140,55.007]],[\"parent/317\",[138,3.688]],[\"name/318\",[141,48.816]],[\"parent/318\",[138,3.688]],[\"name/319\",[142,48.816]],[\"parent/319\",[138,3.688]],[\"name/320\",[64,48.816]],[\"parent/320\",[138,3.688]],[\"name/321\",[65,52.494]],[\"parent/321\",[138,3.688]],[\"name/322\",[66,48.816]],[\"parent/322\",[138,3.688]],[\"name/323\",[67,48.816]],[\"parent/323\",[138,3.688]],[\"name/324\",[68,52.494]],[\"parent/324\",[138,3.688]],[\"name/325\",[69,52.494]],[\"parent/325\",[138,3.688]],[\"name/326\",[70,44.021]],[\"parent/326\",[138,3.688]],[\"name/327\",[16,38.357]],[\"parent/327\",[138,3.688]],[\"name/328\",[1,33.357]],[\"parent/328\",[143,3.964]],[\"name/329\",[18,24.426]],[\"parent/329\",[143,3.964]],[\"name/330\",[15,39.501]],[\"parent/330\",[143,3.964]],[\"name/331\",[141,48.816]],[\"parent/331\",[143,3.964]],[\"name/332\",[142,48.816]],[\"parent/332\",[143,3.964]],[\"name/333\",[139,55.007]],[\"parent/333\",[143,3.964]],[\"name/334\",[140,55.007]],[\"parent/334\",[143,3.964]],[\"name/335\",[64,48.816]],[\"parent/335\",[143,3.964]],[\"name/336\",[65,52.494]],[\"parent/336\",[143,3.964]],[\"name/337\",[66,48.816]],[\"parent/337\",[143,3.964]],[\"name/338\",[67,48.816]],[\"parent/338\",[143,3.964]],[\"name/339\",[68,52.494]],[\"parent/339\",[143,3.964]],[\"name/340\",[69,52.494]],[\"parent/340\",[143,3.964]],[\"name/341\",[70,44.021]],[\"parent/341\",[143,3.964]],[\"name/342\",[21,35.964]],[\"parent/342\",[143,3.964]],[\"name/343\",[144,35.148]],[\"parent/343\",[]],[\"name/344\",[1,33.357]],[\"parent/344\",[144,3.472]],[\"name/345\",[15,39.501]],[\"parent/345\",[144,3.472]],[\"name/346\",[141,48.816]],[\"parent/346\",[144,3.472]],[\"name/347\",[142,48.816]],[\"parent/347\",[144,3.472]],[\"name/348\",[145,58.371]],[\"parent/348\",[144,3.472]],[\"name/349\",[100,48.816]],[\"parent/349\",[144,3.472]],[\"name/350\",[101,48.816]],[\"parent/350\",[144,3.472]],[\"name/351\",[102,48.816]],[\"parent/351\",[144,3.472]],[\"name/352\",[103,48.816]],[\"parent/352\",[144,3.472]],[\"name/353\",[104,48.816]],[\"parent/353\",[144,3.472]],[\"name/354\",[105,48.816]],[\"parent/354\",[144,3.472]],[\"name/355\",[106,48.816]],[\"parent/355\",[144,3.472]],[\"name/356\",[146,55.007]],[\"parent/356\",[144,3.472]],[\"name/357\",[108,48.816]],[\"parent/357\",[144,3.472]],[\"name/358\",[109,48.816]],[\"parent/358\",[144,3.472]],[\"name/359\",[110,52.494]],[\"parent/359\",[144,3.472]],[\"name/360\",[70,44.021]],[\"parent/360\",[144,3.472]],[\"name/361\",[112,52.494]],[\"parent/361\",[144,3.472]],[\"name/362\",[16,38.357]],[\"parent/362\",[144,3.472]],[\"name/363\",[1,33.357]],[\"parent/363\",[147,3.688]],[\"name/364\",[18,24.426]],[\"parent/364\",[147,3.688]],[\"name/365\",[15,39.501]],[\"parent/365\",[147,3.688]],[\"name/366\",[141,48.816]],[\"parent/366\",[147,3.688]],[\"name/367\",[142,48.816]],[\"parent/367\",[147,3.688]],[\"name/368\",[100,48.816]],[\"parent/368\",[147,3.688]],[\"name/369\",[106,48.816]],[\"parent/369\",[147,3.688]],[\"name/370\",[101,48.816]],[\"parent/370\",[147,3.688]],[\"name/371\",[146,55.007]],[\"parent/371\",[147,3.688]],[\"name/372\",[108,48.816]],[\"parent/372\",[147,3.688]],[\"name/373\",[109,48.816]],[\"parent/373\",[147,3.688]],[\"name/374\",[103,48.816]],[\"parent/374\",[147,3.688]],[\"name/375\",[104,48.816]],[\"parent/375\",[147,3.688]],[\"name/376\",[102,48.816]],[\"parent/376\",[147,3.688]],[\"name/377\",[105,48.816]],[\"parent/377\",[147,3.688]],[\"name/378\",[110,52.494]],[\"parent/378\",[147,3.688]],[\"name/379\",[145,58.371]],[\"parent/379\",[147,3.688]],[\"name/380\",[70,44.021]],[\"parent/380\",[147,3.688]],[\"name/381\",[112,52.494]],[\"parent/381\",[147,3.688]],[\"name/382\",[21,35.964]],[\"parent/382\",[147,3.688]],[\"name/383\",[148,46.134]],[\"parent/383\",[]],[\"name/384\",[1,33.357]],[\"parent/384\",[148,4.557]],[\"name/385\",[149,55.007]],[\"parent/385\",[148,4.557]],[\"name/386\",[150,55.007]],[\"parent/386\",[148,4.557]],[\"name/387\",[151,55.007]],[\"parent/387\",[148,4.557]],[\"name/388\",[16,38.357]],[\"parent/388\",[148,4.557]],[\"name/389\",[1,33.357]],[\"parent/389\",[152,4.822]],[\"name/390\",[18,24.426]],[\"parent/390\",[152,4.822]],[\"name/391\",[149,55.007]],[\"parent/391\",[152,4.822]],[\"name/392\",[150,55.007]],[\"parent/392\",[152,4.822]],[\"name/393\",[151,55.007]],[\"parent/393\",[152,4.822]],[\"name/394\",[21,35.964]],[\"parent/394\",[152,4.822]],[\"name/395\",[153,39.501]],[\"parent/395\",[]],[\"name/396\",[1,33.357]],[\"parent/396\",[153,3.902]],[\"name/397\",[154,55.007]],[\"parent/397\",[153,3.902]],[\"name/398\",[155,55.007]],[\"parent/398\",[153,3.902]],[\"name/399\",[156,55.007]],[\"parent/399\",[153,3.902]],[\"name/400\",[157,55.007]],[\"parent/400\",[153,3.902]],[\"name/401\",[158,55.007]],[\"parent/401\",[153,3.902]],[\"name/402\",[159,55.007]],[\"parent/402\",[153,3.902]],[\"name/403\",[160,55.007]],[\"parent/403\",[153,3.902]],[\"name/404\",[161,55.007]],[\"parent/404\",[153,3.902]],[\"name/405\",[162,55.007]],[\"parent/405\",[153,3.902]],[\"name/406\",[163,55.007]],[\"parent/406\",[153,3.902]],[\"name/407\",[16,38.357]],[\"parent/407\",[153,3.902]],[\"name/408\",[1,33.357]],[\"parent/408\",[164,3.964]],[\"name/409\",[18,24.426]],[\"parent/409\",[164,3.964]],[\"name/410\",[165,58.371]],[\"parent/410\",[164,3.964]],[\"name/411\",[166,58.371]],[\"parent/411\",[164,3.964]],[\"name/412\",[154,55.007]],[\"parent/412\",[164,3.964]],[\"name/413\",[155,55.007]],[\"parent/413\",[164,3.964]],[\"name/414\",[156,55.007]],[\"parent/414\",[164,3.964]],[\"name/415\",[157,55.007]],[\"parent/415\",[164,3.964]],[\"name/416\",[158,55.007]],[\"parent/416\",[164,3.964]],[\"name/417\",[159,55.007]],[\"parent/417\",[164,3.964]],[\"name/418\",[160,55.007]],[\"parent/418\",[164,3.964]],[\"name/419\",[161,55.007]],[\"parent/419\",[164,3.964]],[\"name/420\",[162,55.007]],[\"parent/420\",[164,3.964]],[\"name/421\",[163,55.007]],[\"parent/421\",[164,3.964]],[\"name/422\",[21,35.964]],[\"parent/422\",[164,3.964]],[\"name/423\",[19,50.487]],[\"parent/423\",[0,3.737]],[\"name/424\",[21,35.964]],[\"parent/424\",[167,5.434]],[\"name/425\",[19,50.487]],[\"parent/425\",[167,5.434]],[\"name/426\",[168,63.48]],[\"parent/426\",[167,5.434]],[\"name/427\",[20,58.371]],[\"parent/427\",[0,3.737]],[\"name/428\",[21,35.964]],[\"parent/428\",[169,4.349]],[\"name/429\",[170,58.371]],[\"parent/429\",[169,4.349]],[\"name/430\",[171,63.48]],[\"parent/430\",[169,4.349]],[\"name/431\",[172,63.48]],[\"parent/431\",[169,4.349]],[\"name/432\",[173,63.48]],[\"parent/432\",[169,4.349]],[\"name/433\",[174,63.48]],[\"parent/433\",[169,4.349]],[\"name/434\",[175,63.48]],[\"parent/434\",[169,4.349]],[\"name/435\",[176,63.48]],[\"parent/435\",[169,4.349]],[\"name/436\",[177,63.48]],[\"parent/436\",[169,4.349]],[\"name/437\",[178,63.48]],[\"parent/437\",[169,4.349]],[\"name/438\",[179,63.48]],[\"parent/438\",[22,4.259]],[\"name/439\",[21,35.964]],[\"parent/439\",[180,3.844]],[\"name/440\",[181,52.494]],[\"parent/440\",[180,3.844]],[\"name/441\",[182,52.494]],[\"parent/441\",[180,3.844]],[\"name/442\",[183,58.371]],[\"parent/442\",[180,3.844]],[\"name/443\",[18,24.426]],[\"parent/443\",[180,3.844]],[\"name/444\",[184,58.371]],[\"parent/444\",[180,3.844]],[\"name/445\",[18,24.426]],[\"parent/445\",[180,3.844]],[\"name/446\",[185,58.371]],[\"parent/446\",[180,3.844]],[\"name/447\",[18,24.426]],[\"parent/447\",[180,3.844]],[\"name/448\",[186,58.371]],[\"parent/448\",[180,3.844]],[\"name/449\",[18,24.426]],[\"parent/449\",[180,3.844]],[\"name/450\",[187,58.371]],[\"parent/450\",[180,3.844]],[\"name/451\",[18,24.426]],[\"parent/451\",[180,3.844]],[\"name/452\",[188,58.371]],[\"parent/452\",[180,3.844]],[\"name/453\",[18,24.426]],[\"parent/453\",[180,3.844]],[\"name/454\",[189,58.371]],[\"parent/454\",[180,3.844]],[\"name/455\",[18,24.426]],[\"parent/455\",[180,3.844]],[\"name/456\",[190,63.48]],[\"parent/456\",[22,4.259]],[\"name/457\",[21,35.964]],[\"parent/457\",[191,3.964]],[\"name/458\",[181,52.494]],[\"parent/458\",[191,3.964]],[\"name/459\",[182,52.494]],[\"parent/459\",[191,3.964]],[\"name/460\",[192,58.371]],[\"parent/460\",[191,3.964]],[\"name/461\",[18,24.426]],[\"parent/461\",[191,3.964]],[\"name/462\",[193,58.371]],[\"parent/462\",[191,3.964]],[\"name/463\",[18,24.426]],[\"parent/463\",[191,3.964]],[\"name/464\",[194,58.371]],[\"parent/464\",[191,3.964]],[\"name/465\",[18,24.426]],[\"parent/465\",[191,3.964]],[\"name/466\",[195,58.371]],[\"parent/466\",[191,3.964]],[\"name/467\",[18,24.426]],[\"parent/467\",[191,3.964]],[\"name/468\",[196,58.371]],[\"parent/468\",[191,3.964]],[\"name/469\",[18,24.426]],[\"parent/469\",[191,3.964]],[\"name/470\",[197,58.371]],[\"parent/470\",[191,3.964]],[\"name/471\",[18,24.426]],[\"parent/471\",[191,3.964]],[\"name/472\",[198,63.48]],[\"parent/472\",[30,4.822]],[\"name/473\",[199,46.134]],[\"parent/473\",[200,5.434]],[\"name/474\",[201,58.371]],[\"parent/474\",[200,5.434]],[\"name/475\",[18,24.426]],[\"parent/475\",[200,5.434]],[\"name/476\",[202,58.371]],[\"parent/476\",[203,5.766]],[\"name/477\",[18,24.426]],[\"parent/477\",[203,5.766]],[\"name/478\",[204,55.007]],[\"parent/478\",[205,5.766]],[\"name/479\",[206,55.007]],[\"parent/479\",[205,5.766]],[\"name/480\",[207,63.48]],[\"parent/480\",[30,4.822]],[\"name/481\",[199,46.134]],[\"parent/481\",[208,5.186]],[\"name/482\",[201,58.371]],[\"parent/482\",[208,5.186]],[\"name/483\",[18,24.426]],[\"parent/483\",[208,5.186]],[\"name/484\",[202,58.371]],[\"parent/484\",[209,5.186]],[\"name/485\",[18,24.426]],[\"parent/485\",[209,5.186]],[\"name/486\",[204,55.007]],[\"parent/486\",[210,5.434]],[\"name/487\",[206,55.007]],[\"parent/487\",[210,5.434]],[\"name/488\",[18,24.426]],[\"parent/488\",[208,5.186]],[\"name/489\",[18,24.426]],[\"parent/489\",[209,5.186]],[\"name/490\",[18,24.426]],[\"parent/490\",[210,5.434]],[\"name/491\",[18,24.426]],[\"parent/491\",[211,6.271]],[\"name/492\",[18,24.426]],[\"parent/492\",[209,5.186]],[\"name/493\",[212,63.48]],[\"parent/493\",[34,4.987]],[\"name/494\",[21,35.964]],[\"parent/494\",[213,4.1]],[\"name/495\",[214,63.48]],[\"parent/495\",[213,4.1]],[\"name/496\",[215,63.48]],[\"parent/496\",[213,4.1]],[\"name/497\",[199,46.134]],[\"parent/497\",[213,4.1]],[\"name/498\",[189,58.371]],[\"parent/498\",[213,4.1]],[\"name/499\",[183,58.371]],[\"parent/499\",[213,4.1]],[\"name/500\",[184,58.371]],[\"parent/500\",[213,4.1]],[\"name/501\",[185,58.371]],[\"parent/501\",[213,4.1]],[\"name/502\",[186,58.371]],[\"parent/502\",[213,4.1]],[\"name/503\",[187,58.371]],[\"parent/503\",[213,4.1]],[\"name/504\",[188,58.371]],[\"parent/504\",[213,4.1]],[\"name/505\",[181,52.494]],[\"parent/505\",[213,4.1]],[\"name/506\",[182,52.494]],[\"parent/506\",[213,4.1]],[\"name/507\",[216,63.48]],[\"parent/507\",[34,4.987]],[\"name/508\",[21,35.964]],[\"parent/508\",[217,4.1]],[\"name/509\",[218,63.48]],[\"parent/509\",[217,4.1]],[\"name/510\",[204,55.007]],[\"parent/510\",[217,4.1]],[\"name/511\",[206,55.007]],[\"parent/511\",[217,4.1]],[\"name/512\",[219,63.48]],[\"parent/512\",[217,4.1]],[\"name/513\",[197,58.371]],[\"parent/513\",[217,4.1]],[\"name/514\",[192,58.371]],[\"parent/514\",[217,4.1]],[\"name/515\",[193,58.371]],[\"parent/515\",[217,4.1]],[\"name/516\",[194,58.371]],[\"parent/516\",[217,4.1]],[\"name/517\",[195,58.371]],[\"parent/517\",[217,4.1]],[\"name/518\",[196,58.371]],[\"parent/518\",[217,4.1]],[\"name/519\",[181,52.494]],[\"parent/519\",[217,4.1]],[\"name/520\",[182,52.494]],[\"parent/520\",[217,4.1]],[\"name/521\",[220,55.007]],[\"parent/521\",[36,4.822]],[\"name/522\",[199,46.134]],[\"parent/522\",[221,6.271]],[\"name/523\",[220,55.007]],[\"parent/523\",[37,4.822]],[\"name/524\",[199,46.134]],[\"parent/524\",[222,6.271]],[\"name/525\",[220,55.007]],[\"parent/525\",[39,4.987]],[\"name/526\",[199,46.134]],[\"parent/526\",[223,5.766]],[\"name/527\",[18,24.426]],[\"parent/527\",[223,5.766]],[\"name/528\",[224,58.371]],[\"parent/528\",[40,4.987]],[\"name/529\",[199,46.134]],[\"parent/529\",[225,6.271]],[\"name/530\",[224,58.371]],[\"parent/530\",[41,4.987]],[\"name/531\",[199,46.134]],[\"parent/531\",[226,6.271]],[\"name/532\",[227,41.507]],[\"parent/532\",[47,4.03]],[\"name/533\",[18,24.426]],[\"parent/533\",[228,6.271]],[\"name/534\",[229,63.48]],[\"parent/534\",[230,4.447]],[\"name/535\",[48,55.007]],[\"parent/535\",[230,4.447]],[\"name/536\",[49,55.007]],[\"parent/536\",[230,4.447]],[\"name/537\",[50,55.007]],[\"parent/537\",[230,4.447]],[\"name/538\",[51,55.007]],[\"parent/538\",[230,4.447]],[\"name/539\",[52,55.007]],[\"parent/539\",[230,4.447]],[\"name/540\",[11,55.007]],[\"parent/540\",[230,4.447]],[\"name/541\",[12,55.007]],[\"parent/541\",[230,4.447]],[\"name/542\",[6,55.007]],[\"parent/542\",[230,4.447]],[\"name/543\",[227,41.507]],[\"parent/543\",[59,4.822]],[\"name/544\",[18,24.426]],[\"parent/544\",[231,6.271]],[\"name/545\",[232,63.48]],[\"parent/545\",[233,5.766]],[\"name/546\",[234,63.48]],[\"parent/546\",[233,5.766]],[\"name/547\",[235,46.134]],[\"parent/547\",[59,4.822]],[\"name/548\",[18,24.426]],[\"parent/548\",[236,6.271]],[\"name/549\",[237,46.134]],[\"parent/549\",[238,4.681]],[\"name/550\",[239,45.021]],[\"parent/550\",[238,4.681]],[\"name/551\",[240,46.134]],[\"parent/551\",[238,4.681]],[\"name/552\",[241,46.134]],[\"parent/552\",[238,4.681]],[\"name/553\",[242,46.134]],[\"parent/553\",[238,4.681]],[\"name/554\",[243,46.134]],[\"parent/554\",[238,4.681]],[\"name/555\",[244,50.487]],[\"parent/555\",[238,4.681]],[\"name/556\",[245,44.021]],[\"parent/556\",[59,4.822]],[\"name/557\",[18,24.426]],[\"parent/557\",[246,6.271]],[\"name/558\",[247,63.48]],[\"parent/558\",[248,6.271]],[\"name/559\",[227,41.507]],[\"parent/559\",[61,3.902]],[\"name/560\",[18,24.426]],[\"parent/560\",[249,6.271]],[\"name/561\",[62,55.007]],[\"parent/561\",[250,4.822]],[\"name/562\",[251,63.48]],[\"parent/562\",[250,4.822]],[\"name/563\",[63,55.007]],[\"parent/563\",[250,4.822]],[\"name/564\",[64,48.816]],[\"parent/564\",[250,4.822]],[\"name/565\",[66,48.816]],[\"parent/565\",[250,4.822]],[\"name/566\",[67,48.816]],[\"parent/566\",[250,4.822]],[\"name/567\",[235,46.134]],[\"parent/567\",[61,3.902]],[\"name/568\",[18,24.426]],[\"parent/568\",[252,6.271]],[\"name/569\",[237,46.134]],[\"parent/569\",[253,4.557]],[\"name/570\",[244,50.487]],[\"parent/570\",[253,4.557]],[\"name/571\",[239,45.021]],[\"parent/571\",[253,4.557]],[\"name/572\",[240,46.134]],[\"parent/572\",[253,4.557]],[\"name/573\",[243,46.134]],[\"parent/573\",[253,4.557]],[\"name/574\",[241,46.134]],[\"parent/574\",[253,4.557]],[\"name/575\",[242,46.134]],[\"parent/575\",[253,4.557]],[\"name/576\",[254,55.007]],[\"parent/576\",[253,4.557]],[\"name/577\",[245,44.021]],[\"parent/577\",[61,3.902]],[\"name/578\",[18,24.426]],[\"parent/578\",[255,6.271]],[\"name/579\",[256,58.371]],[\"parent/579\",[257,4.987]],[\"name/580\",[258,58.371]],[\"parent/580\",[257,4.987]],[\"name/581\",[259,58.371]],[\"parent/581\",[257,4.987]],[\"name/582\",[260,63.48]],[\"parent/582\",[257,4.987]],[\"name/583\",[261,63.48]],[\"parent/583\",[257,4.987]],[\"name/584\",[227,41.507]],[\"parent/584\",[72,3.844]],[\"name/585\",[18,24.426]],[\"parent/585\",[262,6.271]],[\"name/586\",[73,55.007]],[\"parent/586\",[263,4.987]],[\"name/587\",[76,55.007]],[\"parent/587\",[263,4.987]],[\"name/588\",[77,55.007]],[\"parent/588\",[263,4.987]],[\"name/589\",[78,55.007]],[\"parent/589\",[263,4.987]],[\"name/590\",[79,55.007]],[\"parent/590\",[263,4.987]],[\"name/591\",[235,46.134]],[\"parent/591\",[72,3.844]],[\"name/592\",[18,24.426]],[\"parent/592\",[264,6.271]],[\"name/593\",[237,46.134]],[\"parent/593\",[265,4.557]],[\"name/594\",[244,50.487]],[\"parent/594\",[265,4.557]],[\"name/595\",[239,45.021]],[\"parent/595\",[265,4.557]],[\"name/596\",[240,46.134]],[\"parent/596\",[265,4.557]],[\"name/597\",[243,46.134]],[\"parent/597\",[265,4.557]],[\"name/598\",[241,46.134]],[\"parent/598\",[265,4.557]],[\"name/599\",[242,46.134]],[\"parent/599\",[265,4.557]],[\"name/600\",[254,55.007]],[\"parent/600\",[265,4.557]],[\"name/601\",[245,44.021]],[\"parent/601\",[72,3.844]],[\"name/602\",[18,24.426]],[\"parent/602\",[266,6.271]],[\"name/603\",[267,63.48]],[\"parent/603\",[268,5.434]],[\"name/604\",[269,63.48]],[\"parent/604\",[268,5.434]],[\"name/605\",[270,63.48]],[\"parent/605\",[268,5.434]],[\"name/606\",[271,63.48]],[\"parent/606\",[72,3.844]],[\"name/607\",[18,24.426]],[\"parent/607\",[272,6.271]],[\"name/608\",[19,50.487]],[\"parent/608\",[273,5.766]],[\"name/609\",[274,63.48]],[\"parent/609\",[273,5.766]],[\"name/610\",[81,58.371]],[\"parent/610\",[72,3.844]],[\"name/611\",[245,44.021]],[\"parent/611\",[82,4.447]],[\"name/612\",[18,24.426]],[\"parent/612\",[275,6.271]],[\"name/613\",[276,63.48]],[\"parent/613\",[277,6.271]],[\"name/614\",[235,46.134]],[\"parent/614\",[82,4.447]],[\"name/615\",[18,24.426]],[\"parent/615\",[278,6.271]],[\"name/616\",[237,46.134]],[\"parent/616\",[279,4.822]],[\"name/617\",[239,45.021]],[\"parent/617\",[279,4.822]],[\"name/618\",[240,46.134]],[\"parent/618\",[279,4.822]],[\"name/619\",[243,46.134]],[\"parent/619\",[279,4.822]],[\"name/620\",[241,46.134]],[\"parent/620\",[279,4.822]],[\"name/621\",[242,46.134]],[\"parent/621\",[279,4.822]],[\"name/622\",[227,41.507]],[\"parent/622\",[82,4.447]],[\"name/623\",[18,24.426]],[\"parent/623\",[280,6.271]],[\"name/624\",[83,47.385]],[\"parent/624\",[281,5.766]],[\"name/625\",[84,47.385]],[\"parent/625\",[281,5.766]],[\"name/626\",[282,63.48]],[\"parent/626\",[82,4.447]],[\"name/627\",[18,24.426]],[\"parent/627\",[283,6.271]],[\"name/628\",[284,63.48]],[\"parent/628\",[285,4.822]],[\"name/629\",[286,63.48]],[\"parent/629\",[285,4.822]],[\"name/630\",[287,63.48]],[\"parent/630\",[285,4.822]],[\"name/631\",[288,63.48]],[\"parent/631\",[285,4.822]],[\"name/632\",[289,63.48]],[\"parent/632\",[285,4.822]],[\"name/633\",[290,63.48]],[\"parent/633\",[285,4.822]],[\"name/634\",[291,63.48]],[\"parent/634\",[86,3.964]],[\"name/635\",[227,41.507]],[\"parent/635\",[86,3.964]],[\"name/636\",[18,24.426]],[\"parent/636\",[292,6.271]],[\"name/637\",[293,58.371]],[\"parent/637\",[294,4.447]],[\"name/638\",[87,55.007]],[\"parent/638\",[294,4.447]],[\"name/639\",[88,55.007]],[\"parent/639\",[294,4.447]],[\"name/640\",[89,55.007]],[\"parent/640\",[294,4.447]],[\"name/641\",[90,55.007]],[\"parent/641\",[294,4.447]],[\"name/642\",[91,55.007]],[\"parent/642\",[294,4.447]],[\"name/643\",[92,55.007]],[\"parent/643\",[294,4.447]],[\"name/644\",[93,55.007]],[\"parent/644\",[294,4.447]],[\"name/645\",[94,55.007]],[\"parent/645\",[294,4.447]],[\"name/646\",[235,46.134]],[\"parent/646\",[86,3.964]],[\"name/647\",[18,24.426]],[\"parent/647\",[295,6.271]],[\"name/648\",[237,46.134]],[\"parent/648\",[296,4.681]],[\"name/649\",[239,45.021]],[\"parent/649\",[296,4.681]],[\"name/650\",[240,46.134]],[\"parent/650\",[296,4.681]],[\"name/651\",[243,46.134]],[\"parent/651\",[296,4.681]],[\"name/652\",[241,46.134]],[\"parent/652\",[296,4.681]],[\"name/653\",[242,46.134]],[\"parent/653\",[296,4.681]],[\"name/654\",[297,63.48]],[\"parent/654\",[296,4.681]],[\"name/655\",[245,44.021]],[\"parent/655\",[86,3.964]],[\"name/656\",[18,24.426]],[\"parent/656\",[298,6.271]],[\"name/657\",[299,63.48]],[\"parent/657\",[300,6.271]],[\"name/658\",[227,41.507]],[\"parent/658\",[99,3.641]],[\"name/659\",[18,24.426]],[\"parent/659\",[301,6.271]],[\"name/660\",[100,48.816]],[\"parent/660\",[302,4.349]],[\"name/661\",[106,48.816]],[\"parent/661\",[302,4.349]],[\"name/662\",[101,48.816]],[\"parent/662\",[302,4.349]],[\"name/663\",[107,55.007]],[\"parent/663\",[302,4.349]],[\"name/664\",[108,48.816]],[\"parent/664\",[302,4.349]],[\"name/665\",[109,48.816]],[\"parent/665\",[302,4.349]],[\"name/666\",[103,48.816]],[\"parent/666\",[302,4.349]],[\"name/667\",[104,48.816]],[\"parent/667\",[302,4.349]],[\"name/668\",[102,48.816]],[\"parent/668\",[302,4.349]],[\"name/669\",[105,48.816]],[\"parent/669\",[302,4.349]],[\"name/670\",[235,46.134]],[\"parent/670\",[99,3.641]],[\"name/671\",[18,24.426]],[\"parent/671\",[303,6.271]],[\"name/672\",[237,46.134]],[\"parent/672\",[304,4.447]],[\"name/673\",[244,50.487]],[\"parent/673\",[304,4.447]],[\"name/674\",[239,45.021]],[\"parent/674\",[304,4.447]],[\"name/675\",[240,46.134]],[\"parent/675\",[304,4.447]],[\"name/676\",[243,46.134]],[\"parent/676\",[304,4.447]],[\"name/677\",[241,46.134]],[\"parent/677\",[304,4.447]],[\"name/678\",[242,46.134]],[\"parent/678\",[304,4.447]],[\"name/679\",[254,55.007]],[\"parent/679\",[304,4.447]],[\"name/680\",[305,63.48]],[\"parent/680\",[304,4.447]],[\"name/681\",[245,44.021]],[\"parent/681\",[99,3.641]],[\"name/682\",[18,24.426]],[\"parent/682\",[306,6.271]],[\"name/683\",[307,58.371]],[\"parent/683\",[308,4.987]],[\"name/684\",[309,58.371]],[\"parent/684\",[308,4.987]],[\"name/685\",[310,58.371]],[\"parent/685\",[308,4.987]],[\"name/686\",[256,58.371]],[\"parent/686\",[308,4.987]],[\"name/687\",[311,63.48]],[\"parent/687\",[308,4.987]],[\"name/688\",[312,63.48]],[\"parent/688\",[114,3.232]],[\"name/689\",[313,63.48]],[\"parent/689\",[314,5.186]],[\"name/690\",[315,63.48]],[\"parent/690\",[314,5.186]],[\"name/691\",[316,63.48]],[\"parent/691\",[314,5.186]],[\"name/692\",[317,63.48]],[\"parent/692\",[314,5.186]],[\"name/693\",[227,41.507]],[\"parent/693\",[114,3.232]],[\"name/694\",[18,24.426]],[\"parent/694\",[318,6.271]],[\"name/695\",[115,55.007]],[\"parent/695\",[319,3.844]],[\"name/696\",[320,63.48]],[\"parent/696\",[319,3.844]],[\"name/697\",[117,55.007]],[\"parent/697\",[319,3.844]],[\"name/698\",[120,55.007]],[\"parent/698\",[319,3.844]],[\"name/699\",[119,55.007]],[\"parent/699\",[319,3.844]],[\"name/700\",[122,55.007]],[\"parent/700\",[319,3.844]],[\"name/701\",[123,55.007]],[\"parent/701\",[319,3.844]],[\"name/702\",[124,52.494]],[\"parent/702\",[319,3.844]],[\"name/703\",[125,55.007]],[\"parent/703\",[319,3.844]],[\"name/704\",[126,52.494]],[\"parent/704\",[319,3.844]],[\"name/705\",[127,52.494]],[\"parent/705\",[319,3.844]],[\"name/706\",[321,63.48]],[\"parent/706\",[319,3.844]],[\"name/707\",[322,63.48]],[\"parent/707\",[319,3.844]],[\"name/708\",[128,52.494]],[\"parent/708\",[319,3.844]],[\"name/709\",[129,52.494]],[\"parent/709\",[319,3.844]],[\"name/710\",[130,52.494]],[\"parent/710\",[319,3.844]],[\"name/711\",[131,52.494]],[\"parent/711\",[319,3.844]],[\"name/712\",[323,63.48]],[\"parent/712\",[114,3.232]],[\"name/713\",[124,52.494]],[\"parent/713\",[324,3.737]],[\"name/714\",[325,63.48]],[\"parent/714\",[324,3.737]],[\"name/715\",[126,52.494]],[\"parent/715\",[324,3.737]],[\"name/716\",[326,63.48]],[\"parent/716\",[324,3.737]],[\"name/717\",[327,63.48]],[\"parent/717\",[324,3.737]],[\"name/718\",[293,58.371]],[\"parent/718\",[324,3.737]],[\"name/719\",[328,63.48]],[\"parent/719\",[324,3.737]],[\"name/720\",[329,63.48]],[\"parent/720\",[324,3.737]],[\"name/721\",[330,63.48]],[\"parent/721\",[324,3.737]],[\"name/722\",[331,63.48]],[\"parent/722\",[324,3.737]],[\"name/723\",[127,52.494]],[\"parent/723\",[324,3.737]],[\"name/724\",[332,63.48]],[\"parent/724\",[324,3.737]],[\"name/725\",[333,63.48]],[\"parent/725\",[324,3.737]],[\"name/726\",[334,63.48]],[\"parent/726\",[324,3.737]],[\"name/727\",[128,52.494]],[\"parent/727\",[324,3.737]],[\"name/728\",[129,52.494]],[\"parent/728\",[324,3.737]],[\"name/729\",[130,52.494]],[\"parent/729\",[324,3.737]],[\"name/730\",[131,52.494]],[\"parent/730\",[324,3.737]],[\"name/731\",[335,63.48]],[\"parent/731\",[324,3.737]],[\"name/732\",[245,44.021]],[\"parent/732\",[114,3.232]],[\"name/733\",[18,24.426]],[\"parent/733\",[336,6.271]],[\"name/734\",[337,63.48]],[\"parent/734\",[338,5.434]],[\"name/735\",[339,63.48]],[\"parent/735\",[338,5.434]],[\"name/736\",[340,63.48]],[\"parent/736\",[338,5.434]],[\"name/737\",[235,46.134]],[\"parent/737\",[114,3.232]],[\"name/738\",[18,24.426]],[\"parent/738\",[341,6.271]],[\"name/739\",[237,46.134]],[\"parent/739\",[342,4.822]],[\"name/740\",[239,45.021]],[\"parent/740\",[342,4.822]],[\"name/741\",[240,46.134]],[\"parent/741\",[342,4.822]],[\"name/742\",[243,46.134]],[\"parent/742\",[342,4.822]],[\"name/743\",[241,46.134]],[\"parent/743\",[342,4.822]],[\"name/744\",[242,46.134]],[\"parent/744\",[342,4.822]],[\"name/745\",[343,63.48]],[\"parent/745\",[114,3.232]],[\"name/746\",[18,24.426]],[\"parent/746\",[344,6.271]],[\"name/747\",[345,63.48]],[\"parent/747\",[346,4.557]],[\"name/748\",[347,63.48]],[\"parent/748\",[346,4.557]],[\"name/749\",[19,50.487]],[\"parent/749\",[346,4.557]],[\"name/750\",[348,63.48]],[\"parent/750\",[346,4.557]],[\"name/751\",[349,63.48]],[\"parent/751\",[346,4.557]],[\"name/752\",[350,63.48]],[\"parent/752\",[346,4.557]],[\"name/753\",[351,63.48]],[\"parent/753\",[346,4.557]],[\"name/754\",[352,63.48]],[\"parent/754\",[346,4.557]],[\"name/755\",[353,63.48]],[\"parent/755\",[114,3.232]],[\"name/756\",[227,41.507]],[\"parent/756\",[134,4.349]],[\"name/757\",[18,24.426]],[\"parent/757\",[354,6.271]],[\"name/758\",[135,55.007]],[\"parent/758\",[355,5.434]],[\"name/759\",[111,55.007]],[\"parent/759\",[355,5.434]],[\"name/760\",[136,55.007]],[\"parent/760\",[355,5.434]],[\"name/761\",[245,44.021]],[\"parent/761\",[134,4.349]],[\"name/762\",[18,24.426]],[\"parent/762\",[356,6.271]],[\"name/763\",[357,55.007]],[\"parent/763\",[358,5.434]],[\"name/764\",[359,63.48]],[\"parent/764\",[358,5.434]],[\"name/765\",[360,55.007]],[\"parent/765\",[358,5.434]],[\"name/766\",[235,46.134]],[\"parent/766\",[134,4.349]],[\"name/767\",[18,24.426]],[\"parent/767\",[361,6.271]],[\"name/768\",[237,46.134]],[\"parent/768\",[362,4.557]],[\"name/769\",[239,45.021]],[\"parent/769\",[362,4.557]],[\"name/770\",[240,46.134]],[\"parent/770\",[362,4.557]],[\"name/771\",[243,46.134]],[\"parent/771\",[362,4.557]],[\"name/772\",[363,63.48]],[\"parent/772\",[362,4.557]],[\"name/773\",[241,46.134]],[\"parent/773\",[362,4.557]],[\"name/774\",[242,46.134]],[\"parent/774\",[362,4.557]],[\"name/775\",[244,50.487]],[\"parent/775\",[362,4.557]],[\"name/776\",[364,55.007]],[\"parent/776\",[134,4.349]],[\"name/777\",[18,24.426]],[\"parent/777\",[365,6.271]],[\"name/778\",[170,58.371]],[\"parent/778\",[366,4.822]],[\"name/779\",[239,45.021]],[\"parent/779\",[366,4.822]],[\"name/780\",[367,63.48]],[\"parent/780\",[366,4.822]],[\"name/781\",[368,63.48]],[\"parent/781\",[366,4.822]],[\"name/782\",[369,63.48]],[\"parent/782\",[366,4.822]],[\"name/783\",[370,63.48]],[\"parent/783\",[366,4.822]],[\"name/784\",[227,41.507]],[\"parent/784\",[138,3.688]],[\"name/785\",[18,24.426]],[\"parent/785\",[371,6.271]],[\"name/786\",[141,48.816]],[\"parent/786\",[372,4.447]],[\"name/787\",[373,58.371]],[\"parent/787\",[372,4.447]],[\"name/788\",[142,48.816]],[\"parent/788\",[372,4.447]],[\"name/789\",[139,55.007]],[\"parent/789\",[372,4.447]],[\"name/790\",[374,63.48]],[\"parent/790\",[372,4.447]],[\"name/791\",[140,55.007]],[\"parent/791\",[372,4.447]],[\"name/792\",[64,48.816]],[\"parent/792\",[372,4.447]],[\"name/793\",[66,48.816]],[\"parent/793\",[372,4.447]],[\"name/794\",[67,48.816]],[\"parent/794\",[372,4.447]],[\"name/795\",[364,55.007]],[\"parent/795\",[138,3.688]],[\"name/796\",[245,44.021]],[\"parent/796\",[138,3.688]],[\"name/797\",[18,24.426]],[\"parent/797\",[375,6.271]],[\"name/798\",[357,55.007]],[\"parent/798\",[376,4.557]],[\"name/799\",[377,63.48]],[\"parent/799\",[376,4.557]],[\"name/800\",[258,58.371]],[\"parent/800\",[376,4.557]],[\"name/801\",[259,58.371]],[\"parent/801\",[376,4.557]],[\"name/802\",[378,58.371]],[\"parent/802\",[376,4.557]],[\"name/803\",[379,63.48]],[\"parent/803\",[376,4.557]],[\"name/804\",[380,63.48]],[\"parent/804\",[376,4.557]],[\"name/805\",[360,55.007]],[\"parent/805\",[376,4.557]],[\"name/806\",[381,63.48]],[\"parent/806\",[138,3.688]],[\"name/807\",[382,58.371]],[\"parent/807\",[138,3.688]],[\"name/808\",[227,41.507]],[\"parent/808\",[144,3.472]],[\"name/809\",[18,24.426]],[\"parent/809\",[383,6.271]],[\"name/810\",[373,58.371]],[\"parent/810\",[384,4.1]],[\"name/811\",[142,48.816]],[\"parent/811\",[384,4.1]],[\"name/812\",[141,48.816]],[\"parent/812\",[384,4.1]],[\"name/813\",[100,48.816]],[\"parent/813\",[384,4.1]],[\"name/814\",[106,48.816]],[\"parent/814\",[384,4.1]],[\"name/815\",[101,48.816]],[\"parent/815\",[384,4.1]],[\"name/816\",[146,55.007]],[\"parent/816\",[384,4.1]],[\"name/817\",[108,48.816]],[\"parent/817\",[384,4.1]],[\"name/818\",[109,48.816]],[\"parent/818\",[384,4.1]],[\"name/819\",[103,48.816]],[\"parent/819\",[384,4.1]],[\"name/820\",[104,48.816]],[\"parent/820\",[384,4.1]],[\"name/821\",[102,48.816]],[\"parent/821\",[384,4.1]],[\"name/822\",[105,48.816]],[\"parent/822\",[384,4.1]],[\"name/823\",[364,55.007]],[\"parent/823\",[144,3.472]],[\"name/824\",[245,44.021]],[\"parent/824\",[144,3.472]],[\"name/825\",[18,24.426]],[\"parent/825\",[385,6.271]],[\"name/826\",[357,55.007]],[\"parent/826\",[386,4.557]],[\"name/827\",[378,58.371]],[\"parent/827\",[386,4.557]],[\"name/828\",[360,55.007]],[\"parent/828\",[386,4.557]],[\"name/829\",[307,58.371]],[\"parent/829\",[386,4.557]],[\"name/830\",[309,58.371]],[\"parent/830\",[386,4.557]],[\"name/831\",[310,58.371]],[\"parent/831\",[386,4.557]],[\"name/832\",[387,63.48]],[\"parent/832\",[386,4.557]],[\"name/833\",[388,63.48]],[\"parent/833\",[386,4.557]],[\"name/834\",[389,63.48]],[\"parent/834\",[144,3.472]],[\"name/835\",[382,58.371]],[\"parent/835\",[144,3.472]],[\"name/836\",[227,41.507]],[\"parent/836\",[148,4.557]],[\"name/837\",[18,24.426]],[\"parent/837\",[390,6.271]],[\"name/838\",[149,55.007]],[\"parent/838\",[391,5.434]],[\"name/839\",[150,55.007]],[\"parent/839\",[391,5.434]],[\"name/840\",[151,55.007]],[\"parent/840\",[391,5.434]],[\"name/841\",[392,63.48]],[\"parent/841\",[148,4.557]],[\"name/842\",[166,58.371]],[\"parent/842\",[153,3.902]],[\"name/843\",[165,58.371]],[\"parent/843\",[153,3.902]],[\"name/844\",[227,41.507]],[\"parent/844\",[153,3.902]],[\"name/845\",[18,24.426]],[\"parent/845\",[393,6.271]],[\"name/846\",[154,55.007]],[\"parent/846\",[394,4.349]],[\"name/847\",[155,55.007]],[\"parent/847\",[394,4.349]],[\"name/848\",[156,55.007]],[\"parent/848\",[394,4.349]],[\"name/849\",[157,55.007]],[\"parent/849\",[394,4.349]],[\"name/850\",[158,55.007]],[\"parent/850\",[394,4.349]],[\"name/851\",[159,55.007]],[\"parent/851\",[394,4.349]],[\"name/852\",[160,55.007]],[\"parent/852\",[394,4.349]],[\"name/853\",[161,55.007]],[\"parent/853\",[394,4.349]],[\"name/854\",[162,55.007]],[\"parent/854\",[394,4.349]],[\"name/855\",[163,55.007]],[\"parent/855\",[394,4.349]]],\"invertedIndex\":[[\"__type\",{\"_index\":18,\"name\":{\"18\":{},\"44\":{},\"102\":{},\"118\":{},\"134\":{},\"159\":{},\"177\":{},\"193\":{},\"210\":{},\"234\":{},\"277\":{},\"308\":{},\"329\":{},\"364\":{},\"390\":{},\"409\":{},\"443\":{},\"445\":{},\"447\":{},\"449\":{},\"451\":{},\"453\":{},\"455\":{},\"461\":{},\"463\":{},\"465\":{},\"467\":{},\"469\":{},\"471\":{},\"475\":{},\"477\":{},\"483\":{},\"485\":{},\"488\":{},\"489\":{},\"490\":{},\"491\":{},\"492\":{},\"527\":{},\"533\":{},\"544\":{},\"548\":{},\"557\":{},\"560\":{},\"568\":{},\"578\":{},\"585\":{},\"592\":{},\"602\":{},\"607\":{},\"612\":{},\"615\":{},\"623\":{},\"627\":{},\"636\":{},\"647\":{},\"656\":{},\"659\":{},\"671\":{},\"682\":{},\"694\":{},\"733\":{},\"738\":{},\"746\":{},\"757\":{},\"762\":{},\"767\":{},\"777\":{},\"785\":{},\"797\":{},\"809\":{},\"825\":{},\"837\":{},\"845\":{}},\"parent\":{}}],[\"_session\",{\"_index\":215,\"name\":{\"496\":{}},\"parent\":{}}],[\"addroletouser\",{\"_index\":154,\"name\":{\"397\":{},\"412\":{},\"846\":{}},\"parent\":{}}],[\"alg\",{\"_index\":289,\"name\":{\"632\":{}},\"parent\":{}}],[\"alloweddomainsclaim\",{\"_index\":291,\"name\":{\"634\":{}},\"parent\":{}}],[\"anticsrfcheck\",{\"_index\":313,\"name\":{\"689\":{}},\"parent\":{}}],[\"apiinterface\",{\"_index\":245,\"name\":{\"556\":{},\"577\":{},\"601\":{},\"611\":{},\"655\":{},\"681\":{},\"732\":{},\"761\":{},\"796\":{},\"824\":{}},\"parent\":{}}],[\"apioptions\",{\"_index\":235,\"name\":{\"547\":{},\"567\":{},\"591\":{},\"614\":{},\"646\":{},\"670\":{},\"737\":{},\"766\":{}},\"parent\":{}}],[\"appinfo\",{\"_index\":244,\"name\":{\"555\":{},\"570\":{},\"594\":{},\"673\":{},\"775\":{}},\"parent\":{}}],[\"appleredirecthandlerpost\",{\"_index\":360,\"name\":{\"765\":{},\"805\":{},\"828\":{}},\"parent\":{}}],[\"assertclaims\",{\"_index\":334,\"name\":{\"726\":{}},\"parent\":{}}],[\"associateusertotenant\",{\"_index\":93,\"name\":{\"189\":{},\"200\":{},\"644\":{}},\"parent\":{}}],[\"attachtorequestresponse\",{\"_index\":335,\"name\":{\"731\":{}},\"parent\":{}}],[\"authorisationurlget\",{\"_index\":357,\"name\":{\"763\":{},\"798\":{},\"826\":{}},\"parent\":{}}],[\"awslambda\",{\"_index\":28,\"name\":{\"42\":{},\"50\":{}},\"parent\":{}}],[\"baserequest\",{\"_index\":179,\"name\":{\"438\":{}},\"parent\":{}}],[\"baseresponse\",{\"_index\":190,\"name\":{\"456\":{}},\"parent\":{}}],[\"body\",{\"_index\":219,\"name\":{\"512\":{}},\"parent\":{}}],[\"cancreateprimaryuser\",{\"_index\":48,\"name\":{\"90\":{},\"105\":{},\"535\":{}},\"parent\":{}}],[\"canlinkaccounts\",{\"_index\":50,\"name\":{\"92\":{},\"107\":{},\"537\":{}},\"parent\":{}}],[\"checkdatabase\",{\"_index\":316,\"name\":{\"691\":{}},\"parent\":{}}],[\"clearusermetadata\",{\"_index\":151,\"name\":{\"387\":{},\"393\":{},\"840\":{}},\"parent\":{}}],[\"collectingresponse\",{\"_index\":216,\"name\":{\"507\":{}},\"parent\":{}}],[\"config\",{\"_index\":239,\"name\":{\"550\":{},\"571\":{},\"595\":{},\"617\":{},\"649\":{},\"674\":{},\"740\":{},\"769\":{},\"779\":{}},\"parent\":{}}],[\"constructor\",{\"_index\":21,\"name\":{\"35\":{},\"82\":{},\"86\":{},\"113\":{},\"119\":{},\"145\":{},\"170\":{},\"180\":{},\"202\":{},\"214\":{},\"250\":{},\"300\":{},\"312\":{},\"342\":{},\"382\":{},\"394\":{},\"422\":{},\"424\":{},\"428\":{},\"439\":{},\"457\":{},\"494\":{},\"508\":{}},\"parent\":{}}],[\"consumecode\",{\"_index\":101,\"name\":{\"219\":{},\"238\":{},\"350\":{},\"370\":{},\"662\":{},\"815\":{}},\"parent\":{}}],[\"consumecodepost\",{\"_index\":310,\"name\":{\"685\":{},\"831\":{}},\"parent\":{}}],[\"consumepasswordresettoken\",{\"_index\":66,\"name\":{\"127\":{},\"140\":{},\"322\":{},\"337\":{},\"565\":{},\"793\":{}},\"parent\":{}}],[\"converttorecipeuserid\",{\"_index\":13,\"name\":{\"13\":{},\"33\":{}},\"parent\":{}}],[\"cookies\",{\"_index\":206,\"name\":{\"479\":{},\"487\":{},\"511\":{}},\"parent\":{}}],[\"createcode\",{\"_index\":100,\"name\":{\"218\":{},\"236\":{},\"349\":{},\"368\":{},\"660\":{},\"813\":{}},\"parent\":{}}],[\"createcodepost\",{\"_index\":307,\"name\":{\"683\":{},\"829\":{}},\"parent\":{}}],[\"createemailverificationlink\",{\"_index\":74,\"name\":{\"150\":{},\"163\":{}},\"parent\":{}}],[\"createemailverificationtoken\",{\"_index\":73,\"name\":{\"149\":{},\"162\":{},\"586\":{}},\"parent\":{}}],[\"createjwt\",{\"_index\":83,\"name\":{\"173\":{},\"178\":{},\"206\":{},\"212\":{},\"272\":{},\"293\":{},\"624\":{}},\"parent\":{}}],[\"createmagiclink\",{\"_index\":110,\"name\":{\"228\":{},\"246\":{},\"359\":{},\"378\":{}},\"parent\":{}}],[\"createnewcodefordevice\",{\"_index\":106,\"name\":{\"224\":{},\"237\":{},\"355\":{},\"369\":{},\"661\":{},\"814\":{}},\"parent\":{}}],[\"createnewemailpasswordrecipeuser\",{\"_index\":374,\"name\":{\"790\":{}},\"parent\":{}}],[\"createnewrecipeuser\",{\"_index\":251,\"name\":{\"562\":{}},\"parent\":{}}],[\"createnewroleoraddpermissions\",{\"_index\":158,\"name\":{\"401\":{},\"416\":{},\"850\":{}},\"parent\":{}}],[\"createnewsession\",{\"_index\":115,\"name\":{\"253\":{},\"279\":{},\"695\":{}},\"parent\":{}}],[\"createnewsessionwithoutrequestresponse\",{\"_index\":116,\"name\":{\"254\":{},\"280\":{}},\"parent\":{}}],[\"createorupdatetenant\",{\"_index\":87,\"name\":{\"183\":{},\"194\":{},\"638\":{}},\"parent\":{}}],[\"createorupdatethirdpartyconfig\",{\"_index\":91,\"name\":{\"187\":{},\"198\":{},\"642\":{}},\"parent\":{}}],[\"createprimaryuser\",{\"_index\":49,\"name\":{\"91\":{},\"106\":{},\"536\":{}},\"parent\":{}}],[\"createprimaryuseridorlinkaccounts\",{\"_index\":53,\"name\":{\"95\":{},\"103\":{}},\"parent\":{}}],[\"createresetpasswordlink\",{\"_index\":68,\"name\":{\"129\":{},\"142\":{},\"324\":{},\"339\":{}},\"parent\":{}}],[\"createresetpasswordtoken\",{\"_index\":64,\"name\":{\"125\":{},\"138\":{},\"320\":{},\"335\":{},\"564\":{},\"792\":{}},\"parent\":{}}],[\"createuseridmapping\",{\"_index\":7,\"name\":{\"7\":{},\"26\":{}},\"parent\":{}}],[\"customclaimsinaccesstokenpayload\",{\"_index\":350,\"name\":{\"752\":{}},\"parent\":{}}],[\"dashboardget\",{\"_index\":247,\"name\":{\"558\":{}},\"parent\":{}}],[\"default\",{\"_index\":16,\"name\":{\"16\":{},\"43\":{},\"81\":{},\"85\":{},\"100\":{},\"116\":{},\"132\":{},\"157\":{},\"175\":{},\"191\":{},\"208\":{},\"232\":{},\"275\":{},\"306\":{},\"327\":{},\"362\":{},\"388\":{},\"407\":{}},\"parent\":{}}],[\"deleterole\",{\"_index\":162,\"name\":{\"405\":{},\"420\":{},\"854\":{}},\"parent\":{}}],[\"deletetenant\",{\"_index\":88,\"name\":{\"184\":{},\"195\":{},\"639\":{}},\"parent\":{}}],[\"deletethirdpartyconfig\",{\"_index\":92,\"name\":{\"188\":{},\"199\":{},\"643\":{}},\"parent\":{}}],[\"deleteuser\",{\"_index\":6,\"name\":{\"6\":{},\"32\":{},\"542\":{}},\"parent\":{}}],[\"deleteuseridmapping\",{\"_index\":9,\"name\":{\"9\":{},\"28\":{}},\"parent\":{}}],[\"disassociateuserfromtenant\",{\"_index\":94,\"name\":{\"190\":{},\"201\":{},\"645\":{}},\"parent\":{}}],[\"e\",{\"_index\":288,\"name\":{\"631\":{}},\"parent\":{}}],[\"email\",{\"_index\":274,\"name\":{\"609\":{}},\"parent\":{}}],[\"emaildelivery\",{\"_index\":254,\"name\":{\"576\":{},\"600\":{},\"679\":{}},\"parent\":{}}],[\"emailexistsget\",{\"_index\":256,\"name\":{\"579\":{},\"686\":{}},\"parent\":{}}],[\"emailpasswordapioptions\",{\"_index\":381,\"name\":{\"806\":{}},\"parent\":{}}],[\"emailpasswordemailexistsget\",{\"_index\":377,\"name\":{\"799\":{}},\"parent\":{}}],[\"emailpasswordsignin\",{\"_index\":140,\"name\":{\"317\":{},\"334\":{},\"791\":{}},\"parent\":{}}],[\"emailpasswordsigninpost\",{\"_index\":379,\"name\":{\"803\":{}},\"parent\":{}}],[\"emailpasswordsignup\",{\"_index\":139,\"name\":{\"316\":{},\"333\":{},\"789\":{}},\"parent\":{}}],[\"emailpasswordsignuppost\",{\"_index\":380,\"name\":{\"804\":{}},\"parent\":{}}],[\"emails\",{\"_index\":173,\"name\":{\"432\":{}},\"parent\":{}}],[\"emailverificationclaim\",{\"_index\":81,\"name\":{\"161\":{},\"610\":{}},\"parent\":{}}],[\"error\",{\"_index\":15,\"name\":{\"15\":{},\"19\":{},\"122\":{},\"135\":{},\"148\":{},\"160\":{},\"217\":{},\"235\":{},\"271\":{},\"278\":{},\"303\":{},\"309\":{},\"315\":{},\"330\":{},\"345\":{},\"365\":{}},\"parent\":{}}],[\"errorhandler\",{\"_index\":35,\"name\":{\"57\":{},\"60\":{},\"65\":{}},\"parent\":{}}],[\"exchangeauthcodeforoauthtokens\",{\"_index\":369,\"name\":{\"782\":{}},\"parent\":{}}],[\"expiry\",{\"_index\":349,\"name\":{\"751\":{}},\"parent\":{}}],[\"express\",{\"_index\":23,\"name\":{\"37\":{},\"45\":{}},\"parent\":{}}],[\"fastify\",{\"_index\":24,\"name\":{\"38\":{},\"46\":{}},\"parent\":{}}],[\"fetchandsetclaim\",{\"_index\":128,\"name\":{\"266\":{},\"296\":{},\"708\":{},\"727\":{}},\"parent\":{}}],[\"framework\",{\"_index\":22,\"name\":{\"36\":{}},\"parent\":{\"37\":{},\"38\":{},\"39\":{},\"40\":{},\"41\":{},\"42\":{},\"43\":{},\"44\":{},\"438\":{},\"456\":{}}}],[\"framework.__type\",{\"_index\":29,\"name\":{},\"parent\":{\"45\":{},\"46\":{},\"47\":{},\"48\":{},\"49\":{},\"50\":{}}}],[\"framework.baserequest\",{\"_index\":180,\"name\":{},\"parent\":{\"439\":{},\"440\":{},\"441\":{},\"442\":{},\"443\":{},\"444\":{},\"445\":{},\"446\":{},\"447\":{},\"448\":{},\"449\":{},\"450\":{},\"451\":{},\"452\":{},\"453\":{},\"454\":{},\"455\":{}}}],[\"framework.baseresponse\",{\"_index\":191,\"name\":{},\"parent\":{\"457\":{},\"458\":{},\"459\":{},\"460\":{},\"461\":{},\"462\":{},\"463\":{},\"464\":{},\"465\":{},\"466\":{},\"467\":{},\"468\":{},\"469\":{},\"470\":{},\"471\":{}}}],[\"framework/awslambda\",{\"_index\":30,\"name\":{\"51\":{}},\"parent\":{\"52\":{},\"53\":{},\"54\":{},\"472\":{},\"480\":{}}}],[\"framework/awslambda.sessionevent\",{\"_index\":200,\"name\":{},\"parent\":{\"473\":{},\"474\":{},\"475\":{}}}],[\"framework/awslambda.sessionevent.__type\",{\"_index\":203,\"name\":{},\"parent\":{\"476\":{},\"477\":{}}}],[\"framework/awslambda.sessionevent.__type.__type\",{\"_index\":205,\"name\":{},\"parent\":{\"478\":{},\"479\":{}}}],[\"framework/awslambda.sessioneventv2\",{\"_index\":208,\"name\":{},\"parent\":{\"481\":{},\"482\":{},\"483\":{},\"488\":{}}}],[\"framework/awslambda.sessioneventv2.__type\",{\"_index\":209,\"name\":{},\"parent\":{\"484\":{},\"485\":{},\"489\":{},\"492\":{}}}],[\"framework/awslambda.sessioneventv2.__type.__type\",{\"_index\":210,\"name\":{},\"parent\":{\"486\":{},\"487\":{},\"490\":{}}}],[\"framework/awslambda.sessioneventv2.__type.__type.__type\",{\"_index\":211,\"name\":{},\"parent\":{\"491\":{}}}],[\"framework/custom\",{\"_index\":34,\"name\":{\"55\":{}},\"parent\":{\"56\":{},\"57\":{},\"493\":{},\"507\":{}}}],[\"framework/custom.collectingresponse\",{\"_index\":217,\"name\":{},\"parent\":{\"508\":{},\"509\":{},\"510\":{},\"511\":{},\"512\":{},\"513\":{},\"514\":{},\"515\":{},\"516\":{},\"517\":{},\"518\":{},\"519\":{},\"520\":{}}}],[\"framework/custom.preparsedrequest\",{\"_index\":213,\"name\":{},\"parent\":{\"494\":{},\"495\":{},\"496\":{},\"497\":{},\"498\":{},\"499\":{},\"500\":{},\"501\":{},\"502\":{},\"503\":{},\"504\":{},\"505\":{},\"506\":{}}}],[\"framework/express\",{\"_index\":36,\"name\":{\"58\":{}},\"parent\":{\"59\":{},\"60\":{},\"61\":{},\"62\":{},\"521\":{}}}],[\"framework/express.sessionrequest\",{\"_index\":221,\"name\":{},\"parent\":{\"522\":{}}}],[\"framework/fastify\",{\"_index\":37,\"name\":{\"63\":{}},\"parent\":{\"64\":{},\"65\":{},\"66\":{},\"67\":{},\"523\":{}}}],[\"framework/fastify.sessionrequest\",{\"_index\":222,\"name\":{},\"parent\":{\"524\":{}}}],[\"framework/hapi\",{\"_index\":39,\"name\":{\"68\":{}},\"parent\":{\"69\":{},\"70\":{},\"71\":{},\"525\":{}}}],[\"framework/hapi.sessionrequest\",{\"_index\":223,\"name\":{},\"parent\":{\"526\":{},\"527\":{}}}],[\"framework/koa\",{\"_index\":40,\"name\":{\"72\":{}},\"parent\":{\"73\":{},\"74\":{},\"75\":{},\"528\":{}}}],[\"framework/koa.sessioncontext\",{\"_index\":225,\"name\":{},\"parent\":{\"529\":{}}}],[\"framework/loopback\",{\"_index\":41,\"name\":{\"76\":{}},\"parent\":{\"77\":{},\"78\":{},\"79\":{},\"530\":{}}}],[\"framework/loopback.sessioncontext\",{\"_index\":226,\"name\":{},\"parent\":{\"531\":{}}}],[\"generateemailverifytokenpost\",{\"_index\":270,\"name\":{\"605\":{}},\"parent\":{}}],[\"generatepasswordresettokenpost\",{\"_index\":258,\"name\":{\"580\":{},\"800\":{}},\"parent\":{}}],[\"getaccesstoken\",{\"_index\":331,\"name\":{\"722\":{}},\"parent\":{}}],[\"getaccesstokenpayload\",{\"_index\":328,\"name\":{\"719\":{}},\"parent\":{}}],[\"getallcorsheaders\",{\"_index\":2,\"name\":{\"2\":{},\"22\":{}},\"parent\":{}}],[\"getallroles\",{\"_index\":163,\"name\":{\"406\":{},\"421\":{},\"855\":{}},\"parent\":{}}],[\"getallsessionhandlesforuser\",{\"_index\":123,\"name\":{\"261\":{},\"288\":{},\"701\":{}},\"parent\":{}}],[\"getallsessiontokensdangerously\",{\"_index\":330,\"name\":{\"721\":{}},\"parent\":{}}],[\"getasstring\",{\"_index\":168,\"name\":{\"426\":{}},\"parent\":{}}],[\"getauthorisationredirecturl\",{\"_index\":368,\"name\":{\"781\":{}},\"parent\":{}}],[\"getclaimvalue\",{\"_index\":130,\"name\":{\"268\":{},\"298\":{},\"710\":{},\"729\":{}},\"parent\":{}}],[\"getconfigforclienttype\",{\"_index\":367,\"name\":{\"780\":{}},\"parent\":{}}],[\"getcookievalue\",{\"_index\":186,\"name\":{\"448\":{},\"502\":{}},\"parent\":{}}],[\"getdashboardbundlelocation\",{\"_index\":232,\"name\":{\"545\":{}},\"parent\":{}}],[\"getexpiry\",{\"_index\":333,\"name\":{\"725\":{}},\"parent\":{}}],[\"getformdata\",{\"_index\":189,\"name\":{\"454\":{},\"498\":{}},\"parent\":{}}],[\"getglobalclaimvalidators\",{\"_index\":320,\"name\":{\"696\":{}},\"parent\":{}}],[\"gethandle\",{\"_index\":329,\"name\":{\"720\":{}},\"parent\":{}}],[\"getheadervalue\",{\"_index\":187,\"name\":{\"450\":{},\"503\":{}},\"parent\":{}}],[\"getjsonbody\",{\"_index\":184,\"name\":{\"444\":{},\"500\":{}},\"parent\":{}}],[\"getjwks\",{\"_index\":84,\"name\":{\"174\":{},\"179\":{},\"207\":{},\"213\":{},\"273\":{},\"294\":{},\"625\":{}},\"parent\":{}}],[\"getjwksget\",{\"_index\":276,\"name\":{\"613\":{}},\"parent\":{}}],[\"getkeyvaluefromquery\",{\"_index\":183,\"name\":{\"442\":{},\"499\":{}},\"parent\":{}}],[\"getmethod\",{\"_index\":185,\"name\":{\"446\":{},\"501\":{}},\"parent\":{}}],[\"getopeniddiscoveryconfiguration\",{\"_index\":97,\"name\":{\"205\":{},\"211\":{},\"274\":{},\"295\":{}},\"parent\":{}}],[\"getoriginalurl\",{\"_index\":188,\"name\":{\"452\":{},\"504\":{}},\"parent\":{}}],[\"getpermissionsforrole\",{\"_index\":159,\"name\":{\"402\":{},\"417\":{},\"851\":{}},\"parent\":{}}],[\"getprimaryuserthatcanbelinkedtorecipeuserid\",{\"_index\":54,\"name\":{\"96\":{},\"104\":{}},\"parent\":{}}],[\"getprovider\",{\"_index\":135,\"name\":{\"304\":{},\"310\":{},\"758\":{}},\"parent\":{}}],[\"getrecipeuserid\",{\"_index\":327,\"name\":{\"717\":{}},\"parent\":{}}],[\"getrequestfromusercontext\",{\"_index\":14,\"name\":{\"14\":{},\"34\":{}},\"parent\":{}}],[\"getrolesforuser\",{\"_index\":156,\"name\":{\"399\":{},\"414\":{},\"848\":{}},\"parent\":{}}],[\"getrolesthathavepermission\",{\"_index\":161,\"name\":{\"404\":{},\"419\":{},\"853\":{}},\"parent\":{}}],[\"getsession\",{\"_index\":117,\"name\":{\"255\":{},\"282\":{},\"697\":{}},\"parent\":{}}],[\"getsessiondatafromdatabase\",{\"_index\":325,\"name\":{\"714\":{}},\"parent\":{}}],[\"getsessioninformation\",{\"_index\":119,\"name\":{\"257\":{},\"284\":{},\"699\":{}},\"parent\":{}}],[\"getsessionwithoutrequestresponse\",{\"_index\":118,\"name\":{\"256\":{},\"283\":{}},\"parent\":{}}],[\"gettenant\",{\"_index\":89,\"name\":{\"185\":{},\"196\":{},\"640\":{}},\"parent\":{}}],[\"gettenantid\",{\"_index\":293,\"name\":{\"637\":{},\"718\":{}},\"parent\":{}}],[\"gettimecreated\",{\"_index\":332,\"name\":{\"724\":{}},\"parent\":{}}],[\"getuser\",{\"_index\":11,\"name\":{\"11\":{},\"30\":{},\"540\":{}},\"parent\":{}}],[\"getusercount\",{\"_index\":3,\"name\":{\"3\":{},\"23\":{}},\"parent\":{}}],[\"getuserid\",{\"_index\":326,\"name\":{\"716\":{}},\"parent\":{}}],[\"getuseridmapping\",{\"_index\":8,\"name\":{\"8\":{},\"27\":{}},\"parent\":{}}],[\"getuserinfo\",{\"_index\":370,\"name\":{\"783\":{}},\"parent\":{}}],[\"getusermetadata\",{\"_index\":149,\"name\":{\"385\":{},\"391\":{},\"838\":{}},\"parent\":{}}],[\"getusers\",{\"_index\":229,\"name\":{\"534\":{}},\"parent\":{}}],[\"getusersnewestfirst\",{\"_index\":5,\"name\":{\"5\":{},\"25\":{}},\"parent\":{}}],[\"getusersoldestfirst\",{\"_index\":4,\"name\":{\"4\":{},\"24\":{}},\"parent\":{}}],[\"getusersthathaverole\",{\"_index\":157,\"name\":{\"400\":{},\"415\":{},\"849\":{}},\"parent\":{}}],[\"hapi\",{\"_index\":25,\"name\":{\"39\":{},\"47\":{}},\"parent\":{}}],[\"headers\",{\"_index\":204,\"name\":{\"478\":{},\"486\":{},\"510\":{}},\"parent\":{}}],[\"id\",{\"_index\":170,\"name\":{\"429\":{},\"778\":{}},\"parent\":{}}],[\"index\",{\"_index\":0,\"name\":{\"0\":{}},\"parent\":{\"1\":{},\"2\":{},\"3\":{},\"4\":{},\"5\":{},\"6\":{},\"7\":{},\"8\":{},\"9\":{},\"10\":{},\"11\":{},\"12\":{},\"13\":{},\"14\":{},\"15\":{},\"16\":{},\"423\":{},\"427\":{}}}],[\"index.default\",{\"_index\":17,\"name\":{},\"parent\":{\"17\":{},\"18\":{},\"19\":{},\"20\":{},\"21\":{},\"22\":{},\"23\":{},\"24\":{},\"25\":{},\"26\":{},\"27\":{},\"28\":{},\"29\":{},\"30\":{},\"31\":{},\"32\":{},\"33\":{},\"34\":{},\"35\":{}}}],[\"index.recipeuserid\",{\"_index\":167,\"name\":{},\"parent\":{\"424\":{},\"425\":{},\"426\":{}}}],[\"index.user\",{\"_index\":169,\"name\":{},\"parent\":{\"428\":{},\"429\":{},\"430\":{},\"431\":{},\"432\":{},\"433\":{},\"434\":{},\"435\":{},\"436\":{},\"437\":{}}}],[\"ingredientinterfaceimpl\",{\"_index\":44,\"name\":{\"83\":{},\"87\":{}},\"parent\":{}}],[\"ingredients/emaildelivery\",{\"_index\":42,\"name\":{\"80\":{}},\"parent\":{\"81\":{}}}],[\"ingredients/emaildelivery.default\",{\"_index\":43,\"name\":{},\"parent\":{\"82\":{},\"83\":{}}}],[\"ingredients/smsdelivery\",{\"_index\":45,\"name\":{\"84\":{}},\"parent\":{\"85\":{}}}],[\"ingredients/smsdelivery.default\",{\"_index\":46,\"name\":{},\"parent\":{\"86\":{},\"87\":{}}}],[\"init\",{\"_index\":1,\"name\":{\"1\":{},\"17\":{},\"89\":{},\"101\":{},\"115\":{},\"117\":{},\"121\":{},\"133\":{},\"147\":{},\"158\":{},\"172\":{},\"176\":{},\"182\":{},\"192\":{},\"204\":{},\"209\":{},\"216\":{},\"233\":{},\"252\":{},\"276\":{},\"302\":{},\"307\":{},\"314\":{},\"328\":{},\"344\":{},\"363\":{},\"384\":{},\"389\":{},\"396\":{},\"408\":{}},\"parent\":{}}],[\"isemailchangeallowed\",{\"_index\":57,\"name\":{\"99\":{},\"112\":{}},\"parent\":{}}],[\"isemailverified\",{\"_index\":77,\"name\":{\"153\":{},\"166\":{},\"588\":{}},\"parent\":{}}],[\"isemailverifiedget\",{\"_index\":269,\"name\":{\"604\":{}},\"parent\":{}}],[\"isinserverlessenv\",{\"_index\":243,\"name\":{\"554\":{},\"573\":{},\"597\":{},\"619\":{},\"651\":{},\"676\":{},\"742\":{},\"771\":{}},\"parent\":{}}],[\"isprimaryuser\",{\"_index\":171,\"name\":{\"430\":{}},\"parent\":{}}],[\"issigninallowed\",{\"_index\":56,\"name\":{\"98\":{},\"111\":{}},\"parent\":{}}],[\"issignupallowed\",{\"_index\":55,\"name\":{\"97\":{},\"110\":{}},\"parent\":{}}],[\"jsonobject\",{\"_index\":392,\"name\":{\"841\":{}},\"parent\":{}}],[\"jsonwebkey\",{\"_index\":282,\"name\":{\"626\":{}},\"parent\":{}}],[\"kid\",{\"_index\":286,\"name\":{\"629\":{}},\"parent\":{}}],[\"koa\",{\"_index\":27,\"name\":{\"41\":{},\"49\":{}},\"parent\":{}}],[\"kty\",{\"_index\":284,\"name\":{\"628\":{}},\"parent\":{}}],[\"linkaccounts\",{\"_index\":51,\"name\":{\"93\":{},\"108\":{},\"538\":{}},\"parent\":{}}],[\"listalltenants\",{\"_index\":90,\"name\":{\"186\":{},\"197\":{},\"641\":{}},\"parent\":{}}],[\"listcodesbydeviceid\",{\"_index\":102,\"name\":{\"220\":{},\"244\":{},\"351\":{},\"376\":{},\"668\":{},\"821\":{}},\"parent\":{}}],[\"listcodesbyemail\",{\"_index\":103,\"name\":{\"221\":{},\"242\":{},\"352\":{},\"374\":{},\"666\":{},\"819\":{}},\"parent\":{}}],[\"listcodesbyphonenumber\",{\"_index\":104,\"name\":{\"222\":{},\"243\":{},\"353\":{},\"375\":{},\"667\":{},\"820\":{}},\"parent\":{}}],[\"listcodesbypreauthsessionid\",{\"_index\":105,\"name\":{\"223\":{},\"245\":{},\"354\":{},\"377\":{},\"669\":{},\"822\":{}},\"parent\":{}}],[\"listusersbyaccountinfo\",{\"_index\":12,\"name\":{\"12\":{},\"31\":{},\"541\":{}},\"parent\":{}}],[\"loginmethods\",{\"_index\":176,\"name\":{\"435\":{}},\"parent\":{}}],[\"loginmethodsget\",{\"_index\":299,\"name\":{\"657\":{}},\"parent\":{}}],[\"loopback\",{\"_index\":26,\"name\":{\"40\":{},\"48\":{}},\"parent\":{}}],[\"manuallycreateorupdateuser\",{\"_index\":136,\"name\":{\"305\":{},\"311\":{},\"760\":{}},\"parent\":{}}],[\"mergeintoaccesstokenpayload\",{\"_index\":127,\"name\":{\"265\":{},\"292\":{},\"705\":{},\"723\":{}},\"parent\":{}}],[\"middleware\",{\"_index\":31,\"name\":{\"52\":{},\"56\":{},\"59\":{},\"73\":{},\"77\":{}},\"parent\":{}}],[\"n\",{\"_index\":287,\"name\":{\"630\":{}},\"parent\":{}}],[\"original\",{\"_index\":182,\"name\":{\"441\":{},\"459\":{},\"506\":{},\"520\":{}},\"parent\":{}}],[\"overrideglobalclaimvalidators\",{\"_index\":317,\"name\":{\"692\":{}},\"parent\":{}}],[\"passwordlessapioptions\",{\"_index\":389,\"name\":{\"834\":{}},\"parent\":{}}],[\"passwordlesssigninup\",{\"_index\":145,\"name\":{\"348\":{},\"379\":{}},\"parent\":{}}],[\"passwordlessuseremailexistsget\",{\"_index\":387,\"name\":{\"832\":{}},\"parent\":{}}],[\"passwordlessuserphonenumberexistsget\",{\"_index\":388,\"name\":{\"833\":{}},\"parent\":{}}],[\"passwordresetpost\",{\"_index\":259,\"name\":{\"581\":{},\"801\":{}},\"parent\":{}}],[\"permissionclaim\",{\"_index\":165,\"name\":{\"410\":{},\"843\":{}},\"parent\":{}}],[\"phonenumberexistsget\",{\"_index\":311,\"name\":{\"687\":{}},\"parent\":{}}],[\"phonenumbers\",{\"_index\":174,\"name\":{\"433\":{}},\"parent\":{}}],[\"plugin\",{\"_index\":38,\"name\":{\"64\":{},\"69\":{}},\"parent\":{}}],[\"preparsedrequest\",{\"_index\":212,\"name\":{\"493\":{}},\"parent\":{}}],[\"providers\",{\"_index\":363,\"name\":{\"772\":{}},\"parent\":{}}],[\"recipe/accountlinking\",{\"_index\":47,\"name\":{\"88\":{}},\"parent\":{\"89\":{},\"90\":{},\"91\":{},\"92\":{},\"93\":{},\"94\":{},\"95\":{},\"96\":{},\"97\":{},\"98\":{},\"99\":{},\"100\":{},\"532\":{}}}],[\"recipe/accountlinking.default\",{\"_index\":58,\"name\":{},\"parent\":{\"101\":{},\"102\":{},\"103\":{},\"104\":{},\"105\":{},\"106\":{},\"107\":{},\"108\":{},\"109\":{},\"110\":{},\"111\":{},\"112\":{},\"113\":{}}}],[\"recipe/accountlinking.recipeinterface\",{\"_index\":228,\"name\":{},\"parent\":{\"533\":{}}}],[\"recipe/accountlinking.recipeinterface.__type\",{\"_index\":230,\"name\":{},\"parent\":{\"534\":{},\"535\":{},\"536\":{},\"537\":{},\"538\":{},\"539\":{},\"540\":{},\"541\":{},\"542\":{}}}],[\"recipe/dashboard\",{\"_index\":59,\"name\":{\"114\":{}},\"parent\":{\"115\":{},\"116\":{},\"543\":{},\"547\":{},\"556\":{}}}],[\"recipe/dashboard.apiinterface\",{\"_index\":246,\"name\":{},\"parent\":{\"557\":{}}}],[\"recipe/dashboard.apiinterface.__type\",{\"_index\":248,\"name\":{},\"parent\":{\"558\":{}}}],[\"recipe/dashboard.apioptions\",{\"_index\":236,\"name\":{},\"parent\":{\"548\":{}}}],[\"recipe/dashboard.apioptions.__type\",{\"_index\":238,\"name\":{},\"parent\":{\"549\":{},\"550\":{},\"551\":{},\"552\":{},\"553\":{},\"554\":{},\"555\":{}}}],[\"recipe/dashboard.default\",{\"_index\":60,\"name\":{},\"parent\":{\"117\":{},\"118\":{},\"119\":{}}}],[\"recipe/dashboard.recipeinterface\",{\"_index\":231,\"name\":{},\"parent\":{\"544\":{}}}],[\"recipe/dashboard.recipeinterface.__type\",{\"_index\":233,\"name\":{},\"parent\":{\"545\":{},\"546\":{}}}],[\"recipe/emailpassword\",{\"_index\":61,\"name\":{\"120\":{}},\"parent\":{\"121\":{},\"122\":{},\"123\":{},\"124\":{},\"125\":{},\"126\":{},\"127\":{},\"128\":{},\"129\":{},\"130\":{},\"131\":{},\"132\":{},\"559\":{},\"567\":{},\"577\":{}}}],[\"recipe/emailpassword.apiinterface\",{\"_index\":255,\"name\":{},\"parent\":{\"578\":{}}}],[\"recipe/emailpassword.apiinterface.__type\",{\"_index\":257,\"name\":{},\"parent\":{\"579\":{},\"580\":{},\"581\":{},\"582\":{},\"583\":{}}}],[\"recipe/emailpassword.apioptions\",{\"_index\":252,\"name\":{},\"parent\":{\"568\":{}}}],[\"recipe/emailpassword.apioptions.__type\",{\"_index\":253,\"name\":{},\"parent\":{\"569\":{},\"570\":{},\"571\":{},\"572\":{},\"573\":{},\"574\":{},\"575\":{},\"576\":{}}}],[\"recipe/emailpassword.default\",{\"_index\":71,\"name\":{},\"parent\":{\"133\":{},\"134\":{},\"135\":{},\"136\":{},\"137\":{},\"138\":{},\"139\":{},\"140\":{},\"141\":{},\"142\":{},\"143\":{},\"144\":{},\"145\":{}}}],[\"recipe/emailpassword.recipeinterface\",{\"_index\":249,\"name\":{},\"parent\":{\"560\":{}}}],[\"recipe/emailpassword.recipeinterface.__type\",{\"_index\":250,\"name\":{},\"parent\":{\"561\":{},\"562\":{},\"563\":{},\"564\":{},\"565\":{},\"566\":{}}}],[\"recipe/emailverification\",{\"_index\":72,\"name\":{\"146\":{}},\"parent\":{\"147\":{},\"148\":{},\"149\":{},\"150\":{},\"151\":{},\"152\":{},\"153\":{},\"154\":{},\"155\":{},\"156\":{},\"157\":{},\"584\":{},\"591\":{},\"601\":{},\"606\":{},\"610\":{}}}],[\"recipe/emailverification.apiinterface\",{\"_index\":266,\"name\":{},\"parent\":{\"602\":{}}}],[\"recipe/emailverification.apiinterface.__type\",{\"_index\":268,\"name\":{},\"parent\":{\"603\":{},\"604\":{},\"605\":{}}}],[\"recipe/emailverification.apioptions\",{\"_index\":264,\"name\":{},\"parent\":{\"592\":{}}}],[\"recipe/emailverification.apioptions.__type\",{\"_index\":265,\"name\":{},\"parent\":{\"593\":{},\"594\":{},\"595\":{},\"596\":{},\"597\":{},\"598\":{},\"599\":{},\"600\":{}}}],[\"recipe/emailverification.default\",{\"_index\":80,\"name\":{},\"parent\":{\"158\":{},\"159\":{},\"160\":{},\"161\":{},\"162\":{},\"163\":{},\"164\":{},\"165\":{},\"166\":{},\"167\":{},\"168\":{},\"169\":{},\"170\":{}}}],[\"recipe/emailverification.recipeinterface\",{\"_index\":262,\"name\":{},\"parent\":{\"585\":{}}}],[\"recipe/emailverification.recipeinterface.__type\",{\"_index\":263,\"name\":{},\"parent\":{\"586\":{},\"587\":{},\"588\":{},\"589\":{},\"590\":{}}}],[\"recipe/emailverification.useremailinfo\",{\"_index\":272,\"name\":{},\"parent\":{\"607\":{}}}],[\"recipe/emailverification.useremailinfo.__type\",{\"_index\":273,\"name\":{},\"parent\":{\"608\":{},\"609\":{}}}],[\"recipe/jwt\",{\"_index\":82,\"name\":{\"171\":{}},\"parent\":{\"172\":{},\"173\":{},\"174\":{},\"175\":{},\"611\":{},\"614\":{},\"622\":{},\"626\":{}}}],[\"recipe/jwt.apiinterface\",{\"_index\":275,\"name\":{},\"parent\":{\"612\":{}}}],[\"recipe/jwt.apiinterface.__type\",{\"_index\":277,\"name\":{},\"parent\":{\"613\":{}}}],[\"recipe/jwt.apioptions\",{\"_index\":278,\"name\":{},\"parent\":{\"615\":{}}}],[\"recipe/jwt.apioptions.__type\",{\"_index\":279,\"name\":{},\"parent\":{\"616\":{},\"617\":{},\"618\":{},\"619\":{},\"620\":{},\"621\":{}}}],[\"recipe/jwt.default\",{\"_index\":85,\"name\":{},\"parent\":{\"176\":{},\"177\":{},\"178\":{},\"179\":{},\"180\":{}}}],[\"recipe/jwt.jsonwebkey\",{\"_index\":283,\"name\":{},\"parent\":{\"627\":{}}}],[\"recipe/jwt.jsonwebkey.__type\",{\"_index\":285,\"name\":{},\"parent\":{\"628\":{},\"629\":{},\"630\":{},\"631\":{},\"632\":{},\"633\":{}}}],[\"recipe/jwt.recipeinterface\",{\"_index\":280,\"name\":{},\"parent\":{\"623\":{}}}],[\"recipe/jwt.recipeinterface.__type\",{\"_index\":281,\"name\":{},\"parent\":{\"624\":{},\"625\":{}}}],[\"recipe/multitenancy\",{\"_index\":86,\"name\":{\"181\":{}},\"parent\":{\"182\":{},\"183\":{},\"184\":{},\"185\":{},\"186\":{},\"187\":{},\"188\":{},\"189\":{},\"190\":{},\"191\":{},\"634\":{},\"635\":{},\"646\":{},\"655\":{}}}],[\"recipe/multitenancy.apiinterface\",{\"_index\":298,\"name\":{},\"parent\":{\"656\":{}}}],[\"recipe/multitenancy.apiinterface.__type\",{\"_index\":300,\"name\":{},\"parent\":{\"657\":{}}}],[\"recipe/multitenancy.apioptions\",{\"_index\":295,\"name\":{},\"parent\":{\"647\":{}}}],[\"recipe/multitenancy.apioptions.__type\",{\"_index\":296,\"name\":{},\"parent\":{\"648\":{},\"649\":{},\"650\":{},\"651\":{},\"652\":{},\"653\":{},\"654\":{}}}],[\"recipe/multitenancy.default\",{\"_index\":95,\"name\":{},\"parent\":{\"192\":{},\"193\":{},\"194\":{},\"195\":{},\"196\":{},\"197\":{},\"198\":{},\"199\":{},\"200\":{},\"201\":{},\"202\":{}}}],[\"recipe/multitenancy.recipeinterface\",{\"_index\":292,\"name\":{},\"parent\":{\"636\":{}}}],[\"recipe/multitenancy.recipeinterface.__type\",{\"_index\":294,\"name\":{},\"parent\":{\"637\":{},\"638\":{},\"639\":{},\"640\":{},\"641\":{},\"642\":{},\"643\":{},\"644\":{},\"645\":{}}}],[\"recipe/openid\",{\"_index\":96,\"name\":{\"203\":{}},\"parent\":{\"204\":{},\"205\":{},\"206\":{},\"207\":{},\"208\":{}}}],[\"recipe/openid.default\",{\"_index\":98,\"name\":{},\"parent\":{\"209\":{},\"210\":{},\"211\":{},\"212\":{},\"213\":{},\"214\":{}}}],[\"recipe/passwordless\",{\"_index\":99,\"name\":{\"215\":{}},\"parent\":{\"216\":{},\"217\":{},\"218\":{},\"219\":{},\"220\":{},\"221\":{},\"222\":{},\"223\":{},\"224\":{},\"225\":{},\"226\":{},\"227\":{},\"228\":{},\"229\":{},\"230\":{},\"231\":{},\"232\":{},\"658\":{},\"670\":{},\"681\":{}}}],[\"recipe/passwordless.apiinterface\",{\"_index\":306,\"name\":{},\"parent\":{\"682\":{}}}],[\"recipe/passwordless.apiinterface.__type\",{\"_index\":308,\"name\":{},\"parent\":{\"683\":{},\"684\":{},\"685\":{},\"686\":{},\"687\":{}}}],[\"recipe/passwordless.apioptions\",{\"_index\":303,\"name\":{},\"parent\":{\"671\":{}}}],[\"recipe/passwordless.apioptions.__type\",{\"_index\":304,\"name\":{},\"parent\":{\"672\":{},\"673\":{},\"674\":{},\"675\":{},\"676\":{},\"677\":{},\"678\":{},\"679\":{},\"680\":{}}}],[\"recipe/passwordless.default\",{\"_index\":113,\"name\":{},\"parent\":{\"233\":{},\"234\":{},\"235\":{},\"236\":{},\"237\":{},\"238\":{},\"239\":{},\"240\":{},\"241\":{},\"242\":{},\"243\":{},\"244\":{},\"245\":{},\"246\":{},\"247\":{},\"248\":{},\"249\":{},\"250\":{}}}],[\"recipe/passwordless.recipeinterface\",{\"_index\":301,\"name\":{},\"parent\":{\"659\":{}}}],[\"recipe/passwordless.recipeinterface.__type\",{\"_index\":302,\"name\":{},\"parent\":{\"660\":{},\"661\":{},\"662\":{},\"663\":{},\"664\":{},\"665\":{},\"666\":{},\"667\":{},\"668\":{},\"669\":{}}}],[\"recipe/session\",{\"_index\":114,\"name\":{\"251\":{}},\"parent\":{\"252\":{},\"253\":{},\"254\":{},\"255\":{},\"256\":{},\"257\":{},\"258\":{},\"259\":{},\"260\":{},\"261\":{},\"262\":{},\"263\":{},\"264\":{},\"265\":{},\"266\":{},\"267\":{},\"268\":{},\"269\":{},\"270\":{},\"271\":{},\"272\":{},\"273\":{},\"274\":{},\"275\":{},\"688\":{},\"693\":{},\"712\":{},\"732\":{},\"737\":{},\"745\":{},\"755\":{}}}],[\"recipe/session.apiinterface\",{\"_index\":336,\"name\":{},\"parent\":{\"733\":{}}}],[\"recipe/session.apiinterface.__type\",{\"_index\":338,\"name\":{},\"parent\":{\"734\":{},\"735\":{},\"736\":{}}}],[\"recipe/session.apioptions\",{\"_index\":341,\"name\":{},\"parent\":{\"738\":{}}}],[\"recipe/session.apioptions.__type\",{\"_index\":342,\"name\":{},\"parent\":{\"739\":{},\"740\":{},\"741\":{},\"742\":{},\"743\":{},\"744\":{}}}],[\"recipe/session.default\",{\"_index\":133,\"name\":{},\"parent\":{\"276\":{},\"277\":{},\"278\":{},\"279\":{},\"280\":{},\"281\":{},\"282\":{},\"283\":{},\"284\":{},\"285\":{},\"286\":{},\"287\":{},\"288\":{},\"289\":{},\"290\":{},\"291\":{},\"292\":{},\"293\":{},\"294\":{},\"295\":{},\"296\":{},\"297\":{},\"298\":{},\"299\":{},\"300\":{}}}],[\"recipe/session.recipeinterface\",{\"_index\":318,\"name\":{},\"parent\":{\"694\":{}}}],[\"recipe/session.recipeinterface.__type\",{\"_index\":319,\"name\":{},\"parent\":{\"695\":{},\"696\":{},\"697\":{},\"698\":{},\"699\":{},\"700\":{},\"701\":{},\"702\":{},\"703\":{},\"704\":{},\"705\":{},\"706\":{},\"707\":{},\"708\":{},\"709\":{},\"710\":{},\"711\":{}}}],[\"recipe/session.sessioncontainer\",{\"_index\":324,\"name\":{},\"parent\":{\"713\":{},\"714\":{},\"715\":{},\"716\":{},\"717\":{},\"718\":{},\"719\":{},\"720\":{},\"721\":{},\"722\":{},\"723\":{},\"724\":{},\"725\":{},\"726\":{},\"727\":{},\"728\":{},\"729\":{},\"730\":{},\"731\":{}}}],[\"recipe/session.sessioninformation\",{\"_index\":344,\"name\":{},\"parent\":{\"746\":{}}}],[\"recipe/session.sessioninformation.__type\",{\"_index\":346,\"name\":{},\"parent\":{\"747\":{},\"748\":{},\"749\":{},\"750\":{},\"751\":{},\"752\":{},\"753\":{},\"754\":{}}}],[\"recipe/session.verifysessionoptions\",{\"_index\":314,\"name\":{},\"parent\":{\"689\":{},\"690\":{},\"691\":{},\"692\":{}}}],[\"recipe/thirdparty\",{\"_index\":134,\"name\":{\"301\":{}},\"parent\":{\"302\":{},\"303\":{},\"304\":{},\"305\":{},\"306\":{},\"756\":{},\"761\":{},\"766\":{},\"776\":{}}}],[\"recipe/thirdparty.apiinterface\",{\"_index\":356,\"name\":{},\"parent\":{\"762\":{}}}],[\"recipe/thirdparty.apiinterface.__type\",{\"_index\":358,\"name\":{},\"parent\":{\"763\":{},\"764\":{},\"765\":{}}}],[\"recipe/thirdparty.apioptions\",{\"_index\":361,\"name\":{},\"parent\":{\"767\":{}}}],[\"recipe/thirdparty.apioptions.__type\",{\"_index\":362,\"name\":{},\"parent\":{\"768\":{},\"769\":{},\"770\":{},\"771\":{},\"772\":{},\"773\":{},\"774\":{},\"775\":{}}}],[\"recipe/thirdparty.default\",{\"_index\":137,\"name\":{},\"parent\":{\"307\":{},\"308\":{},\"309\":{},\"310\":{},\"311\":{},\"312\":{}}}],[\"recipe/thirdparty.recipeinterface\",{\"_index\":354,\"name\":{},\"parent\":{\"757\":{}}}],[\"recipe/thirdparty.recipeinterface.__type\",{\"_index\":355,\"name\":{},\"parent\":{\"758\":{},\"759\":{},\"760\":{}}}],[\"recipe/thirdparty.typeprovider\",{\"_index\":365,\"name\":{},\"parent\":{\"777\":{}}}],[\"recipe/thirdparty.typeprovider.__type\",{\"_index\":366,\"name\":{},\"parent\":{\"778\":{},\"779\":{},\"780\":{},\"781\":{},\"782\":{},\"783\":{}}}],[\"recipe/thirdpartyemailpassword\",{\"_index\":138,\"name\":{\"313\":{}},\"parent\":{\"314\":{},\"315\":{},\"316\":{},\"317\":{},\"318\":{},\"319\":{},\"320\":{},\"321\":{},\"322\":{},\"323\":{},\"324\":{},\"325\":{},\"326\":{},\"327\":{},\"784\":{},\"795\":{},\"796\":{},\"806\":{},\"807\":{}}}],[\"recipe/thirdpartyemailpassword.apiinterface\",{\"_index\":375,\"name\":{},\"parent\":{\"797\":{}}}],[\"recipe/thirdpartyemailpassword.apiinterface.__type\",{\"_index\":376,\"name\":{},\"parent\":{\"798\":{},\"799\":{},\"800\":{},\"801\":{},\"802\":{},\"803\":{},\"804\":{},\"805\":{}}}],[\"recipe/thirdpartyemailpassword.default\",{\"_index\":143,\"name\":{},\"parent\":{\"328\":{},\"329\":{},\"330\":{},\"331\":{},\"332\":{},\"333\":{},\"334\":{},\"335\":{},\"336\":{},\"337\":{},\"338\":{},\"339\":{},\"340\":{},\"341\":{},\"342\":{}}}],[\"recipe/thirdpartyemailpassword.recipeinterface\",{\"_index\":371,\"name\":{},\"parent\":{\"785\":{}}}],[\"recipe/thirdpartyemailpassword.recipeinterface.__type\",{\"_index\":372,\"name\":{},\"parent\":{\"786\":{},\"787\":{},\"788\":{},\"789\":{},\"790\":{},\"791\":{},\"792\":{},\"793\":{},\"794\":{}}}],[\"recipe/thirdpartypasswordless\",{\"_index\":144,\"name\":{\"343\":{}},\"parent\":{\"344\":{},\"345\":{},\"346\":{},\"347\":{},\"348\":{},\"349\":{},\"350\":{},\"351\":{},\"352\":{},\"353\":{},\"354\":{},\"355\":{},\"356\":{},\"357\":{},\"358\":{},\"359\":{},\"360\":{},\"361\":{},\"362\":{},\"808\":{},\"823\":{},\"824\":{},\"834\":{},\"835\":{}}}],[\"recipe/thirdpartypasswordless.apiinterface\",{\"_index\":385,\"name\":{},\"parent\":{\"825\":{}}}],[\"recipe/thirdpartypasswordless.apiinterface.__type\",{\"_index\":386,\"name\":{},\"parent\":{\"826\":{},\"827\":{},\"828\":{},\"829\":{},\"830\":{},\"831\":{},\"832\":{},\"833\":{}}}],[\"recipe/thirdpartypasswordless.default\",{\"_index\":147,\"name\":{},\"parent\":{\"363\":{},\"364\":{},\"365\":{},\"366\":{},\"367\":{},\"368\":{},\"369\":{},\"370\":{},\"371\":{},\"372\":{},\"373\":{},\"374\":{},\"375\":{},\"376\":{},\"377\":{},\"378\":{},\"379\":{},\"380\":{},\"381\":{},\"382\":{}}}],[\"recipe/thirdpartypasswordless.recipeinterface\",{\"_index\":383,\"name\":{},\"parent\":{\"809\":{}}}],[\"recipe/thirdpartypasswordless.recipeinterface.__type\",{\"_index\":384,\"name\":{},\"parent\":{\"810\":{},\"811\":{},\"812\":{},\"813\":{},\"814\":{},\"815\":{},\"816\":{},\"817\":{},\"818\":{},\"819\":{},\"820\":{},\"821\":{},\"822\":{}}}],[\"recipe/usermetadata\",{\"_index\":148,\"name\":{\"383\":{}},\"parent\":{\"384\":{},\"385\":{},\"386\":{},\"387\":{},\"388\":{},\"836\":{},\"841\":{}}}],[\"recipe/usermetadata.default\",{\"_index\":152,\"name\":{},\"parent\":{\"389\":{},\"390\":{},\"391\":{},\"392\":{},\"393\":{},\"394\":{}}}],[\"recipe/usermetadata.recipeinterface\",{\"_index\":390,\"name\":{},\"parent\":{\"837\":{}}}],[\"recipe/usermetadata.recipeinterface.__type\",{\"_index\":391,\"name\":{},\"parent\":{\"838\":{},\"839\":{},\"840\":{}}}],[\"recipe/userroles\",{\"_index\":153,\"name\":{\"395\":{}},\"parent\":{\"396\":{},\"397\":{},\"398\":{},\"399\":{},\"400\":{},\"401\":{},\"402\":{},\"403\":{},\"404\":{},\"405\":{},\"406\":{},\"407\":{},\"842\":{},\"843\":{},\"844\":{}}}],[\"recipe/userroles.default\",{\"_index\":164,\"name\":{},\"parent\":{\"408\":{},\"409\":{},\"410\":{},\"411\":{},\"412\":{},\"413\":{},\"414\":{},\"415\":{},\"416\":{},\"417\":{},\"418\":{},\"419\":{},\"420\":{},\"421\":{},\"422\":{}}}],[\"recipe/userroles.recipeinterface\",{\"_index\":393,\"name\":{},\"parent\":{\"845\":{}}}],[\"recipe/userroles.recipeinterface.__type\",{\"_index\":394,\"name\":{},\"parent\":{\"846\":{},\"847\":{},\"848\":{},\"849\":{},\"850\":{},\"851\":{},\"852\":{},\"853\":{},\"854\":{},\"855\":{}}}],[\"recipeid\",{\"_index\":240,\"name\":{\"551\":{},\"572\":{},\"596\":{},\"618\":{},\"650\":{},\"675\":{},\"741\":{},\"770\":{}},\"parent\":{}}],[\"recipeimplementation\",{\"_index\":237,\"name\":{\"549\":{},\"569\":{},\"593\":{},\"616\":{},\"648\":{},\"672\":{},\"739\":{},\"768\":{}},\"parent\":{}}],[\"recipeinterface\",{\"_index\":227,\"name\":{\"532\":{},\"543\":{},\"559\":{},\"584\":{},\"622\":{},\"635\":{},\"658\":{},\"693\":{},\"756\":{},\"784\":{},\"808\":{},\"836\":{},\"844\":{}},\"parent\":{}}],[\"recipeuserid\",{\"_index\":19,\"name\":{\"20\":{},\"423\":{},\"425\":{},\"608\":{},\"749\":{}},\"parent\":{}}],[\"refreshpost\",{\"_index\":337,\"name\":{\"734\":{}},\"parent\":{}}],[\"refreshsession\",{\"_index\":120,\"name\":{\"258\":{},\"285\":{},\"698\":{}},\"parent\":{}}],[\"refreshsessionwithoutrequestresponse\",{\"_index\":121,\"name\":{\"259\":{},\"286\":{}},\"parent\":{}}],[\"regenerateaccesstoken\",{\"_index\":321,\"name\":{\"706\":{}},\"parent\":{}}],[\"removeclaim\",{\"_index\":131,\"name\":{\"269\":{},\"299\":{},\"711\":{},\"730\":{}},\"parent\":{}}],[\"removeheader\",{\"_index\":193,\"name\":{\"462\":{},\"515\":{}},\"parent\":{}}],[\"removepermissionsfromrole\",{\"_index\":160,\"name\":{\"403\":{},\"418\":{},\"852\":{}},\"parent\":{}}],[\"removeuserrole\",{\"_index\":155,\"name\":{\"398\":{},\"413\":{},\"847\":{}},\"parent\":{}}],[\"req\",{\"_index\":241,\"name\":{\"552\":{},\"574\":{},\"598\":{},\"620\":{},\"652\":{},\"677\":{},\"743\":{},\"773\":{}},\"parent\":{}}],[\"request\",{\"_index\":214,\"name\":{\"495\":{}},\"parent\":{}}],[\"res\",{\"_index\":242,\"name\":{\"553\":{},\"575\":{},\"599\":{},\"621\":{},\"653\":{},\"678\":{},\"744\":{},\"774\":{}},\"parent\":{}}],[\"resendcodepost\",{\"_index\":309,\"name\":{\"684\":{},\"830\":{}},\"parent\":{}}],[\"resetpasswordusingtoken\",{\"_index\":65,\"name\":{\"126\":{},\"139\":{},\"321\":{},\"336\":{}},\"parent\":{}}],[\"response\",{\"_index\":202,\"name\":{\"476\":{},\"484\":{}},\"parent\":{}}],[\"revokeallcodes\",{\"_index\":108,\"name\":{\"226\":{},\"240\":{},\"357\":{},\"372\":{},\"664\":{},\"817\":{}},\"parent\":{}}],[\"revokeallsessionsforuser\",{\"_index\":122,\"name\":{\"260\":{},\"287\":{},\"700\":{}},\"parent\":{}}],[\"revokecode\",{\"_index\":109,\"name\":{\"227\":{},\"241\":{},\"358\":{},\"373\":{},\"665\":{},\"818\":{}},\"parent\":{}}],[\"revokeemailverificationtokens\",{\"_index\":78,\"name\":{\"154\":{},\"167\":{},\"589\":{}},\"parent\":{}}],[\"revokemultiplesessions\",{\"_index\":125,\"name\":{\"263\":{},\"290\":{},\"703\":{}},\"parent\":{}}],[\"revokesession\",{\"_index\":124,\"name\":{\"262\":{},\"289\":{},\"702\":{},\"713\":{}},\"parent\":{}}],[\"sendemail\",{\"_index\":70,\"name\":{\"131\":{},\"144\":{},\"156\":{},\"169\":{},\"230\":{},\"248\":{},\"326\":{},\"341\":{},\"360\":{},\"380\":{}},\"parent\":{}}],[\"sendemailverificationemail\",{\"_index\":75,\"name\":{\"151\":{},\"164\":{}},\"parent\":{}}],[\"sendhtmlresponse\",{\"_index\":197,\"name\":{\"470\":{},\"513\":{}},\"parent\":{}}],[\"sendjsonresponse\",{\"_index\":196,\"name\":{\"468\":{},\"518\":{}},\"parent\":{}}],[\"sendresetpasswordemail\",{\"_index\":69,\"name\":{\"130\":{},\"143\":{},\"325\":{},\"340\":{}},\"parent\":{}}],[\"sendsms\",{\"_index\":112,\"name\":{\"231\":{},\"249\":{},\"361\":{},\"381\":{}},\"parent\":{}}],[\"session\",{\"_index\":199,\"name\":{\"473\":{},\"481\":{},\"497\":{},\"522\":{},\"524\":{},\"526\":{},\"529\":{},\"531\":{}},\"parent\":{}}],[\"sessionclaimvalidator\",{\"_index\":353,\"name\":{\"755\":{}},\"parent\":{}}],[\"sessioncontainer\",{\"_index\":323,\"name\":{\"712\":{}},\"parent\":{}}],[\"sessioncontext\",{\"_index\":224,\"name\":{\"528\":{},\"530\":{}},\"parent\":{}}],[\"sessiondataindatabase\",{\"_index\":348,\"name\":{\"750\":{}},\"parent\":{}}],[\"sessionevent\",{\"_index\":198,\"name\":{\"472\":{}},\"parent\":{}}],[\"sessioneventv2\",{\"_index\":207,\"name\":{\"480\":{}},\"parent\":{}}],[\"sessionhandle\",{\"_index\":345,\"name\":{\"747\":{}},\"parent\":{}}],[\"sessioninformation\",{\"_index\":343,\"name\":{\"745\":{}},\"parent\":{}}],[\"sessionrequest\",{\"_index\":220,\"name\":{\"521\":{},\"523\":{},\"525\":{}},\"parent\":{}}],[\"sessionrequired\",{\"_index\":315,\"name\":{\"690\":{}},\"parent\":{}}],[\"setclaimvalue\",{\"_index\":129,\"name\":{\"267\":{},\"297\":{},\"709\":{},\"728\":{}},\"parent\":{}}],[\"setcookie\",{\"_index\":194,\"name\":{\"464\":{},\"516\":{}},\"parent\":{}}],[\"setheader\",{\"_index\":192,\"name\":{\"460\":{},\"514\":{}},\"parent\":{}}],[\"setstatuscode\",{\"_index\":195,\"name\":{\"466\":{},\"517\":{}},\"parent\":{}}],[\"shouldallowaccess\",{\"_index\":234,\"name\":{\"546\":{}},\"parent\":{}}],[\"signin\",{\"_index\":63,\"name\":{\"124\":{},\"137\":{},\"563\":{}},\"parent\":{}}],[\"signinpost\",{\"_index\":260,\"name\":{\"582\":{}},\"parent\":{}}],[\"signinup\",{\"_index\":111,\"name\":{\"229\":{},\"247\":{},\"759\":{}},\"parent\":{}}],[\"signinuppost\",{\"_index\":359,\"name\":{\"764\":{}},\"parent\":{}}],[\"signoutpost\",{\"_index\":339,\"name\":{\"735\":{}},\"parent\":{}}],[\"signup\",{\"_index\":62,\"name\":{\"123\":{},\"136\":{},\"561\":{}},\"parent\":{}}],[\"signuppost\",{\"_index\":261,\"name\":{\"583\":{}},\"parent\":{}}],[\"smsdelivery\",{\"_index\":305,\"name\":{\"680\":{}},\"parent\":{}}],[\"staticthirdpartyproviders\",{\"_index\":297,\"name\":{\"654\":{}},\"parent\":{}}],[\"statuscode\",{\"_index\":218,\"name\":{\"509\":{}},\"parent\":{}}],[\"supertokens\",{\"_index\":201,\"name\":{\"474\":{},\"482\":{}},\"parent\":{}}],[\"tenantid\",{\"_index\":352,\"name\":{\"754\":{}},\"parent\":{}}],[\"tenantids\",{\"_index\":172,\"name\":{\"431\":{}},\"parent\":{}}],[\"thirdparty\",{\"_index\":175,\"name\":{\"434\":{}},\"parent\":{}}],[\"thirdpartyapioptions\",{\"_index\":382,\"name\":{\"807\":{},\"835\":{}},\"parent\":{}}],[\"thirdpartygetprovider\",{\"_index\":141,\"name\":{\"318\":{},\"331\":{},\"346\":{},\"366\":{},\"786\":{},\"812\":{}},\"parent\":{}}],[\"thirdpartymanuallycreateorupdateuser\",{\"_index\":142,\"name\":{\"319\":{},\"332\":{},\"347\":{},\"367\":{},\"788\":{},\"811\":{}},\"parent\":{}}],[\"thirdpartysigninup\",{\"_index\":373,\"name\":{\"787\":{},\"810\":{}},\"parent\":{}}],[\"thirdpartysigninuppost\",{\"_index\":378,\"name\":{\"802\":{},\"827\":{}},\"parent\":{}}],[\"timecreated\",{\"_index\":351,\"name\":{\"753\":{}},\"parent\":{}}],[\"timejoined\",{\"_index\":177,\"name\":{\"436\":{}},\"parent\":{}}],[\"tojson\",{\"_index\":178,\"name\":{\"437\":{}},\"parent\":{}}],[\"typeprovider\",{\"_index\":364,\"name\":{\"776\":{},\"795\":{},\"823\":{}},\"parent\":{}}],[\"unlinkaccount\",{\"_index\":52,\"name\":{\"94\":{},\"109\":{},\"539\":{}},\"parent\":{}}],[\"unverifyemail\",{\"_index\":79,\"name\":{\"155\":{},\"168\":{},\"590\":{}},\"parent\":{}}],[\"updateemailorpassword\",{\"_index\":67,\"name\":{\"128\":{},\"141\":{},\"323\":{},\"338\":{},\"566\":{},\"794\":{}},\"parent\":{}}],[\"updateordeleteuseridmappinginfo\",{\"_index\":10,\"name\":{\"10\":{},\"29\":{}},\"parent\":{}}],[\"updatepasswordlessuser\",{\"_index\":146,\"name\":{\"356\":{},\"371\":{},\"816\":{}},\"parent\":{}}],[\"updatesessiondataindatabase\",{\"_index\":126,\"name\":{\"264\":{},\"291\":{},\"704\":{},\"715\":{}},\"parent\":{}}],[\"updateuser\",{\"_index\":107,\"name\":{\"225\":{},\"239\":{},\"663\":{}},\"parent\":{}}],[\"updateusermetadata\",{\"_index\":150,\"name\":{\"386\":{},\"392\":{},\"839\":{}},\"parent\":{}}],[\"use\",{\"_index\":290,\"name\":{\"633\":{}},\"parent\":{}}],[\"user\",{\"_index\":20,\"name\":{\"21\":{},\"427\":{}},\"parent\":{}}],[\"useremailinfo\",{\"_index\":271,\"name\":{\"606\":{}},\"parent\":{}}],[\"userid\",{\"_index\":347,\"name\":{\"748\":{}},\"parent\":{}}],[\"userroleclaim\",{\"_index\":166,\"name\":{\"411\":{},\"842\":{}},\"parent\":{}}],[\"validateclaims\",{\"_index\":322,\"name\":{\"707\":{}},\"parent\":{}}],[\"validateclaimsforsessionhandle\",{\"_index\":132,\"name\":{\"270\":{},\"281\":{}},\"parent\":{}}],[\"verifyemailpost\",{\"_index\":267,\"name\":{\"603\":{}},\"parent\":{}}],[\"verifyemailusingtoken\",{\"_index\":76,\"name\":{\"152\":{},\"165\":{},\"587\":{}},\"parent\":{}}],[\"verifysession\",{\"_index\":340,\"name\":{\"736\":{}},\"parent\":{}}],[\"verifysessionoptions\",{\"_index\":312,\"name\":{\"688\":{}},\"parent\":{}}],[\"wrapperused\",{\"_index\":181,\"name\":{\"440\":{},\"458\":{},\"505\":{},\"519\":{}},\"parent\":{}}],[\"wraprequest\",{\"_index\":32,\"name\":{\"53\":{},\"61\":{},\"66\":{},\"70\":{},\"74\":{},\"78\":{}},\"parent\":{}}],[\"wrapresponse\",{\"_index\":33,\"name\":{\"54\":{},\"62\":{},\"67\":{},\"71\":{},\"75\":{},\"79\":{}},\"parent\":{}}]],\"pipeline\":[]}}"); \ No newline at end of file diff --git a/docs/classes/framework.BaseRequest.html b/docs/classes/framework.BaseRequest.html index 3951ecef5..6768c138e 100644 --- a/docs/classes/framework.BaseRequest.html +++ b/docs/classes/framework.BaseRequest.html @@ -1 +1 @@ -BaseRequest | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • BaseRequest

Index

Constructors

Properties

getCookieValue: (key_: string) => undefined | string

Type declaration

    • (key_: string): undefined | string
    • Parameters

      • key_: string

      Returns undefined | string

getFormData: () => Promise<any>

Type declaration

    • (): Promise<any>
    • Returns Promise<any>

getHeaderValue: (key: string) => undefined | string

Type declaration

    • (key: string): undefined | string
    • Parameters

      • key: string

      Returns undefined | string

getJSONBody: () => Promise<any>

Type declaration

    • (): Promise<any>
    • Returns Promise<any>

getKeyValueFromQuery: (key: string) => undefined | string

Type declaration

    • (key: string): undefined | string
    • Parameters

      • key: string

      Returns undefined | string

getMethod: () => HTTPMethod

Type declaration

    • (): HTTPMethod
    • Returns HTTPMethod

getOriginalURL: () => string

Type declaration

    • (): string
    • Returns string

original: any
wrapperUsed: boolean

Generated using TypeDoc

\ No newline at end of file +BaseRequest | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Constructors

Properties

getCookieValue: (key_: string) => undefined | string

Type declaration

    • (key_: string): undefined | string
    • Parameters

      • key_: string

      Returns undefined | string

getFormData: () => Promise<any>

Type declaration

    • (): Promise<any>
    • Returns Promise<any>

getHeaderValue: (key: string) => undefined | string

Type declaration

    • (key: string): undefined | string
    • Parameters

      • key: string

      Returns undefined | string

getJSONBody: () => Promise<any>

Type declaration

    • (): Promise<any>
    • Returns Promise<any>

getKeyValueFromQuery: (key: string) => undefined | string

Type declaration

    • (key: string): undefined | string
    • Parameters

      • key: string

      Returns undefined | string

getMethod: () => HTTPMethod

Type declaration

    • (): HTTPMethod
    • Returns HTTPMethod

getOriginalURL: () => string

Type declaration

    • (): string
    • Returns string

original: any
wrapperUsed: boolean

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/framework.BaseResponse.html b/docs/classes/framework.BaseResponse.html index 5f58ed2d8..c10afea44 100644 --- a/docs/classes/framework.BaseResponse.html +++ b/docs/classes/framework.BaseResponse.html @@ -1 +1 @@ -BaseResponse | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • BaseResponse

Index

Constructors

Properties

original: any
removeHeader: (key: string) => void

Type declaration

    • (key: string): void
    • Parameters

      • key: string

      Returns void

sendHTMLResponse: (html: string) => void

Type declaration

    • (html: string): void
    • Parameters

      • html: string

      Returns void

sendJSONResponse: (content: any) => void

Type declaration

    • (content: any): void
    • Parameters

      • content: any

      Returns void

setCookie: (key: string, value: string, domain: undefined | string, secure: boolean, httpOnly: boolean, expires: number, path: string, sameSite: "strict" | "lax" | "none") => void

Type declaration

    • (key: string, value: string, domain: undefined | string, secure: boolean, httpOnly: boolean, expires: number, path: string, sameSite: "strict" | "lax" | "none"): void
    • Parameters

      • key: string
      • value: string
      • domain: undefined | string
      • secure: boolean
      • httpOnly: boolean
      • expires: number
      • path: string
      • sameSite: "strict" | "lax" | "none"

      Returns void

setHeader: (key: string, value: string, allowDuplicateKey: boolean) => void

Type declaration

    • (key: string, value: string, allowDuplicateKey: boolean): void
    • Parameters

      • key: string
      • value: string
      • allowDuplicateKey: boolean

      Returns void

setStatusCode: (statusCode: number) => void

Type declaration

    • (statusCode: number): void
    • Parameters

      • statusCode: number

      Returns void

wrapperUsed: boolean

Generated using TypeDoc

\ No newline at end of file +BaseResponse | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Constructors

Properties

original: any
removeHeader: (key: string) => void

Type declaration

    • (key: string): void
    • Parameters

      • key: string

      Returns void

sendHTMLResponse: (html: string) => void

Type declaration

    • (html: string): void
    • Parameters

      • html: string

      Returns void

sendJSONResponse: (content: any) => void

Type declaration

    • (content: any): void
    • Parameters

      • content: any

      Returns void

setCookie: (key: string, value: string, domain: undefined | string, secure: boolean, httpOnly: boolean, expires: number, path: string, sameSite: "strict" | "lax" | "none") => void

Type declaration

    • (key: string, value: string, domain: undefined | string, secure: boolean, httpOnly: boolean, expires: number, path: string, sameSite: "strict" | "lax" | "none"): void
    • Parameters

      • key: string
      • value: string
      • domain: undefined | string
      • secure: boolean
      • httpOnly: boolean
      • expires: number
      • path: string
      • sameSite: "strict" | "lax" | "none"

      Returns void

setHeader: (key: string, value: string, allowDuplicateKey: boolean) => void

Type declaration

    • (key: string, value: string, allowDuplicateKey: boolean): void
    • Parameters

      • key: string
      • value: string
      • allowDuplicateKey: boolean

      Returns void

setStatusCode: (statusCode: number) => void

Type declaration

    • (statusCode: number): void
    • Parameters

      • statusCode: number

      Returns void

wrapperUsed: boolean

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/framework_custom.CollectingResponse.html b/docs/classes/framework_custom.CollectingResponse.html new file mode 100644 index 000000000..c2cc235e2 --- /dev/null +++ b/docs/classes/framework_custom.CollectingResponse.html @@ -0,0 +1,2 @@ +CollectingResponse | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Constructors

Properties

body?: string
cookies: CookieInfo[]
headers: Headers
original: any
statusCode: number
wrapperUsed: boolean

Methods

  • removeHeader(key: string): void
  • sendHTMLResponse(html: string): void
  • sendJSONResponse(content: any): void
  • setCookie(key: string, value: string, domain: undefined | string, secure: boolean, httpOnly: boolean, expires: number, path: string, sameSite: "strict" | "lax" | "none"): void
  • Parameters

    • key: string
    • value: string
    • domain: undefined | string
    • secure: boolean
    • httpOnly: boolean
    • expires: number
    • path: string
    • sameSite: "strict" | "lax" | "none"

    Returns void

  • setHeader(key: string, value: string, allowDuplicateKey: boolean): void
  • setStatusCode(statusCode: number): void

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/framework_custom.PreParsedRequest.html b/docs/classes/framework_custom.PreParsedRequest.html new file mode 100644 index 000000000..421af5461 --- /dev/null +++ b/docs/classes/framework_custom.PreParsedRequest.html @@ -0,0 +1 @@ +PreParsedRequest | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Constructors

Properties

_session?: SessionContainer
original: any
request: RequestInfo
wrapperUsed: boolean

Accessors

Methods

  • getCookieValue(key: string): undefined | string
  • getFormData(): Promise<any>
  • getHeaderValue(key: string): undefined | string
  • getJSONBody(): Promise<any>
  • getKeyValueFromQuery(key: string): undefined | string
  • getMethod(): HTTPMethod
  • getOriginalURL(): string

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/index.RecipeUserId.html b/docs/classes/index.RecipeUserId.html index 9449b1d22..979f2fd98 100644 --- a/docs/classes/index.RecipeUserId.html +++ b/docs/classes/index.RecipeUserId.html @@ -1 +1 @@ -RecipeUserId | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • RecipeUserId

Index

Constructors

Properties

Methods

Constructors

Properties

recipeUserId: string

Methods

  • getAsString(): string

Generated using TypeDoc

\ No newline at end of file +RecipeUserId | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • RecipeUserId

Index

Constructors

Properties

Methods

Constructors

Properties

recipeUserId: string

Methods

  • getAsString(): string

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/index.User.html b/docs/classes/index.User.html index 90a1e975c..3f4922329 100644 --- a/docs/classes/index.User.html +++ b/docs/classes/index.User.html @@ -1 +1 @@ -User | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • User

Implements

  • User

Index

Constructors

  • new User(user: UserWithoutHelperFunctions): User

Properties

emails: string[]
id: string
isPrimaryUser: boolean
loginMethods: LoginMethod[]
phoneNumbers: string[]
tenantIds: string[]
thirdParty: { id: string; userId: string }[]
timeJoined: number

Methods

Generated using TypeDoc

\ No newline at end of file +User | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • User

Implements

  • User

Index

Constructors

  • new User(user: UserWithoutHelperFunctions): User

Properties

emails: string[]
id: string
isPrimaryUser: boolean
loginMethods: LoginMethod[]
phoneNumbers: string[]
tenantIds: string[]
thirdParty: { id: string; userId: string }[]
timeJoined: number

Methods

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/index.default.html b/docs/classes/index.default.html index 0f9247c2b..06f7b9e3b 100644 --- a/docs/classes/index.default.html +++ b/docs/classes/index.default.html @@ -1 +1 @@ -default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

Error: typeof default = SuperTokensError
RecipeUserId: typeof RecipeUserId = RecipeUserId
User: typeof User = User
init: (config: TypeInput) => void = SuperTokens.init

Type declaration

    • (config: TypeInput): void
    • Parameters

      • config: TypeInput

      Returns void

Methods

  • createUserIdMapping(input: { externalUserId: string; externalUserIdInfo?: string; force?: boolean; superTokensUserId: string }): Promise<{ status: "OK" | "UNKNOWN_SUPERTOKENS_USER_ID_ERROR" } | { doesExternalUserIdExist: boolean; doesSuperTokensUserIdExist: boolean; status: "USER_ID_MAPPING_ALREADY_EXISTS_ERROR" }>
  • Parameters

    • input: { externalUserId: string; externalUserIdInfo?: string; force?: boolean; superTokensUserId: string }
      • externalUserId: string
      • Optional externalUserIdInfo?: string
      • Optional force?: boolean
      • superTokensUserId: string

    Returns Promise<{ status: "OK" | "UNKNOWN_SUPERTOKENS_USER_ID_ERROR" } | { doesExternalUserIdExist: boolean; doesSuperTokensUserIdExist: boolean; status: "USER_ID_MAPPING_ALREADY_EXISTS_ERROR" }>

  • deleteUser(userId: string, removeAllLinkedAccounts?: boolean, userContext?: any): Promise<{ status: "OK" }>
  • Parameters

    • userId: string
    • removeAllLinkedAccounts: boolean = true
    • Optional userContext: any

    Returns Promise<{ status: "OK" }>

  • deleteUserIdMapping(input: { force?: boolean; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }): Promise<{ didMappingExist: boolean; status: "OK" }>
  • Parameters

    • input: { force?: boolean; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }
      • Optional force?: boolean
      • userId: string
      • Optional userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY"

    Returns Promise<{ didMappingExist: boolean; status: "OK" }>

  • getAllCORSHeaders(): string[]
  • getRequestFromUserContext(userContext: any): undefined | BaseRequest
  • getUser(userId: string, userContext?: any): Promise<undefined | User>
  • Parameters

    • userId: string
    • Optional userContext: any

    Returns Promise<undefined | User>

  • getUserCount(includeRecipeIds?: string[], tenantId?: string): Promise<number>
  • Parameters

    • Optional includeRecipeIds: string[]
    • Optional tenantId: string

    Returns Promise<number>

  • getUserIdMapping(input: { userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }): Promise<{ externalUserId: string; externalUserIdInfo: undefined | string; status: "OK"; superTokensUserId: string } | { status: "UNKNOWN_MAPPING_ERROR" }>
  • Parameters

    • input: { userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }
      • userId: string
      • Optional userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY"

    Returns Promise<{ externalUserId: string; externalUserIdInfo: undefined | string; status: "OK"; superTokensUserId: string } | { status: "UNKNOWN_MAPPING_ERROR" }>

  • getUsersNewestFirst(input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }): Promise<{ nextPaginationToken?: string; users: User[] }>
  • Parameters

    • input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }
      • Optional includeRecipeIds?: string[]
      • Optional limit?: number
      • Optional paginationToken?: string
      • Optional query?: {}
        • [key: string]: string
      • tenantId: string

    Returns Promise<{ nextPaginationToken?: string; users: User[] }>

  • getUsersOldestFirst(input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }): Promise<{ nextPaginationToken?: string; users: User[] }>
  • Parameters

    • input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }
      • Optional includeRecipeIds?: string[]
      • Optional limit?: number
      • Optional paginationToken?: string
      • Optional query?: {}
        • [key: string]: string
      • tenantId: string

    Returns Promise<{ nextPaginationToken?: string; users: User[] }>

  • listUsersByAccountInfo(tenantId: string, accountInfo: AccountInfo, doUnionOfAccountInfo?: boolean, userContext?: any): Promise<User[]>
  • Parameters

    • tenantId: string
    • accountInfo: AccountInfo
    • doUnionOfAccountInfo: boolean = false
    • Optional userContext: any

    Returns Promise<User[]>

  • updateOrDeleteUserIdMappingInfo(input: { externalUserIdInfo?: string; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }): Promise<{ status: "OK" | "UNKNOWN_MAPPING_ERROR" }>
  • Parameters

    • input: { externalUserIdInfo?: string; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }
      • Optional externalUserIdInfo?: string
      • userId: string
      • Optional userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY"

    Returns Promise<{ status: "OK" | "UNKNOWN_MAPPING_ERROR" }>

Generated using TypeDoc

\ No newline at end of file +default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

Error: typeof default = SuperTokensError
RecipeUserId: typeof RecipeUserId = RecipeUserId
User: typeof User = User
init: (config: TypeInput) => void = SuperTokens.init

Type declaration

    • (config: TypeInput): void
    • Parameters

      • config: TypeInput

      Returns void

Methods

  • createUserIdMapping(input: { externalUserId: string; externalUserIdInfo?: string; force?: boolean; superTokensUserId: string }): Promise<{ status: "OK" | "UNKNOWN_SUPERTOKENS_USER_ID_ERROR" } | { doesExternalUserIdExist: boolean; doesSuperTokensUserIdExist: boolean; status: "USER_ID_MAPPING_ALREADY_EXISTS_ERROR" }>
  • Parameters

    • input: { externalUserId: string; externalUserIdInfo?: string; force?: boolean; superTokensUserId: string }
      • externalUserId: string
      • Optional externalUserIdInfo?: string
      • Optional force?: boolean
      • superTokensUserId: string

    Returns Promise<{ status: "OK" | "UNKNOWN_SUPERTOKENS_USER_ID_ERROR" } | { doesExternalUserIdExist: boolean; doesSuperTokensUserIdExist: boolean; status: "USER_ID_MAPPING_ALREADY_EXISTS_ERROR" }>

  • deleteUser(userId: string, removeAllLinkedAccounts?: boolean, userContext?: any): Promise<{ status: "OK" }>
  • Parameters

    • userId: string
    • removeAllLinkedAccounts: boolean = true
    • Optional userContext: any

    Returns Promise<{ status: "OK" }>

  • deleteUserIdMapping(input: { force?: boolean; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }): Promise<{ didMappingExist: boolean; status: "OK" }>
  • Parameters

    • input: { force?: boolean; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }
      • Optional force?: boolean
      • userId: string
      • Optional userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY"

    Returns Promise<{ didMappingExist: boolean; status: "OK" }>

  • getAllCORSHeaders(): string[]
  • getRequestFromUserContext(userContext: any): undefined | BaseRequest
  • getUser(userId: string, userContext?: any): Promise<undefined | User>
  • Parameters

    • userId: string
    • Optional userContext: any

    Returns Promise<undefined | User>

  • getUserCount(includeRecipeIds?: string[], tenantId?: string): Promise<number>
  • Parameters

    • Optional includeRecipeIds: string[]
    • Optional tenantId: string

    Returns Promise<number>

  • getUserIdMapping(input: { userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }): Promise<{ externalUserId: string; externalUserIdInfo: undefined | string; status: "OK"; superTokensUserId: string } | { status: "UNKNOWN_MAPPING_ERROR" }>
  • Parameters

    • input: { userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }
      • userId: string
      • Optional userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY"

    Returns Promise<{ externalUserId: string; externalUserIdInfo: undefined | string; status: "OK"; superTokensUserId: string } | { status: "UNKNOWN_MAPPING_ERROR" }>

  • getUsersNewestFirst(input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }): Promise<{ nextPaginationToken?: string; users: User[] }>
  • Parameters

    • input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }
      • Optional includeRecipeIds?: string[]
      • Optional limit?: number
      • Optional paginationToken?: string
      • Optional query?: {}
        • [key: string]: string
      • tenantId: string

    Returns Promise<{ nextPaginationToken?: string; users: User[] }>

  • getUsersOldestFirst(input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }): Promise<{ nextPaginationToken?: string; users: User[] }>
  • Parameters

    • input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }
      • Optional includeRecipeIds?: string[]
      • Optional limit?: number
      • Optional paginationToken?: string
      • Optional query?: {}
        • [key: string]: string
      • tenantId: string

    Returns Promise<{ nextPaginationToken?: string; users: User[] }>

  • listUsersByAccountInfo(tenantId: string, accountInfo: AccountInfo, doUnionOfAccountInfo?: boolean, userContext?: any): Promise<User[]>
  • Parameters

    • tenantId: string
    • accountInfo: AccountInfo
    • doUnionOfAccountInfo: boolean = false
    • Optional userContext: any

    Returns Promise<User[]>

  • updateOrDeleteUserIdMappingInfo(input: { externalUserIdInfo?: string; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }): Promise<{ status: "OK" | "UNKNOWN_MAPPING_ERROR" }>
  • Parameters

    • input: { externalUserIdInfo?: string; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }
      • Optional externalUserIdInfo?: string
      • userId: string
      • Optional userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY"

    Returns Promise<{ status: "OK" | "UNKNOWN_MAPPING_ERROR" }>

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/ingredients_emaildelivery.default.html b/docs/classes/ingredients_emaildelivery.default.html index b09312b9a..3b71438a8 100644 --- a/docs/classes/ingredients_emaildelivery.default.html +++ b/docs/classes/ingredients_emaildelivery.default.html @@ -1 +1 @@ -default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Type parameters

  • T

Hierarchy

  • default

Index

Constructors

  • new default<T>(config: TypeInputWithService<T>): default<T>

Properties

ingredientInterfaceImpl: EmailDeliveryInterface<T>

Generated using TypeDoc

\ No newline at end of file +default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Type parameters

  • T

Hierarchy

  • default

Index

Constructors

  • new default<T>(config: TypeInputWithService<T>): default<T>

Properties

ingredientInterfaceImpl: EmailDeliveryInterface<T>

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/ingredients_smsdelivery.default.html b/docs/classes/ingredients_smsdelivery.default.html index 81e92a592..0591de082 100644 --- a/docs/classes/ingredients_smsdelivery.default.html +++ b/docs/classes/ingredients_smsdelivery.default.html @@ -1 +1 @@ -default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Type parameters

  • T

Hierarchy

  • default

Index

Constructors

  • new default<T>(config: TypeInputWithService<T>): default<T>

Properties

ingredientInterfaceImpl: SmsDeliveryInterface<T>

Generated using TypeDoc

\ No newline at end of file +default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Type parameters

  • T

Hierarchy

  • default

Index

Constructors

  • new default<T>(config: TypeInputWithService<T>): default<T>

Properties

ingredientInterfaceImpl: SmsDeliveryInterface<T>

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/recipe_accountlinking.default.html b/docs/classes/recipe_accountlinking.default.html index 94bd61e4c..e44cb0856 100644 --- a/docs/classes/recipe_accountlinking.default.html +++ b/docs/classes/recipe_accountlinking.default.html @@ -1,15 +1,15 @@ -default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

init: (config?: TypeInput) => RecipeListFunction = Recipe.init

Type declaration

    • (config?: TypeInput): RecipeListFunction
    • Parameters

      • Optional config: TypeInput

      Returns RecipeListFunction

Methods

  • canCreatePrimaryUser(recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; wasAlreadyAPrimaryUser: boolean } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" | "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>
  • Parameters

    Returns Promise<{ status: "OK"; wasAlreadyAPrimaryUser: boolean } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" | "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>

  • canLinkAccounts(recipeUserId: RecipeUserId, primaryUserId: string, userContext?: any): Promise<{ accountsAlreadyLinked: boolean; status: "OK" } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>
  • Parameters

    • recipeUserId: RecipeUserId
    • primaryUserId: string
    • userContext: any = {}

    Returns Promise<{ accountsAlreadyLinked: boolean; status: "OK" } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>

  • createPrimaryUser(recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; user: User; wasAlreadyAPrimaryUser: boolean } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>
  • Parameters

    Returns Promise<{ status: "OK"; user: User; wasAlreadyAPrimaryUser: boolean } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>

  • createPrimaryUserIdOrLinkAccounts(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<User>
  • isEmailChangeAllowed(recipeUserId: RecipeUserId, newEmail: string, isVerified: boolean, userContext?: any): Promise<boolean>
  • isSignInAllowed(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<boolean>
  • isSignUpAllowed(tenantId: string, newUser: AccountInfoWithRecipeId, isVerified: boolean, userContext?: any): Promise<boolean>
  • linkAccounts(recipeUserId: RecipeUserId, primaryUserId: string, userContext?: any): Promise<{ accountsAlreadyLinked: boolean; status: "OK"; user: User } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR"; user: User } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>
  • Parameters

    • recipeUserId: RecipeUserId
    • primaryUserId: string
    • userContext: any = {}

    Returns Promise<{ accountsAlreadyLinked: boolean; status: "OK"; user: User } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR"; user: User } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>

  • unlinkAccount(recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; wasLinked: boolean; wasRecipeUserDeleted: boolean }>

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/recipe_dashboard.default.html b/docs/classes/recipe_dashboard.default.html index 9bdbe02fd..7e91bce82 100644 --- a/docs/classes/recipe_dashboard.default.html +++ b/docs/classes/recipe_dashboard.default.html @@ -1 +1 @@ -default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

Constructors

Properties

init: (config?: TypeInput) => RecipeListFunction = Recipe.init

Type declaration

    • (config?: TypeInput): RecipeListFunction
    • Parameters

      • Optional config: TypeInput

      Returns RecipeListFunction

Generated using TypeDoc

\ No newline at end of file +default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

Constructors

Properties

init: (config?: TypeInput) => RecipeListFunction = Recipe.init

Type declaration

    • (config?: TypeInput): RecipeListFunction
    • Parameters

      • Optional config: TypeInput

      Returns RecipeListFunction

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/recipe_emailpassword.default.html b/docs/classes/recipe_emailpassword.default.html index de49d041f..609c2a399 100644 --- a/docs/classes/recipe_emailpassword.default.html +++ b/docs/classes/recipe_emailpassword.default.html @@ -1,4 +1,4 @@ -default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

Error: typeof default = SuperTokensError
init: (config?: TypeInput) => RecipeListFunction = Recipe.init

Type declaration

    • (config?: TypeInput): RecipeListFunction
    • Parameters

      • Optional config: TypeInput

      Returns RecipeListFunction

Methods

  • consumePasswordResetToken(tenantId: string, token: string, userContext?: any): Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>
  • Parameters

    • tenantId: string
    • token: string
    • Optional userContext: any

    Returns Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>

  • createResetPasswordLink(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ link: string; status: "OK" } | { status: "UNKNOWN_USER_ID_ERROR" }>
  • Parameters

    • tenantId: string
    • userId: string
    • email: string
    • userContext: any = {}

    Returns Promise<{ link: string; status: "OK" } | { status: "UNKNOWN_USER_ID_ERROR" }>

  • createResetPasswordToken(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>
  • +default | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • default

    Index

    Constructors

    Properties

    Error: typeof default = SuperTokensError
    init: (config?: TypeInput) => RecipeListFunction = Recipe.init

    Type declaration

      • (config?: TypeInput): RecipeListFunction
      • Parameters

        • Optional config: TypeInput

        Returns RecipeListFunction

    Methods

    • consumePasswordResetToken(tenantId: string, token: string, userContext?: any): Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>
    • Parameters

      • tenantId: string
      • token: string
      • Optional userContext: any

      Returns Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>

    • createResetPasswordLink(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ link: string; status: "OK" } | { status: "UNKNOWN_USER_ID_ERROR" }>
    • Parameters

      • tenantId: string
      • userId: string
      • email: string
      • userContext: any = {}

      Returns Promise<{ link: string; status: "OK" } | { status: "UNKNOWN_USER_ID_ERROR" }>

    • createResetPasswordToken(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>
    • We do not make email optional here cause we want to allow passing in primaryUserId. If we make email optional, and if the user provides a primaryUserId, then it may result in two problems:

      @@ -9,4 +9,4 @@ or has wrong email compared to what the user wanted to generate a reset token for.

    And we want to allow primaryUserId being passed in.

    -

    Parameters

    • tenantId: string
    • userId: string
    • email: string
    • Optional userContext: any

    Returns Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>

  • resetPasswordUsingToken(tenantId: string, token: string, newPassword: string, userContext?: any): Promise<{ status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
  • Parameters

    • tenantId: string
    • token: string
    • newPassword: string
    • Optional userContext: any

    Returns Promise<{ status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

  • sendEmail(input: TypeEmailPasswordPasswordResetEmailDeliveryInput & { userContext?: any }): Promise<void>
  • sendResetPasswordEmail(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" }>
  • signIn(tenantId: string, email: string, password: string, userContext?: any): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "WRONG_CREDENTIALS_ERROR" }>
  • signUp(tenantId: string, email: string, password: string, userContext?: any): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
  • updateEmailOrPassword(input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy?: string; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
  • Parameters

    • input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy?: string; userContext?: any }
      • Optional applyPasswordPolicy?: boolean
      • Optional email?: string
      • Optional password?: string
      • recipeUserId: RecipeUserId
      • Optional tenantIdForPasswordPolicy?: string
      • Optional userContext?: any

    Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

Generated using TypeDoc

\ No newline at end of file +

Parameters

Returns Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/recipe_emailverification.default.html b/docs/classes/recipe_emailverification.default.html index 8183dd675..2243c9a82 100644 --- a/docs/classes/recipe_emailverification.default.html +++ b/docs/classes/recipe_emailverification.default.html @@ -1 +1 @@ -default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

EmailVerificationClaim: EmailVerificationClaimClass = EmailVerificationClaim
Error: typeof default = SuperTokensError
init: (config: TypeInput) => RecipeListFunction = Recipe.init

Type declaration

    • (config: TypeInput): RecipeListFunction
    • Parameters

      • config: TypeInput

      Returns RecipeListFunction

Methods

  • createEmailVerificationLink(tenantId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ link: string; status: "OK" } | { status: "EMAIL_ALREADY_VERIFIED_ERROR" }>
  • createEmailVerificationToken(tenantId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: "OK"; token: string } | { status: "EMAIL_ALREADY_VERIFIED_ERROR" }>
  • isEmailVerified(recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<boolean>
  • revokeEmailVerificationTokens(tenantId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: string }>
  • sendEmail(input: TypeEmailVerificationEmailDeliveryInput & { userContext?: any }): Promise<void>
  • sendEmailVerificationEmail(tenantId: string, userId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: "OK" } | { status: "EMAIL_ALREADY_VERIFIED_ERROR" }>
  • unverifyEmail(recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: string }>
  • verifyEmailUsingToken(tenantId: string, token: string, attemptAccountLinking?: boolean, userContext?: any): Promise<{ status: "OK"; user: UserEmailInfo } | { status: "EMAIL_VERIFICATION_INVALID_TOKEN_ERROR" }>

Generated using TypeDoc

\ No newline at end of file +default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

EmailVerificationClaim: EmailVerificationClaimClass = EmailVerificationClaim
Error: typeof default = SuperTokensError
init: (config: TypeInput) => RecipeListFunction = Recipe.init

Type declaration

    • (config: TypeInput): RecipeListFunction
    • Parameters

      • config: TypeInput

      Returns RecipeListFunction

Methods

  • createEmailVerificationLink(tenantId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ link: string; status: "OK" } | { status: "EMAIL_ALREADY_VERIFIED_ERROR" }>
  • createEmailVerificationToken(tenantId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: "OK"; token: string } | { status: "EMAIL_ALREADY_VERIFIED_ERROR" }>
  • isEmailVerified(recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<boolean>
  • revokeEmailVerificationTokens(tenantId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: string }>
  • sendEmail(input: TypeEmailVerificationEmailDeliveryInput & { userContext?: any }): Promise<void>
  • sendEmailVerificationEmail(tenantId: string, userId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: "OK" } | { status: "EMAIL_ALREADY_VERIFIED_ERROR" }>
  • unverifyEmail(recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: string }>
  • verifyEmailUsingToken(tenantId: string, token: string, attemptAccountLinking?: boolean, userContext?: any): Promise<{ status: "OK"; user: UserEmailInfo } | { status: "EMAIL_VERIFICATION_INVALID_TOKEN_ERROR" }>

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/recipe_jwt.default.html b/docs/classes/recipe_jwt.default.html index 09b82db50..d462bb371 100644 --- a/docs/classes/recipe_jwt.default.html +++ b/docs/classes/recipe_jwt.default.html @@ -1 +1 @@ -default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

Methods

Constructors

Properties

init: (config?: TypeInput) => RecipeListFunction = Recipe.init

Type declaration

    • (config?: TypeInput): RecipeListFunction
    • Parameters

      • Optional config: TypeInput

      Returns RecipeListFunction

Methods

  • createJWT(payload: any, validitySeconds?: number, useStaticSigningKey?: boolean, userContext?: any): Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>
  • Parameters

    • payload: any
    • Optional validitySeconds: number
    • Optional useStaticSigningKey: boolean
    • Optional userContext: any

    Returns Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>

  • getJWKS(userContext?: any): Promise<{ keys: JsonWebKey[]; validityInSeconds?: number }>

Generated using TypeDoc

\ No newline at end of file +default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

Methods

Constructors

Properties

init: (config?: TypeInput) => RecipeListFunction = Recipe.init

Type declaration

    • (config?: TypeInput): RecipeListFunction
    • Parameters

      • Optional config: TypeInput

      Returns RecipeListFunction

Methods

  • createJWT(payload: any, validitySeconds?: number, useStaticSigningKey?: boolean, userContext?: any): Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>
  • Parameters

    • payload: any
    • Optional validitySeconds: number
    • Optional useStaticSigningKey: boolean
    • Optional userContext: any

    Returns Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>

  • getJWKS(userContext?: any): Promise<{ keys: JsonWebKey[]; validityInSeconds?: number }>

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/recipe_multitenancy.default.html b/docs/classes/recipe_multitenancy.default.html index 009eb14ba..86720ba59 100644 --- a/docs/classes/recipe_multitenancy.default.html +++ b/docs/classes/recipe_multitenancy.default.html @@ -1 +1 @@ -default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

init: (config?: TypeInput) => RecipeListFunction = Recipe.init

Type declaration

    • (config?: TypeInput): RecipeListFunction
    • Parameters

      • Optional config: TypeInput

      Returns RecipeListFunction

Methods

  • associateUserToTenant(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; wasAlreadyAssociated: boolean } | { status: "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" | "THIRD_PARTY_USER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "ASSOCIATION_NOT_ALLOWED_ERROR" }>
  • Parameters

    • tenantId: string
    • recipeUserId: RecipeUserId
    • Optional userContext: any

    Returns Promise<{ status: "OK"; wasAlreadyAssociated: boolean } | { status: "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" | "THIRD_PARTY_USER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "ASSOCIATION_NOT_ALLOWED_ERROR" }>

  • createOrUpdateTenant(tenantId: string, config?: { coreConfig?: {}; emailPasswordEnabled?: boolean; passwordlessEnabled?: boolean; thirdPartyEnabled?: boolean }, userContext?: any): Promise<{ createdNew: boolean; status: "OK" }>
  • Parameters

    • tenantId: string
    • Optional config: { coreConfig?: {}; emailPasswordEnabled?: boolean; passwordlessEnabled?: boolean; thirdPartyEnabled?: boolean }
      • Optional coreConfig?: {}
        • [key: string]: any
      • Optional emailPasswordEnabled?: boolean
      • Optional passwordlessEnabled?: boolean
      • Optional thirdPartyEnabled?: boolean
    • Optional userContext: any

    Returns Promise<{ createdNew: boolean; status: "OK" }>

  • createOrUpdateThirdPartyConfig(tenantId: string, config: ProviderConfig, skipValidation?: boolean, userContext?: any): Promise<{ createdNew: boolean; status: "OK" }>
  • Parameters

    • tenantId: string
    • config: ProviderConfig
    • Optional skipValidation: boolean
    • Optional userContext: any

    Returns Promise<{ createdNew: boolean; status: "OK" }>

  • deleteTenant(tenantId: string, userContext?: any): Promise<{ didExist: boolean; status: "OK" }>
  • deleteThirdPartyConfig(tenantId: string, thirdPartyId: string, userContext?: any): Promise<{ didConfigExist: boolean; status: "OK" }>
  • disassociateUserFromTenant(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; wasAssociated: boolean }>
  • getTenant(tenantId: string, userContext?: any): Promise<undefined | { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }>
  • Parameters

    • tenantId: string
    • Optional userContext: any

    Returns Promise<undefined | { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }>

  • listAllTenants(userContext?: any): Promise<{ status: "OK"; tenants: { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; tenantId: string; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }[] }>
  • Parameters

    • Optional userContext: any

    Returns Promise<{ status: "OK"; tenants: { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; tenantId: string; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }[] }>

Generated using TypeDoc

\ No newline at end of file +default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

init: (config?: TypeInput) => RecipeListFunction = Recipe.init

Type declaration

    • (config?: TypeInput): RecipeListFunction
    • Parameters

      • Optional config: TypeInput

      Returns RecipeListFunction

Methods

  • associateUserToTenant(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; wasAlreadyAssociated: boolean } | { status: "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" | "THIRD_PARTY_USER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "ASSOCIATION_NOT_ALLOWED_ERROR" }>
  • Parameters

    • tenantId: string
    • recipeUserId: RecipeUserId
    • Optional userContext: any

    Returns Promise<{ status: "OK"; wasAlreadyAssociated: boolean } | { status: "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" | "THIRD_PARTY_USER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "ASSOCIATION_NOT_ALLOWED_ERROR" }>

  • createOrUpdateTenant(tenantId: string, config?: { coreConfig?: {}; emailPasswordEnabled?: boolean; passwordlessEnabled?: boolean; thirdPartyEnabled?: boolean }, userContext?: any): Promise<{ createdNew: boolean; status: "OK" }>
  • Parameters

    • tenantId: string
    • Optional config: { coreConfig?: {}; emailPasswordEnabled?: boolean; passwordlessEnabled?: boolean; thirdPartyEnabled?: boolean }
      • Optional coreConfig?: {}
        • [key: string]: any
      • Optional emailPasswordEnabled?: boolean
      • Optional passwordlessEnabled?: boolean
      • Optional thirdPartyEnabled?: boolean
    • Optional userContext: any

    Returns Promise<{ createdNew: boolean; status: "OK" }>

  • createOrUpdateThirdPartyConfig(tenantId: string, config: ProviderConfig, skipValidation?: boolean, userContext?: any): Promise<{ createdNew: boolean; status: "OK" }>
  • Parameters

    • tenantId: string
    • config: ProviderConfig
    • Optional skipValidation: boolean
    • Optional userContext: any

    Returns Promise<{ createdNew: boolean; status: "OK" }>

  • deleteTenant(tenantId: string, userContext?: any): Promise<{ didExist: boolean; status: "OK" }>
  • deleteThirdPartyConfig(tenantId: string, thirdPartyId: string, userContext?: any): Promise<{ didConfigExist: boolean; status: "OK" }>
  • disassociateUserFromTenant(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; wasAssociated: boolean }>
  • getTenant(tenantId: string, userContext?: any): Promise<undefined | { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }>
  • Parameters

    • tenantId: string
    • Optional userContext: any

    Returns Promise<undefined | { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }>

  • listAllTenants(userContext?: any): Promise<{ status: "OK"; tenants: { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; tenantId: string; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }[] }>
  • Parameters

    • Optional userContext: any

    Returns Promise<{ status: "OK"; tenants: { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; tenantId: string; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }[] }>

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/recipe_openid.default.html b/docs/classes/recipe_openid.default.html index d91b1f92b..1287ebf80 100644 --- a/docs/classes/recipe_openid.default.html +++ b/docs/classes/recipe_openid.default.html @@ -1 +1 @@ -default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

init: (config?: TypeInput) => RecipeListFunction = OpenIdRecipe.init

Type declaration

    • (config?: TypeInput): RecipeListFunction
    • Parameters

      • Optional config: TypeInput

      Returns RecipeListFunction

Methods

  • createJWT(payload?: any, validitySeconds?: number, useStaticSigningKey?: boolean, userContext?: any): Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>
  • Parameters

    • Optional payload: any
    • Optional validitySeconds: number
    • Optional useStaticSigningKey: boolean
    • Optional userContext: any

    Returns Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>

  • getJWKS(userContext?: any): Promise<{ keys: JsonWebKey[]; validityInSeconds?: number }>
  • getOpenIdDiscoveryConfiguration(userContext?: any): Promise<{ issuer: string; jwks_uri: string; status: "OK" }>

Generated using TypeDoc

\ No newline at end of file +default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

init: (config?: TypeInput) => RecipeListFunction = OpenIdRecipe.init

Type declaration

    • (config?: TypeInput): RecipeListFunction
    • Parameters

      • Optional config: TypeInput

      Returns RecipeListFunction

Methods

  • createJWT(payload?: any, validitySeconds?: number, useStaticSigningKey?: boolean, userContext?: any): Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>
  • Parameters

    • Optional payload: any
    • Optional validitySeconds: number
    • Optional useStaticSigningKey: boolean
    • Optional userContext: any

    Returns Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>

  • getJWKS(userContext?: any): Promise<{ keys: JsonWebKey[]; validityInSeconds?: number }>
  • getOpenIdDiscoveryConfiguration(userContext?: any): Promise<{ issuer: string; jwks_uri: string; status: "OK" }>

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/recipe_passwordless.default.html b/docs/classes/recipe_passwordless.default.html index 1cfbc89f0..b0346e0e5 100644 --- a/docs/classes/recipe_passwordless.default.html +++ b/docs/classes/recipe_passwordless.default.html @@ -1 +1 @@ -default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

Error: typeof default = SuperTokensError
init: (config: TypeInput) => RecipeListFunction = Recipe.init

Type declaration

    • (config: TypeInput): RecipeListFunction
    • Parameters

      • config: TypeInput

      Returns RecipeListFunction

Methods

  • consumeCode(input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>
  • Parameters

    • input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }

    Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>

  • createCode(input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>
  • Parameters

    • input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })

    Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>

  • createMagicLink(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<string>
  • Parameters

    • input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }

    Returns Promise<string>

  • createNewCodeForDevice(input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>
  • Parameters

    • input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }
      • deviceId: string
      • tenantId: string
      • Optional userContext?: any
      • Optional userInputCode?: string

    Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>

  • listCodesByDeviceId(input: { deviceId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
  • Parameters

    • input: { deviceId: string; tenantId: string; userContext?: any }
      • deviceId: string
      • tenantId: string
      • Optional userContext?: any

    Returns Promise<undefined | DeviceType>

  • listCodesByEmail(input: { email: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
  • Parameters

    • input: { email: string; tenantId: string; userContext?: any }
      • email: string
      • tenantId: string
      • Optional userContext?: any

    Returns Promise<DeviceType[]>

  • listCodesByPhoneNumber(input: { phoneNumber: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
  • Parameters

    • input: { phoneNumber: string; tenantId: string; userContext?: any }
      • phoneNumber: string
      • tenantId: string
      • Optional userContext?: any

    Returns Promise<DeviceType[]>

  • listCodesByPreAuthSessionId(input: { preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
  • Parameters

    • input: { preAuthSessionId: string; tenantId: string; userContext?: any }
      • preAuthSessionId: string
      • tenantId: string
      • Optional userContext?: any

    Returns Promise<undefined | DeviceType>

  • revokeAllCodes(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
  • Parameters

    • input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }

    Returns Promise<{ status: "OK" }>

  • revokeCode(input: { codeId: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
  • Parameters

    • input: { codeId: string; tenantId: string; userContext?: any }
      • codeId: string
      • tenantId: string
      • Optional userContext?: any

    Returns Promise<{ status: "OK" }>

  • sendEmail(input: TypePasswordlessEmailDeliveryInput & { userContext?: any }): Promise<void>
  • sendSms(input: TypePasswordlessSmsDeliveryInput & { userContext?: any }): Promise<void>
  • signInUp(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: string; user: User }>
  • Parameters

    • input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }

    Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: string; user: User }>

  • updateUser(input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>
  • Parameters

    • input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }
      • Optional email?: null | string
      • Optional phoneNumber?: null | string
      • recipeUserId: RecipeUserId
      • Optional userContext?: any

    Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>

Generated using TypeDoc

\ No newline at end of file +default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

Error: typeof default = SuperTokensError
init: (config: TypeInput) => RecipeListFunction = Recipe.init

Type declaration

    • (config: TypeInput): RecipeListFunction
    • Parameters

      • config: TypeInput

      Returns RecipeListFunction

Methods

  • consumeCode(input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>
  • Parameters

    • input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }

    Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>

  • createCode(input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>
  • Parameters

    • input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })

    Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>

  • createMagicLink(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<string>
  • Parameters

    • input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }

    Returns Promise<string>

  • createNewCodeForDevice(input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>
  • Parameters

    • input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }
      • deviceId: string
      • tenantId: string
      • Optional userContext?: any
      • Optional userInputCode?: string

    Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>

  • listCodesByDeviceId(input: { deviceId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
  • Parameters

    • input: { deviceId: string; tenantId: string; userContext?: any }
      • deviceId: string
      • tenantId: string
      • Optional userContext?: any

    Returns Promise<undefined | DeviceType>

  • listCodesByEmail(input: { email: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
  • Parameters

    • input: { email: string; tenantId: string; userContext?: any }
      • email: string
      • tenantId: string
      • Optional userContext?: any

    Returns Promise<DeviceType[]>

  • listCodesByPhoneNumber(input: { phoneNumber: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
  • Parameters

    • input: { phoneNumber: string; tenantId: string; userContext?: any }
      • phoneNumber: string
      • tenantId: string
      • Optional userContext?: any

    Returns Promise<DeviceType[]>

  • listCodesByPreAuthSessionId(input: { preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
  • Parameters

    • input: { preAuthSessionId: string; tenantId: string; userContext?: any }
      • preAuthSessionId: string
      • tenantId: string
      • Optional userContext?: any

    Returns Promise<undefined | DeviceType>

  • revokeAllCodes(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
  • Parameters

    • input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }

    Returns Promise<{ status: "OK" }>

  • revokeCode(input: { codeId: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
  • Parameters

    • input: { codeId: string; tenantId: string; userContext?: any }
      • codeId: string
      • tenantId: string
      • Optional userContext?: any

    Returns Promise<{ status: "OK" }>

  • sendEmail(input: TypePasswordlessEmailDeliveryInput & { userContext?: any }): Promise<void>
  • sendSms(input: TypePasswordlessSmsDeliveryInput & { userContext?: any }): Promise<void>
  • signInUp(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: string; user: User }>
  • Parameters

    • input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }

    Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: string; user: User }>

  • updateUser(input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>
  • Parameters

    • input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }
      • Optional email?: null | string
      • Optional phoneNumber?: null | string
      • recipeUserId: RecipeUserId
      • Optional userContext?: any

    Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/recipe_session.default.html b/docs/classes/recipe_session.default.html index effa83798..2b6d70228 100644 --- a/docs/classes/recipe_session.default.html +++ b/docs/classes/recipe_session.default.html @@ -1,4 +1,4 @@ -default | supertokens-node
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

Error: typeof default = SuperTokensError
init: (config?: TypeInput) => RecipeListFunction = Recipe.init

Type declaration

    • (config?: TypeInput): RecipeListFunction
    • Parameters

      • Optional config: TypeInput

      Returns RecipeListFunction

Methods

  • createJWT(payload?: any, validitySeconds?: number, useStaticSigningKey?: boolean, userContext?: any): Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>
  • Parameters

    • Optional payload: any
    • Optional validitySeconds: number
    • Optional useStaticSigningKey: boolean
    • userContext: any = {}

    Returns Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>

  • createNewSession(req: any, res: any, tenantId: string, recipeUserId: RecipeUserId, accessTokenPayload?: any, sessionDataInDatabase?: any, userContext?: any): Promise<SessionContainer>
  • createNewSessionWithoutRequestResponse(tenantId: string, recipeUserId: RecipeUserId, accessTokenPayload?: any, sessionDataInDatabase?: any, disableAntiCsrf?: boolean, userContext?: any): Promise<SessionContainer>
  • fetchAndSetClaim(sessionHandle: string, claim: SessionClaim<any>, userContext?: any): Promise<boolean>
  • getAllSessionHandlesForUser(userId: string, fetchSessionsForAllLinkedAccounts?: boolean, tenantId?: string, userContext?: any): Promise<string[]>
  • Parameters

    • userId: string
    • fetchSessionsForAllLinkedAccounts: boolean = true
    • Optional tenantId: string
    • userContext: any = {}

    Returns Promise<string[]>

  • getClaimValue<T>(sessionHandle: string, claim: SessionClaim<T>, userContext?: any): Promise<{ status: "SESSION_DOES_NOT_EXIST_ERROR" } | { status: "OK"; value: undefined | T }>
  • Type parameters

    • T

    Parameters

    • sessionHandle: string
    • claim: SessionClaim<T>
    • userContext: any = {}

    Returns Promise<{ status: "SESSION_DOES_NOT_EXIST_ERROR" } | { status: "OK"; value: undefined | T }>

  • getJWKS(userContext?: any): Promise<{ keys: JsonWebKey[] }>
  • getOpenIdDiscoveryConfiguration(userContext?: any): Promise<{ issuer: string; jwks_uri: string; status: "OK" }>
  • getSessionInformation(sessionHandle: string, userContext?: any): Promise<undefined | SessionInformation>
  • getSessionWithoutRequestResponse(accessToken: string, antiCsrfToken?: string): Promise<SessionContainer>
  • getSessionWithoutRequestResponse(accessToken: string, antiCsrfToken?: string, options?: VerifySessionOptions & { sessionRequired?: true }, userContext?: any): Promise<SessionContainer>
  • getSessionWithoutRequestResponse(accessToken: string, antiCsrfToken?: string, options?: VerifySessionOptions & { sessionRequired: false }, userContext?: any): Promise<undefined | SessionContainer>
  • getSessionWithoutRequestResponse(accessToken: string, antiCsrfToken?: string, options?: VerifySessionOptions, userContext?: any): Promise<undefined | SessionContainer>
  • mergeIntoAccessTokenPayload(sessionHandle: string, accessTokenPayloadUpdate: JSONObject, userContext?: any): Promise<boolean>
  • refreshSession(req: any, res: any, userContext?: any): Promise<SessionContainer>
  • refreshSessionWithoutRequestResponse(refreshToken: string, disableAntiCsrf?: boolean, antiCsrfToken?: string, userContext?: any): Promise<SessionContainer>
  • removeClaim(sessionHandle: string, claim: SessionClaim<any>, userContext?: any): Promise<boolean>
  • revokeAllSessionsForUser(userId: string, revokeSessionsForLinkedAccounts?: boolean, tenantId?: string, userContext?: any): Promise<string[]>
  • Parameters

    • userId: string
    • revokeSessionsForLinkedAccounts: boolean = true
    • Optional tenantId: string
    • userContext: any = {}

    Returns Promise<string[]>

  • revokeMultipleSessions(sessionHandles: string[], userContext?: any): Promise<string[]>
  • revokeSession(sessionHandle: string, userContext?: any): Promise<boolean>
  • setClaimValue<T>(sessionHandle: string, claim: SessionClaim<T>, value: T, userContext?: any): Promise<boolean>
  • updateSessionDataInDatabase(sessionHandle: string, newSessionData: any, userContext?: any): Promise<boolean>

Generated using TypeDoc

\ No newline at end of file +

Returns Promise<SessionContainer>

  • Parameters

    Returns Promise<SessionContainer>

  • Parameters

    Returns Promise<undefined | SessionContainer>

  • Parameters

    Returns Promise<undefined | SessionContainer>

  • Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/classes/recipe_thirdparty.default.html b/docs/classes/recipe_thirdparty.default.html index f8bbf3629..eee764af5 100644 --- a/docs/classes/recipe_thirdparty.default.html +++ b/docs/classes/recipe_thirdparty.default.html @@ -1 +1 @@ -default | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • default

    Index

    Constructors

    Properties

    Error: typeof default = SuperTokensError
    init: (config?: TypeInput) => RecipeListFunction = Recipe.init

    Type declaration

      • (config?: TypeInput): RecipeListFunction
      • Parameters

        • Optional config: TypeInput

        Returns RecipeListFunction

    Methods

    • getProvider(tenantId: string, thirdPartyId: string, clientType: undefined | string, userContext?: any): Promise<undefined | TypeProvider>
    • manuallyCreateOrUpdateUser(tenantId: string, thirdPartyId: string, thirdPartyUserId: string, email: string, isVerified: boolean, userContext?: any): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
    • Parameters

      • tenantId: string
      • thirdPartyId: string
      • thirdPartyUserId: string
      • email: string
      • isVerified: boolean
      • userContext: any = {}

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    Generated using TypeDoc

    \ No newline at end of file +default | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • default

    Index

    Constructors

    Properties

    Error: typeof default = SuperTokensError
    init: (config?: TypeInput) => RecipeListFunction = Recipe.init

    Type declaration

      • (config?: TypeInput): RecipeListFunction
      • Parameters

        • Optional config: TypeInput

        Returns RecipeListFunction

    Methods

    • getProvider(tenantId: string, thirdPartyId: string, clientType: undefined | string, userContext?: any): Promise<undefined | TypeProvider>
    • manuallyCreateOrUpdateUser(tenantId: string, thirdPartyId: string, thirdPartyUserId: string, email: string, isVerified: boolean, userContext?: any): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
    • Parameters

      • tenantId: string
      • thirdPartyId: string
      • thirdPartyUserId: string
      • email: string
      • isVerified: boolean
      • userContext: any = {}

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/classes/recipe_thirdpartyemailpassword.default.html b/docs/classes/recipe_thirdpartyemailpassword.default.html index cc894ede4..d324feeb6 100644 --- a/docs/classes/recipe_thirdpartyemailpassword.default.html +++ b/docs/classes/recipe_thirdpartyemailpassword.default.html @@ -1 +1 @@ -default | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • default

    Index

    Constructors

    Properties

    Error: typeof default = SuperTokensError
    init: (config?: TypeInput) => RecipeListFunction = Recipe.init

    Type declaration

      • (config?: TypeInput): RecipeListFunction
      • Parameters

        • Optional config: TypeInput

        Returns RecipeListFunction

    Methods

    • consumePasswordResetToken(tenantId: string, token: string, userContext?: any): Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>
    • createResetPasswordLink(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ link: string; status: "OK" } | { status: "UNKNOWN_USER_ID_ERROR" }>
    • createResetPasswordToken(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>
    • emailPasswordSignIn(tenantId: string, email: string, password: string, userContext?: any): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "WRONG_CREDENTIALS_ERROR" }>
    • emailPasswordSignUp(tenantId: string, email: string, password: string, userContext?: any): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
    • resetPasswordUsingToken(tenantId: string, token: string, newPassword: string, userContext?: any): Promise<{ status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
    • Parameters

      • tenantId: string
      • token: string
      • newPassword: string
      • Optional userContext: any

      Returns Promise<{ status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

    • sendEmail(input: TypeEmailPasswordPasswordResetEmailDeliveryInput & { userContext?: any }): Promise<void>
    • sendResetPasswordEmail(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" }>
    • thirdPartyGetProvider(tenantId: string, thirdPartyId: string, clientType: undefined | string, userContext?: any): Promise<undefined | TypeProvider>
    • thirdPartyManuallyCreateOrUpdateUser(tenantId: string, thirdPartyId: string, thirdPartyUserId: string, email: string, isVerified: boolean, userContext?: any): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
    • Parameters

      • tenantId: string
      • thirdPartyId: string
      • thirdPartyUserId: string
      • email: string
      • isVerified: boolean
      • userContext: any = {}

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • updateEmailOrPassword(input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy?: string; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
    • Parameters

      • input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy?: string; userContext?: any }
        • Optional applyPasswordPolicy?: boolean
        • Optional email?: string
        • Optional password?: string
        • recipeUserId: RecipeUserId
        • Optional tenantIdForPasswordPolicy?: string
        • Optional userContext?: any

      Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file +default | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • default

    Index

    Constructors

    Properties

    Error: typeof default = SuperTokensError
    init: (config?: TypeInput) => RecipeListFunction = Recipe.init

    Type declaration

      • (config?: TypeInput): RecipeListFunction
      • Parameters

        • Optional config: TypeInput

        Returns RecipeListFunction

    Methods

    • consumePasswordResetToken(tenantId: string, token: string, userContext?: any): Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>
    • createResetPasswordLink(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ link: string; status: "OK" } | { status: "UNKNOWN_USER_ID_ERROR" }>
    • createResetPasswordToken(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>
    • emailPasswordSignIn(tenantId: string, email: string, password: string, userContext?: any): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "WRONG_CREDENTIALS_ERROR" }>
    • emailPasswordSignUp(tenantId: string, email: string, password: string, userContext?: any): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
    • resetPasswordUsingToken(tenantId: string, token: string, newPassword: string, userContext?: any): Promise<{ status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
    • Parameters

      • tenantId: string
      • token: string
      • newPassword: string
      • Optional userContext: any

      Returns Promise<{ status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

    • sendEmail(input: TypeEmailPasswordPasswordResetEmailDeliveryInput & { userContext?: any }): Promise<void>
    • sendResetPasswordEmail(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" }>
    • thirdPartyGetProvider(tenantId: string, thirdPartyId: string, clientType: undefined | string, userContext?: any): Promise<undefined | TypeProvider>
    • thirdPartyManuallyCreateOrUpdateUser(tenantId: string, thirdPartyId: string, thirdPartyUserId: string, email: string, isVerified: boolean, userContext?: any): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
    • Parameters

      • tenantId: string
      • thirdPartyId: string
      • thirdPartyUserId: string
      • email: string
      • isVerified: boolean
      • userContext: any = {}

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • updateEmailOrPassword(input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy?: string; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
    • Parameters

      • input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy?: string; userContext?: any }
        • Optional applyPasswordPolicy?: boolean
        • Optional email?: string
        • Optional password?: string
        • recipeUserId: RecipeUserId
        • Optional tenantIdForPasswordPolicy?: string
        • Optional userContext?: any

      Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/classes/recipe_thirdpartypasswordless.default.html b/docs/classes/recipe_thirdpartypasswordless.default.html index 3f729dce1..42a21405c 100644 --- a/docs/classes/recipe_thirdpartypasswordless.default.html +++ b/docs/classes/recipe_thirdpartypasswordless.default.html @@ -1 +1 @@ -default | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • default

    Index

    Constructors

    Properties

    Error: typeof default = SuperTokensError
    init: (config: TypeInput) => RecipeListFunction = Recipe.init

    Type declaration

      • (config: TypeInput): RecipeListFunction
      • Parameters

        • config: TypeInput

        Returns RecipeListFunction

    Methods

    • consumeCode(input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>
    • Parameters

      • input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>

    • createCode(input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>
    • Parameters

      • input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })

      Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>

    • createMagicLink(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<string>
    • createNewCodeForDevice(input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>
    • Parameters

      • input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }
        • deviceId: string
        • tenantId: string
        • Optional userContext?: any
        • Optional userInputCode?: string

      Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>

    • listCodesByDeviceId(input: { deviceId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
    • listCodesByEmail(input: { email: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
    • listCodesByPhoneNumber(input: { phoneNumber: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
    • listCodesByPreAuthSessionId(input: { preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
    • Parameters

      • input: { preAuthSessionId: string; tenantId: string; userContext?: any }
        • preAuthSessionId: string
        • tenantId: string
        • Optional userContext?: any

      Returns Promise<undefined | DeviceType>

    • passwordlessSignInUp(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: string; user: User }>
    • revokeAllCodes(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
    • revokeCode(input: { codeId: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
    • sendEmail(input: TypePasswordlessEmailDeliveryInput & { userContext?: any }): Promise<void>
    • sendSms(input: TypePasswordlessSmsDeliveryInput & { userContext?: any }): Promise<void>
    • thirdPartyGetProvider(tenantId: string, thirdPartyId: string, clientType: undefined | string, userContext?: any): Promise<undefined | TypeProvider>
    • thirdPartyManuallyCreateOrUpdateUser(tenantId: string, thirdPartyId: string, thirdPartyUserId: string, email: string, isVerified: boolean, userContext?: any): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
    • Parameters

      • tenantId: string
      • thirdPartyId: string
      • thirdPartyUserId: string
      • email: string
      • isVerified: boolean
      • userContext: any = {}

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • updatePasswordlessUser(input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>
    • Parameters

      • input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }
        • Optional email?: null | string
        • Optional phoneNumber?: null | string
        • recipeUserId: RecipeUserId
        • Optional userContext?: any

      Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file +default | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • default

    Index

    Constructors

    Properties

    Error: typeof default = SuperTokensError
    init: (config: TypeInput) => RecipeListFunction = Recipe.init

    Type declaration

      • (config: TypeInput): RecipeListFunction
      • Parameters

        • config: TypeInput

        Returns RecipeListFunction

    Methods

    • consumeCode(input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>
    • Parameters

      • input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>

    • createCode(input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>
    • Parameters

      • input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })

      Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>

    • createMagicLink(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<string>
    • createNewCodeForDevice(input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>
    • Parameters

      • input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }
        • deviceId: string
        • tenantId: string
        • Optional userContext?: any
        • Optional userInputCode?: string

      Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>

    • listCodesByDeviceId(input: { deviceId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
    • listCodesByEmail(input: { email: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
    • listCodesByPhoneNumber(input: { phoneNumber: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
    • listCodesByPreAuthSessionId(input: { preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
    • Parameters

      • input: { preAuthSessionId: string; tenantId: string; userContext?: any }
        • preAuthSessionId: string
        • tenantId: string
        • Optional userContext?: any

      Returns Promise<undefined | DeviceType>

    • passwordlessSignInUp(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: string; user: User }>
    • revokeAllCodes(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
    • revokeCode(input: { codeId: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
    • sendEmail(input: TypePasswordlessEmailDeliveryInput & { userContext?: any }): Promise<void>
    • sendSms(input: TypePasswordlessSmsDeliveryInput & { userContext?: any }): Promise<void>
    • thirdPartyGetProvider(tenantId: string, thirdPartyId: string, clientType: undefined | string, userContext?: any): Promise<undefined | TypeProvider>
    • thirdPartyManuallyCreateOrUpdateUser(tenantId: string, thirdPartyId: string, thirdPartyUserId: string, email: string, isVerified: boolean, userContext?: any): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
    • Parameters

      • tenantId: string
      • thirdPartyId: string
      • thirdPartyUserId: string
      • email: string
      • isVerified: boolean
      • userContext: any = {}

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • updatePasswordlessUser(input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>
    • Parameters

      • input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }
        • Optional email?: null | string
        • Optional phoneNumber?: null | string
        • recipeUserId: RecipeUserId
        • Optional userContext?: any

      Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/classes/recipe_usermetadata.default.html b/docs/classes/recipe_usermetadata.default.html index 11e6c2b1c..14d246b53 100644 --- a/docs/classes/recipe_usermetadata.default.html +++ b/docs/classes/recipe_usermetadata.default.html @@ -1 +1 @@ -default | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • default

    Index

    Constructors

    Properties

    init: (config?: TypeInput) => RecipeListFunction = Recipe.init

    Type declaration

      • (config?: TypeInput): RecipeListFunction
      • Parameters

        • Optional config: TypeInput

        Returns RecipeListFunction

    Methods

    • clearUserMetadata(userId: string, userContext?: any): Promise<{ status: "OK" }>
    • getUserMetadata(userId: string, userContext?: any): Promise<{ metadata: any; status: "OK" }>
    • updateUserMetadata(userId: string, metadataUpdate: JSONObject, userContext?: any): Promise<{ metadata: JSONObject; status: "OK" }>

    Generated using TypeDoc

    \ No newline at end of file +default | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • default

    Index

    Constructors

    Properties

    init: (config?: TypeInput) => RecipeListFunction = Recipe.init

    Type declaration

      • (config?: TypeInput): RecipeListFunction
      • Parameters

        • Optional config: TypeInput

        Returns RecipeListFunction

    Methods

    • clearUserMetadata(userId: string, userContext?: any): Promise<{ status: "OK" }>
    • getUserMetadata(userId: string, userContext?: any): Promise<{ metadata: any; status: "OK" }>
    • updateUserMetadata(userId: string, metadataUpdate: JSONObject, userContext?: any): Promise<{ metadata: JSONObject; status: "OK" }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/classes/recipe_userroles.default.html b/docs/classes/recipe_userroles.default.html index 53c204cd2..27d2a444b 100644 --- a/docs/classes/recipe_userroles.default.html +++ b/docs/classes/recipe_userroles.default.html @@ -1 +1 @@ -default | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • default

    Index

    Constructors

    Properties

    PermissionClaim: PermissionClaimClass = PermissionClaim
    UserRoleClaim: UserRoleClaimClass = UserRoleClaim
    init: (config?: TypeInput) => RecipeListFunction = Recipe.init

    Type declaration

      • (config?: TypeInput): RecipeListFunction
      • Parameters

        • Optional config: TypeInput

        Returns RecipeListFunction

    Methods

    • addRoleToUser(tenantId: string, userId: string, role: string, userContext?: any): Promise<{ didUserAlreadyHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • tenantId: string
      • userId: string
      • role: string
      • Optional userContext: any

      Returns Promise<{ didUserAlreadyHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    • createNewRoleOrAddPermissions(role: string, permissions: string[], userContext?: any): Promise<{ createdNewRole: boolean; status: "OK" }>
    • deleteRole(role: string, userContext?: any): Promise<{ didRoleExist: boolean; status: "OK" }>
    • getAllRoles(userContext?: any): Promise<{ roles: string[]; status: "OK" }>
    • getPermissionsForRole(role: string, userContext?: any): Promise<{ permissions: string[]; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • role: string
      • Optional userContext: any

      Returns Promise<{ permissions: string[]; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    • getRolesForUser(tenantId: string, userId: string, userContext?: any): Promise<{ roles: string[]; status: "OK" }>
    • getRolesThatHavePermission(permission: string, userContext?: any): Promise<{ roles: string[]; status: "OK" }>
    • getUsersThatHaveRole(tenantId: string, role: string, userContext?: any): Promise<{ status: "OK"; users: string[] } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • tenantId: string
      • role: string
      • Optional userContext: any

      Returns Promise<{ status: "OK"; users: string[] } | { status: "UNKNOWN_ROLE_ERROR" }>

    • removePermissionsFromRole(role: string, permissions: string[], userContext?: any): Promise<{ status: "OK" | "UNKNOWN_ROLE_ERROR" }>
    • removeUserRole(tenantId: string, userId: string, role: string, userContext?: any): Promise<{ didUserHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • tenantId: string
      • userId: string
      • role: string
      • Optional userContext: any

      Returns Promise<{ didUserHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file +default | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • default

    Index

    Constructors

    Properties

    PermissionClaim: PermissionClaimClass = PermissionClaim
    UserRoleClaim: UserRoleClaimClass = UserRoleClaim
    init: (config?: TypeInput) => RecipeListFunction = Recipe.init

    Type declaration

      • (config?: TypeInput): RecipeListFunction
      • Parameters

        • Optional config: TypeInput

        Returns RecipeListFunction

    Methods

    • addRoleToUser(tenantId: string, userId: string, role: string, userContext?: any): Promise<{ didUserAlreadyHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • tenantId: string
      • userId: string
      • role: string
      • Optional userContext: any

      Returns Promise<{ didUserAlreadyHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    • createNewRoleOrAddPermissions(role: string, permissions: string[], userContext?: any): Promise<{ createdNewRole: boolean; status: "OK" }>
    • deleteRole(role: string, userContext?: any): Promise<{ didRoleExist: boolean; status: "OK" }>
    • getAllRoles(userContext?: any): Promise<{ roles: string[]; status: "OK" }>
    • getPermissionsForRole(role: string, userContext?: any): Promise<{ permissions: string[]; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • role: string
      • Optional userContext: any

      Returns Promise<{ permissions: string[]; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    • getRolesForUser(tenantId: string, userId: string, userContext?: any): Promise<{ roles: string[]; status: "OK" }>
    • getRolesThatHavePermission(permission: string, userContext?: any): Promise<{ roles: string[]; status: "OK" }>
    • getUsersThatHaveRole(tenantId: string, role: string, userContext?: any): Promise<{ status: "OK"; users: string[] } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • tenantId: string
      • role: string
      • Optional userContext: any

      Returns Promise<{ status: "OK"; users: string[] } | { status: "UNKNOWN_ROLE_ERROR" }>

    • removePermissionsFromRole(role: string, permissions: string[], userContext?: any): Promise<{ status: "OK" | "UNKNOWN_ROLE_ERROR" }>
    • removeUserRole(tenantId: string, userId: string, role: string, userContext?: any): Promise<{ didUserHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • tenantId: string
      • userId: string
      • role: string
      • Optional userContext: any

      Returns Promise<{ didUserHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 9251e0790..c5959a718 100644 --- a/docs/index.html +++ b/docs/index.html @@ -35,4 +35,4 @@

    Authors

    Created with :heart: by the folks at supertokens.com.

    Featured on Openbase

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/framework_awsLambda.SessionEvent.html b/docs/interfaces/framework_awsLambda.SessionEvent.html index 015df1ce2..57fbc8f4f 100644 --- a/docs/interfaces/framework_awsLambda.SessionEvent.html +++ b/docs/interfaces/framework_awsLambda.SessionEvent.html @@ -1 +1 @@ -SessionEvent | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • SupertokensLambdaEvent
      • SessionEvent

    Index

    Properties

    body: null | string
    headers: APIGatewayProxyEventHeaders
    httpMethod: string
    isBase64Encoded: boolean
    multiValueHeaders: APIGatewayProxyEventMultiValueHeaders
    multiValueQueryStringParameters: null | APIGatewayProxyEventMultiValueQueryStringParameters
    path: string
    pathParameters: null | APIGatewayProxyEventPathParameters
    queryStringParameters: null | APIGatewayProxyEventQueryStringParameters
    requestContext: APIGatewayEventRequestContextWithAuthorizer<APIGatewayEventDefaultAuthorizerContext>
    resource: string
    stageVariables: null | APIGatewayProxyEventStageVariables
    supertokens: { response: { cookies: string[]; headers: { allowDuplicateKey: boolean; key: string; value: string | number | boolean }[] } }

    Type declaration

    • response: { cookies: string[]; headers: { allowDuplicateKey: boolean; key: string; value: string | number | boolean }[] }
      • cookies: string[]
      • headers: { allowDuplicateKey: boolean; key: string; value: string | number | boolean }[]

    Generated using TypeDoc

    \ No newline at end of file +SessionEvent | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • SupertokensLambdaEvent
      • SessionEvent

    Index

    Properties

    body: null | string
    headers: APIGatewayProxyEventHeaders
    httpMethod: string
    isBase64Encoded: boolean
    multiValueHeaders: APIGatewayProxyEventMultiValueHeaders
    multiValueQueryStringParameters: null | APIGatewayProxyEventMultiValueQueryStringParameters
    path: string
    pathParameters: null | APIGatewayProxyEventPathParameters
    queryStringParameters: null | APIGatewayProxyEventQueryStringParameters
    requestContext: APIGatewayEventRequestContextWithAuthorizer<APIGatewayEventDefaultAuthorizerContext>
    resource: string
    stageVariables: null | APIGatewayProxyEventStageVariables
    supertokens: { response: { cookies: string[]; headers: { allowDuplicateKey: boolean; key: string; value: string | number | boolean }[] } }

    Type declaration

    • response: { cookies: string[]; headers: { allowDuplicateKey: boolean; key: string; value: string | number | boolean }[] }
      • cookies: string[]
      • headers: { allowDuplicateKey: boolean; key: string; value: string | number | boolean }[]

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/framework_awsLambda.SessionEventV2.html b/docs/interfaces/framework_awsLambda.SessionEventV2.html index 3714ee4fa..e5b1e7241 100644 --- a/docs/interfaces/framework_awsLambda.SessionEventV2.html +++ b/docs/interfaces/framework_awsLambda.SessionEventV2.html @@ -1 +1 @@ -SessionEventV2 | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • SupertokensLambdaEventV2
      • SessionEventV2

    Index

    Properties

    body?: string
    cookies?: string[]
    headers: APIGatewayProxyEventHeaders
    isBase64Encoded: boolean
    pathParameters?: APIGatewayProxyEventPathParameters
    queryStringParameters?: APIGatewayProxyEventQueryStringParameters
    rawPath: string
    rawQueryString: string
    requestContext: { accountId: string; apiId: string; authorizer?: { jwt: { claims: {}; scopes: string[] } }; domainName: string; domainPrefix: string; http: { method: string; path: string; protocol: string; sourceIp: string; userAgent: string }; requestId: string; routeKey: string; stage: string; time: string; timeEpoch: number }

    Type declaration

    • accountId: string
    • apiId: string
    • Optional authorizer?: { jwt: { claims: {}; scopes: string[] } }
      • jwt: { claims: {}; scopes: string[] }
        • claims: {}
          • [name: string]: string | number | boolean | string[]
        • scopes: string[]
    • domainName: string
    • domainPrefix: string
    • http: { method: string; path: string; protocol: string; sourceIp: string; userAgent: string }
      • method: string
      • path: string
      • protocol: string
      • sourceIp: string
      • userAgent: string
    • requestId: string
    • routeKey: string
    • stage: string
    • time: string
    • timeEpoch: number
    routeKey: string
    stageVariables?: APIGatewayProxyEventStageVariables
    supertokens: { response: { cookies: string[]; headers: { allowDuplicateKey: boolean; key: string; value: string | number | boolean }[] } }

    Type declaration

    • response: { cookies: string[]; headers: { allowDuplicateKey: boolean; key: string; value: string | number | boolean }[] }
      • cookies: string[]
      • headers: { allowDuplicateKey: boolean; key: string; value: string | number | boolean }[]
    version: string

    Generated using TypeDoc

    \ No newline at end of file +SessionEventV2 | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • SupertokensLambdaEventV2
      • SessionEventV2

    Index

    Properties

    body?: string
    cookies?: string[]
    headers: APIGatewayProxyEventHeaders
    isBase64Encoded: boolean
    pathParameters?: APIGatewayProxyEventPathParameters
    queryStringParameters?: APIGatewayProxyEventQueryStringParameters
    rawPath: string
    rawQueryString: string
    requestContext: { accountId: string; apiId: string; authorizer?: { jwt: { claims: {}; scopes: string[] } }; domainName: string; domainPrefix: string; http: { method: string; path: string; protocol: string; sourceIp: string; userAgent: string }; requestId: string; routeKey: string; stage: string; time: string; timeEpoch: number }

    Type declaration

    • accountId: string
    • apiId: string
    • Optional authorizer?: { jwt: { claims: {}; scopes: string[] } }
      • jwt: { claims: {}; scopes: string[] }
        • claims: {}
          • [name: string]: string | number | boolean | string[]
        • scopes: string[]
    • domainName: string
    • domainPrefix: string
    • http: { method: string; path: string; protocol: string; sourceIp: string; userAgent: string }
      • method: string
      • path: string
      • protocol: string
      • sourceIp: string
      • userAgent: string
    • requestId: string
    • routeKey: string
    • stage: string
    • time: string
    • timeEpoch: number
    routeKey: string
    stageVariables?: APIGatewayProxyEventStageVariables
    supertokens: { response: { cookies: string[]; headers: { allowDuplicateKey: boolean; key: string; value: string | number | boolean }[] } }

    Type declaration

    • response: { cookies: string[]; headers: { allowDuplicateKey: boolean; key: string; value: string | number | boolean }[] }
      • cookies: string[]
      • headers: { allowDuplicateKey: boolean; key: string; value: string | number | boolean }[]
    version: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/framework_express.SessionRequest.html b/docs/interfaces/framework_express.SessionRequest.html index 2a58a289d..b297d98dd 100644 --- a/docs/interfaces/framework_express.SessionRequest.html +++ b/docs/interfaces/framework_express.SessionRequest.html @@ -118,7 +118,7 @@
    route: any
    secure: boolean

    Short-hand for:

    req.protocol == 'https'

    -
    session?: SessionContainer
    signedCookies: any
    socket: Socket
    +
    session?: SessionContainer
    signedCookies: any
    socket: Socket

    The net.Socket object associated with the connection.

    With HTTPS support, use request.socket.getPeerCertificate() to obtain the client's authentication details.

    @@ -402,4 +402,4 @@
    since

    v0.9.4

    Parameters

    Returns SessionRequest

    Generated using TypeDoc

    \ No newline at end of file +

    Returns SessionRequest

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/framework_fastify.SessionRequest.html b/docs/interfaces/framework_fastify.SessionRequest.html index 608ec01a1..7cdb8f14f 100644 --- a/docs/interfaces/framework_fastify.SessionRequest.html +++ b/docs/interfaces/framework_fastify.SessionRequest.html @@ -1,4 +1,4 @@ SessionRequest | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • FastifyRequest
      • SessionRequest

    Index

    Properties

    body: unknown
    connection: Socket
    headers: IncomingHttpHeaders
    hostname: string
    id: any
    ip: string
    ips?: string[]
    is404: boolean
    log: FastifyLoggerInstance
    method: string
    params: unknown
    protocol: "http" | "https"
    query: unknown
    raw: IncomingMessage
    req: IncomingMessage
    deprecated

    Use raw property

    -
    routerMethod: string
    routerPath: string
    socket: Socket
    url: string
    validationError?: Error & { validation: any; validationContext: string }
    +
    routerMethod: string
    routerPath: string
    socket: Socket
    url: string
    validationError?: Error & { validation: any; validationContext: string }

    in order for this to be used the user should ensure they have set the attachValidation option.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/framework_hapi.SessionRequest.html b/docs/interfaces/framework_hapi.SessionRequest.html index bfdd54d4a..c3b56c66a 100644 --- a/docs/interfaces/framework_hapi.SessionRequest.html +++ b/docs/interfaces/framework_hapi.SessionRequest.html @@ -89,7 +89,7 @@
    server: Server

    Access: read only and the public server interface. The server object.

    -
    session?: SessionContainer
    state: Dictionary<any>
    +
    session?: SessionContainer
    state: Dictionary<any>

    An object containing parsed HTTP state information (cookies) where each key is the cookie name and value is the matching cookie content after processing using any registered cookie definition.

    url: URL

    The parsed request URI.

    @@ -208,4 +208,4 @@

    if true, strip the trailing slash from the path. Defaults to false.

    Returns void

    void See docs

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/framework_koa.SessionContext.html b/docs/interfaces/framework_koa.SessionContext.html index 9d130b5c2..9c26b80ad 100644 --- a/docs/interfaces/framework_koa.SessionContext.html +++ b/docs/interfaces/framework_koa.SessionContext.html @@ -81,7 +81,7 @@
    secure: boolean

    Short-hand for:

    this.protocol == 'https'

    -
    session?: SessionContainer
    socket: Socket
    +
    session?: SessionContainer
    socket: Socket

    Return the request socket.

    stale: boolean

    Check if the request is stale, aka @@ -211,4 +211,4 @@ clone() to fail.

    Returns any

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/framework_loopback.SessionContext.html b/docs/interfaces/framework_loopback.SessionContext.html index b0c5a3cd6..a3e30a504 100644 --- a/docs/interfaces/framework_loopback.SessionContext.html +++ b/docs/interfaces/framework_loopback.SessionContext.html @@ -14,7 +14,7 @@

    A flag to tell if the response is finished.

    scope: BindingScope

    Scope for binding resolution

    -
    session?: SessionContainer
    subscriptionManager: ContextSubscriptionManager
    +
    session?: SessionContainer
    subscriptionManager: ContextSubscriptionManager

    Manager for observer subscriptions

    tagIndexer: ContextTagIndexer

    Indexer for bindings by tag

    @@ -400,4 +400,4 @@

    Remove the context event observer from the context

    Parameters

    Returns boolean

    Generated using TypeDoc

    \ No newline at end of file +

    Returns boolean

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/recipe_session.SessionContainer.html b/docs/interfaces/recipe_session.SessionContainer.html index 658ac83f3..f9196ad65 100644 --- a/docs/interfaces/recipe_session.SessionContainer.html +++ b/docs/interfaces/recipe_session.SessionContainer.html @@ -1 +1 @@ -SessionContainer | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • SessionContainer

    Index

    Methods

    • attachToRequestResponse(reqResInfo: ReqResInfo): void | Promise<void>
    • fetchAndSetClaim<T>(claim: SessionClaim<T>, userContext?: any): Promise<void>
    • getAccessToken(userContext?: any): string
    • getAccessTokenPayload(userContext?: any): any
    • getAllSessionTokensDangerously(): { accessAndFrontTokenUpdated: boolean; accessToken: string; antiCsrfToken: undefined | string; frontToken: string; refreshToken: undefined | string }
    • Returns { accessAndFrontTokenUpdated: boolean; accessToken: string; antiCsrfToken: undefined | string; frontToken: string; refreshToken: undefined | string }

      • accessAndFrontTokenUpdated: boolean
      • accessToken: string
      • antiCsrfToken: undefined | string
      • frontToken: string
      • refreshToken: undefined | string
    • getClaimValue<T>(claim: SessionClaim<T>, userContext?: any): Promise<undefined | T>
    • getExpiry(userContext?: any): Promise<number>
    • getHandle(userContext?: any): string
    • getSessionDataFromDatabase(userContext?: any): Promise<any>
    • getTenantId(userContext?: any): string
    • getTimeCreated(userContext?: any): Promise<number>
    • getUserId(userContext?: any): string
    • mergeIntoAccessTokenPayload(accessTokenPayloadUpdate: JSONObject, userContext?: any): Promise<void>
    • removeClaim(claim: SessionClaim<any>, userContext?: any): Promise<void>
    • revokeSession(userContext?: any): Promise<void>
    • setClaimValue<T>(claim: SessionClaim<T>, value: T, userContext?: any): Promise<void>
    • updateSessionDataInDatabase(newSessionData: any, userContext?: any): Promise<any>

    Generated using TypeDoc

    \ No newline at end of file +SessionContainer | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • SessionContainer

    Index

    Methods

    • attachToRequestResponse(reqResInfo: ReqResInfo, userContext?: any): void | Promise<void>
    • fetchAndSetClaim<T>(claim: SessionClaim<T>, userContext?: any): Promise<void>
    • getAccessToken(userContext?: any): string
    • getAccessTokenPayload(userContext?: any): any
    • getAllSessionTokensDangerously(): { accessAndFrontTokenUpdated: boolean; accessToken: string; antiCsrfToken: undefined | string; frontToken: string; refreshToken: undefined | string }
    • Returns { accessAndFrontTokenUpdated: boolean; accessToken: string; antiCsrfToken: undefined | string; frontToken: string; refreshToken: undefined | string }

      • accessAndFrontTokenUpdated: boolean
      • accessToken: string
      • antiCsrfToken: undefined | string
      • frontToken: string
      • refreshToken: undefined | string
    • getClaimValue<T>(claim: SessionClaim<T>, userContext?: any): Promise<undefined | T>
    • getExpiry(userContext?: any): Promise<number>
    • getHandle(userContext?: any): string
    • getSessionDataFromDatabase(userContext?: any): Promise<any>
    • getTenantId(userContext?: any): string
    • getTimeCreated(userContext?: any): Promise<number>
    • getUserId(userContext?: any): string
    • mergeIntoAccessTokenPayload(accessTokenPayloadUpdate: JSONObject, userContext?: any): Promise<void>
    • removeClaim(claim: SessionClaim<any>, userContext?: any): Promise<void>
    • revokeSession(userContext?: any): Promise<void>
    • setClaimValue<T>(claim: SessionClaim<T>, value: T, userContext?: any): Promise<void>
    • updateSessionDataInDatabase(newSessionData: any, userContext?: any): Promise<any>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/recipe_session.VerifySessionOptions.html b/docs/interfaces/recipe_session.VerifySessionOptions.html index 03af9ca26..aeb382de6 100644 --- a/docs/interfaces/recipe_session.VerifySessionOptions.html +++ b/docs/interfaces/recipe_session.VerifySessionOptions.html @@ -1 +1 @@ -VerifySessionOptions | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • VerifySessionOptions

    Index

    Properties

    antiCsrfCheck?: boolean
    checkDatabase?: boolean
    sessionRequired?: boolean

    Methods

    Generated using TypeDoc

    \ No newline at end of file +VerifySessionOptions | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • VerifySessionOptions

    Index

    Properties

    antiCsrfCheck?: boolean
    checkDatabase?: boolean
    sessionRequired?: boolean

    Methods

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/recipe_usermetadata.JSONObject.html b/docs/interfaces/recipe_usermetadata.JSONObject.html index 70624224d..ea1a4e5ef 100644 --- a/docs/interfaces/recipe_usermetadata.JSONObject.html +++ b/docs/interfaces/recipe_usermetadata.JSONObject.html @@ -1 +1 @@ -JSONObject | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • JSONObject

    Indexable

    [ind: string]: JSONValue

    Generated using TypeDoc

    \ No newline at end of file +JSONObject | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • JSONObject

    Indexable

    [ind: string]: JSONValue

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html index 52bf067b9..6e0696c5f 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1 +1 @@ -supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    supertokens-node

    Generated using TypeDoc

    \ No newline at end of file +supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    supertokens-node

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/framework.html b/docs/modules/framework.html index 87c43fc87..2859ece97 100644 --- a/docs/modules/framework.html +++ b/docs/modules/framework.html @@ -1 +1 @@ -framework | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Properties

    default: { awsLambda: framework/awsLambda; express: framework/express; fastify: framework/fastify; hapi: framework/hapi; koa: framework/koa; loopback: framework/loopback }

    Type declaration

    Variables

    awsLambda: framework/awsLambda = awsLambdaFramework
    express: framework/express = expressFramework
    fastify: framework/fastify = fastifyFramework
    hapi: framework/hapi = hapiFramework
    koa: framework/koa = koaFramework
    loopback: framework/loopback = loopbackFramework

    Generated using TypeDoc

    \ No newline at end of file +framework | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Properties

    default: { awsLambda: framework/awsLambda; express: framework/express; fastify: framework/fastify; hapi: framework/hapi; koa: framework/koa; loopback: framework/loopback }

    Type declaration

    Variables

    awsLambda: framework/awsLambda = awsLambdaFramework
    express: framework/express = expressFramework
    fastify: framework/fastify = fastifyFramework
    hapi: framework/hapi = hapiFramework
    koa: framework/koa = koaFramework
    loopback: framework/loopback = loopbackFramework

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/framework_awsLambda.html b/docs/modules/framework_awsLambda.html index 02065176f..fd520d406 100644 --- a/docs/modules/framework_awsLambda.html +++ b/docs/modules/framework_awsLambda.html @@ -1 +1 @@ -framework/awsLambda | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module framework/awsLambda

    Index

    Functions

    • middleware(handler?: Handler<any, any>): Handler<any, any>

    Generated using TypeDoc

    \ No newline at end of file +framework/awsLambda | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module framework/awsLambda

    Index

    Functions

    • middleware(handler?: Handler<any, any>): Handler<any, any>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/framework_custom.html b/docs/modules/framework_custom.html new file mode 100644 index 000000000..6cfa734d7 --- /dev/null +++ b/docs/modules/framework_custom.html @@ -0,0 +1 @@ +framework/custom | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module framework/custom

    Index

    Functions

    • middleware<OrigReqType, OrigRespType>(wrapRequest?: (req: OrigReqType) => BaseRequest, wrapResponse?: (req: OrigRespType) => BaseResponse): (request: OrigReqType, response: OrigRespType, next?: NextFunction) => Promise<{ error: undefined; handled: boolean } | { error: any; handled: undefined }>
    • Type parameters

      Parameters

      Returns (request: OrigReqType, response: OrigRespType, next?: NextFunction) => Promise<{ error: undefined; handled: boolean } | { error: any; handled: undefined }>

        • (request: OrigReqType, response: OrigRespType, next?: NextFunction): Promise<{ error: undefined; handled: boolean } | { error: any; handled: undefined }>
        • Parameters

          • request: OrigReqType
          • response: OrigRespType
          • Optional next: NextFunction

          Returns Promise<{ error: undefined; handled: boolean } | { error: any; handled: undefined }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/framework_express.html b/docs/modules/framework_express.html index 7f76a7725..850576315 100644 --- a/docs/modules/framework_express.html +++ b/docs/modules/framework_express.html @@ -1 +1 @@ -framework/express | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module framework/express

    Index

    Functions

    • errorHandler(): (err: any, req: Request, res: Response, next: NextFunction) => Promise<void>
    • Returns (err: any, req: Request, res: Response, next: NextFunction) => Promise<void>

        • (err: any, req: Request, res: Response, next: NextFunction): Promise<void>
        • Parameters

          • err: any
          • req: Request
          • res: Response
          • next: NextFunction

          Returns Promise<void>

    • middleware(): (req: Request, res: Response, next: NextFunction) => Promise<void>
    • Returns (req: Request, res: Response, next: NextFunction) => Promise<void>

        • (req: Request, res: Response, next: NextFunction): Promise<void>
        • Parameters

          • req: Request
          • res: Response
          • next: NextFunction

          Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +framework/express | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module framework/express

    Index

    Functions

    • errorHandler(): (err: any, req: Request, res: Response, next: NextFunction) => Promise<void>
    • Returns (err: any, req: Request, res: Response, next: NextFunction) => Promise<void>

        • (err: any, req: Request, res: Response, next: NextFunction): Promise<void>
        • Parameters

          • err: any
          • req: Request
          • res: Response
          • next: NextFunction

          Returns Promise<void>

    • middleware(): (req: Request, res: Response, next: NextFunction) => Promise<void>
    • Returns (req: Request, res: Response, next: NextFunction) => Promise<void>

        • (req: Request, res: Response, next: NextFunction): Promise<void>
        • Parameters

          • req: Request
          • res: Response
          • next: NextFunction

          Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/framework_fastify.html b/docs/modules/framework_fastify.html index 254967728..aafc5b5a5 100644 --- a/docs/modules/framework_fastify.html +++ b/docs/modules/framework_fastify.html @@ -1 +1 @@ -framework/fastify | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module framework/fastify

    Index

    Functions

    • errorHandler(): (err: any, req: FastifyRequest<RouteGenericInterface, Server, IncomingMessage>, res: FastifyReply<Server, IncomingMessage, ServerResponse, RouteGenericInterface, unknown>) => Promise<void>
    • Returns (err: any, req: FastifyRequest<RouteGenericInterface, Server, IncomingMessage>, res: FastifyReply<Server, IncomingMessage, ServerResponse, RouteGenericInterface, unknown>) => Promise<void>

        • (err: any, req: FastifyRequest<RouteGenericInterface, Server, IncomingMessage>, res: FastifyReply<Server, IncomingMessage, ServerResponse, RouteGenericInterface, unknown>): Promise<void>
        • Parameters

          • err: any
          • req: FastifyRequest<RouteGenericInterface, Server, IncomingMessage>
          • res: FastifyReply<Server, IncomingMessage, ServerResponse, RouteGenericInterface, unknown>

          Returns Promise<void>

    • plugin(instance: FastifyInstance<Server, IncomingMessage, ServerResponse, FastifyLoggerInstance>, opts: Record<never, never>, done: (err?: Error) => void): void
    • Parameters

      • instance: FastifyInstance<Server, IncomingMessage, ServerResponse, FastifyLoggerInstance>
      • opts: Record<never, never>
      • done: (err?: Error) => void
          • (err?: Error): void
          • Parameters

            • Optional err: Error

            Returns void

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +framework/fastify | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module framework/fastify

    Index

    Functions

    • errorHandler(): (err: any, req: FastifyRequest<RouteGenericInterface, Server, IncomingMessage>, res: FastifyReply<Server, IncomingMessage, ServerResponse, RouteGenericInterface, unknown>) => Promise<void>
    • Returns (err: any, req: FastifyRequest<RouteGenericInterface, Server, IncomingMessage>, res: FastifyReply<Server, IncomingMessage, ServerResponse, RouteGenericInterface, unknown>) => Promise<void>

        • (err: any, req: FastifyRequest<RouteGenericInterface, Server, IncomingMessage>, res: FastifyReply<Server, IncomingMessage, ServerResponse, RouteGenericInterface, unknown>): Promise<void>
        • Parameters

          • err: any
          • req: FastifyRequest<RouteGenericInterface, Server, IncomingMessage>
          • res: FastifyReply<Server, IncomingMessage, ServerResponse, RouteGenericInterface, unknown>

          Returns Promise<void>

    • plugin(instance: FastifyInstance<Server, IncomingMessage, ServerResponse, FastifyLoggerInstance>, opts: Record<never, never>, done: (err?: Error) => void): void
    • Parameters

      • instance: FastifyInstance<Server, IncomingMessage, ServerResponse, FastifyLoggerInstance>
      • opts: Record<never, never>
      • done: (err?: Error) => void
          • (err?: Error): void
          • Parameters

            • Optional err: Error

            Returns void

      Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/framework_hapi.html b/docs/modules/framework_hapi.html index af50dc273..7fa1a6351 100644 --- a/docs/modules/framework_hapi.html +++ b/docs/modules/framework_hapi.html @@ -1 +1 @@ -framework/hapi | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module framework/hapi

    Index

    Variables

    plugin: Plugin<{}> = HapiWrapper.plugin

    Functions

    Generated using TypeDoc

    \ No newline at end of file +framework/hapi | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module framework/hapi

    Index

    Variables

    plugin: Plugin<{}> = HapiWrapper.plugin

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/framework_koa.html b/docs/modules/framework_koa.html index 6addd23ca..391c5b6c8 100644 --- a/docs/modules/framework_koa.html +++ b/docs/modules/framework_koa.html @@ -1 +1 @@ -framework/koa | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module framework/koa

    Index

    Functions

    • middleware(): (ctx: Context, next: Next) => Promise<void>
    • Returns (ctx: Context, next: Next) => Promise<void>

        • (ctx: Context, next: Next): Promise<void>
        • Parameters

          • ctx: Context
          • next: Next

          Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +framework/koa | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module framework/koa

    Index

    Functions

    • middleware(): (ctx: Context, next: Next) => Promise<void>
    • Returns (ctx: Context, next: Next) => Promise<void>

        • (ctx: Context, next: Next): Promise<void>
        • Parameters

          • ctx: Context
          • next: Next

          Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/framework_loopback.html b/docs/modules/framework_loopback.html index 67b722dd4..990f8b872 100644 --- a/docs/modules/framework_loopback.html +++ b/docs/modules/framework_loopback.html @@ -1 +1 @@ -framework/loopback | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module framework/loopback

    Index

    Functions

    • middleware(context: MiddlewareContext, next: Next): ValueOrPromise<NonVoid>

    Generated using TypeDoc

    \ No newline at end of file +framework/loopback | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module framework/loopback

    Index

    Functions

    • middleware(context: MiddlewareContext, next: Next): ValueOrPromise<NonVoid>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/index.html b/docs/modules/index.html index 6103cc39e..c1f4592e9 100644 --- a/docs/modules/index.html +++ b/docs/modules/index.html @@ -1 +1 @@ -index | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Variables

    Error: typeof default = SuperTokensWrapper.Error

    Functions

    • createUserIdMapping(input: { externalUserId: string; externalUserIdInfo?: string; force?: boolean; superTokensUserId: string }): Promise<{ status: "OK" | "UNKNOWN_SUPERTOKENS_USER_ID_ERROR" } | { doesExternalUserIdExist: boolean; doesSuperTokensUserIdExist: boolean; status: "USER_ID_MAPPING_ALREADY_EXISTS_ERROR" }>
    • Parameters

      • input: { externalUserId: string; externalUserIdInfo?: string; force?: boolean; superTokensUserId: string }
        • externalUserId: string
        • Optional externalUserIdInfo?: string
        • Optional force?: boolean
        • superTokensUserId: string

      Returns Promise<{ status: "OK" | "UNKNOWN_SUPERTOKENS_USER_ID_ERROR" } | { doesExternalUserIdExist: boolean; doesSuperTokensUserIdExist: boolean; status: "USER_ID_MAPPING_ALREADY_EXISTS_ERROR" }>

    • deleteUser(userId: string, removeAllLinkedAccounts?: boolean, userContext?: any): Promise<{ status: "OK" }>
    • Parameters

      • userId: string
      • removeAllLinkedAccounts: boolean = true
      • Optional userContext: any

      Returns Promise<{ status: "OK" }>

    • deleteUserIdMapping(input: { force?: boolean; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }): Promise<{ didMappingExist: boolean; status: "OK" }>
    • Parameters

      • input: { force?: boolean; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }
        • Optional force?: boolean
        • userId: string
        • Optional userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY"

      Returns Promise<{ didMappingExist: boolean; status: "OK" }>

    • getAllCORSHeaders(): string[]
    • getRequestFromUserContext(userContext: any): undefined | BaseRequest
    • getUser(userId: string, userContext?: any): Promise<undefined | User>
    • Parameters

      • userId: string
      • Optional userContext: any

      Returns Promise<undefined | User>

    • getUserCount(includeRecipeIds?: string[], tenantId?: string): Promise<number>
    • Parameters

      • Optional includeRecipeIds: string[]
      • Optional tenantId: string

      Returns Promise<number>

    • getUserIdMapping(input: { userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }): Promise<{ externalUserId: string; externalUserIdInfo: undefined | string; status: "OK"; superTokensUserId: string } | { status: "UNKNOWN_MAPPING_ERROR" }>
    • Parameters

      • input: { userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }
        • userId: string
        • Optional userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY"

      Returns Promise<{ externalUserId: string; externalUserIdInfo: undefined | string; status: "OK"; superTokensUserId: string } | { status: "UNKNOWN_MAPPING_ERROR" }>

    • getUsersNewestFirst(input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }): Promise<{ nextPaginationToken?: string; users: User[] }>
    • Parameters

      • input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }
        • Optional includeRecipeIds?: string[]
        • Optional limit?: number
        • Optional paginationToken?: string
        • Optional query?: {}
          • [key: string]: string
        • tenantId: string

      Returns Promise<{ nextPaginationToken?: string; users: User[] }>

    • getUsersOldestFirst(input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }): Promise<{ nextPaginationToken?: string; users: User[] }>
    • Parameters

      • input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }
        • Optional includeRecipeIds?: string[]
        • Optional limit?: number
        • Optional paginationToken?: string
        • Optional query?: {}
          • [key: string]: string
        • tenantId: string

      Returns Promise<{ nextPaginationToken?: string; users: User[] }>

    • init(config: TypeInput): void
    • listUsersByAccountInfo(tenantId: string, accountInfo: AccountInfo, doUnionOfAccountInfo?: boolean, userContext?: any): Promise<User[]>
    • Parameters

      • tenantId: string
      • accountInfo: AccountInfo
      • doUnionOfAccountInfo: boolean = false
      • Optional userContext: any

      Returns Promise<User[]>

    • updateOrDeleteUserIdMappingInfo(input: { externalUserIdInfo?: string; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }): Promise<{ status: "OK" | "UNKNOWN_MAPPING_ERROR" }>
    • Parameters

      • input: { externalUserIdInfo?: string; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }
        • Optional externalUserIdInfo?: string
        • userId: string
        • Optional userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY"

      Returns Promise<{ status: "OK" | "UNKNOWN_MAPPING_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file +index | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Variables

    Error: typeof default = SuperTokensWrapper.Error

    Functions

    • createUserIdMapping(input: { externalUserId: string; externalUserIdInfo?: string; force?: boolean; superTokensUserId: string }): Promise<{ status: "OK" | "UNKNOWN_SUPERTOKENS_USER_ID_ERROR" } | { doesExternalUserIdExist: boolean; doesSuperTokensUserIdExist: boolean; status: "USER_ID_MAPPING_ALREADY_EXISTS_ERROR" }>
    • Parameters

      • input: { externalUserId: string; externalUserIdInfo?: string; force?: boolean; superTokensUserId: string }
        • externalUserId: string
        • Optional externalUserIdInfo?: string
        • Optional force?: boolean
        • superTokensUserId: string

      Returns Promise<{ status: "OK" | "UNKNOWN_SUPERTOKENS_USER_ID_ERROR" } | { doesExternalUserIdExist: boolean; doesSuperTokensUserIdExist: boolean; status: "USER_ID_MAPPING_ALREADY_EXISTS_ERROR" }>

    • deleteUser(userId: string, removeAllLinkedAccounts?: boolean, userContext?: any): Promise<{ status: "OK" }>
    • Parameters

      • userId: string
      • removeAllLinkedAccounts: boolean = true
      • Optional userContext: any

      Returns Promise<{ status: "OK" }>

    • deleteUserIdMapping(input: { force?: boolean; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }): Promise<{ didMappingExist: boolean; status: "OK" }>
    • Parameters

      • input: { force?: boolean; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }
        • Optional force?: boolean
        • userId: string
        • Optional userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY"

      Returns Promise<{ didMappingExist: boolean; status: "OK" }>

    • getAllCORSHeaders(): string[]
    • getRequestFromUserContext(userContext: any): undefined | BaseRequest
    • getUser(userId: string, userContext?: any): Promise<undefined | User>
    • Parameters

      • userId: string
      • Optional userContext: any

      Returns Promise<undefined | User>

    • getUserCount(includeRecipeIds?: string[], tenantId?: string): Promise<number>
    • Parameters

      • Optional includeRecipeIds: string[]
      • Optional tenantId: string

      Returns Promise<number>

    • getUserIdMapping(input: { userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }): Promise<{ externalUserId: string; externalUserIdInfo: undefined | string; status: "OK"; superTokensUserId: string } | { status: "UNKNOWN_MAPPING_ERROR" }>
    • Parameters

      • input: { userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }
        • userId: string
        • Optional userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY"

      Returns Promise<{ externalUserId: string; externalUserIdInfo: undefined | string; status: "OK"; superTokensUserId: string } | { status: "UNKNOWN_MAPPING_ERROR" }>

    • getUsersNewestFirst(input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }): Promise<{ nextPaginationToken?: string; users: User[] }>
    • Parameters

      • input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }
        • Optional includeRecipeIds?: string[]
        • Optional limit?: number
        • Optional paginationToken?: string
        • Optional query?: {}
          • [key: string]: string
        • tenantId: string

      Returns Promise<{ nextPaginationToken?: string; users: User[] }>

    • getUsersOldestFirst(input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }): Promise<{ nextPaginationToken?: string; users: User[] }>
    • Parameters

      • input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string }
        • Optional includeRecipeIds?: string[]
        • Optional limit?: number
        • Optional paginationToken?: string
        • Optional query?: {}
          • [key: string]: string
        • tenantId: string

      Returns Promise<{ nextPaginationToken?: string; users: User[] }>

    • init(config: TypeInput): void
    • listUsersByAccountInfo(tenantId: string, accountInfo: AccountInfo, doUnionOfAccountInfo?: boolean, userContext?: any): Promise<User[]>
    • Parameters

      • tenantId: string
      • accountInfo: AccountInfo
      • doUnionOfAccountInfo: boolean = false
      • Optional userContext: any

      Returns Promise<User[]>

    • updateOrDeleteUserIdMappingInfo(input: { externalUserIdInfo?: string; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }): Promise<{ status: "OK" | "UNKNOWN_MAPPING_ERROR" }>
    • Parameters

      • input: { externalUserIdInfo?: string; userId: string; userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY" }
        • Optional externalUserIdInfo?: string
        • userId: string
        • Optional userIdType?: "SUPERTOKENS" | "EXTERNAL" | "ANY"

      Returns Promise<{ status: "OK" | "UNKNOWN_MAPPING_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/ingredients_emaildelivery.html b/docs/modules/ingredients_emaildelivery.html index 192a66792..8353302e8 100644 --- a/docs/modules/ingredients_emaildelivery.html +++ b/docs/modules/ingredients_emaildelivery.html @@ -1 +1 @@ -ingredients/emaildelivery | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module ingredients/emaildelivery

    Index

    Classes

    Generated using TypeDoc

    \ No newline at end of file +ingredients/emaildelivery | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module ingredients/emaildelivery

    Index

    Classes

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/ingredients_smsdelivery.html b/docs/modules/ingredients_smsdelivery.html index 0e245c295..c1a229804 100644 --- a/docs/modules/ingredients_smsdelivery.html +++ b/docs/modules/ingredients_smsdelivery.html @@ -1 +1 @@ -ingredients/smsdelivery | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module ingredients/smsdelivery

    Index

    Classes

    Generated using TypeDoc

    \ No newline at end of file +ingredients/smsdelivery | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module ingredients/smsdelivery

    Index

    Classes

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/recipe_accountlinking.html b/docs/modules/recipe_accountlinking.html index 88932df12..97ee09609 100644 --- a/docs/modules/recipe_accountlinking.html +++ b/docs/modules/recipe_accountlinking.html @@ -1 +1 @@ -recipe/accountlinking | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/accountlinking

    Index

    Type aliases

    RecipeInterface: { canCreatePrimaryUser: any; canLinkAccounts: any; createPrimaryUser: any; deleteUser: any; getUser: any; getUsers: any; linkAccounts: any; listUsersByAccountInfo: any; unlinkAccount: any }

    Type declaration

    • canCreatePrimaryUser:function
      • canCreatePrimaryUser(input: { recipeUserId: RecipeUserId; userContext: any }): Promise<{ status: "OK"; wasAlreadyAPrimaryUser: boolean } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" | "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>
      • Parameters

        Returns Promise<{ status: "OK"; wasAlreadyAPrimaryUser: boolean } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" | "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>

    • canLinkAccounts:function
      • canLinkAccounts(input: { primaryUserId: string; recipeUserId: RecipeUserId; userContext: any }): Promise<{ accountsAlreadyLinked: boolean; status: "OK" } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>
      • Parameters

        • input: { primaryUserId: string; recipeUserId: RecipeUserId; userContext: any }
          • primaryUserId: string
          • recipeUserId: RecipeUserId
          • userContext: any

        Returns Promise<{ accountsAlreadyLinked: boolean; status: "OK" } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>

    • createPrimaryUser:function
      • createPrimaryUser(input: { recipeUserId: RecipeUserId; userContext: any }): Promise<{ status: "OK"; user: User; wasAlreadyAPrimaryUser: boolean } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>
      • Parameters

        Returns Promise<{ status: "OK"; user: User; wasAlreadyAPrimaryUser: boolean } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>

    • deleteUser:function
      • deleteUser(input: { removeAllLinkedAccounts: boolean; userContext: any; userId: string }): Promise<{ status: "OK" }>
      • Parameters

        • input: { removeAllLinkedAccounts: boolean; userContext: any; userId: string }
          • removeAllLinkedAccounts: boolean
          • userContext: any
          • userId: string

        Returns Promise<{ status: "OK" }>

    • getUser:function
      • getUser(input: { userContext: any; userId: string }): Promise<undefined | User>
    • getUsers:function
      • getUsers(input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; timeJoinedOrder: "ASC" | "DESC"; userContext: any }): Promise<{ nextPaginationToken?: string; users: User[] }>
      • Parameters

        • input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; timeJoinedOrder: "ASC" | "DESC"; userContext: any }
          • Optional includeRecipeIds?: string[]
          • Optional limit?: number
          • Optional paginationToken?: string
          • Optional query?: {}
            • [key: string]: string
          • timeJoinedOrder: "ASC" | "DESC"
          • userContext: any

        Returns Promise<{ nextPaginationToken?: string; users: User[] }>

    • linkAccounts:function
      • linkAccounts(input: { primaryUserId: string; recipeUserId: RecipeUserId; userContext: any }): Promise<{ accountsAlreadyLinked: boolean; status: "OK"; user: User } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR"; user: User } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>
      • Parameters

        • input: { primaryUserId: string; recipeUserId: RecipeUserId; userContext: any }
          • primaryUserId: string
          • recipeUserId: RecipeUserId
          • userContext: any

        Returns Promise<{ accountsAlreadyLinked: boolean; status: "OK"; user: User } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR"; user: User } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>

    • listUsersByAccountInfo:function
      • listUsersByAccountInfo(input: { accountInfo: AccountInfo; doUnionOfAccountInfo: boolean; tenantId: string; userContext: any }): Promise<User[]>
      • Parameters

        • input: { accountInfo: AccountInfo; doUnionOfAccountInfo: boolean; tenantId: string; userContext: any }
          • accountInfo: AccountInfo
          • doUnionOfAccountInfo: boolean
          • tenantId: string
          • userContext: any

        Returns Promise<User[]>

    • unlinkAccount:function
      • unlinkAccount(input: { recipeUserId: RecipeUserId; userContext: any }): Promise<{ status: "OK"; wasLinked: boolean; wasRecipeUserDeleted: boolean }>

    Functions

    • canCreatePrimaryUser(recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; wasAlreadyAPrimaryUser: boolean } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" | "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>
    • Parameters

      Returns Promise<{ status: "OK"; wasAlreadyAPrimaryUser: boolean } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" | "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>

    • canLinkAccounts(recipeUserId: RecipeUserId, primaryUserId: string, userContext?: any): Promise<{ accountsAlreadyLinked: boolean; status: "OK" } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>
    • Parameters

      • recipeUserId: RecipeUserId
      • primaryUserId: string
      • userContext: any = {}

      Returns Promise<{ accountsAlreadyLinked: boolean; status: "OK" } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>

    • createPrimaryUser(recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; user: User; wasAlreadyAPrimaryUser: boolean } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>
    • Parameters

      Returns Promise<{ status: "OK"; user: User; wasAlreadyAPrimaryUser: boolean } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>

    • createPrimaryUserIdOrLinkAccounts(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<User>
    • getPrimaryUserThatCanBeLinkedToRecipeUserId(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<undefined | User>
    • init(config?: TypeInput): RecipeListFunction
    • isEmailChangeAllowed(recipeUserId: RecipeUserId, newEmail: string, isVerified: boolean, userContext?: any): Promise<boolean>
    • isSignInAllowed(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<boolean>
    • isSignUpAllowed(tenantId: string, newUser: AccountInfoWithRecipeId, isVerified: boolean, userContext?: any): Promise<boolean>
    • linkAccounts(recipeUserId: RecipeUserId, primaryUserId: string, userContext?: any): Promise<{ accountsAlreadyLinked: boolean; status: "OK"; user: User } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR"; user: User } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>
    • Parameters

      • recipeUserId: RecipeUserId
      • primaryUserId: string
      • userContext: any = {}

      Returns Promise<{ accountsAlreadyLinked: boolean; status: "OK"; user: User } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR"; user: User } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>

    • unlinkAccount(recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; wasLinked: boolean; wasRecipeUserDeleted: boolean }>

    Generated using TypeDoc

    \ No newline at end of file +recipe/accountlinking | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/accountlinking

    Index

    Type aliases

    RecipeInterface: { canCreatePrimaryUser: any; canLinkAccounts: any; createPrimaryUser: any; deleteUser: any; getUser: any; getUsers: any; linkAccounts: any; listUsersByAccountInfo: any; unlinkAccount: any }

    Type declaration

    • canCreatePrimaryUser:function
      • canCreatePrimaryUser(input: { recipeUserId: RecipeUserId; userContext: any }): Promise<{ status: "OK"; wasAlreadyAPrimaryUser: boolean } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" | "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>
      • Parameters

        Returns Promise<{ status: "OK"; wasAlreadyAPrimaryUser: boolean } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" | "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>

    • canLinkAccounts:function
      • canLinkAccounts(input: { primaryUserId: string; recipeUserId: RecipeUserId; userContext: any }): Promise<{ accountsAlreadyLinked: boolean; status: "OK" } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>
      • Parameters

        • input: { primaryUserId: string; recipeUserId: RecipeUserId; userContext: any }
          • primaryUserId: string
          • recipeUserId: RecipeUserId
          • userContext: any

        Returns Promise<{ accountsAlreadyLinked: boolean; status: "OK" } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>

    • createPrimaryUser:function
      • createPrimaryUser(input: { recipeUserId: RecipeUserId; userContext: any }): Promise<{ status: "OK"; user: User; wasAlreadyAPrimaryUser: boolean } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>
      • Parameters

        Returns Promise<{ status: "OK"; user: User; wasAlreadyAPrimaryUser: boolean } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>

    • deleteUser:function
      • deleteUser(input: { removeAllLinkedAccounts: boolean; userContext: any; userId: string }): Promise<{ status: "OK" }>
      • Parameters

        • input: { removeAllLinkedAccounts: boolean; userContext: any; userId: string }
          • removeAllLinkedAccounts: boolean
          • userContext: any
          • userId: string

        Returns Promise<{ status: "OK" }>

    • getUser:function
      • getUser(input: { userContext: any; userId: string }): Promise<undefined | User>
    • getUsers:function
      • getUsers(input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string; timeJoinedOrder: "ASC" | "DESC"; userContext: any }): Promise<{ nextPaginationToken?: string; users: User[] }>
      • Parameters

        • input: { includeRecipeIds?: string[]; limit?: number; paginationToken?: string; query?: {}; tenantId: string; timeJoinedOrder: "ASC" | "DESC"; userContext: any }
          • Optional includeRecipeIds?: string[]
          • Optional limit?: number
          • Optional paginationToken?: string
          • Optional query?: {}
            • [key: string]: string
          • tenantId: string
          • timeJoinedOrder: "ASC" | "DESC"
          • userContext: any

        Returns Promise<{ nextPaginationToken?: string; users: User[] }>

    • linkAccounts:function
      • linkAccounts(input: { primaryUserId: string; recipeUserId: RecipeUserId; userContext: any }): Promise<{ accountsAlreadyLinked: boolean; status: "OK"; user: User } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR"; user: User } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>
      • Parameters

        • input: { primaryUserId: string; recipeUserId: RecipeUserId; userContext: any }
          • primaryUserId: string
          • recipeUserId: RecipeUserId
          • userContext: any

        Returns Promise<{ accountsAlreadyLinked: boolean; status: "OK"; user: User } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR"; user: User } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>

    • listUsersByAccountInfo:function
      • listUsersByAccountInfo(input: { accountInfo: AccountInfo; doUnionOfAccountInfo: boolean; tenantId: string; userContext: any }): Promise<User[]>
      • Parameters

        • input: { accountInfo: AccountInfo; doUnionOfAccountInfo: boolean; tenantId: string; userContext: any }
          • accountInfo: AccountInfo
          • doUnionOfAccountInfo: boolean
          • tenantId: string
          • userContext: any

        Returns Promise<User[]>

    • unlinkAccount:function
      • unlinkAccount(input: { recipeUserId: RecipeUserId; userContext: any }): Promise<{ status: "OK"; wasLinked: boolean; wasRecipeUserDeleted: boolean }>

    Functions

    • canCreatePrimaryUser(recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; wasAlreadyAPrimaryUser: boolean } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" | "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>
    • Parameters

      Returns Promise<{ status: "OK"; wasAlreadyAPrimaryUser: boolean } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" | "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>

    • canLinkAccounts(recipeUserId: RecipeUserId, primaryUserId: string, userContext?: any): Promise<{ accountsAlreadyLinked: boolean; status: "OK" } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>
    • Parameters

      • recipeUserId: RecipeUserId
      • primaryUserId: string
      • userContext: any = {}

      Returns Promise<{ accountsAlreadyLinked: boolean; status: "OK" } | { description: string; primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>

    • createPrimaryUser(recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; user: User; wasAlreadyAPrimaryUser: boolean } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>
    • Parameters

      Returns Promise<{ status: "OK"; user: User; wasAlreadyAPrimaryUser: boolean } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_PRIMARY_USER_ID_ERROR" } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" }>

    • createPrimaryUserIdOrLinkAccounts(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<User>
    • getPrimaryUserThatCanBeLinkedToRecipeUserId(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<undefined | User>
    • init(config?: TypeInput): RecipeListFunction
    • isEmailChangeAllowed(recipeUserId: RecipeUserId, newEmail: string, isVerified: boolean, userContext?: any): Promise<boolean>
    • isSignInAllowed(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<boolean>
    • isSignUpAllowed(tenantId: string, newUser: AccountInfoWithRecipeId, isVerified: boolean, userContext?: any): Promise<boolean>
    • linkAccounts(recipeUserId: RecipeUserId, primaryUserId: string, userContext?: any): Promise<{ accountsAlreadyLinked: boolean; status: "OK"; user: User } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR"; user: User } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>
    • Parameters

      • recipeUserId: RecipeUserId
      • primaryUserId: string
      • userContext: any = {}

      Returns Promise<{ accountsAlreadyLinked: boolean; status: "OK"; user: User } | { primaryUserId: string; status: "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR"; user: User } | { description: string; primaryUserId: string; status: "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" } | { status: "INPUT_USER_IS_NOT_A_PRIMARY_USER" }>

    • unlinkAccount(recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; wasLinked: boolean; wasRecipeUserDeleted: boolean }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/recipe_dashboard.html b/docs/modules/recipe_dashboard.html index 600310d80..75d2df6bd 100644 --- a/docs/modules/recipe_dashboard.html +++ b/docs/modules/recipe_dashboard.html @@ -1 +1 @@ -recipe/dashboard | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/dashboard

    Index

    Type aliases

    APIInterface: { dashboardGET: undefined | ((input: { options: APIOptions; userContext: any }) => Promise<string>) }

    Type declaration

    • dashboardGET: undefined | ((input: { options: APIOptions; userContext: any }) => Promise<string>)
    APIOptions: { appInfo: NormalisedAppinfo; config: TypeNormalisedInput; isInServerlessEnv: boolean; recipeId: string; recipeImplementation: RecipeInterface; req: BaseRequest; res: BaseResponse }

    Type declaration

    RecipeInterface: { getDashboardBundleLocation: any; shouldAllowAccess: any }

    Type declaration

    • getDashboardBundleLocation:function
      • getDashboardBundleLocation(input: { userContext: any }): Promise<string>
    • shouldAllowAccess:function
      • shouldAllowAccess(input: { config: TypeNormalisedInput; req: BaseRequest; userContext: any }): Promise<boolean>

    Functions

    • init(config?: TypeInput): RecipeListFunction

    Generated using TypeDoc

    \ No newline at end of file +recipe/dashboard | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/dashboard

    Index

    Type aliases

    APIInterface: { dashboardGET: undefined | ((input: { options: APIOptions; userContext: any }) => Promise<string>) }

    Type declaration

    • dashboardGET: undefined | ((input: { options: APIOptions; userContext: any }) => Promise<string>)
    APIOptions: { appInfo: NormalisedAppinfo; config: TypeNormalisedInput; isInServerlessEnv: boolean; recipeId: string; recipeImplementation: RecipeInterface; req: BaseRequest; res: BaseResponse }

    Type declaration

    RecipeInterface: { getDashboardBundleLocation: any; shouldAllowAccess: any }

    Type declaration

    • getDashboardBundleLocation:function
      • getDashboardBundleLocation(input: { userContext: any }): Promise<string>
    • shouldAllowAccess:function
      • shouldAllowAccess(input: { config: TypeNormalisedInput; req: BaseRequest; userContext: any }): Promise<boolean>

    Functions

    • init(config?: TypeInput): RecipeListFunction

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/recipe_emailpassword.html b/docs/modules/recipe_emailpassword.html index c9e9b5917..34c1f1ef4 100644 --- a/docs/modules/recipe_emailpassword.html +++ b/docs/modules/recipe_emailpassword.html @@ -1,5 +1,5 @@ -recipe/emailpassword | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/emailpassword

    Index

    Type aliases

    APIInterface: { emailExistsGET: undefined | ((input: { email: string; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>); generatePasswordResetTokenPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ status: "OK" } | { reason: string; status: "PASSWORD_RESET_NOT_ALLOWED" } | GeneralErrorResponse>); passwordResetPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; token: string; userContext: any }) => Promise<{ email: string; status: "OK"; user: User } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" } | GeneralErrorResponse>); signInPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_NOT_ALLOWED" } | { status: "WRONG_CREDENTIALS_ERROR" } | GeneralErrorResponse>); signUpPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: User } | { reason: string; status: "SIGN_UP_NOT_ALLOWED" } | { status: "EMAIL_ALREADY_EXISTS_ERROR" } | GeneralErrorResponse>) }

    Type declaration

    • emailExistsGET: undefined | ((input: { email: string; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>)
    • generatePasswordResetTokenPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ status: "OK" } | { reason: string; status: "PASSWORD_RESET_NOT_ALLOWED" } | GeneralErrorResponse>)
    • passwordResetPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; token: string; userContext: any }) => Promise<{ email: string; status: "OK"; user: User } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" } | GeneralErrorResponse>)
    • signInPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_NOT_ALLOWED" } | { status: "WRONG_CREDENTIALS_ERROR" } | GeneralErrorResponse>)
    • signUpPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: User } | { reason: string; status: "SIGN_UP_NOT_ALLOWED" } | { status: "EMAIL_ALREADY_EXISTS_ERROR" } | GeneralErrorResponse>)
    APIOptions: { appInfo: NormalisedAppinfo; config: TypeNormalisedInput; emailDelivery: default<TypeEmailPasswordEmailDeliveryInput>; isInServerlessEnv: boolean; recipeId: string; recipeImplementation: RecipeInterface; req: BaseRequest; res: BaseResponse }

    Type declaration

    RecipeInterface: { consumePasswordResetToken: any; createNewRecipeUser: any; createResetPasswordToken: any; signIn: any; signUp: any; updateEmailOrPassword: any }

    Type declaration

    • consumePasswordResetToken:function
      • consumePasswordResetToken(input: { tenantId: string; token: string; userContext: any }): Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>
      • Parameters

        • input: { tenantId: string; token: string; userContext: any }
          • tenantId: string
          • token: string
          • userContext: any

        Returns Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>

    • createNewRecipeUser:function
      • createNewRecipeUser(input: { email: string; password: string; tenantId: string; userContext: any }): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
      • Parameters

        • input: { email: string; password: string; tenantId: string; userContext: any }
          • email: string
          • password: string
          • tenantId: string
          • userContext: any

        Returns Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>

    • createResetPasswordToken:function
      • createResetPasswordToken(input: { email: string; tenantId: string; userContext: any; userId: string }): Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>
      • +recipe/emailpassword | supertokens-node
        Options
        All
        • Public
        • Public/Protected
        • All
        Menu

        Module recipe/emailpassword

        Index

        Type aliases

        APIInterface: { emailExistsGET: undefined | ((input: { email: string; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>); generatePasswordResetTokenPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ status: "OK" } | { reason: string; status: "PASSWORD_RESET_NOT_ALLOWED" } | GeneralErrorResponse>); passwordResetPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; token: string; userContext: any }) => Promise<{ email: string; status: "OK"; user: User } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" } | GeneralErrorResponse>); signInPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_NOT_ALLOWED" } | { status: "WRONG_CREDENTIALS_ERROR" } | GeneralErrorResponse>); signUpPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: User } | { reason: string; status: "SIGN_UP_NOT_ALLOWED" } | { status: "EMAIL_ALREADY_EXISTS_ERROR" } | GeneralErrorResponse>) }

        Type declaration

        • emailExistsGET: undefined | ((input: { email: string; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>)
        • generatePasswordResetTokenPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ status: "OK" } | { reason: string; status: "PASSWORD_RESET_NOT_ALLOWED" } | GeneralErrorResponse>)
        • passwordResetPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; token: string; userContext: any }) => Promise<{ email: string; status: "OK"; user: User } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" } | GeneralErrorResponse>)
        • signInPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_NOT_ALLOWED" } | { status: "WRONG_CREDENTIALS_ERROR" } | GeneralErrorResponse>)
        • signUpPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: APIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: User } | { reason: string; status: "SIGN_UP_NOT_ALLOWED" } | { status: "EMAIL_ALREADY_EXISTS_ERROR" } | GeneralErrorResponse>)
        APIOptions: { appInfo: NormalisedAppinfo; config: TypeNormalisedInput; emailDelivery: default<TypeEmailPasswordEmailDeliveryInput>; isInServerlessEnv: boolean; recipeId: string; recipeImplementation: RecipeInterface; req: BaseRequest; res: BaseResponse }

        Type declaration

        RecipeInterface: { consumePasswordResetToken: any; createNewRecipeUser: any; createResetPasswordToken: any; signIn: any; signUp: any; updateEmailOrPassword: any }

        Type declaration

        • consumePasswordResetToken:function
          • consumePasswordResetToken(input: { tenantId: string; token: string; userContext: any }): Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>
          • Parameters

            • input: { tenantId: string; token: string; userContext: any }
              • tenantId: string
              • token: string
              • userContext: any

            Returns Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>

        • createNewRecipeUser:function
          • createNewRecipeUser(input: { email: string; password: string; tenantId: string; userContext: any }): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
          • Parameters

            • input: { email: string; password: string; tenantId: string; userContext: any }
              • email: string
              • password: string
              • tenantId: string
              • userContext: any

            Returns Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>

        • createResetPasswordToken:function
          • createResetPasswordToken(input: { email: string; tenantId: string; userContext: any; userId: string }): Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>
          • We pass in the email as well to this function cause the input userId may not be associated with an emailpassword account. In this case, we need to know which email to use to create an emailpassword account later on.

            -

            Parameters

            • input: { email: string; tenantId: string; userContext: any; userId: string }
              • email: string
              • tenantId: string
              • userContext: any
              • userId: string

            Returns Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>

        • signIn:function
          • signIn(input: { email: string; password: string; tenantId: string; userContext: any }): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "WRONG_CREDENTIALS_ERROR" }>
          • Parameters

            • input: { email: string; password: string; tenantId: string; userContext: any }
              • email: string
              • password: string
              • tenantId: string
              • userContext: any

            Returns Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "WRONG_CREDENTIALS_ERROR" }>

        • signUp:function
          • signUp(input: { email: string; password: string; tenantId: string; userContext: any }): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
          • Parameters

            • input: { email: string; password: string; tenantId: string; userContext: any }
              • email: string
              • password: string
              • tenantId: string
              • userContext: any

            Returns Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>

        • updateEmailOrPassword:function
          • updateEmailOrPassword(input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy: string; userContext: any }): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
          • Parameters

            • input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy: string; userContext: any }
              • Optional applyPasswordPolicy?: boolean
              • Optional email?: string
              • Optional password?: string
              • recipeUserId: RecipeUserId
              • tenantIdForPasswordPolicy: string
              • userContext: any

            Returns Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

        Variables

        Error: typeof default = Wrapper.Error

        Functions

        • consumePasswordResetToken(tenantId: string, token: string, userContext?: any): Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>
        • Parameters

          • tenantId: string
          • token: string
          • Optional userContext: any

          Returns Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>

        • createResetPasswordLink(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ link: string; status: "OK" } | { status: "UNKNOWN_USER_ID_ERROR" }>
        • Parameters

          • tenantId: string
          • userId: string
          • email: string
          • userContext: any = {}

          Returns Promise<{ link: string; status: "OK" } | { status: "UNKNOWN_USER_ID_ERROR" }>

        • createResetPasswordToken(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>
        • Parameters

          • tenantId: string
          • userId: string
          • email: string
          • Optional userContext: any

          Returns Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>

        • init(config?: TypeInput): RecipeListFunction
        • resetPasswordUsingToken(tenantId: string, token: string, newPassword: string, userContext?: any): Promise<{ status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
        • Parameters

          • tenantId: string
          • token: string
          • newPassword: string
          • Optional userContext: any

          Returns Promise<{ status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

        • sendEmail(input: TypeEmailPasswordPasswordResetEmailDeliveryInput & { userContext?: any }): Promise<void>
        • sendResetPasswordEmail(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" }>
        • signIn(tenantId: string, email: string, password: string, userContext?: any): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "WRONG_CREDENTIALS_ERROR" }>
        • signUp(tenantId: string, email: string, password: string, userContext?: any): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
        • updateEmailOrPassword(input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy?: string; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
        • Parameters

          • input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy?: string; userContext?: any }
            • Optional applyPasswordPolicy?: boolean
            • Optional email?: string
            • Optional password?: string
            • recipeUserId: RecipeUserId
            • Optional tenantIdForPasswordPolicy?: string
            • Optional userContext?: any

          Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

        Legend

        • Variable
        • Function
        • Function with type parameter
        • Type alias
        • Class
        • Class with type parameter
        • Interface

        Settings

        Theme

        Generated using TypeDoc

        \ No newline at end of file +

        Parameters

        • input: { email: string; tenantId: string; userContext: any; userId: string }
          • email: string
          • tenantId: string
          • userContext: any
          • userId: string

        Returns Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>

    • signIn:function
      • signIn(input: { email: string; password: string; tenantId: string; userContext: any }): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "WRONG_CREDENTIALS_ERROR" }>
      • Parameters

        • input: { email: string; password: string; tenantId: string; userContext: any }
          • email: string
          • password: string
          • tenantId: string
          • userContext: any

        Returns Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "WRONG_CREDENTIALS_ERROR" }>

    • signUp:function
      • signUp(input: { email: string; password: string; tenantId: string; userContext: any }): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
      • Parameters

        • input: { email: string; password: string; tenantId: string; userContext: any }
          • email: string
          • password: string
          • tenantId: string
          • userContext: any

        Returns Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>

    • updateEmailOrPassword:function
      • updateEmailOrPassword(input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy: string; userContext: any }): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
      • Parameters

        • input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy: string; userContext: any }
          • Optional applyPasswordPolicy?: boolean
          • Optional email?: string
          • Optional password?: string
          • recipeUserId: RecipeUserId
          • tenantIdForPasswordPolicy: string
          • userContext: any

        Returns Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

    Variables

    Error: typeof default = Wrapper.Error

    Functions

    • consumePasswordResetToken(tenantId: string, token: string, userContext?: any): Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>
    • Parameters

      • tenantId: string
      • token: string
      • Optional userContext: any

      Returns Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>

    • createResetPasswordLink(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ link: string; status: "OK" } | { status: "UNKNOWN_USER_ID_ERROR" }>
    • Parameters

      • tenantId: string
      • userId: string
      • email: string
      • userContext: any = {}

      Returns Promise<{ link: string; status: "OK" } | { status: "UNKNOWN_USER_ID_ERROR" }>

    • createResetPasswordToken(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>
    • Parameters

      • tenantId: string
      • userId: string
      • email: string
      • Optional userContext: any

      Returns Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>

    • init(config?: TypeInput): RecipeListFunction
    • resetPasswordUsingToken(tenantId: string, token: string, newPassword: string, userContext?: any): Promise<{ status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
    • Parameters

      • tenantId: string
      • token: string
      • newPassword: string
      • Optional userContext: any

      Returns Promise<{ status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

    • sendEmail(input: TypeEmailPasswordPasswordResetEmailDeliveryInput & { userContext?: any }): Promise<void>
    • sendResetPasswordEmail(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" }>
    • signIn(tenantId: string, email: string, password: string, userContext?: any): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "WRONG_CREDENTIALS_ERROR" }>
    • signUp(tenantId: string, email: string, password: string, userContext?: any): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
    • updateEmailOrPassword(input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy?: string; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
    • Parameters

      • input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy?: string; userContext?: any }
        • Optional applyPasswordPolicy?: boolean
        • Optional email?: string
        • Optional password?: string
        • recipeUserId: RecipeUserId
        • Optional tenantIdForPasswordPolicy?: string
        • Optional userContext?: any

      Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/recipe_emailverification.html b/docs/modules/recipe_emailverification.html index 64bb0ece3..af0b48037 100644 --- a/docs/modules/recipe_emailverification.html +++ b/docs/modules/recipe_emailverification.html @@ -1 +1 @@ -recipe/emailverification | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/emailverification

    Index

    Type aliases

    APIInterface: { generateEmailVerifyTokenPOST: undefined | ((input: { options: APIOptions; session: SessionContainer; userContext: any }) => Promise<{ status: "OK" } | { newSession?: SessionContainer; status: "EMAIL_ALREADY_VERIFIED_ERROR" } | GeneralErrorResponse>); isEmailVerifiedGET: undefined | ((input: { options: APIOptions; session: SessionContainer; userContext: any }) => Promise<{ isVerified: boolean; newSession?: SessionContainer; status: "OK" } | GeneralErrorResponse>); verifyEmailPOST: undefined | ((input: { options: APIOptions; session?: SessionContainer; tenantId: string; token: string; userContext: any }) => Promise<{ newSession?: SessionContainer; status: "OK"; user: UserEmailInfo } | { status: "EMAIL_VERIFICATION_INVALID_TOKEN_ERROR" } | GeneralErrorResponse>) }

    Type declaration

    • generateEmailVerifyTokenPOST: undefined | ((input: { options: APIOptions; session: SessionContainer; userContext: any }) => Promise<{ status: "OK" } | { newSession?: SessionContainer; status: "EMAIL_ALREADY_VERIFIED_ERROR" } | GeneralErrorResponse>)
    • isEmailVerifiedGET: undefined | ((input: { options: APIOptions; session: SessionContainer; userContext: any }) => Promise<{ isVerified: boolean; newSession?: SessionContainer; status: "OK" } | GeneralErrorResponse>)
    • verifyEmailPOST: undefined | ((input: { options: APIOptions; session?: SessionContainer; tenantId: string; token: string; userContext: any }) => Promise<{ newSession?: SessionContainer; status: "OK"; user: UserEmailInfo } | { status: "EMAIL_VERIFICATION_INVALID_TOKEN_ERROR" } | GeneralErrorResponse>)
    APIOptions: { appInfo: NormalisedAppinfo; config: TypeNormalisedInput; emailDelivery: default<TypeEmailVerificationEmailDeliveryInput>; isInServerlessEnv: boolean; recipeId: string; recipeImplementation: RecipeInterface; req: BaseRequest; res: BaseResponse }

    Type declaration

    • appInfo: NormalisedAppinfo
    • config: TypeNormalisedInput
    • emailDelivery: default<TypeEmailVerificationEmailDeliveryInput>
    • isInServerlessEnv: boolean
    • recipeId: string
    • recipeImplementation: RecipeInterface
    • req: BaseRequest
    • res: BaseResponse
    RecipeInterface: { createEmailVerificationToken: any; isEmailVerified: any; revokeEmailVerificationTokens: any; unverifyEmail: any; verifyEmailUsingToken: any }

    Type declaration

    • createEmailVerificationToken:function
      • createEmailVerificationToken(input: { email: string; recipeUserId: RecipeUserId; tenantId: string; userContext: any }): Promise<{ status: "OK"; token: string } | { status: "EMAIL_ALREADY_VERIFIED_ERROR" }>
    • isEmailVerified:function
      • isEmailVerified(input: { email: string; recipeUserId: RecipeUserId; userContext: any }): Promise<boolean>
    • revokeEmailVerificationTokens:function
      • revokeEmailVerificationTokens(input: { email: string; recipeUserId: RecipeUserId; tenantId: string; userContext: any }): Promise<{ status: "OK" }>
    • unverifyEmail:function
      • unverifyEmail(input: { email: string; recipeUserId: RecipeUserId; userContext: any }): Promise<{ status: "OK" }>
    • verifyEmailUsingToken:function
      • verifyEmailUsingToken(input: { attemptAccountLinking: boolean; tenantId: string; token: string; userContext: any }): Promise<{ status: "OK"; user: UserEmailInfo } | { status: "EMAIL_VERIFICATION_INVALID_TOKEN_ERROR" }>
      • Parameters

        • input: { attemptAccountLinking: boolean; tenantId: string; token: string; userContext: any }
          • attemptAccountLinking: boolean
          • tenantId: string
          • token: string
          • userContext: any

        Returns Promise<{ status: "OK"; user: UserEmailInfo } | { status: "EMAIL_VERIFICATION_INVALID_TOKEN_ERROR" }>

    UserEmailInfo: { email: string; recipeUserId: RecipeUserId }

    Type declaration

    Variables

    EmailVerificationClaim: EmailVerificationClaimClass = ...
    Error: typeof default = Wrapper.Error

    Functions

    • createEmailVerificationLink(tenantId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ link: string; status: "OK" } | { status: "EMAIL_ALREADY_VERIFIED_ERROR" }>
    • createEmailVerificationToken(tenantId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: "OK"; token: string } | { status: "EMAIL_ALREADY_VERIFIED_ERROR" }>
    • init(config: TypeInput): RecipeListFunction
    • isEmailVerified(recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<boolean>
    • revokeEmailVerificationTokens(tenantId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: string }>
    • sendEmail(input: TypeEmailVerificationEmailDeliveryInput & { userContext?: any }): Promise<void>
    • sendEmailVerificationEmail(tenantId: string, userId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: "OK" } | { status: "EMAIL_ALREADY_VERIFIED_ERROR" }>
    • unverifyEmail(recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: string }>
    • verifyEmailUsingToken(tenantId: string, token: string, attemptAccountLinking?: boolean, userContext?: any): Promise<{ status: "OK"; user: UserEmailInfo } | { status: "EMAIL_VERIFICATION_INVALID_TOKEN_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file +recipe/emailverification | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/emailverification

    Index

    Type aliases

    APIInterface: { generateEmailVerifyTokenPOST: undefined | ((input: { options: APIOptions; session: SessionContainer; userContext: any }) => Promise<{ status: "OK" } | { newSession?: SessionContainer; status: "EMAIL_ALREADY_VERIFIED_ERROR" } | GeneralErrorResponse>); isEmailVerifiedGET: undefined | ((input: { options: APIOptions; session: SessionContainer; userContext: any }) => Promise<{ isVerified: boolean; newSession?: SessionContainer; status: "OK" } | GeneralErrorResponse>); verifyEmailPOST: undefined | ((input: { options: APIOptions; session?: SessionContainer; tenantId: string; token: string; userContext: any }) => Promise<{ newSession?: SessionContainer; status: "OK"; user: UserEmailInfo } | { status: "EMAIL_VERIFICATION_INVALID_TOKEN_ERROR" } | GeneralErrorResponse>) }

    Type declaration

    • generateEmailVerifyTokenPOST: undefined | ((input: { options: APIOptions; session: SessionContainer; userContext: any }) => Promise<{ status: "OK" } | { newSession?: SessionContainer; status: "EMAIL_ALREADY_VERIFIED_ERROR" } | GeneralErrorResponse>)
    • isEmailVerifiedGET: undefined | ((input: { options: APIOptions; session: SessionContainer; userContext: any }) => Promise<{ isVerified: boolean; newSession?: SessionContainer; status: "OK" } | GeneralErrorResponse>)
    • verifyEmailPOST: undefined | ((input: { options: APIOptions; session?: SessionContainer; tenantId: string; token: string; userContext: any }) => Promise<{ newSession?: SessionContainer; status: "OK"; user: UserEmailInfo } | { status: "EMAIL_VERIFICATION_INVALID_TOKEN_ERROR" } | GeneralErrorResponse>)
    APIOptions: { appInfo: NormalisedAppinfo; config: TypeNormalisedInput; emailDelivery: default<TypeEmailVerificationEmailDeliveryInput>; isInServerlessEnv: boolean; recipeId: string; recipeImplementation: RecipeInterface; req: BaseRequest; res: BaseResponse }

    Type declaration

    • appInfo: NormalisedAppinfo
    • config: TypeNormalisedInput
    • emailDelivery: default<TypeEmailVerificationEmailDeliveryInput>
    • isInServerlessEnv: boolean
    • recipeId: string
    • recipeImplementation: RecipeInterface
    • req: BaseRequest
    • res: BaseResponse
    RecipeInterface: { createEmailVerificationToken: any; isEmailVerified: any; revokeEmailVerificationTokens: any; unverifyEmail: any; verifyEmailUsingToken: any }

    Type declaration

    • createEmailVerificationToken:function
      • createEmailVerificationToken(input: { email: string; recipeUserId: RecipeUserId; tenantId: string; userContext: any }): Promise<{ status: "OK"; token: string } | { status: "EMAIL_ALREADY_VERIFIED_ERROR" }>
    • isEmailVerified:function
      • isEmailVerified(input: { email: string; recipeUserId: RecipeUserId; userContext: any }): Promise<boolean>
    • revokeEmailVerificationTokens:function
      • revokeEmailVerificationTokens(input: { email: string; recipeUserId: RecipeUserId; tenantId: string; userContext: any }): Promise<{ status: "OK" }>
    • unverifyEmail:function
      • unverifyEmail(input: { email: string; recipeUserId: RecipeUserId; userContext: any }): Promise<{ status: "OK" }>
    • verifyEmailUsingToken:function
      • verifyEmailUsingToken(input: { attemptAccountLinking: boolean; tenantId: string; token: string; userContext: any }): Promise<{ status: "OK"; user: UserEmailInfo } | { status: "EMAIL_VERIFICATION_INVALID_TOKEN_ERROR" }>
      • Parameters

        • input: { attemptAccountLinking: boolean; tenantId: string; token: string; userContext: any }
          • attemptAccountLinking: boolean
          • tenantId: string
          • token: string
          • userContext: any

        Returns Promise<{ status: "OK"; user: UserEmailInfo } | { status: "EMAIL_VERIFICATION_INVALID_TOKEN_ERROR" }>

    UserEmailInfo: { email: string; recipeUserId: RecipeUserId }

    Type declaration

    Variables

    EmailVerificationClaim: EmailVerificationClaimClass = ...
    Error: typeof default = Wrapper.Error

    Functions

    • createEmailVerificationLink(tenantId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ link: string; status: "OK" } | { status: "EMAIL_ALREADY_VERIFIED_ERROR" }>
    • createEmailVerificationToken(tenantId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: "OK"; token: string } | { status: "EMAIL_ALREADY_VERIFIED_ERROR" }>
    • init(config: TypeInput): RecipeListFunction
    • isEmailVerified(recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<boolean>
    • revokeEmailVerificationTokens(tenantId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: string }>
    • sendEmail(input: TypeEmailVerificationEmailDeliveryInput & { userContext?: any }): Promise<void>
    • sendEmailVerificationEmail(tenantId: string, userId: string, recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: "OK" } | { status: "EMAIL_ALREADY_VERIFIED_ERROR" }>
    • unverifyEmail(recipeUserId: RecipeUserId, email?: string, userContext?: any): Promise<{ status: string }>
    • verifyEmailUsingToken(tenantId: string, token: string, attemptAccountLinking?: boolean, userContext?: any): Promise<{ status: "OK"; user: UserEmailInfo } | { status: "EMAIL_VERIFICATION_INVALID_TOKEN_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/recipe_jwt.html b/docs/modules/recipe_jwt.html index 204f37970..c7fd46fb7 100644 --- a/docs/modules/recipe_jwt.html +++ b/docs/modules/recipe_jwt.html @@ -1 +1 @@ -recipe/jwt | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Type aliases

    APIInterface: { getJWKSGET: undefined | ((input: { options: APIOptions; userContext: any }) => Promise<{ keys: JsonWebKey[] } | GeneralErrorResponse>) }

    Type declaration

    • getJWKSGET: undefined | ((input: { options: APIOptions; userContext: any }) => Promise<{ keys: JsonWebKey[] } | GeneralErrorResponse>)
    APIOptions: { config: TypeNormalisedInput; isInServerlessEnv: boolean; recipeId: string; recipeImplementation: RecipeInterface; req: BaseRequest; res: BaseResponse }

    Type declaration

    JsonWebKey: { alg: string; e: string; kid: string; kty: string; n: string; use: string }

    Type declaration

    • alg: string
    • e: string
    • kid: string
    • kty: string
    • n: string
    • use: string
    RecipeInterface: { createJWT: any; getJWKS: any }

    Type declaration

    • createJWT:function
      • createJWT(input: { payload?: any; useStaticSigningKey?: boolean; userContext: any; validitySeconds?: number }): Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>
      • Parameters

        • input: { payload?: any; useStaticSigningKey?: boolean; userContext: any; validitySeconds?: number }
          • Optional payload?: any
          • Optional useStaticSigningKey?: boolean
          • userContext: any
          • Optional validitySeconds?: number

        Returns Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>

    • getJWKS:function
      • getJWKS(input: { userContext: any }): Promise<{ keys: JsonWebKey[]; validityInSeconds?: number }>

    Functions

    • createJWT(payload: any, validitySeconds?: number, useStaticSigningKey?: boolean, userContext?: any): Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>
    • Parameters

      • payload: any
      • Optional validitySeconds: number
      • Optional useStaticSigningKey: boolean
      • Optional userContext: any

      Returns Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>

    • getJWKS(userContext?: any): Promise<{ keys: JsonWebKey[]; validityInSeconds?: number }>
    • init(config?: TypeInput): RecipeListFunction

    Generated using TypeDoc

    \ No newline at end of file +recipe/jwt | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Type aliases

    APIInterface: { getJWKSGET: undefined | ((input: { options: APIOptions; userContext: any }) => Promise<{ keys: JsonWebKey[] } | GeneralErrorResponse>) }

    Type declaration

    • getJWKSGET: undefined | ((input: { options: APIOptions; userContext: any }) => Promise<{ keys: JsonWebKey[] } | GeneralErrorResponse>)
    APIOptions: { config: TypeNormalisedInput; isInServerlessEnv: boolean; recipeId: string; recipeImplementation: RecipeInterface; req: BaseRequest; res: BaseResponse }

    Type declaration

    JsonWebKey: { alg: string; e: string; kid: string; kty: string; n: string; use: string }

    Type declaration

    • alg: string
    • e: string
    • kid: string
    • kty: string
    • n: string
    • use: string
    RecipeInterface: { createJWT: any; getJWKS: any }

    Type declaration

    • createJWT:function
      • createJWT(input: { payload?: any; useStaticSigningKey?: boolean; userContext: any; validitySeconds?: number }): Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>
      • Parameters

        • input: { payload?: any; useStaticSigningKey?: boolean; userContext: any; validitySeconds?: number }
          • Optional payload?: any
          • Optional useStaticSigningKey?: boolean
          • userContext: any
          • Optional validitySeconds?: number

        Returns Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>

    • getJWKS:function
      • getJWKS(input: { userContext: any }): Promise<{ keys: JsonWebKey[]; validityInSeconds?: number }>

    Functions

    • createJWT(payload: any, validitySeconds?: number, useStaticSigningKey?: boolean, userContext?: any): Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>
    • Parameters

      • payload: any
      • Optional validitySeconds: number
      • Optional useStaticSigningKey: boolean
      • Optional userContext: any

      Returns Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>

    • getJWKS(userContext?: any): Promise<{ keys: JsonWebKey[]; validityInSeconds?: number }>
    • init(config?: TypeInput): RecipeListFunction

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/recipe_multitenancy.html b/docs/modules/recipe_multitenancy.html index 592f45184..928654a68 100644 --- a/docs/modules/recipe_multitenancy.html +++ b/docs/modules/recipe_multitenancy.html @@ -1 +1 @@ -recipe/multitenancy | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/multitenancy

    Index

    Type aliases

    APIInterface: { loginMethodsGET: any }

    Type declaration

    • loginMethodsGET:function
      • loginMethodsGET(input: { clientType?: string; options: APIOptions; tenantId: string; userContext: any }): Promise<GeneralErrorResponse | { emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: { id: string; name?: string }[] } }>
      • Parameters

        • input: { clientType?: string; options: APIOptions; tenantId: string; userContext: any }
          • Optional clientType?: string
          • options: APIOptions
          • tenantId: string
          • userContext: any

        Returns Promise<GeneralErrorResponse | { emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: { id: string; name?: string }[] } }>

    APIOptions: { config: TypeNormalisedInput; isInServerlessEnv: boolean; recipeId: string; recipeImplementation: RecipeInterface; req: BaseRequest; res: BaseResponse; staticThirdPartyProviders: ProviderInput[] }

    Type declaration

    RecipeInterface: { associateUserToTenant: any; createOrUpdateTenant: any; createOrUpdateThirdPartyConfig: any; deleteTenant: any; deleteThirdPartyConfig: any; disassociateUserFromTenant: any; getTenant: any; getTenantId: any; listAllTenants: any }

    Type declaration

    • associateUserToTenant:function
      • associateUserToTenant(input: { recipeUserId: RecipeUserId; tenantId: string; userContext: any }): Promise<{ status: "OK"; wasAlreadyAssociated: boolean } | { status: "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" | "THIRD_PARTY_USER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "ASSOCIATION_NOT_ALLOWED_ERROR" }>
      • Parameters

        • input: { recipeUserId: RecipeUserId; tenantId: string; userContext: any }

        Returns Promise<{ status: "OK"; wasAlreadyAssociated: boolean } | { status: "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" | "THIRD_PARTY_USER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "ASSOCIATION_NOT_ALLOWED_ERROR" }>

    • createOrUpdateTenant:function
      • createOrUpdateTenant(input: { config?: { coreConfig?: {}; emailPasswordEnabled?: boolean; passwordlessEnabled?: boolean; thirdPartyEnabled?: boolean }; tenantId: string; userContext: any }): Promise<{ createdNew: boolean; status: "OK" }>
      • Parameters

        • input: { config?: { coreConfig?: {}; emailPasswordEnabled?: boolean; passwordlessEnabled?: boolean; thirdPartyEnabled?: boolean }; tenantId: string; userContext: any }
          • Optional config?: { coreConfig?: {}; emailPasswordEnabled?: boolean; passwordlessEnabled?: boolean; thirdPartyEnabled?: boolean }
            • Optional coreConfig?: {}
              • [key: string]: any
            • Optional emailPasswordEnabled?: boolean
            • Optional passwordlessEnabled?: boolean
            • Optional thirdPartyEnabled?: boolean
          • tenantId: string
          • userContext: any

        Returns Promise<{ createdNew: boolean; status: "OK" }>

    • createOrUpdateThirdPartyConfig:function
      • createOrUpdateThirdPartyConfig(input: { config: ProviderConfig; skipValidation?: boolean; tenantId: string; userContext: any }): Promise<{ createdNew: boolean; status: "OK" }>
      • Parameters

        • input: { config: ProviderConfig; skipValidation?: boolean; tenantId: string; userContext: any }
          • config: ProviderConfig
          • Optional skipValidation?: boolean
          • tenantId: string
          • userContext: any

        Returns Promise<{ createdNew: boolean; status: "OK" }>

    • deleteTenant:function
      • deleteTenant(input: { tenantId: string; userContext: any }): Promise<{ didExist: boolean; status: "OK" }>
    • deleteThirdPartyConfig:function
      • deleteThirdPartyConfig(input: { tenantId: string; thirdPartyId: string; userContext: any }): Promise<{ didConfigExist: boolean; status: "OK" }>
      • Parameters

        • input: { tenantId: string; thirdPartyId: string; userContext: any }
          • tenantId: string
          • thirdPartyId: string
          • userContext: any

        Returns Promise<{ didConfigExist: boolean; status: "OK" }>

    • disassociateUserFromTenant:function
      • disassociateUserFromTenant(input: { recipeUserId: RecipeUserId; tenantId: string; userContext: any }): Promise<{ status: "OK"; wasAssociated: boolean }>
    • getTenant:function
      • getTenant(input: { tenantId: string; userContext: any }): Promise<undefined | { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }>
      • Parameters

        • input: { tenantId: string; userContext: any }
          • tenantId: string
          • userContext: any

        Returns Promise<undefined | { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }>

    • getTenantId:function
      • getTenantId(input: { tenantIdFromFrontend: string; userContext: any }): Promise<string>
    • listAllTenants:function
      • listAllTenants(input: { userContext: any }): Promise<{ status: "OK"; tenants: { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; tenantId: string; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }[] }>
      • Parameters

        • input: { userContext: any }
          • userContext: any

        Returns Promise<{ status: "OK"; tenants: { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; tenantId: string; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }[] }>

    Variables

    AllowedDomainsClaim: AllowedDomainsClaimClass = ...

    Functions

    • associateUserToTenant(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; wasAlreadyAssociated: boolean } | { status: "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" | "THIRD_PARTY_USER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "ASSOCIATION_NOT_ALLOWED_ERROR" }>
    • Parameters

      • tenantId: string
      • recipeUserId: RecipeUserId
      • Optional userContext: any

      Returns Promise<{ status: "OK"; wasAlreadyAssociated: boolean } | { status: "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" | "THIRD_PARTY_USER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "ASSOCIATION_NOT_ALLOWED_ERROR" }>

    • createOrUpdateTenant(tenantId: string, config?: { coreConfig?: {}; emailPasswordEnabled?: boolean; passwordlessEnabled?: boolean; thirdPartyEnabled?: boolean }, userContext?: any): Promise<{ createdNew: boolean; status: "OK" }>
    • Parameters

      • tenantId: string
      • Optional config: { coreConfig?: {}; emailPasswordEnabled?: boolean; passwordlessEnabled?: boolean; thirdPartyEnabled?: boolean }
        • Optional coreConfig?: {}
          • [key: string]: any
        • Optional emailPasswordEnabled?: boolean
        • Optional passwordlessEnabled?: boolean
        • Optional thirdPartyEnabled?: boolean
      • Optional userContext: any

      Returns Promise<{ createdNew: boolean; status: "OK" }>

    • createOrUpdateThirdPartyConfig(tenantId: string, config: ProviderConfig, skipValidation?: boolean, userContext?: any): Promise<{ createdNew: boolean; status: "OK" }>
    • Parameters

      • tenantId: string
      • config: ProviderConfig
      • Optional skipValidation: boolean
      • Optional userContext: any

      Returns Promise<{ createdNew: boolean; status: "OK" }>

    • deleteTenant(tenantId: string, userContext?: any): Promise<{ didExist: boolean; status: "OK" }>
    • deleteThirdPartyConfig(tenantId: string, thirdPartyId: string, userContext?: any): Promise<{ didConfigExist: boolean; status: "OK" }>
    • disassociateUserFromTenant(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; wasAssociated: boolean }>
    • getTenant(tenantId: string, userContext?: any): Promise<undefined | { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }>
    • Parameters

      • tenantId: string
      • Optional userContext: any

      Returns Promise<undefined | { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }>

    • init(config?: TypeInput): RecipeListFunction
    • listAllTenants(userContext?: any): Promise<{ status: "OK"; tenants: { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; tenantId: string; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }[] }>
    • Parameters

      • Optional userContext: any

      Returns Promise<{ status: "OK"; tenants: { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; tenantId: string; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }[] }>

    Generated using TypeDoc

    \ No newline at end of file +recipe/multitenancy | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/multitenancy

    Index

    Type aliases

    APIInterface: { loginMethodsGET: any }

    Type declaration

    • loginMethodsGET:function
      • loginMethodsGET(input: { clientType?: string; options: APIOptions; tenantId: string; userContext: any }): Promise<GeneralErrorResponse | { emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: { id: string; name?: string }[] } }>
      • Parameters

        • input: { clientType?: string; options: APIOptions; tenantId: string; userContext: any }
          • Optional clientType?: string
          • options: APIOptions
          • tenantId: string
          • userContext: any

        Returns Promise<GeneralErrorResponse | { emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: { id: string; name?: string }[] } }>

    APIOptions: { config: TypeNormalisedInput; isInServerlessEnv: boolean; recipeId: string; recipeImplementation: RecipeInterface; req: BaseRequest; res: BaseResponse; staticThirdPartyProviders: ProviderInput[] }

    Type declaration

    RecipeInterface: { associateUserToTenant: any; createOrUpdateTenant: any; createOrUpdateThirdPartyConfig: any; deleteTenant: any; deleteThirdPartyConfig: any; disassociateUserFromTenant: any; getTenant: any; getTenantId: any; listAllTenants: any }

    Type declaration

    • associateUserToTenant:function
      • associateUserToTenant(input: { recipeUserId: RecipeUserId; tenantId: string; userContext: any }): Promise<{ status: "OK"; wasAlreadyAssociated: boolean } | { status: "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" | "THIRD_PARTY_USER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "ASSOCIATION_NOT_ALLOWED_ERROR" }>
      • Parameters

        • input: { recipeUserId: RecipeUserId; tenantId: string; userContext: any }

        Returns Promise<{ status: "OK"; wasAlreadyAssociated: boolean } | { status: "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" | "THIRD_PARTY_USER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "ASSOCIATION_NOT_ALLOWED_ERROR" }>

    • createOrUpdateTenant:function
      • createOrUpdateTenant(input: { config?: { coreConfig?: {}; emailPasswordEnabled?: boolean; passwordlessEnabled?: boolean; thirdPartyEnabled?: boolean }; tenantId: string; userContext: any }): Promise<{ createdNew: boolean; status: "OK" }>
      • Parameters

        • input: { config?: { coreConfig?: {}; emailPasswordEnabled?: boolean; passwordlessEnabled?: boolean; thirdPartyEnabled?: boolean }; tenantId: string; userContext: any }
          • Optional config?: { coreConfig?: {}; emailPasswordEnabled?: boolean; passwordlessEnabled?: boolean; thirdPartyEnabled?: boolean }
            • Optional coreConfig?: {}
              • [key: string]: any
            • Optional emailPasswordEnabled?: boolean
            • Optional passwordlessEnabled?: boolean
            • Optional thirdPartyEnabled?: boolean
          • tenantId: string
          • userContext: any

        Returns Promise<{ createdNew: boolean; status: "OK" }>

    • createOrUpdateThirdPartyConfig:function
      • createOrUpdateThirdPartyConfig(input: { config: ProviderConfig; skipValidation?: boolean; tenantId: string; userContext: any }): Promise<{ createdNew: boolean; status: "OK" }>
      • Parameters

        • input: { config: ProviderConfig; skipValidation?: boolean; tenantId: string; userContext: any }
          • config: ProviderConfig
          • Optional skipValidation?: boolean
          • tenantId: string
          • userContext: any

        Returns Promise<{ createdNew: boolean; status: "OK" }>

    • deleteTenant:function
      • deleteTenant(input: { tenantId: string; userContext: any }): Promise<{ didExist: boolean; status: "OK" }>
    • deleteThirdPartyConfig:function
      • deleteThirdPartyConfig(input: { tenantId: string; thirdPartyId: string; userContext: any }): Promise<{ didConfigExist: boolean; status: "OK" }>
      • Parameters

        • input: { tenantId: string; thirdPartyId: string; userContext: any }
          • tenantId: string
          • thirdPartyId: string
          • userContext: any

        Returns Promise<{ didConfigExist: boolean; status: "OK" }>

    • disassociateUserFromTenant:function
      • disassociateUserFromTenant(input: { recipeUserId: RecipeUserId; tenantId: string; userContext: any }): Promise<{ status: "OK"; wasAssociated: boolean }>
    • getTenant:function
      • getTenant(input: { tenantId: string; userContext: any }): Promise<undefined | { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }>
      • Parameters

        • input: { tenantId: string; userContext: any }
          • tenantId: string
          • userContext: any

        Returns Promise<undefined | { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }>

    • getTenantId:function
      • getTenantId(input: { tenantIdFromFrontend: string; userContext: any }): Promise<string>
    • listAllTenants:function
      • listAllTenants(input: { userContext: any }): Promise<{ status: "OK"; tenants: { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; tenantId: string; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }[] }>
      • Parameters

        • input: { userContext: any }
          • userContext: any

        Returns Promise<{ status: "OK"; tenants: { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; tenantId: string; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }[] }>

    Variables

    AllowedDomainsClaim: AllowedDomainsClaimClass = ...

    Functions

    • associateUserToTenant(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; wasAlreadyAssociated: boolean } | { status: "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" | "THIRD_PARTY_USER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "ASSOCIATION_NOT_ALLOWED_ERROR" }>
    • Parameters

      • tenantId: string
      • recipeUserId: RecipeUserId
      • Optional userContext: any

      Returns Promise<{ status: "OK"; wasAlreadyAssociated: boolean } | { status: "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" | "THIRD_PARTY_USER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "ASSOCIATION_NOT_ALLOWED_ERROR" }>

    • createOrUpdateTenant(tenantId: string, config?: { coreConfig?: {}; emailPasswordEnabled?: boolean; passwordlessEnabled?: boolean; thirdPartyEnabled?: boolean }, userContext?: any): Promise<{ createdNew: boolean; status: "OK" }>
    • Parameters

      • tenantId: string
      • Optional config: { coreConfig?: {}; emailPasswordEnabled?: boolean; passwordlessEnabled?: boolean; thirdPartyEnabled?: boolean }
        • Optional coreConfig?: {}
          • [key: string]: any
        • Optional emailPasswordEnabled?: boolean
        • Optional passwordlessEnabled?: boolean
        • Optional thirdPartyEnabled?: boolean
      • Optional userContext: any

      Returns Promise<{ createdNew: boolean; status: "OK" }>

    • createOrUpdateThirdPartyConfig(tenantId: string, config: ProviderConfig, skipValidation?: boolean, userContext?: any): Promise<{ createdNew: boolean; status: "OK" }>
    • Parameters

      • tenantId: string
      • config: ProviderConfig
      • Optional skipValidation: boolean
      • Optional userContext: any

      Returns Promise<{ createdNew: boolean; status: "OK" }>

    • deleteTenant(tenantId: string, userContext?: any): Promise<{ didExist: boolean; status: "OK" }>
    • deleteThirdPartyConfig(tenantId: string, thirdPartyId: string, userContext?: any): Promise<{ didConfigExist: boolean; status: "OK" }>
    • disassociateUserFromTenant(tenantId: string, recipeUserId: RecipeUserId, userContext?: any): Promise<{ status: "OK"; wasAssociated: boolean }>
    • getTenant(tenantId: string, userContext?: any): Promise<undefined | { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }>
    • Parameters

      • tenantId: string
      • Optional userContext: any

      Returns Promise<undefined | { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; status: "OK"; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }>

    • init(config?: TypeInput): RecipeListFunction
    • listAllTenants(userContext?: any): Promise<{ status: "OK"; tenants: { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; tenantId: string; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }[] }>
    • Parameters

      • Optional userContext: any

      Returns Promise<{ status: "OK"; tenants: { coreConfig: {}; emailPassword: { enabled: boolean }; passwordless: { enabled: boolean }; tenantId: string; thirdParty: { enabled: boolean; providers: ProviderConfig[] } }[] }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/recipe_openid.html b/docs/modules/recipe_openid.html index 9af7fa9f0..5c5c9785b 100644 --- a/docs/modules/recipe_openid.html +++ b/docs/modules/recipe_openid.html @@ -1 +1 @@ -recipe/openid | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/openid

    Index

    Functions

    • createJWT(payload?: any, validitySeconds?: number, useStaticSigningKey?: boolean, userContext?: any): Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>
    • Parameters

      • Optional payload: any
      • Optional validitySeconds: number
      • Optional useStaticSigningKey: boolean
      • Optional userContext: any

      Returns Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>

    • getJWKS(userContext?: any): Promise<{ keys: JsonWebKey[]; validityInSeconds?: number }>
    • getOpenIdDiscoveryConfiguration(userContext?: any): Promise<{ issuer: string; jwks_uri: string; status: "OK" }>
    • init(config?: TypeInput): RecipeListFunction

    Generated using TypeDoc

    \ No newline at end of file +recipe/openid | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/openid

    Index

    Functions

    • createJWT(payload?: any, validitySeconds?: number, useStaticSigningKey?: boolean, userContext?: any): Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>
    • Parameters

      • Optional payload: any
      • Optional validitySeconds: number
      • Optional useStaticSigningKey: boolean
      • Optional userContext: any

      Returns Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>

    • getJWKS(userContext?: any): Promise<{ keys: JsonWebKey[]; validityInSeconds?: number }>
    • getOpenIdDiscoveryConfiguration(userContext?: any): Promise<{ issuer: string; jwks_uri: string; status: "OK" }>
    • init(config?: TypeInput): RecipeListFunction

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/recipe_passwordless.html b/docs/modules/recipe_passwordless.html index 044a507ef..cc6cf04e9 100644 --- a/docs/modules/recipe_passwordless.html +++ b/docs/modules/recipe_passwordless.html @@ -1 +1 @@ -recipe/passwordless | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/passwordless

    Index

    Type aliases

    APIInterface: { consumeCodePOST?: any; createCodePOST?: any; emailExistsGET?: any; phoneNumberExistsGET?: any; resendCodePOST?: any }

    Type declaration

    • consumeCodePOST?:function
      • consumeCodePOST(input: ({ deviceId: string; preAuthSessionId: string; userInputCode: string } & { options: APIOptions; tenantId: string; userContext: any }) & ({ linkCode: string; preAuthSessionId: string } & { options: APIOptions; tenantId: string; userContext: any })): Promise<GeneralErrorResponse | { createdNewRecipeUser: boolean; session: SessionContainer; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: ({ deviceId: string; preAuthSessionId: string; userInputCode: string } & { options: APIOptions; tenantId: string; userContext: any }) & ({ linkCode: string; preAuthSessionId: string } & { options: APIOptions; tenantId: string; userContext: any })

        Returns Promise<GeneralErrorResponse | { createdNewRecipeUser: boolean; session: SessionContainer; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • createCodePOST?:function
      • createCodePOST(input: ({ email: string } & { options: APIOptions; tenantId: string; userContext: any }) & ({ phoneNumber: string } & { options: APIOptions; tenantId: string; userContext: any })): Promise<GeneralErrorResponse | { deviceId: string; flowType: "USER_INPUT_CODE" | "MAGIC_LINK" | "USER_INPUT_CODE_AND_MAGIC_LINK"; preAuthSessionId: string; status: "OK" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: ({ email: string } & { options: APIOptions; tenantId: string; userContext: any }) & ({ phoneNumber: string } & { options: APIOptions; tenantId: string; userContext: any })

        Returns Promise<GeneralErrorResponse | { deviceId: string; flowType: "USER_INPUT_CODE" | "MAGIC_LINK" | "USER_INPUT_CODE_AND_MAGIC_LINK"; preAuthSessionId: string; status: "OK" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • emailExistsGET?:function
      • emailExistsGET(input: { email: string; options: APIOptions; tenantId: string; userContext: any }): Promise<GeneralErrorResponse | { exists: boolean; status: "OK" }>
    • phoneNumberExistsGET?:function
      • phoneNumberExistsGET(input: { options: APIOptions; phoneNumber: string; tenantId: string; userContext: any }): Promise<GeneralErrorResponse | { exists: boolean; status: "OK" }>
    • resendCodePOST?:function
      • resendCodePOST(input: { deviceId: string; preAuthSessionId: string } & { options: APIOptions; tenantId: string; userContext: any }): Promise<GeneralErrorResponse | { status: "RESTART_FLOW_ERROR" | "OK" }>
      • Parameters

        • input: { deviceId: string; preAuthSessionId: string } & { options: APIOptions; tenantId: string; userContext: any }

        Returns Promise<GeneralErrorResponse | { status: "RESTART_FLOW_ERROR" | "OK" }>

    APIOptions: { appInfo: NormalisedAppinfo; config: TypeNormalisedInput; emailDelivery: default<TypePasswordlessEmailDeliveryInput>; isInServerlessEnv: boolean; recipeId: string; recipeImplementation: RecipeInterface; req: BaseRequest; res: BaseResponse; smsDelivery: default<TypePasswordlessSmsDeliveryInput> }

    Type declaration

    • appInfo: NormalisedAppinfo
    • config: TypeNormalisedInput
    • emailDelivery: default<TypePasswordlessEmailDeliveryInput>
    • isInServerlessEnv: boolean
    • recipeId: string
    • recipeImplementation: RecipeInterface
    • req: BaseRequest
    • res: BaseResponse
    • smsDelivery: default<TypePasswordlessSmsDeliveryInput>
    RecipeInterface: { consumeCode: any; createCode: any; createNewCodeForDevice: any; listCodesByDeviceId: any; listCodesByEmail: any; listCodesByPhoneNumber: any; listCodesByPreAuthSessionId: any; revokeAllCodes: any; revokeCode: any; updateUser: any }

    Type declaration

    • consumeCode:function
      • consumeCode(input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>
      • Parameters

        • input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext: any }

        Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>

    • createCode:function
      • createCode(input: ({ email: string } & { tenantId: string; userContext: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext: any; userInputCode?: string })): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>
      • Parameters

        • input: ({ email: string } & { tenantId: string; userContext: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext: any; userInputCode?: string })

        Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>

    • createNewCodeForDevice:function
      • createNewCodeForDevice(input: { deviceId: string; tenantId: string; userContext: any; userInputCode?: string }): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>
      • Parameters

        • input: { deviceId: string; tenantId: string; userContext: any; userInputCode?: string }
          • deviceId: string
          • tenantId: string
          • userContext: any
          • Optional userInputCode?: string

        Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>

    • listCodesByDeviceId:function
      • listCodesByDeviceId(input: { deviceId: string; tenantId: string; userContext: any }): Promise<undefined | DeviceType>
      • Parameters

        • input: { deviceId: string; tenantId: string; userContext: any }
          • deviceId: string
          • tenantId: string
          • userContext: any

        Returns Promise<undefined | DeviceType>

    • listCodesByEmail:function
      • listCodesByEmail(input: { email: string; tenantId: string; userContext: any }): Promise<DeviceType[]>
    • listCodesByPhoneNumber:function
      • listCodesByPhoneNumber(input: { phoneNumber: string; tenantId: string; userContext: any }): Promise<DeviceType[]>
      • Parameters

        • input: { phoneNumber: string; tenantId: string; userContext: any }
          • phoneNumber: string
          • tenantId: string
          • userContext: any

        Returns Promise<DeviceType[]>

    • listCodesByPreAuthSessionId:function
      • listCodesByPreAuthSessionId(input: { preAuthSessionId: string; tenantId: string; userContext: any }): Promise<undefined | DeviceType>
      • Parameters

        • input: { preAuthSessionId: string; tenantId: string; userContext: any }
          • preAuthSessionId: string
          • tenantId: string
          • userContext: any

        Returns Promise<undefined | DeviceType>

    • revokeAllCodes:function
      • revokeAllCodes(input: { email: string; tenantId: string; userContext: any } | { phoneNumber: string; tenantId: string; userContext: any }): Promise<{ status: "OK" }>
      • Parameters

        • input: { email: string; tenantId: string; userContext: any } | { phoneNumber: string; tenantId: string; userContext: any }

        Returns Promise<{ status: "OK" }>

    • revokeCode:function
      • revokeCode(input: { codeId: string; tenantId: string; userContext: any }): Promise<{ status: "OK" }>
      • Parameters

        • input: { codeId: string; tenantId: string; userContext: any }
          • codeId: string
          • tenantId: string
          • userContext: any

        Returns Promise<{ status: "OK" }>

    • updateUser:function
      • updateUser(input: { email?: string | null; phoneNumber?: string | null; recipeUserId: RecipeUserId; userContext: any }): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>
      • Parameters

        • input: { email?: string | null; phoneNumber?: string | null; recipeUserId: RecipeUserId; userContext: any }
          • Optional email?: string | null
          • Optional phoneNumber?: string | null
          • recipeUserId: RecipeUserId
          • userContext: any

        Returns Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>

    Variables

    Error: typeof default = Wrapper.Error

    Functions

    • consumeCode(input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>
    • Parameters

      • input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>

    • createCode(input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>
    • Parameters

      • input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })

      Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>

    • createMagicLink(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<string>
    • Parameters

      • input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }

      Returns Promise<string>

    • createNewCodeForDevice(input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>
    • Parameters

      • input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }
        • deviceId: string
        • tenantId: string
        • Optional userContext?: any
        • Optional userInputCode?: string

      Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>

    • init(config: TypeInput): RecipeListFunction
    • listCodesByDeviceId(input: { deviceId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
    • Parameters

      • input: { deviceId: string; tenantId: string; userContext?: any }
        • deviceId: string
        • tenantId: string
        • Optional userContext?: any

      Returns Promise<undefined | DeviceType>

    • listCodesByEmail(input: { email: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
    • Parameters

      • input: { email: string; tenantId: string; userContext?: any }
        • email: string
        • tenantId: string
        • Optional userContext?: any

      Returns Promise<DeviceType[]>

    • listCodesByPhoneNumber(input: { phoneNumber: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
    • Parameters

      • input: { phoneNumber: string; tenantId: string; userContext?: any }
        • phoneNumber: string
        • tenantId: string
        • Optional userContext?: any

      Returns Promise<DeviceType[]>

    • listCodesByPreAuthSessionId(input: { preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
    • Parameters

      • input: { preAuthSessionId: string; tenantId: string; userContext?: any }
        • preAuthSessionId: string
        • tenantId: string
        • Optional userContext?: any

      Returns Promise<undefined | DeviceType>

    • revokeAllCodes(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
    • Parameters

      • input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }

      Returns Promise<{ status: "OK" }>

    • revokeCode(input: { codeId: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
    • Parameters

      • input: { codeId: string; tenantId: string; userContext?: any }
        • codeId: string
        • tenantId: string
        • Optional userContext?: any

      Returns Promise<{ status: "OK" }>

    • sendEmail(input: TypePasswordlessEmailDeliveryInput & { userContext?: any }): Promise<void>
    • sendSms(input: TypePasswordlessSmsDeliveryInput & { userContext?: any }): Promise<void>
    • signInUp(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: string; user: User }>
    • Parameters

      • input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: string; user: User }>

    • updateUser(input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>
    • Parameters

      • input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }
        • Optional email?: null | string
        • Optional phoneNumber?: null | string
        • recipeUserId: RecipeUserId
        • Optional userContext?: any

      Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file +recipe/passwordless | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/passwordless

    Index

    Type aliases

    APIInterface: { consumeCodePOST?: any; createCodePOST?: any; emailExistsGET?: any; phoneNumberExistsGET?: any; resendCodePOST?: any }

    Type declaration

    • consumeCodePOST?:function
      • consumeCodePOST(input: ({ deviceId: string; preAuthSessionId: string; userInputCode: string } & { options: APIOptions; tenantId: string; userContext: any }) & ({ linkCode: string; preAuthSessionId: string } & { options: APIOptions; tenantId: string; userContext: any })): Promise<GeneralErrorResponse | { createdNewRecipeUser: boolean; session: SessionContainer; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: ({ deviceId: string; preAuthSessionId: string; userInputCode: string } & { options: APIOptions; tenantId: string; userContext: any }) & ({ linkCode: string; preAuthSessionId: string } & { options: APIOptions; tenantId: string; userContext: any })

        Returns Promise<GeneralErrorResponse | { createdNewRecipeUser: boolean; session: SessionContainer; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • createCodePOST?:function
      • createCodePOST(input: ({ email: string } & { options: APIOptions; tenantId: string; userContext: any }) & ({ phoneNumber: string } & { options: APIOptions; tenantId: string; userContext: any })): Promise<GeneralErrorResponse | { deviceId: string; flowType: "USER_INPUT_CODE" | "MAGIC_LINK" | "USER_INPUT_CODE_AND_MAGIC_LINK"; preAuthSessionId: string; status: "OK" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: ({ email: string } & { options: APIOptions; tenantId: string; userContext: any }) & ({ phoneNumber: string } & { options: APIOptions; tenantId: string; userContext: any })

        Returns Promise<GeneralErrorResponse | { deviceId: string; flowType: "USER_INPUT_CODE" | "MAGIC_LINK" | "USER_INPUT_CODE_AND_MAGIC_LINK"; preAuthSessionId: string; status: "OK" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • emailExistsGET?:function
      • emailExistsGET(input: { email: string; options: APIOptions; tenantId: string; userContext: any }): Promise<GeneralErrorResponse | { exists: boolean; status: "OK" }>
    • phoneNumberExistsGET?:function
      • phoneNumberExistsGET(input: { options: APIOptions; phoneNumber: string; tenantId: string; userContext: any }): Promise<GeneralErrorResponse | { exists: boolean; status: "OK" }>
    • resendCodePOST?:function
      • resendCodePOST(input: { deviceId: string; preAuthSessionId: string } & { options: APIOptions; tenantId: string; userContext: any }): Promise<GeneralErrorResponse | { status: "RESTART_FLOW_ERROR" | "OK" }>
      • Parameters

        • input: { deviceId: string; preAuthSessionId: string } & { options: APIOptions; tenantId: string; userContext: any }

        Returns Promise<GeneralErrorResponse | { status: "RESTART_FLOW_ERROR" | "OK" }>

    APIOptions: { appInfo: NormalisedAppinfo; config: TypeNormalisedInput; emailDelivery: default<TypePasswordlessEmailDeliveryInput>; isInServerlessEnv: boolean; recipeId: string; recipeImplementation: RecipeInterface; req: BaseRequest; res: BaseResponse; smsDelivery: default<TypePasswordlessSmsDeliveryInput> }

    Type declaration

    • appInfo: NormalisedAppinfo
    • config: TypeNormalisedInput
    • emailDelivery: default<TypePasswordlessEmailDeliveryInput>
    • isInServerlessEnv: boolean
    • recipeId: string
    • recipeImplementation: RecipeInterface
    • req: BaseRequest
    • res: BaseResponse
    • smsDelivery: default<TypePasswordlessSmsDeliveryInput>
    RecipeInterface: { consumeCode: any; createCode: any; createNewCodeForDevice: any; listCodesByDeviceId: any; listCodesByEmail: any; listCodesByPhoneNumber: any; listCodesByPreAuthSessionId: any; revokeAllCodes: any; revokeCode: any; updateUser: any }

    Type declaration

    • consumeCode:function
      • consumeCode(input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>
      • Parameters

        • input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext: any }

        Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>

    • createCode:function
      • createCode(input: ({ email: string } & { tenantId: string; userContext: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext: any; userInputCode?: string })): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>
      • Parameters

        • input: ({ email: string } & { tenantId: string; userContext: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext: any; userInputCode?: string })

        Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>

    • createNewCodeForDevice:function
      • createNewCodeForDevice(input: { deviceId: string; tenantId: string; userContext: any; userInputCode?: string }): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>
      • Parameters

        • input: { deviceId: string; tenantId: string; userContext: any; userInputCode?: string }
          • deviceId: string
          • tenantId: string
          • userContext: any
          • Optional userInputCode?: string

        Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>

    • listCodesByDeviceId:function
      • listCodesByDeviceId(input: { deviceId: string; tenantId: string; userContext: any }): Promise<undefined | DeviceType>
      • Parameters

        • input: { deviceId: string; tenantId: string; userContext: any }
          • deviceId: string
          • tenantId: string
          • userContext: any

        Returns Promise<undefined | DeviceType>

    • listCodesByEmail:function
      • listCodesByEmail(input: { email: string; tenantId: string; userContext: any }): Promise<DeviceType[]>
    • listCodesByPhoneNumber:function
      • listCodesByPhoneNumber(input: { phoneNumber: string; tenantId: string; userContext: any }): Promise<DeviceType[]>
      • Parameters

        • input: { phoneNumber: string; tenantId: string; userContext: any }
          • phoneNumber: string
          • tenantId: string
          • userContext: any

        Returns Promise<DeviceType[]>

    • listCodesByPreAuthSessionId:function
      • listCodesByPreAuthSessionId(input: { preAuthSessionId: string; tenantId: string; userContext: any }): Promise<undefined | DeviceType>
      • Parameters

        • input: { preAuthSessionId: string; tenantId: string; userContext: any }
          • preAuthSessionId: string
          • tenantId: string
          • userContext: any

        Returns Promise<undefined | DeviceType>

    • revokeAllCodes:function
      • revokeAllCodes(input: { email: string; tenantId: string; userContext: any } | { phoneNumber: string; tenantId: string; userContext: any }): Promise<{ status: "OK" }>
      • Parameters

        • input: { email: string; tenantId: string; userContext: any } | { phoneNumber: string; tenantId: string; userContext: any }

        Returns Promise<{ status: "OK" }>

    • revokeCode:function
      • revokeCode(input: { codeId: string; tenantId: string; userContext: any }): Promise<{ status: "OK" }>
      • Parameters

        • input: { codeId: string; tenantId: string; userContext: any }
          • codeId: string
          • tenantId: string
          • userContext: any

        Returns Promise<{ status: "OK" }>

    • updateUser:function
      • updateUser(input: { email?: string | null; phoneNumber?: string | null; recipeUserId: RecipeUserId; userContext: any }): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>
      • Parameters

        • input: { email?: string | null; phoneNumber?: string | null; recipeUserId: RecipeUserId; userContext: any }
          • Optional email?: string | null
          • Optional phoneNumber?: string | null
          • recipeUserId: RecipeUserId
          • userContext: any

        Returns Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>

    Variables

    Error: typeof default = Wrapper.Error

    Functions

    • consumeCode(input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>
    • Parameters

      • input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>

    • createCode(input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>
    • Parameters

      • input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })

      Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>

    • createMagicLink(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<string>
    • Parameters

      • input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }

      Returns Promise<string>

    • createNewCodeForDevice(input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>
    • Parameters

      • input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }
        • deviceId: string
        • tenantId: string
        • Optional userContext?: any
        • Optional userInputCode?: string

      Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>

    • init(config: TypeInput): RecipeListFunction
    • listCodesByDeviceId(input: { deviceId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
    • Parameters

      • input: { deviceId: string; tenantId: string; userContext?: any }
        • deviceId: string
        • tenantId: string
        • Optional userContext?: any

      Returns Promise<undefined | DeviceType>

    • listCodesByEmail(input: { email: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
    • Parameters

      • input: { email: string; tenantId: string; userContext?: any }
        • email: string
        • tenantId: string
        • Optional userContext?: any

      Returns Promise<DeviceType[]>

    • listCodesByPhoneNumber(input: { phoneNumber: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
    • Parameters

      • input: { phoneNumber: string; tenantId: string; userContext?: any }
        • phoneNumber: string
        • tenantId: string
        • Optional userContext?: any

      Returns Promise<DeviceType[]>

    • listCodesByPreAuthSessionId(input: { preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
    • Parameters

      • input: { preAuthSessionId: string; tenantId: string; userContext?: any }
        • preAuthSessionId: string
        • tenantId: string
        • Optional userContext?: any

      Returns Promise<undefined | DeviceType>

    • revokeAllCodes(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
    • Parameters

      • input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }

      Returns Promise<{ status: "OK" }>

    • revokeCode(input: { codeId: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
    • Parameters

      • input: { codeId: string; tenantId: string; userContext?: any }
        • codeId: string
        • tenantId: string
        • Optional userContext?: any

      Returns Promise<{ status: "OK" }>

    • sendEmail(input: TypePasswordlessEmailDeliveryInput & { userContext?: any }): Promise<void>
    • sendSms(input: TypePasswordlessSmsDeliveryInput & { userContext?: any }): Promise<void>
    • signInUp(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: string; user: User }>
    • Parameters

      • input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: string; user: User }>

    • updateUser(input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>
    • Parameters

      • input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }
        • Optional email?: null | string
        • Optional phoneNumber?: null | string
        • recipeUserId: RecipeUserId
        • Optional userContext?: any

      Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/recipe_session.html b/docs/modules/recipe_session.html index 96ca8dcab..3e74cf5dd 100644 --- a/docs/modules/recipe_session.html +++ b/docs/modules/recipe_session.html @@ -1,13 +1,13 @@ -recipe/session | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/session

    Index

    Type aliases

    APIInterface: { refreshPOST: undefined | ((input: { options: APIOptions; userContext: any }) => Promise<SessionContainer>); signOutPOST: undefined | ((input: { options: APIOptions; session: SessionContainer | undefined; userContext: any }) => Promise<{ status: "OK" } | GeneralErrorResponse>); verifySession: any }

    Type declaration

  • mergeIntoAccessTokenPayload:function
    • mergeIntoAccessTokenPayload(input: { accessTokenPayloadUpdate: JSONObject; sessionHandle: string; userContext: any }): Promise<boolean>
  • refreshSession:function
    • refreshSession(input: { antiCsrfToken?: string; disableAntiCsrf: boolean; refreshToken: string; userContext: any }): Promise<SessionContainer>
    • Parameters

      • input: { antiCsrfToken?: string; disableAntiCsrf: boolean; refreshToken: string; userContext: any }
        • Optional antiCsrfToken?: string
        • disableAntiCsrf: boolean
        • refreshToken: string
        • userContext: any

      Returns Promise<SessionContainer>

  • regenerateAccessToken:function
    • regenerateAccessToken(input: { accessToken: string; newAccessTokenPayload?: any; userContext: any }): Promise<undefined | { accessToken?: { createdTime: number; expiry: number; token: string }; session: { handle: string; recipeUserId: RecipeUserId; tenantId: string; userDataInJWT: any; userId: string }; status: "OK" }>
    • Parameters

      • input: { accessToken: string; newAccessTokenPayload?: any; userContext: any }
        • accessToken: string
        • Optional newAccessTokenPayload?: any
        • userContext: any

      Returns Promise<undefined | { accessToken?: { createdTime: number; expiry: number; token: string }; session: { handle: string; recipeUserId: RecipeUserId; tenantId: string; userDataInJWT: any; userId: string }; status: "OK" }>

      Returns false if the sessionHandle does not exist

      +
  • removeClaim:function
    • removeClaim(input: { claim: SessionClaim<any>; sessionHandle: string; userContext: any }): Promise<boolean>
    • Parameters

      • input: { claim: SessionClaim<any>; sessionHandle: string; userContext: any }
        • claim: SessionClaim<any>
        • sessionHandle: string
        • userContext: any

      Returns Promise<boolean>

  • revokeAllSessionsForUser:function
    • revokeAllSessionsForUser(input: { revokeAcrossAllTenants?: boolean; revokeSessionsForLinkedAccounts: boolean; tenantId: string; userContext: any; userId: string }): Promise<string[]>
    • Parameters

      • input: { revokeAcrossAllTenants?: boolean; revokeSessionsForLinkedAccounts: boolean; tenantId: string; userContext: any; userId: string }
        • Optional revokeAcrossAllTenants?: boolean
        • revokeSessionsForLinkedAccounts: boolean
        • tenantId: string
        • userContext: any
        • userId: string

      Returns Promise<string[]>

  • revokeMultipleSessions:function
    • revokeMultipleSessions(input: { sessionHandles: string[]; userContext: any }): Promise<string[]>
    • Parameters

      • input: { sessionHandles: string[]; userContext: any }
        • sessionHandles: string[]
        • userContext: any

      Returns Promise<string[]>

  • revokeSession:function
    • revokeSession(input: { sessionHandle: string; userContext: any }): Promise<boolean>
  • setClaimValue:function
    • setClaimValue<T>(input: { claim: SessionClaim<T>; sessionHandle: string; userContext: any; value: T }): Promise<boolean>
    • Type parameters

      • T

      Parameters

      • input: { claim: SessionClaim<T>; sessionHandle: string; userContext: any; value: T }
        • claim: SessionClaim<T>
        • sessionHandle: string
        • userContext: any
        • value: T

      Returns Promise<boolean>

  • updateSessionDataInDatabase:function
    • updateSessionDataInDatabase(input: { newSessionData: any; sessionHandle: string; userContext: any }): Promise<boolean>
    • Parameters

      • input: { newSessionData: any; sessionHandle: string; userContext: any }
        • newSessionData: any
        • sessionHandle: string
        • userContext: any

      Returns Promise<boolean>

  • validateClaims:function
    • validateClaims(input: { accessTokenPayload: any; claimValidators: SessionClaimValidator[]; recipeUserId: RecipeUserId; userContext: any; userId: string }): Promise<{ accessTokenPayloadUpdate?: any; invalidClaims: ClaimValidationError[] }>
  • SessionClaimValidator: ({ claim: SessionClaim<any>; shouldRefetch: any } | {}) & { id: string; validate: any }
    SessionInformation: { customClaimsInAccessTokenPayload: any; expiry: number; recipeUserId: RecipeUserId; sessionDataInDatabase: any; sessionHandle: string; tenantId: string; timeCreated: number; userId: string }

    Type declaration

    • customClaimsInAccessTokenPayload: any
    • expiry: number
    • recipeUserId: RecipeUserId
    • sessionDataInDatabase: any
    • sessionHandle: string
    • tenantId: string
    • timeCreated: number
    • userId: string

    Variables

    Error: typeof default = SessionWrapper.Error

    Functions

    • createJWT(payload?: any, validitySeconds?: number, useStaticSigningKey?: boolean, userContext?: any): Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>
    • Parameters

      • Optional payload: any
      • Optional validitySeconds: number
      • Optional useStaticSigningKey: boolean
      • userContext: any = {}

      Returns Promise<{ jwt: string; status: "OK" } | { status: "UNSUPPORTED_ALGORITHM_ERROR" }>

    • createNewSession(req: any, res: any, tenantId: string, recipeUserId: RecipeUserId, accessTokenPayload?: any, sessionDataInDatabase?: any, userContext?: any): Promise<SessionContainer>
    • createNewSessionWithoutRequestResponse(tenantId: string, recipeUserId: RecipeUserId, accessTokenPayload?: any, sessionDataInDatabase?: any, disableAntiCsrf?: boolean, userContext?: any): Promise<SessionContainer>
    • fetchAndSetClaim(sessionHandle: string, claim: SessionClaim<any>, userContext?: any): Promise<boolean>
    • getAllSessionHandlesForUser(userId: string, fetchSessionsForAllLinkedAccounts?: boolean, tenantId?: string, userContext?: any): Promise<string[]>
    • Parameters

      • userId: string
      • fetchSessionsForAllLinkedAccounts: boolean = true
      • Optional tenantId: string
      • userContext: any = {}

      Returns Promise<string[]>

    • getClaimValue<T>(sessionHandle: string, claim: SessionClaim<T>, userContext?: any): Promise<{ status: "SESSION_DOES_NOT_EXIST_ERROR" } | { status: "OK"; value: undefined | T }>
    • Type parameters

      • T

      Parameters

      • sessionHandle: string
      • claim: SessionClaim<T>
      • userContext: any = {}

      Returns Promise<{ status: "SESSION_DOES_NOT_EXIST_ERROR" } | { status: "OK"; value: undefined | T }>

    • getJWKS(userContext?: any): Promise<{ keys: JsonWebKey[] }>
    • getOpenIdDiscoveryConfiguration(userContext?: any): Promise<{ issuer: string; jwks_uri: string; status: "OK" }>
    • getSessionInformation(sessionHandle: string, userContext?: any): Promise<undefined | SessionInformation>
    • getSessionWithoutRequestResponse(accessToken: string, antiCsrfToken?: string): Promise<SessionContainer>
    • getSessionWithoutRequestResponse(accessToken: string, antiCsrfToken?: string, options?: VerifySessionOptions & { sessionRequired?: true }, userContext?: any): Promise<SessionContainer>
    • getSessionWithoutRequestResponse(accessToken: string, antiCsrfToken?: string, options?: VerifySessionOptions & { sessionRequired: false }, userContext?: any): Promise<undefined | SessionContainer>
    • getSessionWithoutRequestResponse(accessToken: string, antiCsrfToken?: string, options?: VerifySessionOptions, userContext?: any): Promise<undefined | SessionContainer>
    • init(config?: TypeInput): RecipeListFunction
    • mergeIntoAccessTokenPayload(sessionHandle: string, accessTokenPayloadUpdate: JSONObject, userContext?: any): Promise<boolean>
    • refreshSession(req: any, res: any, userContext?: any): Promise<SessionContainer>
    • refreshSessionWithoutRequestResponse(refreshToken: string, disableAntiCsrf?: boolean, antiCsrfToken?: string, userContext?: any): Promise<SessionContainer>
    • removeClaim(sessionHandle: string, claim: SessionClaim<any>, userContext?: any): Promise<boolean>
    • revokeAllSessionsForUser(userId: string, revokeSessionsForLinkedAccounts?: boolean, tenantId?: string, userContext?: any): Promise<string[]>
    • Parameters

      • userId: string
      • revokeSessionsForLinkedAccounts: boolean = true
      • Optional tenantId: string
      • userContext: any = {}

      Returns Promise<string[]>

    • revokeMultipleSessions(sessionHandles: string[], userContext?: any): Promise<string[]>
    • revokeSession(sessionHandle: string, userContext?: any): Promise<boolean>
    • setClaimValue<T>(sessionHandle: string, claim: SessionClaim<T>, value: T, userContext?: any): Promise<boolean>
    • updateSessionDataInDatabase(sessionHandle: string, newSessionData: any, userContext?: any): Promise<boolean>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/recipe_thirdparty.html b/docs/modules/recipe_thirdparty.html index 0983183a6..4ea800cc8 100644 --- a/docs/modules/recipe_thirdparty.html +++ b/docs/modules/recipe_thirdparty.html @@ -1 +1 @@ -recipe/thirdparty | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/thirdparty

    Index

    Type aliases

    APIInterface: { appleRedirectHandlerPOST: undefined | ((input: { formPostInfoFromProvider: {}; options: APIOptions; userContext: any }) => Promise<void>); authorisationUrlGET: undefined | ((input: { options: APIOptions; provider: TypeProvider; redirectURIOnProviderDashboard: string; tenantId: string; userContext: any }) => Promise<{ pkceCodeVerifier?: string; status: "OK"; urlWithQueryParams: string } | GeneralErrorResponse>); signInUpPOST: undefined | ((input: { options: APIOptions; provider: TypeProvider; tenantId: string; userContext: any } & ({ redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any } } | { oAuthTokens: {} })) => Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; session: SessionContainer; status: "OK"; user: User } | { status: "NO_EMAIL_GIVEN_BY_PROVIDER" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>) }

    Type declaration

    • appleRedirectHandlerPOST: undefined | ((input: { formPostInfoFromProvider: {}; options: APIOptions; userContext: any }) => Promise<void>)
    • authorisationUrlGET: undefined | ((input: { options: APIOptions; provider: TypeProvider; redirectURIOnProviderDashboard: string; tenantId: string; userContext: any }) => Promise<{ pkceCodeVerifier?: string; status: "OK"; urlWithQueryParams: string } | GeneralErrorResponse>)
    • signInUpPOST: undefined | ((input: { options: APIOptions; provider: TypeProvider; tenantId: string; userContext: any } & ({ redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any } } | { oAuthTokens: {} })) => Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; session: SessionContainer; status: "OK"; user: User } | { status: "NO_EMAIL_GIVEN_BY_PROVIDER" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>)
    APIOptions: { appInfo: NormalisedAppinfo; config: TypeNormalisedInput; isInServerlessEnv: boolean; providers: ProviderInput[]; recipeId: string; recipeImplementation: RecipeInterface; req: BaseRequest; res: BaseResponse }

    Type declaration

    • appInfo: NormalisedAppinfo
    • config: TypeNormalisedInput
    • isInServerlessEnv: boolean
    • providers: ProviderInput[]
    • recipeId: string
    • recipeImplementation: RecipeInterface
    • req: BaseRequest
    • res: BaseResponse
    RecipeInterface: { getProvider: any; manuallyCreateOrUpdateUser: any; signInUp: any }

    Type declaration

    • getProvider:function
      • getProvider(input: { clientType?: string; tenantId: string; thirdPartyId: string; userContext: any }): Promise<undefined | TypeProvider>
      • Parameters

        • input: { clientType?: string; tenantId: string; thirdPartyId: string; userContext: any }
          • Optional clientType?: string
          • tenantId: string
          • thirdPartyId: string
          • userContext: any

        Returns Promise<undefined | TypeProvider>

    • manuallyCreateOrUpdateUser:function
      • manuallyCreateOrUpdateUser(input: { email: string; isVerified: boolean; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: { email: string; isVerified: boolean; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }
          • email: string
          • isVerified: boolean
          • tenantId: string
          • thirdPartyId: string
          • thirdPartyUserId: string
          • userContext: any

        Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • signInUp:function
      • signInUp(input: { email: string; isVerified: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: { email: string; isVerified: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }
          • email: string
          • isVerified: boolean
          • oAuthTokens: {}
            • [key: string]: any
          • rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }
            • Optional fromIdTokenPayload?: {}
              • [key: string]: any
            • Optional fromUserInfoAPI?: {}
              • [key: string]: any
          • tenantId: string
          • thirdPartyId: string
          • thirdPartyUserId: string
          • userContext: any

        Returns Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    TypeProvider: { config: ProviderConfigForClientType; id: string; exchangeAuthCodeForOAuthTokens: any; getAuthorisationRedirectURL: any; getConfigForClientType: any; getUserInfo: any }

    Type declaration

    • config: ProviderConfigForClientType
    • id: string
    • exchangeAuthCodeForOAuthTokens:function
      • exchangeAuthCodeForOAuthTokens(input: { redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any }; userContext: any }): Promise<any>
      • Parameters

        • input: { redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any }; userContext: any }
          • redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any }
            • Optional pkceCodeVerifier?: string
            • redirectURIOnProviderDashboard: string
            • redirectURIQueryParams: any
          • userContext: any

        Returns Promise<any>

    • getAuthorisationRedirectURL:function
      • getAuthorisationRedirectURL(input: { redirectURIOnProviderDashboard: string; userContext: any }): Promise<{ pkceCodeVerifier?: string; urlWithQueryParams: string }>
      • Parameters

        • input: { redirectURIOnProviderDashboard: string; userContext: any }
          • redirectURIOnProviderDashboard: string
          • userContext: any

        Returns Promise<{ pkceCodeVerifier?: string; urlWithQueryParams: string }>

    • getConfigForClientType:function
      • getConfigForClientType(input: { clientType?: string; userContext: any }): Promise<ProviderConfigForClientType>
      • Parameters

        • input: { clientType?: string; userContext: any }
          • Optional clientType?: string
          • userContext: any

        Returns Promise<ProviderConfigForClientType>

    • getUserInfo:function
      • getUserInfo(input: { oAuthTokens: any; userContext: any }): Promise<UserInfo>

    Variables

    Error: typeof default = Wrapper.Error

    Functions

    • getProvider(tenantId: string, thirdPartyId: string, clientType: undefined | string, userContext?: any): Promise<undefined | TypeProvider>
    • init(config?: TypeInput): RecipeListFunction
    • manuallyCreateOrUpdateUser(tenantId: string, thirdPartyId: string, thirdPartyUserId: string, email: string, isVerified: boolean, userContext?: any): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
    • Parameters

      • tenantId: string
      • thirdPartyId: string
      • thirdPartyUserId: string
      • email: string
      • isVerified: boolean
      • userContext: any = {}

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    Generated using TypeDoc

    \ No newline at end of file +recipe/thirdparty | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/thirdparty

    Index

    Type aliases

    APIInterface: { appleRedirectHandlerPOST: undefined | ((input: { formPostInfoFromProvider: {}; options: APIOptions; userContext: any }) => Promise<void>); authorisationUrlGET: undefined | ((input: { options: APIOptions; provider: TypeProvider; redirectURIOnProviderDashboard: string; tenantId: string; userContext: any }) => Promise<{ pkceCodeVerifier?: string; status: "OK"; urlWithQueryParams: string } | GeneralErrorResponse>); signInUpPOST: undefined | ((input: { options: APIOptions; provider: TypeProvider; tenantId: string; userContext: any } & ({ redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any } } | { oAuthTokens: {} })) => Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; session: SessionContainer; status: "OK"; user: User } | { status: "NO_EMAIL_GIVEN_BY_PROVIDER" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>) }

    Type declaration

    • appleRedirectHandlerPOST: undefined | ((input: { formPostInfoFromProvider: {}; options: APIOptions; userContext: any }) => Promise<void>)
    • authorisationUrlGET: undefined | ((input: { options: APIOptions; provider: TypeProvider; redirectURIOnProviderDashboard: string; tenantId: string; userContext: any }) => Promise<{ pkceCodeVerifier?: string; status: "OK"; urlWithQueryParams: string } | GeneralErrorResponse>)
    • signInUpPOST: undefined | ((input: { options: APIOptions; provider: TypeProvider; tenantId: string; userContext: any } & ({ redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any } } | { oAuthTokens: {} })) => Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; session: SessionContainer; status: "OK"; user: User } | { status: "NO_EMAIL_GIVEN_BY_PROVIDER" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>)
    APIOptions: { appInfo: NormalisedAppinfo; config: TypeNormalisedInput; isInServerlessEnv: boolean; providers: ProviderInput[]; recipeId: string; recipeImplementation: RecipeInterface; req: BaseRequest; res: BaseResponse }

    Type declaration

    • appInfo: NormalisedAppinfo
    • config: TypeNormalisedInput
    • isInServerlessEnv: boolean
    • providers: ProviderInput[]
    • recipeId: string
    • recipeImplementation: RecipeInterface
    • req: BaseRequest
    • res: BaseResponse
    RecipeInterface: { getProvider: any; manuallyCreateOrUpdateUser: any; signInUp: any }

    Type declaration

    • getProvider:function
      • getProvider(input: { clientType?: string; tenantId: string; thirdPartyId: string; userContext: any }): Promise<undefined | TypeProvider>
      • Parameters

        • input: { clientType?: string; tenantId: string; thirdPartyId: string; userContext: any }
          • Optional clientType?: string
          • tenantId: string
          • thirdPartyId: string
          • userContext: any

        Returns Promise<undefined | TypeProvider>

    • manuallyCreateOrUpdateUser:function
      • manuallyCreateOrUpdateUser(input: { email: string; isVerified: boolean; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: { email: string; isVerified: boolean; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }
          • email: string
          • isVerified: boolean
          • tenantId: string
          • thirdPartyId: string
          • thirdPartyUserId: string
          • userContext: any

        Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • signInUp:function
      • signInUp(input: { email: string; isVerified: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: { email: string; isVerified: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }
          • email: string
          • isVerified: boolean
          • oAuthTokens: {}
            • [key: string]: any
          • rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }
            • Optional fromIdTokenPayload?: {}
              • [key: string]: any
            • Optional fromUserInfoAPI?: {}
              • [key: string]: any
          • tenantId: string
          • thirdPartyId: string
          • thirdPartyUserId: string
          • userContext: any

        Returns Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    TypeProvider: { config: ProviderConfigForClientType; id: string; exchangeAuthCodeForOAuthTokens: any; getAuthorisationRedirectURL: any; getConfigForClientType: any; getUserInfo: any }

    Type declaration

    • config: ProviderConfigForClientType
    • id: string
    • exchangeAuthCodeForOAuthTokens:function
      • exchangeAuthCodeForOAuthTokens(input: { redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any }; userContext: any }): Promise<any>
      • Parameters

        • input: { redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any }; userContext: any }
          • redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any }
            • Optional pkceCodeVerifier?: string
            • redirectURIOnProviderDashboard: string
            • redirectURIQueryParams: any
          • userContext: any

        Returns Promise<any>

    • getAuthorisationRedirectURL:function
      • getAuthorisationRedirectURL(input: { redirectURIOnProviderDashboard: string; userContext: any }): Promise<{ pkceCodeVerifier?: string; urlWithQueryParams: string }>
      • Parameters

        • input: { redirectURIOnProviderDashboard: string; userContext: any }
          • redirectURIOnProviderDashboard: string
          • userContext: any

        Returns Promise<{ pkceCodeVerifier?: string; urlWithQueryParams: string }>

    • getConfigForClientType:function
      • getConfigForClientType(input: { clientType?: string; userContext: any }): Promise<ProviderConfigForClientType>
      • Parameters

        • input: { clientType?: string; userContext: any }
          • Optional clientType?: string
          • userContext: any

        Returns Promise<ProviderConfigForClientType>

    • getUserInfo:function
      • getUserInfo(input: { oAuthTokens: any; userContext: any }): Promise<UserInfo>

    Variables

    Error: typeof default = Wrapper.Error

    Functions

    • getProvider(tenantId: string, thirdPartyId: string, clientType: undefined | string, userContext?: any): Promise<undefined | TypeProvider>
    • init(config?: TypeInput): RecipeListFunction
    • manuallyCreateOrUpdateUser(tenantId: string, thirdPartyId: string, thirdPartyUserId: string, email: string, isVerified: boolean, userContext?: any): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
    • Parameters

      • tenantId: string
      • thirdPartyId: string
      • thirdPartyUserId: string
      • email: string
      • isVerified: boolean
      • userContext: any = {}

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/recipe_thirdpartyemailpassword.html b/docs/modules/recipe_thirdpartyemailpassword.html index 94dd327b4..499ce7ff2 100644 --- a/docs/modules/recipe_thirdpartyemailpassword.html +++ b/docs/modules/recipe_thirdpartyemailpassword.html @@ -1 +1 @@ -recipe/thirdpartyemailpassword | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/thirdpartyemailpassword

    Index

    References

    Re-exports TypeProvider

    Type aliases

    APIInterface: { appleRedirectHandlerPOST: undefined | ((input: { formPostInfoFromProvider: any; options: ThirdPartyAPIOptions; userContext: any }) => Promise<void>); authorisationUrlGET: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; redirectURIOnProviderDashboard: string; tenantId: string; userContext: any }) => Promise<{ pkceCodeVerifier?: string; status: "OK"; urlWithQueryParams: string } | GeneralErrorResponse>); emailPasswordEmailExistsGET: undefined | ((input: { email: string; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>); emailPasswordSignInPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: GlobalUser } | { reason: string; status: "SIGN_IN_NOT_ALLOWED" } | { status: "WRONG_CREDENTIALS_ERROR" } | GeneralErrorResponse>); emailPasswordSignUpPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: GlobalUser } | { reason: string; status: "SIGN_UP_NOT_ALLOWED" } | { status: "EMAIL_ALREADY_EXISTS_ERROR" } | GeneralErrorResponse>); generatePasswordResetTokenPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ status: "OK" } | { reason: string; status: "PASSWORD_RESET_NOT_ALLOWED" } | GeneralErrorResponse>); passwordResetPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; token: string; userContext: any }) => Promise<{ email: string; status: "OK"; user: GlobalUser } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" } | GeneralErrorResponse>); thirdPartySignInUpPOST: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; tenantId: string; userContext: any } & ({ redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any } } | { oAuthTokens: {} })) => Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; session: SessionContainer; status: "OK"; user: GlobalUser } | { status: "NO_EMAIL_GIVEN_BY_PROVIDER" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>) }

    Type declaration

    • appleRedirectHandlerPOST: undefined | ((input: { formPostInfoFromProvider: any; options: ThirdPartyAPIOptions; userContext: any }) => Promise<void>)
    • authorisationUrlGET: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; redirectURIOnProviderDashboard: string; tenantId: string; userContext: any }) => Promise<{ pkceCodeVerifier?: string; status: "OK"; urlWithQueryParams: string } | GeneralErrorResponse>)
    • emailPasswordEmailExistsGET: undefined | ((input: { email: string; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>)
    • emailPasswordSignInPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: GlobalUser } | { reason: string; status: "SIGN_IN_NOT_ALLOWED" } | { status: "WRONG_CREDENTIALS_ERROR" } | GeneralErrorResponse>)
    • emailPasswordSignUpPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: GlobalUser } | { reason: string; status: "SIGN_UP_NOT_ALLOWED" } | { status: "EMAIL_ALREADY_EXISTS_ERROR" } | GeneralErrorResponse>)
    • generatePasswordResetTokenPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ status: "OK" } | { reason: string; status: "PASSWORD_RESET_NOT_ALLOWED" } | GeneralErrorResponse>)
    • passwordResetPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; token: string; userContext: any }) => Promise<{ email: string; status: "OK"; user: GlobalUser } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" } | GeneralErrorResponse>)
    • thirdPartySignInUpPOST: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; tenantId: string; userContext: any } & ({ redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any } } | { oAuthTokens: {} })) => Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; session: SessionContainer; status: "OK"; user: GlobalUser } | { status: "NO_EMAIL_GIVEN_BY_PROVIDER" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>)
    EmailPasswordAPIOptions: APIOptions
    RecipeInterface: { consumePasswordResetToken: any; createNewEmailPasswordRecipeUser: any; createResetPasswordToken: any; emailPasswordSignIn: any; emailPasswordSignUp: any; thirdPartyGetProvider: any; thirdPartyManuallyCreateOrUpdateUser: any; thirdPartySignInUp: any; updateEmailOrPassword: any }

    Type declaration

    • consumePasswordResetToken:function
      • consumePasswordResetToken(input: { tenantId: string; token: string; userContext: any }): Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>
      • Parameters

        • input: { tenantId: string; token: string; userContext: any }
          • tenantId: string
          • token: string
          • userContext: any

        Returns Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>

    • createNewEmailPasswordRecipeUser:function
      • createNewEmailPasswordRecipeUser(input: { email: string; password: string; userContext: any }): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: GlobalUser } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
    • createResetPasswordToken:function
      • createResetPasswordToken(input: { email: string; tenantId: string; userContext: any; userId: string }): Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>
      • Parameters

        • input: { email: string; tenantId: string; userContext: any; userId: string }
          • email: string
          • tenantId: string
          • userContext: any
          • userId: string

        Returns Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>

    • emailPasswordSignIn:function
      • emailPasswordSignIn(input: { email: string; password: string; tenantId: string; userContext: any }): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: GlobalUser } | { status: "WRONG_CREDENTIALS_ERROR" }>
      • Parameters

        • input: { email: string; password: string; tenantId: string; userContext: any }
          • email: string
          • password: string
          • tenantId: string
          • userContext: any

        Returns Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: GlobalUser } | { status: "WRONG_CREDENTIALS_ERROR" }>

    • emailPasswordSignUp:function
      • emailPasswordSignUp(input: { email: string; password: string; tenantId: string; userContext: any }): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: GlobalUser } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
      • Parameters

        • input: { email: string; password: string; tenantId: string; userContext: any }
          • email: string
          • password: string
          • tenantId: string
          • userContext: any

        Returns Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: GlobalUser } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>

    • thirdPartyGetProvider:function
      • thirdPartyGetProvider(input: { clientType?: string; tenantId: string; thirdPartyId: string; userContext: any }): Promise<undefined | TypeProvider>
    • thirdPartyManuallyCreateOrUpdateUser:function
      • thirdPartyManuallyCreateOrUpdateUser(input: { email: string; isVerified: boolean; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: GlobalUser } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: { email: string; isVerified: boolean; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }
          • email: string
          • isVerified: boolean
          • tenantId: string
          • thirdPartyId: string
          • thirdPartyUserId: string
          • userContext: any

        Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: GlobalUser } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • thirdPartySignInUp:function
      • thirdPartySignInUp(input: { email: string; isVerified: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: { email: string; isVerified: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }
          • email: string
          • isVerified: boolean
          • oAuthTokens: {}
            • [key: string]: any
          • rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }
            • Optional fromIdTokenPayload?: {}
              • [key: string]: any
            • Optional fromUserInfoAPI?: {}
              • [key: string]: any
          • tenantId: string
          • thirdPartyId: string
          • thirdPartyUserId: string
          • userContext: any

        Returns Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • updateEmailOrPassword:function
      • updateEmailOrPassword(input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy: string; userContext: any }): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
      • Parameters

        • input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy: string; userContext: any }
          • Optional applyPasswordPolicy?: boolean
          • Optional email?: string
          • Optional password?: string
          • recipeUserId: RecipeUserId
          • tenantIdForPasswordPolicy: string
          • userContext: any

        Returns Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

    ThirdPartyAPIOptions: APIOptions

    Variables

    Error: typeof default = Wrapper.Error

    Functions

    • consumePasswordResetToken(tenantId: string, token: string, userContext?: any): Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>
    • createResetPasswordLink(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ link: string; status: "OK" } | { status: "UNKNOWN_USER_ID_ERROR" }>
    • createResetPasswordToken(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>
    • emailPasswordSignIn(tenantId: string, email: string, password: string, userContext?: any): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "WRONG_CREDENTIALS_ERROR" }>
    • emailPasswordSignUp(tenantId: string, email: string, password: string, userContext?: any): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
    • init(config?: TypeInput): RecipeListFunction
    • resetPasswordUsingToken(tenantId: string, token: string, newPassword: string, userContext?: any): Promise<{ status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
    • Parameters

      • tenantId: string
      • token: string
      • newPassword: string
      • Optional userContext: any

      Returns Promise<{ status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

    • sendEmail(input: TypeEmailPasswordPasswordResetEmailDeliveryInput & { userContext?: any }): Promise<void>
    • sendResetPasswordEmail(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" }>
    • thirdPartyGetProvider(tenantId: string, thirdPartyId: string, clientType: undefined | string, userContext?: any): Promise<undefined | TypeProvider>
    • thirdPartyManuallyCreateOrUpdateUser(tenantId: string, thirdPartyId: string, thirdPartyUserId: string, email: string, isVerified: boolean, userContext?: any): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
    • Parameters

      • tenantId: string
      • thirdPartyId: string
      • thirdPartyUserId: string
      • email: string
      • isVerified: boolean
      • userContext: any = {}

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • updateEmailOrPassword(input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy?: string; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
    • Parameters

      • input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy?: string; userContext?: any }
        • Optional applyPasswordPolicy?: boolean
        • Optional email?: string
        • Optional password?: string
        • recipeUserId: RecipeUserId
        • Optional tenantIdForPasswordPolicy?: string
        • Optional userContext?: any

      Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file +recipe/thirdpartyemailpassword | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/thirdpartyemailpassword

    Index

    References

    Re-exports TypeProvider

    Type aliases

    APIInterface: { appleRedirectHandlerPOST: undefined | ((input: { formPostInfoFromProvider: any; options: ThirdPartyAPIOptions; userContext: any }) => Promise<void>); authorisationUrlGET: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; redirectURIOnProviderDashboard: string; tenantId: string; userContext: any }) => Promise<{ pkceCodeVerifier?: string; status: "OK"; urlWithQueryParams: string } | GeneralErrorResponse>); emailPasswordEmailExistsGET: undefined | ((input: { email: string; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>); emailPasswordSignInPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: GlobalUser } | { reason: string; status: "SIGN_IN_NOT_ALLOWED" } | { status: "WRONG_CREDENTIALS_ERROR" } | GeneralErrorResponse>); emailPasswordSignUpPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: GlobalUser } | { reason: string; status: "SIGN_UP_NOT_ALLOWED" } | { status: "EMAIL_ALREADY_EXISTS_ERROR" } | GeneralErrorResponse>); generatePasswordResetTokenPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ status: "OK" } | { reason: string; status: "PASSWORD_RESET_NOT_ALLOWED" } | GeneralErrorResponse>); passwordResetPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; token: string; userContext: any }) => Promise<{ email: string; status: "OK"; user: GlobalUser } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" } | GeneralErrorResponse>); thirdPartySignInUpPOST: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; tenantId: string; userContext: any } & ({ redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any } } | { oAuthTokens: {} })) => Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; session: SessionContainer; status: "OK"; user: GlobalUser } | { status: "NO_EMAIL_GIVEN_BY_PROVIDER" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>) }

    Type declaration

    • appleRedirectHandlerPOST: undefined | ((input: { formPostInfoFromProvider: any; options: ThirdPartyAPIOptions; userContext: any }) => Promise<void>)
    • authorisationUrlGET: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; redirectURIOnProviderDashboard: string; tenantId: string; userContext: any }) => Promise<{ pkceCodeVerifier?: string; status: "OK"; urlWithQueryParams: string } | GeneralErrorResponse>)
    • emailPasswordEmailExistsGET: undefined | ((input: { email: string; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>)
    • emailPasswordSignInPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: GlobalUser } | { reason: string; status: "SIGN_IN_NOT_ALLOWED" } | { status: "WRONG_CREDENTIALS_ERROR" } | GeneralErrorResponse>)
    • emailPasswordSignUpPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ session: SessionContainer; status: "OK"; user: GlobalUser } | { reason: string; status: "SIGN_UP_NOT_ALLOWED" } | { status: "EMAIL_ALREADY_EXISTS_ERROR" } | GeneralErrorResponse>)
    • generatePasswordResetTokenPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; userContext: any }) => Promise<{ status: "OK" } | { reason: string; status: "PASSWORD_RESET_NOT_ALLOWED" } | GeneralErrorResponse>)
    • passwordResetPOST: undefined | ((input: { formFields: { id: string; value: string }[]; options: EmailPasswordAPIOptions; tenantId: string; token: string; userContext: any }) => Promise<{ email: string; status: "OK"; user: GlobalUser } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" } | GeneralErrorResponse>)
    • thirdPartySignInUpPOST: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; tenantId: string; userContext: any } & ({ redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any } } | { oAuthTokens: {} })) => Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; session: SessionContainer; status: "OK"; user: GlobalUser } | { status: "NO_EMAIL_GIVEN_BY_PROVIDER" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>)
    EmailPasswordAPIOptions: APIOptions
    RecipeInterface: { consumePasswordResetToken: any; createNewEmailPasswordRecipeUser: any; createResetPasswordToken: any; emailPasswordSignIn: any; emailPasswordSignUp: any; thirdPartyGetProvider: any; thirdPartyManuallyCreateOrUpdateUser: any; thirdPartySignInUp: any; updateEmailOrPassword: any }

    Type declaration

    • consumePasswordResetToken:function
      • consumePasswordResetToken(input: { tenantId: string; token: string; userContext: any }): Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>
      • Parameters

        • input: { tenantId: string; token: string; userContext: any }
          • tenantId: string
          • token: string
          • userContext: any

        Returns Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>

    • createNewEmailPasswordRecipeUser:function
      • createNewEmailPasswordRecipeUser(input: { email: string; password: string; userContext: any }): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: GlobalUser } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
    • createResetPasswordToken:function
      • createResetPasswordToken(input: { email: string; tenantId: string; userContext: any; userId: string }): Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>
      • Parameters

        • input: { email: string; tenantId: string; userContext: any; userId: string }
          • email: string
          • tenantId: string
          • userContext: any
          • userId: string

        Returns Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>

    • emailPasswordSignIn:function
      • emailPasswordSignIn(input: { email: string; password: string; tenantId: string; userContext: any }): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: GlobalUser } | { status: "WRONG_CREDENTIALS_ERROR" }>
      • Parameters

        • input: { email: string; password: string; tenantId: string; userContext: any }
          • email: string
          • password: string
          • tenantId: string
          • userContext: any

        Returns Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: GlobalUser } | { status: "WRONG_CREDENTIALS_ERROR" }>

    • emailPasswordSignUp:function
      • emailPasswordSignUp(input: { email: string; password: string; tenantId: string; userContext: any }): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: GlobalUser } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
      • Parameters

        • input: { email: string; password: string; tenantId: string; userContext: any }
          • email: string
          • password: string
          • tenantId: string
          • userContext: any

        Returns Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: GlobalUser } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>

    • thirdPartyGetProvider:function
      • thirdPartyGetProvider(input: { clientType?: string; tenantId: string; thirdPartyId: string; userContext: any }): Promise<undefined | TypeProvider>
    • thirdPartyManuallyCreateOrUpdateUser:function
      • thirdPartyManuallyCreateOrUpdateUser(input: { email: string; isVerified: boolean; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: GlobalUser } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: { email: string; isVerified: boolean; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }
          • email: string
          • isVerified: boolean
          • tenantId: string
          • thirdPartyId: string
          • thirdPartyUserId: string
          • userContext: any

        Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: GlobalUser } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • thirdPartySignInUp:function
      • thirdPartySignInUp(input: { email: string; isVerified: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: { email: string; isVerified: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }
          • email: string
          • isVerified: boolean
          • oAuthTokens: {}
            • [key: string]: any
          • rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }
            • Optional fromIdTokenPayload?: {}
              • [key: string]: any
            • Optional fromUserInfoAPI?: {}
              • [key: string]: any
          • tenantId: string
          • thirdPartyId: string
          • thirdPartyUserId: string
          • userContext: any

        Returns Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • updateEmailOrPassword:function
      • updateEmailOrPassword(input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy: string; userContext: any }): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
      • Parameters

        • input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy: string; userContext: any }
          • Optional applyPasswordPolicy?: boolean
          • Optional email?: string
          • Optional password?: string
          • recipeUserId: RecipeUserId
          • tenantIdForPasswordPolicy: string
          • userContext: any

        Returns Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

    ThirdPartyAPIOptions: APIOptions

    Variables

    Error: typeof default = Wrapper.Error

    Functions

    • consumePasswordResetToken(tenantId: string, token: string, userContext?: any): Promise<{ email: string; status: "OK"; userId: string } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" }>
    • createResetPasswordLink(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ link: string; status: "OK" } | { status: "UNKNOWN_USER_ID_ERROR" }>
    • createResetPasswordToken(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK"; token: string } | { status: "UNKNOWN_USER_ID_ERROR" }>
    • emailPasswordSignIn(tenantId: string, email: string, password: string, userContext?: any): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "WRONG_CREDENTIALS_ERROR" }>
    • emailPasswordSignUp(tenantId: string, email: string, password: string, userContext?: any): Promise<{ recipeUserId: RecipeUserId; status: "OK"; user: User } | { status: "EMAIL_ALREADY_EXISTS_ERROR" }>
    • init(config?: TypeInput): RecipeListFunction
    • resetPasswordUsingToken(tenantId: string, token: string, newPassword: string, userContext?: any): Promise<{ status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
    • Parameters

      • tenantId: string
      • token: string
      • newPassword: string
      • Optional userContext: any

      Returns Promise<{ status: "RESET_PASSWORD_INVALID_TOKEN_ERROR" } | { status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

    • sendEmail(input: TypeEmailPasswordPasswordResetEmailDeliveryInput & { userContext?: any }): Promise<void>
    • sendResetPasswordEmail(tenantId: string, userId: string, email: string, userContext?: any): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" }>
    • thirdPartyGetProvider(tenantId: string, thirdPartyId: string, clientType: undefined | string, userContext?: any): Promise<undefined | TypeProvider>
    • thirdPartyManuallyCreateOrUpdateUser(tenantId: string, thirdPartyId: string, thirdPartyUserId: string, email: string, isVerified: boolean, userContext?: any): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
    • Parameters

      • tenantId: string
      • thirdPartyId: string
      • thirdPartyUserId: string
      • email: string
      • isVerified: boolean
      • userContext: any = {}

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • updateEmailOrPassword(input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy?: string; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>
    • Parameters

      • input: { applyPasswordPolicy?: boolean; email?: string; password?: string; recipeUserId: RecipeUserId; tenantIdForPasswordPolicy?: string; userContext?: any }
        • Optional applyPasswordPolicy?: boolean
        • Optional email?: string
        • Optional password?: string
        • recipeUserId: RecipeUserId
        • Optional tenantIdForPasswordPolicy?: string
        • Optional userContext?: any

      Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { failureReason: string; status: "PASSWORD_POLICY_VIOLATED_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/recipe_thirdpartypasswordless.html b/docs/modules/recipe_thirdpartypasswordless.html index f81771a76..5f6526c3a 100644 --- a/docs/modules/recipe_thirdpartypasswordless.html +++ b/docs/modules/recipe_thirdpartypasswordless.html @@ -1 +1 @@ -recipe/thirdpartypasswordless | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/thirdpartypasswordless

    Index

    References

    Re-exports TypeProvider

    Type aliases

    APIInterface: { appleRedirectHandlerPOST: undefined | ((input: { formPostInfoFromProvider: any; options: ThirdPartyAPIOptions; userContext: any }) => Promise<void>); authorisationUrlGET: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; redirectURIOnProviderDashboard: string; tenantId: string; userContext: any }) => Promise<{ pkceCodeVerifier?: string; status: "OK"; urlWithQueryParams: string } | GeneralErrorResponse>); consumeCodePOST: undefined | ((input: ({ deviceId: string; preAuthSessionId: string; userInputCode: string } | { linkCode: string; preAuthSessionId: string }) & { options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<{ createdNewRecipeUser: boolean; session: SessionContainer; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | GeneralErrorResponse | { status: "RESTART_FLOW_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>); createCodePOST: undefined | ((input: ({ email: string } | { phoneNumber: string }) & { options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<{ deviceId: string; flowType: "USER_INPUT_CODE" | "MAGIC_LINK" | "USER_INPUT_CODE_AND_MAGIC_LINK"; preAuthSessionId: string; status: "OK" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>); passwordlessUserEmailExistsGET: undefined | ((input: { email: string; options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>); passwordlessUserPhoneNumberExistsGET: undefined | ((input: { options: PasswordlessAPIOptions; phoneNumber: string; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>); resendCodePOST: undefined | ((input: { deviceId: string; preAuthSessionId: string } & { options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<GeneralErrorResponse | { status: "RESTART_FLOW_ERROR" | "OK" }>); thirdPartySignInUpPOST: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; tenantId: string; userContext: any } & ({ redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any } } | { oAuthTokens: {} })) => Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; session: SessionContainer; status: "OK"; user: User } | { status: "NO_EMAIL_GIVEN_BY_PROVIDER" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>) }

    Type declaration

    • appleRedirectHandlerPOST: undefined | ((input: { formPostInfoFromProvider: any; options: ThirdPartyAPIOptions; userContext: any }) => Promise<void>)
    • authorisationUrlGET: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; redirectURIOnProviderDashboard: string; tenantId: string; userContext: any }) => Promise<{ pkceCodeVerifier?: string; status: "OK"; urlWithQueryParams: string } | GeneralErrorResponse>)
    • consumeCodePOST: undefined | ((input: ({ deviceId: string; preAuthSessionId: string; userInputCode: string } | { linkCode: string; preAuthSessionId: string }) & { options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<{ createdNewRecipeUser: boolean; session: SessionContainer; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | GeneralErrorResponse | { status: "RESTART_FLOW_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>)
    • createCodePOST: undefined | ((input: ({ email: string } | { phoneNumber: string }) & { options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<{ deviceId: string; flowType: "USER_INPUT_CODE" | "MAGIC_LINK" | "USER_INPUT_CODE_AND_MAGIC_LINK"; preAuthSessionId: string; status: "OK" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>)
    • passwordlessUserEmailExistsGET: undefined | ((input: { email: string; options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>)
    • passwordlessUserPhoneNumberExistsGET: undefined | ((input: { options: PasswordlessAPIOptions; phoneNumber: string; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>)
    • resendCodePOST: undefined | ((input: { deviceId: string; preAuthSessionId: string } & { options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<GeneralErrorResponse | { status: "RESTART_FLOW_ERROR" | "OK" }>)
    • thirdPartySignInUpPOST: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; tenantId: string; userContext: any } & ({ redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any } } | { oAuthTokens: {} })) => Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; session: SessionContainer; status: "OK"; user: User } | { status: "NO_EMAIL_GIVEN_BY_PROVIDER" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>)
    PasswordlessAPIOptions: APIOptions
    RecipeInterface: { consumeCode: any; createCode: any; createNewCodeForDevice: any; listCodesByDeviceId: any; listCodesByEmail: any; listCodesByPhoneNumber: any; listCodesByPreAuthSessionId: any; revokeAllCodes: any; revokeCode: any; thirdPartyGetProvider: any; thirdPartyManuallyCreateOrUpdateUser: any; thirdPartySignInUp: any; updatePasswordlessUser: any }

    Type declaration

    • consumeCode:function
      • consumeCode(input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>
      • Parameters

        • input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext: any }

        Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>

    • createCode:function
      • createCode(input: ({ email: string } & { tenantId: string; userContext: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext: any; userInputCode?: string })): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>
      • Parameters

        • input: ({ email: string } & { tenantId: string; userContext: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext: any; userInputCode?: string })

        Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>

    • createNewCodeForDevice:function
      • createNewCodeForDevice(input: { deviceId: string; tenantId: string; userContext: any; userInputCode?: string }): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>
      • Parameters

        • input: { deviceId: string; tenantId: string; userContext: any; userInputCode?: string }
          • deviceId: string
          • tenantId: string
          • userContext: any
          • Optional userInputCode?: string

        Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>

    • listCodesByDeviceId:function
      • listCodesByDeviceId(input: { deviceId: string; tenantId: string; userContext: any }): Promise<undefined | DeviceType>
    • listCodesByEmail:function
      • listCodesByEmail(input: { email: string; tenantId: string; userContext: any }): Promise<DeviceType[]>
    • listCodesByPhoneNumber:function
      • listCodesByPhoneNumber(input: { phoneNumber: string; tenantId: string; userContext: any }): Promise<DeviceType[]>
    • listCodesByPreAuthSessionId:function
      • listCodesByPreAuthSessionId(input: { preAuthSessionId: string; tenantId: string; userContext: any }): Promise<undefined | DeviceType>
    • revokeAllCodes:function
      • revokeAllCodes(input: { email: string; tenantId: string; userContext: any } | { phoneNumber: string; tenantId: string; userContext: any }): Promise<{ status: "OK" }>
    • revokeCode:function
      • revokeCode(input: { codeId: string; tenantId: string; userContext: any }): Promise<{ status: "OK" }>
    • thirdPartyGetProvider:function
      • thirdPartyGetProvider(input: { clientType?: string; tenantId: string; thirdPartyId: string; userContext: any }): Promise<undefined | TypeProvider>
    • thirdPartyManuallyCreateOrUpdateUser:function
      • thirdPartyManuallyCreateOrUpdateUser(input: { email: string; isVerified: boolean; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: { email: string; isVerified: boolean; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }
          • email: string
          • isVerified: boolean
          • tenantId: string
          • thirdPartyId: string
          • thirdPartyUserId: string
          • userContext: any

        Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • thirdPartySignInUp:function
      • thirdPartySignInUp(input: { email: string; isVerified: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: { email: string; isVerified: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }
          • email: string
          • isVerified: boolean
          • oAuthTokens: {}
            • [key: string]: any
          • rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }
            • Optional fromIdTokenPayload?: {}
              • [key: string]: any
            • Optional fromUserInfoAPI?: {}
              • [key: string]: any
          • tenantId: string
          • thirdPartyId: string
          • thirdPartyUserId: string
          • userContext: any

        Returns Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • updatePasswordlessUser:function
      • updatePasswordlessUser(input: { email?: string | null; phoneNumber?: string | null; recipeUserId: RecipeUserId; userContext: any }): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>
      • Parameters

        • input: { email?: string | null; phoneNumber?: string | null; recipeUserId: RecipeUserId; userContext: any }
          • Optional email?: string | null
          • Optional phoneNumber?: string | null
          • recipeUserId: RecipeUserId
          • userContext: any

        Returns Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>

    ThirdPartyAPIOptions: APIOptions

    Variables

    Error: typeof default = Wrapper.Error

    Functions

    • consumeCode(input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>
    • Parameters

      • input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>

    • createCode(input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>
    • Parameters

      • input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })

      Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>

    • createMagicLink(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<string>
    • createNewCodeForDevice(input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>
    • Parameters

      • input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }
        • deviceId: string
        • tenantId: string
        • Optional userContext?: any
        • Optional userInputCode?: string

      Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>

    • init(config: TypeInput): RecipeListFunction
    • listCodesByDeviceId(input: { deviceId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
    • listCodesByEmail(input: { email: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
    • listCodesByPhoneNumber(input: { phoneNumber: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
    • listCodesByPreAuthSessionId(input: { preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
    • Parameters

      • input: { preAuthSessionId: string; tenantId: string; userContext?: any }
        • preAuthSessionId: string
        • tenantId: string
        • Optional userContext?: any

      Returns Promise<undefined | DeviceType>

    • passwordlessSignInUp(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: string; user: User }>
    • revokeAllCodes(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
    • revokeCode(input: { codeId: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
    • sendEmail(input: TypePasswordlessEmailDeliveryInput & { userContext?: any }): Promise<void>
    • sendSms(input: TypePasswordlessSmsDeliveryInput & { userContext?: any }): Promise<void>
    • thirdPartyGetProvider(tenantId: string, thirdPartyId: string, clientType: undefined | string, userContext?: any): Promise<undefined | TypeProvider>
    • thirdPartyManuallyCreateOrUpdateUser(tenantId: string, thirdPartyId: string, thirdPartyUserId: string, email: string, isVerified: boolean, userContext?: any): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
    • Parameters

      • tenantId: string
      • thirdPartyId: string
      • thirdPartyUserId: string
      • email: string
      • isVerified: boolean
      • userContext: any = {}

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • updatePasswordlessUser(input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>
    • Parameters

      • input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }
        • Optional email?: null | string
        • Optional phoneNumber?: null | string
        • recipeUserId: RecipeUserId
        • Optional userContext?: any

      Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file +recipe/thirdpartypasswordless | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/thirdpartypasswordless

    Index

    References

    Re-exports TypeProvider

    Type aliases

    APIInterface: { appleRedirectHandlerPOST: undefined | ((input: { formPostInfoFromProvider: any; options: ThirdPartyAPIOptions; userContext: any }) => Promise<void>); authorisationUrlGET: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; redirectURIOnProviderDashboard: string; tenantId: string; userContext: any }) => Promise<{ pkceCodeVerifier?: string; status: "OK"; urlWithQueryParams: string } | GeneralErrorResponse>); consumeCodePOST: undefined | ((input: ({ deviceId: string; preAuthSessionId: string; userInputCode: string } | { linkCode: string; preAuthSessionId: string }) & { options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<{ createdNewRecipeUser: boolean; session: SessionContainer; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | GeneralErrorResponse | { status: "RESTART_FLOW_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>); createCodePOST: undefined | ((input: ({ email: string } | { phoneNumber: string }) & { options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<{ deviceId: string; flowType: "USER_INPUT_CODE" | "MAGIC_LINK" | "USER_INPUT_CODE_AND_MAGIC_LINK"; preAuthSessionId: string; status: "OK" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>); passwordlessUserEmailExistsGET: undefined | ((input: { email: string; options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>); passwordlessUserPhoneNumberExistsGET: undefined | ((input: { options: PasswordlessAPIOptions; phoneNumber: string; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>); resendCodePOST: undefined | ((input: { deviceId: string; preAuthSessionId: string } & { options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<GeneralErrorResponse | { status: "RESTART_FLOW_ERROR" | "OK" }>); thirdPartySignInUpPOST: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; tenantId: string; userContext: any } & ({ redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any } } | { oAuthTokens: {} })) => Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; session: SessionContainer; status: "OK"; user: User } | { status: "NO_EMAIL_GIVEN_BY_PROVIDER" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>) }

    Type declaration

    • appleRedirectHandlerPOST: undefined | ((input: { formPostInfoFromProvider: any; options: ThirdPartyAPIOptions; userContext: any }) => Promise<void>)
    • authorisationUrlGET: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; redirectURIOnProviderDashboard: string; tenantId: string; userContext: any }) => Promise<{ pkceCodeVerifier?: string; status: "OK"; urlWithQueryParams: string } | GeneralErrorResponse>)
    • consumeCodePOST: undefined | ((input: ({ deviceId: string; preAuthSessionId: string; userInputCode: string } | { linkCode: string; preAuthSessionId: string }) & { options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<{ createdNewRecipeUser: boolean; session: SessionContainer; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | GeneralErrorResponse | { status: "RESTART_FLOW_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>)
    • createCodePOST: undefined | ((input: ({ email: string } | { phoneNumber: string }) & { options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<{ deviceId: string; flowType: "USER_INPUT_CODE" | "MAGIC_LINK" | "USER_INPUT_CODE_AND_MAGIC_LINK"; preAuthSessionId: string; status: "OK" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>)
    • passwordlessUserEmailExistsGET: undefined | ((input: { email: string; options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>)
    • passwordlessUserPhoneNumberExistsGET: undefined | ((input: { options: PasswordlessAPIOptions; phoneNumber: string; tenantId: string; userContext: any }) => Promise<{ exists: boolean; status: "OK" } | GeneralErrorResponse>)
    • resendCodePOST: undefined | ((input: { deviceId: string; preAuthSessionId: string } & { options: PasswordlessAPIOptions; tenantId: string; userContext: any }) => Promise<GeneralErrorResponse | { status: "RESTART_FLOW_ERROR" | "OK" }>)
    • thirdPartySignInUpPOST: undefined | ((input: { options: ThirdPartyAPIOptions; provider: TypeProvider; tenantId: string; userContext: any } & ({ redirectURIInfo: { pkceCodeVerifier?: string; redirectURIOnProviderDashboard: string; redirectURIQueryParams: any } } | { oAuthTokens: {} })) => Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; session: SessionContainer; status: "OK"; user: User } | { status: "NO_EMAIL_GIVEN_BY_PROVIDER" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" } | GeneralErrorResponse>)
    PasswordlessAPIOptions: APIOptions
    RecipeInterface: { consumeCode: any; createCode: any; createNewCodeForDevice: any; listCodesByDeviceId: any; listCodesByEmail: any; listCodesByPhoneNumber: any; listCodesByPreAuthSessionId: any; revokeAllCodes: any; revokeCode: any; thirdPartyGetProvider: any; thirdPartyManuallyCreateOrUpdateUser: any; thirdPartySignInUp: any; updatePasswordlessUser: any }

    Type declaration

    • consumeCode:function
      • consumeCode(input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>
      • Parameters

        • input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext: any }

        Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>

    • createCode:function
      • createCode(input: ({ email: string } & { tenantId: string; userContext: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext: any; userInputCode?: string })): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>
      • Parameters

        • input: ({ email: string } & { tenantId: string; userContext: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext: any; userInputCode?: string })

        Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>

    • createNewCodeForDevice:function
      • createNewCodeForDevice(input: { deviceId: string; tenantId: string; userContext: any; userInputCode?: string }): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>
      • Parameters

        • input: { deviceId: string; tenantId: string; userContext: any; userInputCode?: string }
          • deviceId: string
          • tenantId: string
          • userContext: any
          • Optional userInputCode?: string

        Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>

    • listCodesByDeviceId:function
      • listCodesByDeviceId(input: { deviceId: string; tenantId: string; userContext: any }): Promise<undefined | DeviceType>
    • listCodesByEmail:function
      • listCodesByEmail(input: { email: string; tenantId: string; userContext: any }): Promise<DeviceType[]>
    • listCodesByPhoneNumber:function
      • listCodesByPhoneNumber(input: { phoneNumber: string; tenantId: string; userContext: any }): Promise<DeviceType[]>
    • listCodesByPreAuthSessionId:function
      • listCodesByPreAuthSessionId(input: { preAuthSessionId: string; tenantId: string; userContext: any }): Promise<undefined | DeviceType>
    • revokeAllCodes:function
      • revokeAllCodes(input: { email: string; tenantId: string; userContext: any } | { phoneNumber: string; tenantId: string; userContext: any }): Promise<{ status: "OK" }>
    • revokeCode:function
      • revokeCode(input: { codeId: string; tenantId: string; userContext: any }): Promise<{ status: "OK" }>
    • thirdPartyGetProvider:function
      • thirdPartyGetProvider(input: { clientType?: string; tenantId: string; thirdPartyId: string; userContext: any }): Promise<undefined | TypeProvider>
    • thirdPartyManuallyCreateOrUpdateUser:function
      • thirdPartyManuallyCreateOrUpdateUser(input: { email: string; isVerified: boolean; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: { email: string; isVerified: boolean; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }
          • email: string
          • isVerified: boolean
          • tenantId: string
          • thirdPartyId: string
          • thirdPartyUserId: string
          • userContext: any

        Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • thirdPartySignInUp:function
      • thirdPartySignInUp(input: { email: string; isVerified: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }): Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
      • Parameters

        • input: { email: string; isVerified: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; tenantId: string; thirdPartyId: string; thirdPartyUserId: string; userContext: any }
          • email: string
          • isVerified: boolean
          • oAuthTokens: {}
            • [key: string]: any
          • rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }
            • Optional fromIdTokenPayload?: {}
              • [key: string]: any
            • Optional fromUserInfoAPI?: {}
              • [key: string]: any
          • tenantId: string
          • thirdPartyId: string
          • thirdPartyUserId: string
          • userContext: any

        Returns Promise<{ createdNewRecipeUser: boolean; oAuthTokens: {}; rawUserInfoFromProvider: { fromIdTokenPayload?: {}; fromUserInfoAPI?: {} }; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • updatePasswordlessUser:function
      • updatePasswordlessUser(input: { email?: string | null; phoneNumber?: string | null; recipeUserId: RecipeUserId; userContext: any }): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>
      • Parameters

        • input: { email?: string | null; phoneNumber?: string | null; recipeUserId: RecipeUserId; userContext: any }
          • Optional email?: string | null
          • Optional phoneNumber?: string | null
          • recipeUserId: RecipeUserId
          • userContext: any

        Returns Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>

    ThirdPartyAPIOptions: APIOptions

    Variables

    Error: typeof default = Wrapper.Error

    Functions

    • consumeCode(input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>
    • Parameters

      • input: { deviceId: string; preAuthSessionId: string; tenantId: string; userContext?: any; userInputCode: string } | { linkCode: string; preAuthSessionId: string; tenantId: string; userContext?: any }

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { failedCodeInputAttemptCount: number; maximumCodeInputAttempts: number; status: "INCORRECT_USER_INPUT_CODE_ERROR" | "EXPIRED_USER_INPUT_CODE_ERROR" } | { status: "RESTART_FLOW_ERROR" }>

    • createCode(input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>
    • Parameters

      • input: ({ email: string } & { tenantId: string; userContext?: any; userInputCode?: string }) & ({ phoneNumber: string } & { tenantId: string; userContext?: any; userInputCode?: string })

      Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string }>

    • createMagicLink(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<string>
    • createNewCodeForDevice(input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }): Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>
    • Parameters

      • input: { deviceId: string; tenantId: string; userContext?: any; userInputCode?: string }
        • deviceId: string
        • tenantId: string
        • Optional userContext?: any
        • Optional userInputCode?: string

      Returns Promise<{ codeId: string; codeLifetime: number; deviceId: string; linkCode: string; preAuthSessionId: string; status: "OK"; timeCreated: number; userInputCode: string } | { status: "RESTART_FLOW_ERROR" | "USER_INPUT_CODE_ALREADY_USED_ERROR" }>

    • init(config: TypeInput): RecipeListFunction
    • listCodesByDeviceId(input: { deviceId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
    • listCodesByEmail(input: { email: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
    • listCodesByPhoneNumber(input: { phoneNumber: string; tenantId: string; userContext?: any }): Promise<DeviceType[]>
    • listCodesByPreAuthSessionId(input: { preAuthSessionId: string; tenantId: string; userContext?: any }): Promise<undefined | DeviceType>
    • Parameters

      • input: { preAuthSessionId: string; tenantId: string; userContext?: any }
        • preAuthSessionId: string
        • tenantId: string
        • Optional userContext?: any

      Returns Promise<undefined | DeviceType>

    • passwordlessSignInUp(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: string; user: User }>
    • revokeAllCodes(input: { email: string; tenantId: string; userContext?: any } | { phoneNumber: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
    • revokeCode(input: { codeId: string; tenantId: string; userContext?: any }): Promise<{ status: "OK" }>
    • sendEmail(input: TypePasswordlessEmailDeliveryInput & { userContext?: any }): Promise<void>
    • sendSms(input: TypePasswordlessSmsDeliveryInput & { userContext?: any }): Promise<void>
    • thirdPartyGetProvider(tenantId: string, thirdPartyId: string, clientType: undefined | string, userContext?: any): Promise<undefined | TypeProvider>
    • thirdPartyManuallyCreateOrUpdateUser(tenantId: string, thirdPartyId: string, thirdPartyUserId: string, email: string, isVerified: boolean, userContext?: any): Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>
    • Parameters

      • tenantId: string
      • thirdPartyId: string
      • thirdPartyUserId: string
      • email: string
      • isVerified: boolean
      • userContext: any = {}

      Returns Promise<{ createdNewRecipeUser: boolean; recipeUserId: RecipeUserId; status: "OK"; user: User } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" } | { reason: string; status: "SIGN_IN_UP_NOT_ALLOWED" }>

    • updatePasswordlessUser(input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }): Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>
    • Parameters

      • input: { email?: null | string; phoneNumber?: null | string; recipeUserId: RecipeUserId; userContext?: any }
        • Optional email?: null | string
        • Optional phoneNumber?: null | string
        • recipeUserId: RecipeUserId
        • Optional userContext?: any

      Returns Promise<{ status: "OK" | "EMAIL_ALREADY_EXISTS_ERROR" | "UNKNOWN_USER_ID_ERROR" | "PHONE_NUMBER_ALREADY_EXISTS_ERROR" } | { reason: string; status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR" | "PHONE_NUMBER_CHANGE_NOT_ALLOWED_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/recipe_usermetadata.html b/docs/modules/recipe_usermetadata.html index eab75b28f..e94680211 100644 --- a/docs/modules/recipe_usermetadata.html +++ b/docs/modules/recipe_usermetadata.html @@ -1,4 +1,4 @@ -recipe/usermetadata | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/usermetadata

    Index

    Type aliases

    RecipeInterface: { clearUserMetadata: any; getUserMetadata: any; updateUserMetadata: any }

    Type declaration

    • clearUserMetadata:function
      • clearUserMetadata(input: { userContext: any; userId: string }): Promise<{ status: "OK" }>
    • getUserMetadata:function
      • getUserMetadata(input: { userContext: any; userId: string }): Promise<{ metadata: any; status: "OK" }>
    • updateUserMetadata:function
      • updateUserMetadata(input: { metadataUpdate: JSONObject; userContext: any; userId: string }): Promise<{ metadata: JSONObject; status: "OK" }>
      • +recipe/usermetadata | supertokens-node
        Options
        All
        • Public
        • Public/Protected
        • All
        Menu

        Module recipe/usermetadata

        Index

        Type aliases

        RecipeInterface: { clearUserMetadata: any; getUserMetadata: any; updateUserMetadata: any }

        Type declaration

        • clearUserMetadata:function
          • clearUserMetadata(input: { userContext: any; userId: string }): Promise<{ status: "OK" }>
        • getUserMetadata:function
          • getUserMetadata(input: { userContext: any; userId: string }): Promise<{ metadata: any; status: "OK" }>
        • updateUserMetadata:function
          • updateUserMetadata(input: { metadataUpdate: JSONObject; userContext: any; userId: string }): Promise<{ metadata: JSONObject; status: "OK" }>
          • Updates the metadata object of the user by doing a shallow merge of the stored and the update JSONs and removing properties set to null on the root level of the update object. e.g.:

            @@ -7,4 +7,4 @@
          • update: { "notifications": { "sms": true }, "todos": null }
          • result: { "preferences": { "theme":"dark" }, "notifications": { "sms": true } }
          -

        Parameters

        • input: { metadataUpdate: JSONObject; userContext: any; userId: string }
          • metadataUpdate: JSONObject
          • userContext: any
          • userId: string

        Returns Promise<{ metadata: JSONObject; status: "OK" }>

    Functions

    • clearUserMetadata(userId: string, userContext?: any): Promise<{ status: "OK" }>
    • getUserMetadata(userId: string, userContext?: any): Promise<{ metadata: any; status: "OK" }>
    • init(config?: TypeInput): RecipeListFunction
    • updateUserMetadata(userId: string, metadataUpdate: JSONObject, userContext?: any): Promise<{ metadata: JSONObject; status: "OK" }>

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    Returns Promise<{ metadata: JSONObject; status: "OK" }>

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/modules/recipe_userroles.html b/docs/modules/recipe_userroles.html index 30f74a6aa..1ae1176d7 100644 --- a/docs/modules/recipe_userroles.html +++ b/docs/modules/recipe_userroles.html @@ -1 +1 @@ -recipe/userroles | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/userroles

    Index

    Type aliases

    RecipeInterface: { addRoleToUser: any; createNewRoleOrAddPermissions: any; deleteRole: any; getAllRoles: any; getPermissionsForRole: any; getRolesForUser: any; getRolesThatHavePermission: any; getUsersThatHaveRole: any; removePermissionsFromRole: any; removeUserRole: any }

    Type declaration

    • addRoleToUser:function
      • addRoleToUser(input: { role: string; tenantId: string; userContext: any; userId: string }): Promise<{ didUserAlreadyHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
      • Parameters

        • input: { role: string; tenantId: string; userContext: any; userId: string }
          • role: string
          • tenantId: string
          • userContext: any
          • userId: string

        Returns Promise<{ didUserAlreadyHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    • createNewRoleOrAddPermissions:function
      • createNewRoleOrAddPermissions(input: { permissions: string[]; role: string; userContext: any }): Promise<{ createdNewRole: boolean; status: "OK" }>
      • Parameters

        • input: { permissions: string[]; role: string; userContext: any }
          • permissions: string[]
          • role: string
          • userContext: any

        Returns Promise<{ createdNewRole: boolean; status: "OK" }>

    • deleteRole:function
      • deleteRole(input: { role: string; userContext: any }): Promise<{ didRoleExist: boolean; status: "OK" }>
      • Parameters

        • input: { role: string; userContext: any }
          • role: string
          • userContext: any

        Returns Promise<{ didRoleExist: boolean; status: "OK" }>

    • getAllRoles:function
      • getAllRoles(input: { userContext: any }): Promise<{ roles: string[]; status: "OK" }>
    • getPermissionsForRole:function
      • getPermissionsForRole(input: { role: string; userContext: any }): Promise<{ permissions: string[]; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
      • Parameters

        • input: { role: string; userContext: any }
          • role: string
          • userContext: any

        Returns Promise<{ permissions: string[]; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    • getRolesForUser:function
      • getRolesForUser(input: { tenantId: string; userContext: any; userId: string }): Promise<{ roles: string[]; status: "OK" }>
      • Parameters

        • input: { tenantId: string; userContext: any; userId: string }
          • tenantId: string
          • userContext: any
          • userId: string

        Returns Promise<{ roles: string[]; status: "OK" }>

    • getRolesThatHavePermission:function
      • getRolesThatHavePermission(input: { permission: string; userContext: any }): Promise<{ roles: string[]; status: "OK" }>
      • Parameters

        • input: { permission: string; userContext: any }
          • permission: string
          • userContext: any

        Returns Promise<{ roles: string[]; status: "OK" }>

    • getUsersThatHaveRole:function
      • getUsersThatHaveRole(input: { role: string; tenantId: string; userContext: any }): Promise<{ status: "OK"; users: string[] } | { status: "UNKNOWN_ROLE_ERROR" }>
      • Parameters

        • input: { role: string; tenantId: string; userContext: any }
          • role: string
          • tenantId: string
          • userContext: any

        Returns Promise<{ status: "OK"; users: string[] } | { status: "UNKNOWN_ROLE_ERROR" }>

    • removePermissionsFromRole:function
      • removePermissionsFromRole(input: { permissions: string[]; role: string; userContext: any }): Promise<{ status: "OK" | "UNKNOWN_ROLE_ERROR" }>
      • Parameters

        • input: { permissions: string[]; role: string; userContext: any }
          • permissions: string[]
          • role: string
          • userContext: any

        Returns Promise<{ status: "OK" | "UNKNOWN_ROLE_ERROR" }>

    • removeUserRole:function
      • removeUserRole(input: { role: string; tenantId: string; userContext: any; userId: string }): Promise<{ didUserHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
      • Parameters

        • input: { role: string; tenantId: string; userContext: any; userId: string }
          • role: string
          • tenantId: string
          • userContext: any
          • userId: string

        Returns Promise<{ didUserHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    Variables

    PermissionClaim: PermissionClaimClass = ...
    UserRoleClaim: UserRoleClaimClass = ...

    Functions

    • addRoleToUser(tenantId: string, userId: string, role: string, userContext?: any): Promise<{ didUserAlreadyHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • tenantId: string
      • userId: string
      • role: string
      • Optional userContext: any

      Returns Promise<{ didUserAlreadyHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    • createNewRoleOrAddPermissions(role: string, permissions: string[], userContext?: any): Promise<{ createdNewRole: boolean; status: "OK" }>
    • deleteRole(role: string, userContext?: any): Promise<{ didRoleExist: boolean; status: "OK" }>
    • getAllRoles(userContext?: any): Promise<{ roles: string[]; status: "OK" }>
    • getPermissionsForRole(role: string, userContext?: any): Promise<{ permissions: string[]; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • role: string
      • Optional userContext: any

      Returns Promise<{ permissions: string[]; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    • getRolesForUser(tenantId: string, userId: string, userContext?: any): Promise<{ roles: string[]; status: "OK" }>
    • getRolesThatHavePermission(permission: string, userContext?: any): Promise<{ roles: string[]; status: "OK" }>
    • getUsersThatHaveRole(tenantId: string, role: string, userContext?: any): Promise<{ status: "OK"; users: string[] } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • tenantId: string
      • role: string
      • Optional userContext: any

      Returns Promise<{ status: "OK"; users: string[] } | { status: "UNKNOWN_ROLE_ERROR" }>

    • init(config?: TypeInput): RecipeListFunction
    • removePermissionsFromRole(role: string, permissions: string[], userContext?: any): Promise<{ status: "OK" | "UNKNOWN_ROLE_ERROR" }>
    • removeUserRole(tenantId: string, userId: string, role: string, userContext?: any): Promise<{ didUserHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • tenantId: string
      • userId: string
      • role: string
      • Optional userContext: any

      Returns Promise<{ didUserHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file +recipe/userroles | supertokens-node
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Module recipe/userroles

    Index

    Type aliases

    RecipeInterface: { addRoleToUser: any; createNewRoleOrAddPermissions: any; deleteRole: any; getAllRoles: any; getPermissionsForRole: any; getRolesForUser: any; getRolesThatHavePermission: any; getUsersThatHaveRole: any; removePermissionsFromRole: any; removeUserRole: any }

    Type declaration

    • addRoleToUser:function
      • addRoleToUser(input: { role: string; tenantId: string; userContext: any; userId: string }): Promise<{ didUserAlreadyHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
      • Parameters

        • input: { role: string; tenantId: string; userContext: any; userId: string }
          • role: string
          • tenantId: string
          • userContext: any
          • userId: string

        Returns Promise<{ didUserAlreadyHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    • createNewRoleOrAddPermissions:function
      • createNewRoleOrAddPermissions(input: { permissions: string[]; role: string; userContext: any }): Promise<{ createdNewRole: boolean; status: "OK" }>
      • Parameters

        • input: { permissions: string[]; role: string; userContext: any }
          • permissions: string[]
          • role: string
          • userContext: any

        Returns Promise<{ createdNewRole: boolean; status: "OK" }>

    • deleteRole:function
      • deleteRole(input: { role: string; userContext: any }): Promise<{ didRoleExist: boolean; status: "OK" }>
      • Parameters

        • input: { role: string; userContext: any }
          • role: string
          • userContext: any

        Returns Promise<{ didRoleExist: boolean; status: "OK" }>

    • getAllRoles:function
      • getAllRoles(input: { userContext: any }): Promise<{ roles: string[]; status: "OK" }>
    • getPermissionsForRole:function
      • getPermissionsForRole(input: { role: string; userContext: any }): Promise<{ permissions: string[]; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
      • Parameters

        • input: { role: string; userContext: any }
          • role: string
          • userContext: any

        Returns Promise<{ permissions: string[]; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    • getRolesForUser:function
      • getRolesForUser(input: { tenantId: string; userContext: any; userId: string }): Promise<{ roles: string[]; status: "OK" }>
      • Parameters

        • input: { tenantId: string; userContext: any; userId: string }
          • tenantId: string
          • userContext: any
          • userId: string

        Returns Promise<{ roles: string[]; status: "OK" }>

    • getRolesThatHavePermission:function
      • getRolesThatHavePermission(input: { permission: string; userContext: any }): Promise<{ roles: string[]; status: "OK" }>
      • Parameters

        • input: { permission: string; userContext: any }
          • permission: string
          • userContext: any

        Returns Promise<{ roles: string[]; status: "OK" }>

    • getUsersThatHaveRole:function
      • getUsersThatHaveRole(input: { role: string; tenantId: string; userContext: any }): Promise<{ status: "OK"; users: string[] } | { status: "UNKNOWN_ROLE_ERROR" }>
      • Parameters

        • input: { role: string; tenantId: string; userContext: any }
          • role: string
          • tenantId: string
          • userContext: any

        Returns Promise<{ status: "OK"; users: string[] } | { status: "UNKNOWN_ROLE_ERROR" }>

    • removePermissionsFromRole:function
      • removePermissionsFromRole(input: { permissions: string[]; role: string; userContext: any }): Promise<{ status: "OK" | "UNKNOWN_ROLE_ERROR" }>
      • Parameters

        • input: { permissions: string[]; role: string; userContext: any }
          • permissions: string[]
          • role: string
          • userContext: any

        Returns Promise<{ status: "OK" | "UNKNOWN_ROLE_ERROR" }>

    • removeUserRole:function
      • removeUserRole(input: { role: string; tenantId: string; userContext: any; userId: string }): Promise<{ didUserHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
      • Parameters

        • input: { role: string; tenantId: string; userContext: any; userId: string }
          • role: string
          • tenantId: string
          • userContext: any
          • userId: string

        Returns Promise<{ didUserHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    Variables

    PermissionClaim: PermissionClaimClass = ...
    UserRoleClaim: UserRoleClaimClass = ...

    Functions

    • addRoleToUser(tenantId: string, userId: string, role: string, userContext?: any): Promise<{ didUserAlreadyHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • tenantId: string
      • userId: string
      • role: string
      • Optional userContext: any

      Returns Promise<{ didUserAlreadyHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    • createNewRoleOrAddPermissions(role: string, permissions: string[], userContext?: any): Promise<{ createdNewRole: boolean; status: "OK" }>
    • deleteRole(role: string, userContext?: any): Promise<{ didRoleExist: boolean; status: "OK" }>
    • getAllRoles(userContext?: any): Promise<{ roles: string[]; status: "OK" }>
    • getPermissionsForRole(role: string, userContext?: any): Promise<{ permissions: string[]; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • role: string
      • Optional userContext: any

      Returns Promise<{ permissions: string[]; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    • getRolesForUser(tenantId: string, userId: string, userContext?: any): Promise<{ roles: string[]; status: "OK" }>
    • getRolesThatHavePermission(permission: string, userContext?: any): Promise<{ roles: string[]; status: "OK" }>
    • getUsersThatHaveRole(tenantId: string, role: string, userContext?: any): Promise<{ status: "OK"; users: string[] } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • tenantId: string
      • role: string
      • Optional userContext: any

      Returns Promise<{ status: "OK"; users: string[] } | { status: "UNKNOWN_ROLE_ERROR" }>

    • init(config?: TypeInput): RecipeListFunction
    • removePermissionsFromRole(role: string, permissions: string[], userContext?: any): Promise<{ status: "OK" | "UNKNOWN_ROLE_ERROR" }>
    • removeUserRole(tenantId: string, userId: string, role: string, userContext?: any): Promise<{ didUserHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>
    • Parameters

      • tenantId: string
      • userId: string
      • role: string
      • Optional userContext: any

      Returns Promise<{ didUserHaveRole: boolean; status: "OK" } | { status: "UNKNOWN_ROLE_ERROR" }>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/examples/aws/with-emailpassword/test/basic.test.js b/examples/aws/with-emailpassword/test/basic.test.js index 34f06c029..31bb96004 100644 --- a/examples/aws/with-emailpassword/test/basic.test.js +++ b/examples/aws/with-emailpassword/test/basic.test.js @@ -86,7 +86,8 @@ describe("SuperTokens Example Basic tests", function () { ]); await submitForm(page); await page.waitForNavigation(); - const user = await EmailPassword.getUserByEmail("public", email); + const userList = await SuperTokensNode.listUsersByAccountInfo("public", { email }); + const user = userList[0]; const callApiBtn = await page.waitForSelector(".sessionButton"); let setAlertContent; let alertContent = new Promise((res) => (setAlertContent = res)); diff --git a/examples/express/with-emailpassword/test/basic.test.js b/examples/express/with-emailpassword/test/basic.test.js index b40f68c48..bc33830fb 100644 --- a/examples/express/with-emailpassword/test/basic.test.js +++ b/examples/express/with-emailpassword/test/basic.test.js @@ -79,7 +79,8 @@ describe("SuperTokens Example Basic tests", function () { { name: "password", value: testPW }, ]); await submitForm(page); - const user = await EmailPassword.getUserByEmail("public", email); + const userList = await SuperTokensNode.listUsersByAccountInfo("public", { email }); + const user = userList[0]; const callApiBtn = await page.waitForSelector(".sessionButton"); let setAlertContent; let alertContent = new Promise((res) => (setAlertContent = res)); diff --git a/examples/fastify/with-emailpassword/test/basic.test.js b/examples/fastify/with-emailpassword/test/basic.test.js index b40f68c48..bc33830fb 100644 --- a/examples/fastify/with-emailpassword/test/basic.test.js +++ b/examples/fastify/with-emailpassword/test/basic.test.js @@ -79,7 +79,8 @@ describe("SuperTokens Example Basic tests", function () { { name: "password", value: testPW }, ]); await submitForm(page); - const user = await EmailPassword.getUserByEmail("public", email); + const userList = await SuperTokensNode.listUsersByAccountInfo("public", { email }); + const user = userList[0]; const callApiBtn = await page.waitForSelector(".sessionButton"); let setAlertContent; let alertContent = new Promise((res) => (setAlertContent = res)); diff --git a/examples/hapi/with-emailpassword/test/basic.test.js b/examples/hapi/with-emailpassword/test/basic.test.js index 010816c0e..5a4fc5f87 100644 --- a/examples/hapi/with-emailpassword/test/basic.test.js +++ b/examples/hapi/with-emailpassword/test/basic.test.js @@ -80,7 +80,8 @@ describe("SuperTokens Example Basic tests", function () { ]); await submitForm(page); await page.waitForNavigation(); - const user = await EmailPassword.getUserByEmail("public", email); + const userList = await SuperTokensNode.listUsersByAccountInfo("public", { email }); + const user = userList[0]; const callApiBtn = await page.waitForSelector(".sessionButton"); let setAlertContent; let alertContent = new Promise((res) => (setAlertContent = res)); diff --git a/examples/koa/with-emailpassword/test/basic.test.js b/examples/koa/with-emailpassword/test/basic.test.js index b40f68c48..bc33830fb 100644 --- a/examples/koa/with-emailpassword/test/basic.test.js +++ b/examples/koa/with-emailpassword/test/basic.test.js @@ -79,7 +79,8 @@ describe("SuperTokens Example Basic tests", function () { { name: "password", value: testPW }, ]); await submitForm(page); - const user = await EmailPassword.getUserByEmail("public", email); + const userList = await SuperTokensNode.listUsersByAccountInfo("public", { email }); + const user = userList[0]; const callApiBtn = await page.waitForSelector(".sessionButton"); let setAlertContent; let alertContent = new Promise((res) => (setAlertContent = res)); diff --git a/examples/loopback/with-emailpassword/test/basic.test.js b/examples/loopback/with-emailpassword/test/basic.test.js index 010816c0e..5a4fc5f87 100644 --- a/examples/loopback/with-emailpassword/test/basic.test.js +++ b/examples/loopback/with-emailpassword/test/basic.test.js @@ -80,7 +80,8 @@ describe("SuperTokens Example Basic tests", function () { ]); await submitForm(page); await page.waitForNavigation(); - const user = await EmailPassword.getUserByEmail("public", email); + const userList = await SuperTokensNode.listUsersByAccountInfo("public", { email }); + const user = userList[0]; const callApiBtn = await page.waitForSelector(".sessionButton"); let setAlertContent; let alertContent = new Promise((res) => (setAlertContent = res)); diff --git a/examples/nest/with-emailpassword/test/basic.test.js b/examples/nest/with-emailpassword/test/basic.test.js index 010816c0e..5a4fc5f87 100644 --- a/examples/nest/with-emailpassword/test/basic.test.js +++ b/examples/nest/with-emailpassword/test/basic.test.js @@ -80,7 +80,8 @@ describe("SuperTokens Example Basic tests", function () { ]); await submitForm(page); await page.waitForNavigation(); - const user = await EmailPassword.getUserByEmail("public", email); + const userList = await SuperTokensNode.listUsersByAccountInfo("public", { email }); + const user = userList[0]; const callApiBtn = await page.waitForSelector(".sessionButton"); let setAlertContent; let alertContent = new Promise((res) => (setAlertContent = res)); diff --git a/examples/next/with-emailpassword/config/appInfo.ts b/examples/next/with-emailpassword/config/appInfo.ts index e148fa890..ed09e30c7 100644 --- a/examples/next/with-emailpassword/config/appInfo.ts +++ b/examples/next/with-emailpassword/config/appInfo.ts @@ -2,7 +2,12 @@ const port = process.env.APP_PORT || 3000; const apiBasePath = "/api/auth/"; -export const websiteDomain = process.env.APP_URL || process.env.NEXT_PUBLIC_APP_URL || `http://localhost:${port}`; +export const websiteDomain = + process.env.APP_URL || + process.env.NEXT_PUBLIC_APP_URL || + process.env.DEPLOY_URL || + process.env.URL || + `http://localhost:${port}`; export const appInfo = { appName: "SuperTokens Demo App", diff --git a/examples/next/with-emailpassword/netlify.toml b/examples/next/with-emailpassword/netlify.toml new file mode 100644 index 000000000..00649df24 --- /dev/null +++ b/examples/next/with-emailpassword/netlify.toml @@ -0,0 +1,4 @@ +[build] + command = "NEXT_PUBLIC_APP_URL=$DEPLOY_URL npm run build" + functions = "netlify/functions" + publish = ".next" diff --git a/examples/next/with-emailpassword/package-lock.json b/examples/next/with-emailpassword/package-lock.json index e702c675b..8a5aa6b80 100644 --- a/examples/next/with-emailpassword/package-lock.json +++ b/examples/next/with-emailpassword/package-lock.json @@ -4,6 +4,7 @@ "requires": true, "packages": { "": { + "hasInstallScript": true, "dependencies": { "next": "latest", "react": "^18.2.0", diff --git a/examples/next/with-emailpassword/package.json b/examples/next/with-emailpassword/package.json index 7ea83a771..462e4d850 100644 --- a/examples/next/with-emailpassword/package.json +++ b/examples/next/with-emailpassword/package.json @@ -1,6 +1,7 @@ { "private": true, "scripts": { + "postinstall": "../../../updateLibInExample", "dev": "next dev", "build": "next build", "start": "next start" diff --git a/examples/next/with-emailpassword/test/basic.test.js b/examples/next/with-emailpassword/test/basic.test.js index 25087c794..3708671c8 100644 --- a/examples/next/with-emailpassword/test/basic.test.js +++ b/examples/next/with-emailpassword/test/basic.test.js @@ -34,8 +34,19 @@ const EmailPassword = require("supertokens-node/recipe/emailpassword"); // Run the tests in a DOM environment. require("jsdom-global")(); -const apiDomain = "http://localhost:3001"; -const websiteDomain = "http://localhost:3000"; +let deployInfo; + +if (process.env.TEST_DEPLOYED_VERSION) { + deployInfo = require("../deployInfo.json"); + + if (!deployInfo.deploy_url) { + throw new Error("Deployment failed or json error. " + JSON.stringify(deployInfo)); + } +} + +const apiDomain = deployInfo?.deploy_url ?? "http://localhost:3000"; +const websiteDomain = deployInfo?.deploy_url ?? "http://localhost:3000"; + SuperTokensNode.init({ supertokens: { // We are running these tests without running a local ST instance @@ -80,8 +91,19 @@ describe("SuperTokens Example Basic tests", function () { ]); await submitForm(page); await page.waitForNavigation(); - const user = await EmailPassword.getUserByEmail("public", email); + const userList = await SuperTokensNode.listUsersByAccountInfo("public", { email }); + const user = userList[0]; const callApiBtn = await page.waitForSelector(".ProtectedHome_sessionButton__ihFAK"); + + // we save the cookies.. + let originalCookies = (await page._client.send("Network.getAllCookies")).cookies; + + // we set the old cookies with invalid access token + originalCookies = originalCookies.map((c) => + c.name === "sAccessToken" || c.name === "st-access-token" ? { ...c, value: "broken" } : c + ); + await page.setCookie(...originalCookies); + let setAlertContent; let alertContent = new Promise((res) => (setAlertContent = res)); page.on("dialog", async (dialog) => { diff --git a/framework/custom/index.d.ts b/framework/custom/index.d.ts new file mode 100644 index 000000000..0279b7e19 --- /dev/null +++ b/framework/custom/index.d.ts @@ -0,0 +1,3 @@ +export * from "../../lib/build/framework/custom"; +import * as _default from "../../lib/build/framework/custom"; +export default _default; diff --git a/framework/custom/index.js b/framework/custom/index.js new file mode 100644 index 000000000..2cb267700 --- /dev/null +++ b/framework/custom/index.js @@ -0,0 +1,6 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +exports.__esModule = true; +__export(require("../../lib/build/framework/custom")); diff --git a/lib/build/framework/awsLambda/framework.js b/lib/build/framework/awsLambda/framework.js index d9533f1c5..993becc3e 100644 --- a/lib/build/framework/awsLambda/framework.js +++ b/lib/build/framework/awsLambda/framework.js @@ -142,7 +142,10 @@ class AWSResponse extends response_1.BaseResponse { path, sameSite ); - this.event.supertokens.response.cookies.push(serialisedCookie); + this.event.supertokens.response.cookies = [ + ...this.event.supertokens.response.cookies.filter((c) => !c.startsWith(key + "=")), + serialisedCookie, + ]; }; /** * @param {number} statusCode @@ -187,8 +190,18 @@ class AWSResponse extends response_1.BaseResponse { } } if (supertokensHeaders[i].allowDuplicateKey && currentValue !== undefined) { - let newValue = `${currentValue}, ${supertokensHeaders[i].value}`; - headers[supertokensHeaders[i].key] = newValue; + /** + We only want to append if it does not already exist + For example if the caller is trying to add front token to the access control exposed headers property + we do not want to append if something else had already added it + */ + if ( + typeof currentValue !== "string" || + !currentValue.includes(supertokensHeaders[i].value.toString()) + ) { + let newValue = `${currentValue}, ${supertokensHeaders[i].value}`; + headers[supertokensHeaders[i].key] = newValue; + } } else { headers[supertokensHeaders[i].key] = supertokensHeaders[i].value; } @@ -264,7 +277,7 @@ const middleware = (handler) => { }); return response.sendResponse(); } catch (err) { - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); if (response.responseSet) { return response.sendResponse(); } diff --git a/lib/build/framework/custom/framework.d.ts b/lib/build/framework/custom/framework.d.ts new file mode 100644 index 000000000..82e383dae --- /dev/null +++ b/lib/build/framework/custom/framework.d.ts @@ -0,0 +1,109 @@ +// @ts-nocheck +import type { HTTPMethod } from "../../types"; +import { BaseRequest } from "../request"; +import { BaseResponse } from "../response"; +import { SessionContainerInterface } from "../../recipe/session/types"; +declare type RequestInfo = { + url: string; + method: HTTPMethod; + headers: Headers; + cookies: Record; + query: Record; + getJSONBody: () => Promise; + getFormBody: () => Promise; + setSession?: (session: SessionContainerInterface) => void; +}; +export declare class PreParsedRequest extends BaseRequest { + private request; + private _session?; + get session(): SessionContainerInterface | undefined; + set session(value: SessionContainerInterface | undefined); + constructor(request: RequestInfo); + getFormData: () => Promise; + getKeyValueFromQuery: (key: string) => string | undefined; + getJSONBody: () => Promise; + getMethod: () => HTTPMethod; + getCookieValue: (key: string) => string | undefined; + getHeaderValue: (key: string) => string | undefined; + getOriginalURL: () => string; +} +export declare type CookieInfo = { + key: string; + value: string; + domain: string | undefined; + secure: boolean; + httpOnly: boolean; + expires: number; + path: string; + sameSite: "strict" | "lax" | "none"; +}; +export declare class CollectingResponse extends BaseResponse { + statusCode: number; + readonly headers: Headers; + readonly cookies: CookieInfo[]; + body?: string; + constructor(); + sendHTMLResponse: (html: string) => void; + setHeader: (key: string, value: string, allowDuplicateKey: boolean) => void; + removeHeader: (key: string) => void; + setCookie: ( + key: string, + value: string, + domain: string | undefined, + secure: boolean, + httpOnly: boolean, + expires: number, + path: string, + sameSite: "strict" | "lax" | "none" + ) => void; + /** + * @param {number} statusCode + */ + setStatusCode: (statusCode: number) => void; + sendJSONResponse: (content: any) => void; +} +export declare type NextFunction = (err?: any) => void; +export declare const middleware: ( + wrapRequest?: (req: OrigReqType) => BaseRequest, + wrapResponse?: (req: OrigRespType) => BaseResponse +) => ( + request: OrigReqType, + response: OrigRespType, + next?: NextFunction | undefined +) => Promise< + | { + handled: boolean; + error?: undefined; + } + | { + error: any; + handled?: undefined; + } +>; +export declare const errorHandler: () => ( + err: any, + request: BaseRequest, + response: BaseResponse, + next: NextFunction +) => Promise; +export declare const CustomFrameworkWrapper: { + middleware: ( + wrapRequest?: (req: OrigReqType) => BaseRequest, + wrapResponse?: (req: OrigRespType) => BaseResponse + ) => ( + request: OrigReqType, + response: OrigRespType, + next?: NextFunction | undefined + ) => Promise< + | { + handled: boolean; + error?: undefined; + } + | { + error: any; + handled?: undefined; + } + >; + errorHandler: () => (err: any, request: BaseRequest, response: BaseResponse, next: NextFunction) => Promise; +}; +export {}; diff --git a/lib/build/framework/custom/framework.js b/lib/build/framework/custom/framework.js new file mode 100644 index 000000000..b1a35d5b4 --- /dev/null +++ b/lib/build/framework/custom/framework.js @@ -0,0 +1,170 @@ +"use strict"; +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * 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. + */ +var __importDefault = + (this && this.__importDefault) || + function (mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CustomFrameworkWrapper = exports.errorHandler = exports.middleware = exports.CollectingResponse = exports.PreParsedRequest = void 0; +const utils_1 = require("../../utils"); +const request_1 = require("../request"); +const response_1 = require("../response"); +const supertokens_1 = __importDefault(require("../../supertokens")); +class PreParsedRequest extends request_1.BaseRequest { + constructor(request) { + super(); + this.getFormData = async () => { + return this.request.getFormBody(); + }; + this.getKeyValueFromQuery = (key) => { + if (this.request.query === undefined) { + return undefined; + } + let value = this.request.query[key]; + if (value === undefined || typeof value !== "string") { + return undefined; + } + return value; + }; + this.getJSONBody = async () => { + return this.request.getJSONBody(); + }; + this.getMethod = () => { + return utils_1.normaliseHttpMethod(this.request.method); + }; + this.getCookieValue = (key) => { + return this.request.cookies[key]; + }; + this.getHeaderValue = (key) => { + var _a; + return (_a = this.request.headers.get(key)) !== null && _a !== void 0 ? _a : undefined; + }; + this.getOriginalURL = () => { + return this.request.url; + }; + this.original = request; + this.request = request; + } + get session() { + return this._session; + } + set session(value) { + this._session = value; + if (value !== undefined && this.request.setSession !== undefined) { + this.request.setSession(value); + } + } +} +exports.PreParsedRequest = PreParsedRequest; +class CollectingResponse extends response_1.BaseResponse { + constructor() { + super(); + this.sendHTMLResponse = (html) => { + this.headers.set("Content-Type", "text/html"); + this.body = html; + }; + this.setHeader = (key, value, allowDuplicateKey) => { + var _a; + if (allowDuplicateKey) { + /** + We only want to append if it does not already exist + For example if the caller is trying to add front token to the access control exposed headers property + we do not want to append if something else had already added it + */ + if (!((_a = this.headers.get(key)) === null || _a === void 0 ? void 0 : _a.includes(value))) { + this.headers.append(key, value); + } + } else { + this.headers.set(key, value); + } + }; + this.removeHeader = (key) => { + this.headers.delete(key); + }; + this.setCookie = (key, value, domain, secure, httpOnly, expires, path, sameSite) => { + this.cookies.push({ key, value, domain, secure, httpOnly, expires, path, sameSite }); + }; + /** + * @param {number} statusCode + */ + this.setStatusCode = (statusCode) => { + this.statusCode = statusCode; + }; + this.sendJSONResponse = (content) => { + this.headers.set("Content-Type", "application/json"); + this.body = JSON.stringify(content); + }; + this.headers = new Headers(); + this.statusCode = 200; + this.cookies = []; + } +} +exports.CollectingResponse = CollectingResponse; +const identity = (i) => i; +const middleware = (wrapRequest = identity, wrapResponse = identity) => { + return async (request, response, next) => { + const wrappedReq = wrapRequest(request); + const wrappedResp = wrapResponse(response); + let supertokens; + const userContext = utils_1.makeDefaultUserContextFromAPI(wrappedReq); + try { + supertokens = supertokens_1.default.getInstanceOrThrowError(); + const result = await supertokens.middleware(wrappedReq, wrappedResp, userContext); + if (!result) { + if (next) { + next(); + } + return { handled: false }; + } + return { handled: true }; + } catch (err) { + if (supertokens) { + try { + await supertokens.errorHandler(err, wrappedReq, wrappedResp, userContext); + return { handled: true }; + } catch (_a) { + if (next) { + next(err); + } + return { error: err }; + } + } else { + if (next) { + next(err); + } + return { error: err }; + } + } + }; +}; +exports.middleware = middleware; +const errorHandler = () => { + return async (err, request, response, next) => { + let supertokens = supertokens_1.default.getInstanceOrThrowError(); + const userContext = utils_1.makeDefaultUserContextFromAPI(request); + try { + await supertokens.errorHandler(err, request, response, userContext); + } catch (err) { + return next(err); + } + }; +}; +exports.errorHandler = errorHandler; +exports.CustomFrameworkWrapper = { + middleware: exports.middleware, + errorHandler: exports.errorHandler, +}; diff --git a/lib/build/framework/custom/index.d.ts b/lib/build/framework/custom/index.d.ts new file mode 100644 index 000000000..7c3b1f1fa --- /dev/null +++ b/lib/build/framework/custom/index.d.ts @@ -0,0 +1,25 @@ +// @ts-nocheck +export { PreParsedRequest, CollectingResponse } from "./framework"; +export declare const middleware: ( + wrapRequest?: (req: OrigReqType) => import("..").BaseRequest, + wrapResponse?: (req: OrigRespType) => import("..").BaseResponse +) => ( + request: OrigReqType, + response: OrigRespType, + next?: import("./framework").NextFunction | undefined +) => Promise< + | { + handled: boolean; + error?: undefined; + } + | { + error: any; + handled?: undefined; + } +>; +export declare const errorHandler: () => ( + err: any, + request: import("..").BaseRequest, + response: import("..").BaseResponse, + next: import("./framework").NextFunction +) => Promise; diff --git a/lib/build/framework/custom/index.js b/lib/build/framework/custom/index.js new file mode 100644 index 000000000..31170e351 --- /dev/null +++ b/lib/build/framework/custom/index.js @@ -0,0 +1,33 @@ +"use strict"; +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.errorHandler = exports.middleware = exports.CollectingResponse = exports.PreParsedRequest = void 0; +const framework_1 = require("./framework"); +var framework_2 = require("./framework"); +Object.defineProperty(exports, "PreParsedRequest", { + enumerable: true, + get: function () { + return framework_2.PreParsedRequest; + }, +}); +Object.defineProperty(exports, "CollectingResponse", { + enumerable: true, + get: function () { + return framework_2.CollectingResponse; + }, +}); +exports.middleware = framework_1.CustomFrameworkWrapper.middleware; +exports.errorHandler = framework_1.CustomFrameworkWrapper.errorHandler; diff --git a/lib/build/framework/express/framework.js b/lib/build/framework/express/framework.js index f917472f1..eb5d0cace 100644 --- a/lib/build/framework/express/framework.js +++ b/lib/build/framework/express/framework.js @@ -140,7 +140,7 @@ const middleware = () => { } catch (err) { if (supertokens) { try { - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); } catch (_a) { next(err); } @@ -156,8 +156,9 @@ const errorHandler = () => { let supertokens = supertokens_1.default.getInstanceOrThrowError(); let request = new ExpressRequest(req); let response = new ExpressResponse(res); + const userContext = utils_1.makeDefaultUserContextFromAPI(request); try { - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); } catch (err) { return next(err); } diff --git a/lib/build/framework/fastify/framework.js b/lib/build/framework/fastify/framework.js index 5bec9f553..f7099ee35 100644 --- a/lib/build/framework/fastify/framework.js +++ b/lib/build/framework/fastify/framework.js @@ -79,7 +79,14 @@ class FastifyResponse extends response_1.BaseResponse { if (existingValue === undefined) { this.response.header(key, value); } else if (allowDuplicateKey) { - this.response.header(key, existingValue + ", " + value); + /** + We only want to append if it does not already exist + For example if the caller is trying to add front token to the access control exposed headers property + we do not want to append if something else had already added it + */ + if (typeof existingValue !== "string" || !existingValue.includes(value)) { + this.response.header(key, existingValue + ", " + value); + } } else { // we overwrite the current one with the new one this.response.header(key, value); @@ -102,43 +109,14 @@ class FastifyResponse extends response_1.BaseResponse { path, sameSite ); - /** - * lets say if current value is undefined, prev -> undefined - * - * now if add AT, - * cookieValueToSetInHeader -> AT - * response header object will be: - * - * 'set-cookie': AT - * - * now if add RT, - * - * prev -> AT - * cookieValueToSetInHeader -> AT + RT - * and response header object will be: - * - * 'set-cookie': AT + AT + RT - * - * now if add IRT, - * - * prev -> AT + AT + RT - * cookieValueToSetInHeader -> IRT + AT + AT + RT - * and response header object will be: - * - * 'set-cookie': AT + AT + RT + IRT + AT + AT + RT - * - * To avoid this, we no longer get and use the previous value - * - * Old code: - * - * let prev: string | string[] | undefined = this.response.getHeader(COOKIE_HEADER) as - * | string - * | string[] - * | undefined; - * let cookieValueToSetInHeader = getCookieValueToSetInHeader(prev, serialisedCookie, key); - * this.response.header(COOKIE_HEADER, cookieValueToSetInHeader); - */ - this.response.header(constants_1.COOKIE_HEADER, serialisedCookie); + let oldHeaders = this.response.getHeader(constants_1.COOKIE_HEADER); + if (oldHeaders === undefined) oldHeaders = []; + else if (!(oldHeaders instanceof Array)) oldHeaders = [oldHeaders]; + this.response.removeHeader(constants_1.COOKIE_HEADER); + this.response.header(constants_1.COOKIE_HEADER, [ + ...oldHeaders.filter((h) => !h.startsWith(key + "=")), + serialisedCookie, + ]); }; /** * @param {number} statusCode @@ -172,7 +150,7 @@ function plugin(fastify, _, done) { try { await supertokens.middleware(request, response, userContext); } catch (err) { - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); } }); done(); @@ -183,7 +161,8 @@ const errorHandler = () => { let supertokens = supertokens_1.default.getInstanceOrThrowError(); let request = new FastifyRequest(req); let response = new FastifyResponse(res); - await supertokens.errorHandler(err, request, response); + let userContext = utils_1.makeDefaultUserContextFromAPI(request); + await supertokens.errorHandler(err, request, response, userContext); }; }; exports.errorHandler = errorHandler; diff --git a/lib/build/framework/hapi/framework.js b/lib/build/framework/hapi/framework.js index 23a86baa8..c4b07347a 100644 --- a/lib/build/framework/hapi/framework.js +++ b/lib/build/framework/hapi/framework.js @@ -156,9 +156,10 @@ const plugin = { let err = request.response.data || request.response; let req = new HapiRequest(request); let res = new HapiResponse(h); + const userContext = utils_1.makeDefaultUserContextFromAPI(req); if (err !== undefined && err !== null) { try { - await supertokens.errorHandler(err, req, res); + await supertokens.errorHandler(err, req, res, userContext); if (res.responseSet) { let resObj = res.sendResponse(true); (request.app.lazyHeaders || []).forEach(({ key, value, allowDuplicateKey }) => { diff --git a/lib/build/framework/koa/framework.js b/lib/build/framework/koa/framework.js index e4500d3ed..5bac1d858 100644 --- a/lib/build/framework/koa/framework.js +++ b/lib/build/framework/koa/framework.js @@ -88,7 +88,14 @@ class KoaResponse extends response_1.BaseResponse { if (existingValue === undefined) { this.ctx.set(key, value); } else if (allowDuplicateKey) { - this.ctx.set(key, existingValue + ", " + value); + /** + We only want to append if it does not already exist + For example if the caller is trying to add front token to the access control exposed headers property + we do not want to append if something else had already added it + */ + if (typeof existingValue !== "string" || !existingValue.includes(value)) { + this.ctx.set(key, existingValue + ", " + value); + } } else { // we overwrite the current one with the new one this.ctx.set(key, value); @@ -108,6 +115,7 @@ class KoaResponse extends response_1.BaseResponse { expires: new Date(expires), domain, path, + overwrite: true, }); }; /** @@ -142,7 +150,7 @@ const middleware = () => { return await next(); } } catch (err) { - return await supertokens.errorHandler(err, request, response); + return await supertokens.errorHandler(err, request, response, userContext); } }; }; diff --git a/lib/build/framework/loopback/framework.js b/lib/build/framework/loopback/framework.js index cabc274cd..745f62fb5 100644 --- a/lib/build/framework/loopback/framework.js +++ b/lib/build/framework/loopback/framework.js @@ -127,7 +127,7 @@ const middleware = async (ctx, next) => { } return; } catch (err) { - return await supertokens.errorHandler(err, request, response); + return await supertokens.errorHandler(err, request, response, userContext); } }; exports.middleware = middleware; diff --git a/lib/build/framework/types.d.ts b/lib/build/framework/types.d.ts index f685b5e0a..9ea5d4ea5 100644 --- a/lib/build/framework/types.d.ts +++ b/lib/build/framework/types.d.ts @@ -1,5 +1,5 @@ // @ts-nocheck -export declare type TypeFramework = "express" | "fastify" | "hapi" | "loopback" | "koa" | "awsLambda"; +export declare type TypeFramework = "express" | "fastify" | "hapi" | "loopback" | "koa" | "awsLambda" | "custom"; import { BaseRequest, BaseResponse } from "."; export declare let SchemaFramework: { type: string; diff --git a/lib/build/framework/types.js b/lib/build/framework/types.js index 282217eef..9a77275ad 100644 --- a/lib/build/framework/types.js +++ b/lib/build/framework/types.js @@ -3,5 +3,5 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.SchemaFramework = void 0; exports.SchemaFramework = { type: "string", - enum: ["express", "fastify", "hapi", "loopback", "koa", "awsLambda"], + enum: ["express", "fastify", "hapi", "loopback", "koa", "awsLambda", "custom"], }; diff --git a/lib/build/framework/utils.js b/lib/build/framework/utils.js index 2e392b51c..76803c26c 100644 --- a/lib/build/framework/utils.js +++ b/lib/build/framework/utils.js @@ -217,10 +217,17 @@ function setHeaderForExpressLikeResponse(res, key, value, allowDuplicateKey) { res.setHeader(key, value); } } else if (allowDuplicateKey) { - if (res.header !== undefined) { - res.header(key, existingValue + ", " + value); - } else { - res.setHeader(key, existingValue + ", " + value); + /** + We only want to append if it does not already exist + For example if the caller is trying to add front token to the access control exposed headers property + we do not want to append if something else had already added it + */ + if (typeof existingValue !== "string" || !existingValue.includes(value)) { + if (res.header !== undefined) { + res.header(key, existingValue + ", " + value); + } else { + res.setHeader(key, existingValue + ", " + value); + } } } else { // we overwrite the current one with the new one diff --git a/lib/build/nextjs.d.ts b/lib/build/nextjs.d.ts index 195a81422..7154203c4 100644 --- a/lib/build/nextjs.d.ts +++ b/lib/build/nextjs.d.ts @@ -1,9 +1,27 @@ // @ts-nocheck +declare type PartialNextRequest = { + method: string; + url: string; + headers: Headers; + formData: () => any; + json: () => any; + cookies: { + getAll: () => { + name: string; + value: string; + }[]; + }; +}; export default class NextJS { static superTokensNextWrapper( middleware: (next: (middlewareError?: any) => void) => Promise, request: any, response: any ): Promise; + static getAppDirRequestHandler( + NextResponse: typeof Response + ): (req: T) => Promise; } export declare let superTokensNextWrapper: typeof NextJS.superTokensNextWrapper; +export declare let getAppDirRequestHandler: typeof NextJS.getAppDirRequestHandler; +export {}; diff --git a/lib/build/nextjs.js b/lib/build/nextjs.js index adcc99506..6c0306f3c 100644 --- a/lib/build/nextjs.js +++ b/lib/build/nextjs.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.superTokensNextWrapper = void 0; +exports.getAppDirRequestHandler = exports.superTokensNextWrapper = void 0; /* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. * * This software is licensed under the Apache License, Version 2.0 (the @@ -15,7 +15,9 @@ exports.superTokensNextWrapper = void 0; * License for the specific language governing permissions and limitations * under the License. */ +const cookie_1 = require("cookie"); const express_1 = require("./framework/express"); +const custom_1 = require("./framework/custom"); function next(request, response, resolve, reject) { return async function (middlewareError) { if (middlewareError === undefined) { @@ -51,6 +53,49 @@ class NextJS { } }); } + static getAppDirRequestHandler(NextResponse) { + const stMiddleware = custom_1.middleware((req) => { + const query = Object.fromEntries(new URL(req.url).searchParams.entries()); + const cookies = Object.fromEntries(req.cookies.getAll().map((cookie) => [cookie.name, cookie.value])); + return new custom_1.PreParsedRequest({ + method: req.method, + url: req.url, + query: query, + headers: req.headers, + cookies, + getFormBody: () => req.formData(), + getJSONBody: () => req.json(), + }); + }); + return async function handleCall(req) { + const baseResponse = new custom_1.CollectingResponse(); + const { handled, error } = await stMiddleware(req, baseResponse); + if (error) { + throw error; + } + if (!handled) { + return new NextResponse("Not found", { status: 404 }); + } + for (const respCookie of baseResponse.cookies) { + baseResponse.headers.append( + "Set-Cookie", + cookie_1.serialize(respCookie.key, respCookie.value, { + domain: respCookie.domain, + expires: new Date(respCookie.expires), + httpOnly: respCookie.httpOnly, + path: respCookie.path, + sameSite: respCookie.sameSite, + secure: respCookie.secure, + }) + ); + } + return new NextResponse(baseResponse.body, { + headers: baseResponse.headers, + status: baseResponse.statusCode, + }); + }; + } } exports.default = NextJS; exports.superTokensNextWrapper = NextJS.superTokensNextWrapper; +exports.getAppDirRequestHandler = NextJS.getAppDirRequestHandler; diff --git a/lib/build/querier.js b/lib/build/querier.js index 6546e051b..9daa21bb8 100644 --- a/lib/build/querier.js +++ b/lib/build/querier.js @@ -1,40 +1,4 @@ "use strict"; -var __createBinding = - (this && this.__createBinding) || - (Object.create - ? function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { - enumerable: true, - get: function () { - return m[k]; - }, - }); - } - : function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - }); -var __setModuleDefault = - (this && this.__setModuleDefault) || - (Object.create - ? function (o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } - : function (o, v) { - o["default"] = v; - }); -var __importStar = - (this && this.__importStar) || - function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; var __importDefault = (this && this.__importDefault) || function (mod) { @@ -56,7 +20,6 @@ exports.Querier = void 0; * License for the specific language governing permissions and limitations * under the License. */ -const cross_fetch_1 = __importStar(require("cross-fetch")); const utils_1 = require("./utils"); const version_1 = require("./version"); const normalisedURLPath_1 = __importDefault(require("./normalisedURLPath")); @@ -84,7 +47,7 @@ class Querier { "api-key": Querier.apiKey, }; } - let response = await cross_fetch_1.default(url, { + let response = await utils_1.doFetch(url, { method: "GET", headers, }); @@ -129,7 +92,7 @@ class Querier { if (path.isARecipePath() && this.rIdToCore !== undefined) { headers = Object.assign(Object.assign({}, headers), { rid: this.rIdToCore }); } - return cross_fetch_1.default(url, { + return utils_1.doFetch(url, { method: "POST", body: body !== undefined ? JSON.stringify(body) : undefined, headers, @@ -157,7 +120,7 @@ class Querier { const finalURL = new URL(url); const searchParams = new URLSearchParams(params); finalURL.search = searchParams.toString(); - return cross_fetch_1.default(finalURL.toString(), { + return utils_1.doFetch(finalURL.toString(), { method: "DELETE", body: body !== undefined ? JSON.stringify(body) : undefined, headers, @@ -187,7 +150,7 @@ class Querier { Object.entries(params).filter(([_, value]) => value !== undefined) ); finalURL.search = searchParams.toString(); - return await cross_fetch_1.default(finalURL.toString(), { + return utils_1.doFetch(finalURL.toString(), { method: "GET", headers, }); @@ -215,7 +178,7 @@ class Querier { Object.entries(params).filter(([_, value]) => value !== undefined) ); finalURL.search = searchParams.toString(); - return await cross_fetch_1.default(finalURL.toString(), { + return utils_1.doFetch(finalURL.toString(), { method: "GET", headers, }); @@ -238,7 +201,7 @@ class Querier { if (path.isARecipePath() && this.rIdToCore !== undefined) { headers = Object.assign(Object.assign({}, headers), { rid: this.rIdToCore }); } - return cross_fetch_1.default(url, { + return utils_1.doFetch(url, { method: "PUT", body: body !== undefined ? JSON.stringify(body) : undefined, headers, @@ -297,9 +260,9 @@ class Querier { err.message.includes("ECONNREFUSED") || err.code === "ECONNREFUSED") ) { - return await this.sendRequestHelper(path, method, requestFunc, numberOfTries - 1, retryInfoMap); + return this.sendRequestHelper(path, method, requestFunc, numberOfTries - 1, retryInfoMap); } - if (err instanceof cross_fetch_1.Response) { + if ("status" in err && "text" in err) { if (err.status === constants_1.RATE_LIMIT_STATUS_CODE) { const retriesLeft = retryInfoMap[url]; if (retriesLeft > 0) { @@ -307,7 +270,7 @@ class Querier { const attemptsMade = maxRetries - retriesLeft; const delay = 10 + 250 * attemptsMade; await new Promise((resolve) => setTimeout(resolve, delay)); - return await this.sendRequestHelper(path, method, requestFunc, numberOfTries, retryInfoMap); + return this.sendRequestHelper(path, method, requestFunc, numberOfTries, retryInfoMap); } } throw new Error( diff --git a/lib/build/recipe/accountlinking/recipeImplementation.js b/lib/build/recipe/accountlinking/recipeImplementation.js index 03043931b..16c7fb2f8 100644 --- a/lib/build/recipe/accountlinking/recipeImplementation.js +++ b/lib/build/recipe/accountlinking/recipeImplementation.js @@ -23,13 +23,15 @@ const normalisedURLPath_1 = __importDefault(require("../../normalisedURLPath")); const user_1 = require("../../user"); function getRecipeImplementation(querier, config, recipeInstance) { return { - getUsers: async function ({ timeJoinedOrder, limit, paginationToken, includeRecipeIds, query }) { + getUsers: async function ({ tenantId, timeJoinedOrder, limit, paginationToken, includeRecipeIds, query }) { let includeRecipeIdsStr = undefined; if (includeRecipeIds !== undefined) { includeRecipeIdsStr = includeRecipeIds.join(","); } let response = await querier.sendGetRequest( - new normalisedURLPath_1.default("/users"), + new normalisedURLPath_1.default( + `${tenantId !== null && tenantId !== void 0 ? tenantId : "public"}/users` + ), Object.assign( { includeRecipeIds: includeRecipeIdsStr, diff --git a/lib/build/recipe/accountlinking/types.d.ts b/lib/build/recipe/accountlinking/types.d.ts index ee66ae675..804682e69 100644 --- a/lib/build/recipe/accountlinking/types.d.ts +++ b/lib/build/recipe/accountlinking/types.d.ts @@ -54,6 +54,7 @@ export declare type TypeNormalisedInput = { }; export declare type RecipeInterface = { getUsers: (input: { + tenantId: string; timeJoinedOrder: "ASC" | "DESC"; limit?: number; paginationToken?: string; diff --git a/lib/build/recipe/dashboard/api/analytics.js b/lib/build/recipe/dashboard/api/analytics.js index f14cc300d..1a4dba3db 100644 --- a/lib/build/recipe/dashboard/api/analytics.js +++ b/lib/build/recipe/dashboard/api/analytics.js @@ -24,7 +24,7 @@ const querier_1 = require("../../../querier"); const normalisedURLPath_1 = __importDefault(require("../../../normalisedURLPath")); const version_1 = require("../../../version"); const error_1 = __importDefault(require("../../../error")); -const cross_fetch_1 = __importDefault(require("cross-fetch")); +const utils_1 = require("../../../utils"); async function analyticsPost(_, ___, options, __) { // If telemetry is disabled, dont send any event if (!supertokens_1.default.getInstanceOrThrowError().telemetryEnabled) { @@ -60,9 +60,12 @@ async function analyticsPost(_, ___, options, __) { status: "OK", }; } - const { apiDomain, websiteDomain, appName } = options.appInfo; + const { apiDomain, getOrigin: websiteDomain, appName } = options.appInfo; const data = { - websiteDomain: websiteDomain.getAsStringDangerous(), + websiteDomain: websiteDomain({ + request: undefined, + userContext: {}, + }).getAsStringDangerous(), apiDomain: apiDomain.getAsStringDangerous(), appName, sdk: "node", @@ -73,7 +76,7 @@ async function analyticsPost(_, ___, options, __) { dashboardVersion, }; try { - await cross_fetch_1.default("https://api.supertokens.com/0/st/telemetry", { + await utils_1.doFetch("https://api.supertokens.com/0/st/telemetry", { method: "POST", body: JSON.stringify(data), headers: { diff --git a/lib/build/recipe/emailpassword/api/implementation.js b/lib/build/recipe/emailpassword/api/implementation.js index fcaf413cd..284b26954 100644 --- a/lib/build/recipe/emailpassword/api/implementation.js +++ b/lib/build/recipe/emailpassword/api/implementation.js @@ -63,6 +63,8 @@ function getAPIImplementation() { token: response.token, recipeId: options.recipeId, tenantId, + request: options.req, + userContext, }); logger_1.logDebugMessage(`Sending password reset email to ${email}`); await options.emailDelivery.ingredientInterfaceImpl.sendEmail({ diff --git a/lib/build/recipe/emailpassword/index.js b/lib/build/recipe/emailpassword/index.js index 564796686..5c665fda5 100644 --- a/lib/build/recipe/emailpassword/index.js +++ b/lib/build/recipe/emailpassword/index.js @@ -107,6 +107,8 @@ class Wrapper { recipeId: recipeInstance.getRecipeId(), token: token.token, tenantId: tenantId === undefined ? constants_1.DEFAULT_TENANT_ID : tenantId, + request: __1.getRequestFromUserContext(userContext), + userContext, }), }; } diff --git a/lib/build/recipe/emailpassword/utils.d.ts b/lib/build/recipe/emailpassword/utils.d.ts index 5e01cc47d..f9ef8d5dc 100644 --- a/lib/build/recipe/emailpassword/utils.d.ts +++ b/lib/build/recipe/emailpassword/utils.d.ts @@ -2,6 +2,7 @@ import Recipe from "./recipe"; import { TypeInput, TypeNormalisedInput, NormalisedFormField, TypeInputFormField } from "./types"; import { NormalisedAppinfo } from "../../types"; +import { BaseRequest } from "../../framework"; export declare function validateAndNormaliseUserInput( recipeInstance: Recipe, appInfo: NormalisedAppinfo, @@ -26,4 +27,6 @@ export declare function getPasswordResetLink(input: { token: string; recipeId: string; tenantId: string; + request: BaseRequest | undefined; + userContext: any; }): string; diff --git a/lib/build/recipe/emailpassword/utils.js b/lib/build/recipe/emailpassword/utils.js index 823085fe1..f2518e26e 100644 --- a/lib/build/recipe/emailpassword/utils.js +++ b/lib/build/recipe/emailpassword/utils.js @@ -213,7 +213,12 @@ async function defaultEmailValidator(value) { exports.defaultEmailValidator = defaultEmailValidator; function getPasswordResetLink(input) { return ( - input.appInfo.websiteDomain.getAsStringDangerous() + + input.appInfo + .getOrigin({ + request: input.request, + userContext: input.userContext, + }) + .getAsStringDangerous() + input.appInfo.websiteBasePath.getAsStringDangerous() + "/reset-password?token=" + input.token + diff --git a/lib/build/recipe/emailverification/api/implementation.js b/lib/build/recipe/emailverification/api/implementation.js index f75f28545..5471e5f41 100644 --- a/lib/build/recipe/emailverification/api/implementation.js +++ b/lib/build/recipe/emailverification/api/implementation.js @@ -70,13 +70,7 @@ function getAPIInterface() { newSession, }; } else { - if ((await session.getClaimValue(emailVerificationClaim_1.EmailVerificationClaim)) !== false) { - await session.setClaimValue( - emailVerificationClaim_1.EmailVerificationClaim, - false, - userContext - ); - } + await session.setClaimValue(emailVerificationClaim_1.EmailVerificationClaim, false, userContext); return { status: "OK", isVerified: false, @@ -166,6 +160,8 @@ function getAPIInterface() { token: response.token, recipeId: options.recipeId, tenantId, + request: options.req, + userContext, }); logger_1.logDebugMessage(`Sending email verification email to ${emailInfo}`); await options.emailDelivery.ingredientInterfaceImpl.sendEmail({ diff --git a/lib/build/recipe/emailverification/index.js b/lib/build/recipe/emailverification/index.js index 9f81c6832..7651ef570 100644 --- a/lib/build/recipe/emailverification/index.js +++ b/lib/build/recipe/emailverification/index.js @@ -24,6 +24,7 @@ const recipe_1 = __importDefault(require("./recipe")); const error_1 = __importDefault(require("./error")); const emailVerificationClaim_1 = require("./emailVerificationClaim"); const utils_1 = require("./utils"); +const __1 = require("../.."); class Wrapper { static async createEmailVerificationToken(tenantId, recipeUserId, email, userContext = {}) { const recipeInstance = recipe_1.default.getInstanceOrThrowError(); @@ -67,6 +68,8 @@ class Wrapper { token: emailVerificationToken.token, recipeId: recipeInstance.getRecipeId(), tenantId, + request: __1.getRequestFromUserContext(userContext), + userContext, }), }; } diff --git a/lib/build/recipe/emailverification/recipe.js b/lib/build/recipe/emailverification/recipe.js index 96faa4eb0..6f8031a23 100644 --- a/lib/build/recipe/emailverification/recipe.js +++ b/lib/build/recipe/emailverification/recipe.js @@ -187,30 +187,23 @@ class Recipe extends recipeModule_1.default { // We also have the sub cases here that the account that just // got verified was already linked to the session's primary user ID, // but either way, we don't need to change any user ID. - // In this case, all we do is to update the emailverification claim if it's - // not already set to true (it is ok to assume true cause this function - // is only called when the email is verified). - if ( - (await input.session.getClaimValue(emailVerificationClaim_1.EmailVerificationClaim)) !== - true - ) { - try { - // EmailVerificationClaim will be based on the recipeUserId - // and not the primary user ID. - await input.session.fetchAndSetClaim( - emailVerificationClaim_1.EmailVerificationClaim, - input.userContext - ); - } catch (err) { - // This should never happen, since we've just set the status above. - if (err.message === "UNKNOWN_USER_ID") { - throw new error_2.default({ - type: error_2.default.UNAUTHORISED, - message: "Unknown User ID provided", - }); - } - throw err; + // In this case, all we do is to update the emailverification claim + try { + // EmailVerificationClaim will be based on the recipeUserId + // and not the primary user ID. + await input.session.fetchAndSetClaim( + emailVerificationClaim_1.EmailVerificationClaim, + input.userContext + ); + } catch (err) { + // This should never happen, since we've just set the status above. + if (err.message === "UNKNOWN_USER_ID") { + throw new error_2.default({ + type: error_2.default.UNAUTHORISED, + message: "Unknown User ID provided", + }); } + throw err; } return; } else { diff --git a/lib/build/recipe/emailverification/utils.d.ts b/lib/build/recipe/emailverification/utils.d.ts index 8af27d9e6..87217577f 100644 --- a/lib/build/recipe/emailverification/utils.d.ts +++ b/lib/build/recipe/emailverification/utils.d.ts @@ -2,6 +2,7 @@ import Recipe from "./recipe"; import { TypeInput, TypeNormalisedInput } from "./types"; import { NormalisedAppinfo } from "../../types"; +import { BaseRequest } from "../../framework"; export declare function validateAndNormaliseUserInput( _: Recipe, appInfo: NormalisedAppinfo, @@ -12,4 +13,6 @@ export declare function getEmailVerifyLink(input: { token: string; recipeId: string; tenantId: string; + request: BaseRequest | undefined; + userContext: any; }): string; diff --git a/lib/build/recipe/emailverification/utils.js b/lib/build/recipe/emailverification/utils.js index b273a003e..603f823ea 100644 --- a/lib/build/recipe/emailverification/utils.js +++ b/lib/build/recipe/emailverification/utils.js @@ -65,7 +65,12 @@ function validateAndNormaliseUserInput(_, appInfo, config) { exports.validateAndNormaliseUserInput = validateAndNormaliseUserInput; function getEmailVerifyLink(input) { return ( - input.appInfo.websiteDomain.getAsStringDangerous() + + input.appInfo + .getOrigin({ + request: input.request, + userContext: input.userContext, + }) + .getAsStringDangerous() + input.appInfo.websiteBasePath.getAsStringDangerous() + "/verify-email" + "?token=" + diff --git a/lib/build/recipe/passwordless/api/implementation.js b/lib/build/recipe/passwordless/api/implementation.js index abdee27bc..9ac97df00 100644 --- a/lib/build/recipe/passwordless/api/implementation.js +++ b/lib/build/recipe/passwordless/api/implementation.js @@ -224,7 +224,12 @@ function getAPIImplementation() { const flowType = input.options.config.flowType; if (flowType === "MAGIC_LINK" || flowType === "USER_INPUT_CODE_AND_MAGIC_LINK") { magicLink = - input.options.appInfo.websiteDomain.getAsStringDangerous() + + input.options.appInfo + .getOrigin({ + request: input.options.req, + userContext: input.userContext, + }) + .getAsStringDangerous() + input.options.appInfo.websiteBasePath.getAsStringDangerous() + "/verify" + "?rid=" + @@ -354,7 +359,12 @@ function getAPIImplementation() { const flowType = input.options.config.flowType; if (flowType === "MAGIC_LINK" || flowType === "USER_INPUT_CODE_AND_MAGIC_LINK") { magicLink = - input.options.appInfo.websiteDomain.getAsStringDangerous() + + input.options.appInfo + .getOrigin({ + request: input.options.req, + userContext: input.userContext, + }) + .getAsStringDangerous() + input.options.appInfo.websiteBasePath.getAsStringDangerous() + "/verify" + "?rid=" + diff --git a/lib/build/recipe/passwordless/index.js b/lib/build/recipe/passwordless/index.js index fc5b789da..7881e06dc 100644 --- a/lib/build/recipe/passwordless/index.js +++ b/lib/build/recipe/passwordless/index.js @@ -22,6 +22,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.sendSms = exports.sendEmail = exports.signInUp = exports.createMagicLink = exports.revokeCode = exports.revokeAllCodes = exports.updateUser = exports.createNewCodeForDevice = exports.listCodesByPreAuthSessionId = exports.listCodesByPhoneNumber = exports.listCodesByEmail = exports.listCodesByDeviceId = exports.consumeCode = exports.createCode = exports.Error = exports.init = void 0; const recipe_1 = __importDefault(require("./recipe")); const error_1 = __importDefault(require("./error")); +const __1 = require("../.."); class Wrapper { static createCode(input) { var _a; @@ -104,6 +105,7 @@ class Wrapper { var _a; return recipe_1.default.getInstanceOrThrowError().createMagicLink( Object.assign(Object.assign({}, input), { + request: __1.getRequestFromUserContext(input.userContext), userContext: (_a = input.userContext) !== null && _a !== void 0 ? _a : {}, }) ); diff --git a/lib/build/recipe/passwordless/recipe.d.ts b/lib/build/recipe/passwordless/recipe.d.ts index 4019d514a..80d7c388f 100644 --- a/lib/build/recipe/passwordless/recipe.d.ts +++ b/lib/build/recipe/passwordless/recipe.d.ts @@ -48,11 +48,13 @@ export default class Recipe extends RecipeModule { | { email: string; tenantId: string; + request: BaseRequest | undefined; userContext?: any; } | { phoneNumber: string; tenantId: string; + request: BaseRequest | undefined; userContext?: any; } ) => Promise; diff --git a/lib/build/recipe/passwordless/recipe.js b/lib/build/recipe/passwordless/recipe.js index 28828fb58..9412e8b8b 100644 --- a/lib/build/recipe/passwordless/recipe.js +++ b/lib/build/recipe/passwordless/recipe.js @@ -129,7 +129,12 @@ class Recipe extends recipeModule_1.default { ); const appInfo = this.getAppInfo(); let magicLink = - appInfo.websiteDomain.getAsStringDangerous() + + appInfo + .getOrigin({ + request: input.request, + userContext: input.userContext, + }) + .getAsStringDangerous() + appInfo.websiteBasePath.getAsStringDangerous() + "/verify" + "?rid=" + diff --git a/lib/build/recipe/session/cookieAndHeaders.d.ts b/lib/build/recipe/session/cookieAndHeaders.d.ts index f92171d16..40b15126f 100644 --- a/lib/build/recipe/session/cookieAndHeaders.d.ts +++ b/lib/build/recipe/session/cookieAndHeaders.d.ts @@ -1,11 +1,18 @@ // @ts-nocheck import type { BaseRequest, BaseResponse } from "../../framework"; import { TokenTransferMethod, TokenType, TypeNormalisedInput } from "./types"; -export declare function clearSessionFromAllTokenTransferMethods(config: TypeNormalisedInput, res: BaseResponse): void; +export declare function clearSessionFromAllTokenTransferMethods( + config: TypeNormalisedInput, + res: BaseResponse, + request: BaseRequest | undefined, + userContext: any +): void; export declare function clearSession( config: TypeNormalisedInput, res: BaseResponse, - transferMethod: TokenTransferMethod + transferMethod: TokenTransferMethod, + request: BaseRequest | undefined, + userContext: any ): void; export declare function getAntiCsrfTokenFromHeaders(req: BaseRequest): string | undefined; export declare function setAntiCsrfTokenInHeaders(res: BaseResponse, antiCsrfToken: string): void; @@ -23,7 +30,9 @@ export declare function setToken( tokenType: TokenType, value: string, expires: number, - transferMethod: TokenTransferMethod + transferMethod: TokenTransferMethod, + req: BaseRequest | undefined, + userContext: any ): void; export declare function setHeader(res: BaseResponse, name: string, value: string): void; /** @@ -43,6 +52,8 @@ export declare function setCookie( name: string, value: string, expires: number, - pathType: "refreshTokenPath" | "accessTokenPath" + pathType: "refreshTokenPath" | "accessTokenPath", + req: BaseRequest | undefined, + userContext: any ): void; export declare function getAuthModeFromHeader(req: BaseRequest): string | undefined; diff --git a/lib/build/recipe/session/cookieAndHeaders.js b/lib/build/recipe/session/cookieAndHeaders.js index 89f7957ce..d0987ad6b 100644 --- a/lib/build/recipe/session/cookieAndHeaders.js +++ b/lib/build/recipe/session/cookieAndHeaders.js @@ -26,7 +26,7 @@ const refreshTokenHeaderKey = "st-refresh-token"; const antiCsrfHeaderKey = "anti-csrf"; const frontTokenHeaderKey = "front-token"; const authModeHeaderKey = "st-auth-mode"; -function clearSessionFromAllTokenTransferMethods(config, res) { +function clearSessionFromAllTokenTransferMethods(config, res, request, userContext) { // We are clearing the session in all transfermethods to be sure to override cookies in case they have been already added to the response. // This is done to handle the following use-case: // If the app overrides signInPOST to check the ban status of the user after the original implementation and throwing an UNAUTHORISED error @@ -34,15 +34,15 @@ function clearSessionFromAllTokenTransferMethods(config, res) { // We can't know which to clear since we can't reliably query or remove the set-cookie header added to the response (causes issues in some frameworks, i.e.: hapi) // The safe solution in this case is to overwrite all the response cookies/headers with an empty value, which is what we are doing here for (const transferMethod of constants_2.availableTokenTransferMethods) { - clearSession(config, res, transferMethod); + clearSession(config, res, transferMethod, request, userContext); } } exports.clearSessionFromAllTokenTransferMethods = clearSessionFromAllTokenTransferMethods; -function clearSession(config, res, transferMethod) { +function clearSession(config, res, transferMethod, request, userContext) { // If we can be specific about which transferMethod we want to clear, there is no reason to clear the other ones const tokenTypes = ["access", "refresh"]; for (const token of tokenTypes) { - setToken(config, res, token, "", 0, transferMethod); + setToken(config, res, token, "", 0, transferMethod, request, userContext); } res.removeHeader(antiCsrfHeaderKey); // This can be added multiple times in some cases, but that should be OK @@ -111,7 +111,7 @@ function getToken(req, tokenType, transferMethod) { } } exports.getToken = getToken; -function setToken(config, res, tokenType, value, expires, transferMethod) { +function setToken(config, res, tokenType, value, expires, transferMethod, req, userContext) { logger_1.logDebugMessage(`setToken: Setting ${tokenType} token as ${transferMethod}`); if (transferMethod === "cookie") { setCookie( @@ -120,7 +120,9 @@ function setToken(config, res, tokenType, value, expires, transferMethod) { getCookieNameFromTokenType(tokenType), value, expires, - tokenType === "refresh" ? "refreshTokenPath" : "accessTokenPath" + tokenType === "refresh" ? "refreshTokenPath" : "accessTokenPath", + req, + userContext ); } else if (transferMethod === "header") { setHeader(res, getResponseHeaderNameForTokenType(tokenType), value); @@ -143,10 +145,13 @@ exports.setHeader = setHeader; * @param expires * @param path */ -function setCookie(config, res, name, value, expires, pathType) { +function setCookie(config, res, name, value, expires, pathType, req, userContext) { let domain = config.cookieDomain; let secure = config.cookieSecure; - let sameSite = config.cookieSameSite; + let sameSite = config.getCookieSameSite({ + request: req, + userContext, + }); let path = ""; if (pathType === "refreshTokenPath") { path = config.refreshTokenPath.getAsStringDangerous(); diff --git a/lib/build/recipe/session/framework/awsLambda.js b/lib/build/recipe/session/framework/awsLambda.js index 13d291025..1e6b919f7 100644 --- a/lib/build/recipe/session/framework/awsLambda.js +++ b/lib/build/recipe/session/framework/awsLambda.js @@ -22,7 +22,7 @@ function verifySession(handler, verifySessionOptions) { let handlerResult = await handler(event, context, callback); return response.sendResponse(handlerResult); } catch (err) { - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); if (response.responseSet) { return response.sendResponse({}); } diff --git a/lib/build/recipe/session/framework/custom.d.ts b/lib/build/recipe/session/framework/custom.d.ts new file mode 100644 index 000000000..23c82a5c2 --- /dev/null +++ b/lib/build/recipe/session/framework/custom.d.ts @@ -0,0 +1,10 @@ +// @ts-nocheck +import type { VerifySessionOptions } from ".."; +import { BaseRequest, BaseResponse } from "../../../framework"; +import { NextFunction } from "../../../framework/custom/framework"; +import { SessionContainerInterface } from "../types"; +export declare function verifySession< + T extends BaseRequest & { + session?: SessionContainerInterface; + } +>(options?: VerifySessionOptions): (req: T, res: BaseResponse, next?: NextFunction | undefined) => Promise; diff --git a/lib/build/recipe/session/framework/custom.js b/lib/build/recipe/session/framework/custom.js new file mode 100644 index 000000000..0615fe8b7 --- /dev/null +++ b/lib/build/recipe/session/framework/custom.js @@ -0,0 +1,50 @@ +"use strict"; +var __importDefault = + (this && this.__importDefault) || + function (mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.verifySession = void 0; +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * 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. + */ +const recipe_1 = __importDefault(require("../recipe")); +const supertokens_1 = __importDefault(require("../../../supertokens")); +const utils_1 = require("../../../utils"); +function verifySession(options) { + return async (req, res, next) => { + const userContext = utils_1.makeDefaultUserContextFromAPI(req); + try { + const sessionRecipe = recipe_1.default.getInstanceOrThrowError(); + req.session = await sessionRecipe.verifySession(options, req, res, userContext); + if (next !== undefined) { + next(); + } + return undefined; + } catch (err) { + try { + const supertokens = supertokens_1.default.getInstanceOrThrowError(); + await supertokens.errorHandler(err, req, res, userContext); + return undefined; + } catch (_a) { + if (next !== undefined) { + next(err); + } + return err; + } + } + }; +} +exports.verifySession = verifySession; diff --git a/lib/build/recipe/session/framework/express.js b/lib/build/recipe/session/framework/express.js index 19292e2c3..a99ef67ce 100644 --- a/lib/build/recipe/session/framework/express.js +++ b/lib/build/recipe/session/framework/express.js @@ -36,7 +36,7 @@ function verifySession(options) { } catch (err) { try { const supertokens = supertokens_1.default.getInstanceOrThrowError(); - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); } catch (_a) { next(err); } diff --git a/lib/build/recipe/session/framework/fastify.js b/lib/build/recipe/session/framework/fastify.js index 9007fb99c..119d5dd24 100644 --- a/lib/build/recipe/session/framework/fastify.js +++ b/lib/build/recipe/session/framework/fastify.js @@ -34,7 +34,7 @@ function verifySession(options) { req.session = await sessionRecipe.verifySession(options, request, response, userContext); } catch (err) { const supertokens = supertokens_1.default.getInstanceOrThrowError(); - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); throw err; } }; diff --git a/lib/build/recipe/session/framework/hapi.js b/lib/build/recipe/session/framework/hapi.js index e04fa1a04..be8581c64 100644 --- a/lib/build/recipe/session/framework/hapi.js +++ b/lib/build/recipe/session/framework/hapi.js @@ -35,7 +35,7 @@ function verifySession(options) { } catch (err) { try { const supertokens = supertokens_1.default.getInstanceOrThrowError(); - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); if (response.responseSet) { let resObj = response.sendResponse(true); (req.app.lazyHeaders || []).forEach(({ key, value, allowDuplicateKey }) => { diff --git a/lib/build/recipe/session/framework/koa.js b/lib/build/recipe/session/framework/koa.js index d60b78edf..12f1d474a 100644 --- a/lib/build/recipe/session/framework/koa.js +++ b/lib/build/recipe/session/framework/koa.js @@ -35,7 +35,7 @@ function verifySession(options) { } catch (err) { try { const supertokens = supertokens_1.default.getInstanceOrThrowError(); - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); return; } catch (_a) { // We catch and ignore since we want to re-throw the original error if handling wasn't successful diff --git a/lib/build/recipe/session/framework/loopback.js b/lib/build/recipe/session/framework/loopback.js index a9f76dbad..7b4feb2da 100644 --- a/lib/build/recipe/session/framework/loopback.js +++ b/lib/build/recipe/session/framework/loopback.js @@ -36,7 +36,7 @@ function verifySession(options) { } catch (err) { try { const supertokens = supertokens_1.default.getInstanceOrThrowError(); - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); return; } catch (_a) { // We catch and ignore since we want to re-throw the original error if handling wasn't successful diff --git a/lib/build/recipe/session/recipe.d.ts b/lib/build/recipe/session/recipe.d.ts index 5577843a8..678d36663 100644 --- a/lib/build/recipe/session/recipe.d.ts +++ b/lib/build/recipe/session/recipe.d.ts @@ -42,7 +42,7 @@ export default class SessionRecipe extends RecipeModule { method: HTTPMethod, userContext: any ) => Promise; - handleError: (err: STError, request: BaseRequest, response: BaseResponse) => Promise; + handleError: (err: STError, request: BaseRequest, response: BaseResponse, userContext: any) => Promise; getAllCORSHeaders: () => string[]; isErrorFromThisRecipe: (err: any) => err is STError; verifySession: ( diff --git a/lib/build/recipe/session/recipe.js b/lib/build/recipe/session/recipe.js index e275b461c..ab82761bb 100644 --- a/lib/build/recipe/session/recipe.js +++ b/lib/build/recipe/session/recipe.js @@ -93,7 +93,7 @@ class SessionRecipe extends recipeModule_1.default { return await this.openIdRecipe.handleAPIRequest(id, tenantId, req, res, path, method, userContext); } }; - this.handleError = async (err, request, response) => { + this.handleError = async (err, request, response, userContext) => { if (err.fromRecipe === SessionRecipe.RECIPE_ID) { if (err.type === error_1.default.UNAUTHORISED) { logger_1.logDebugMessage("errorHandler: returning UNAUTHORISED"); @@ -103,7 +103,12 @@ class SessionRecipe extends recipeModule_1.default { err.payload.clearTokens === true ) { logger_1.logDebugMessage("errorHandler: Clearing tokens because of UNAUTHORISED response"); - cookieAndHeaders_1.clearSessionFromAllTokenTransferMethods(this.config, response); + cookieAndHeaders_1.clearSessionFromAllTokenTransferMethods( + this.config, + response, + request, + userContext + ); } return await this.config.errorHandlers.onUnauthorised(err.message, request, response); } else if (err.type === error_1.default.TRY_REFRESH_TOKEN) { @@ -112,7 +117,12 @@ class SessionRecipe extends recipeModule_1.default { } else if (err.type === error_1.default.TOKEN_THEFT_DETECTED) { logger_1.logDebugMessage("errorHandler: returning TOKEN_THEFT_DETECTED"); logger_1.logDebugMessage("errorHandler: Clearing tokens because of TOKEN_THEFT_DETECTED response"); - cookieAndHeaders_1.clearSessionFromAllTokenTransferMethods(this.config, response); + cookieAndHeaders_1.clearSessionFromAllTokenTransferMethods( + this.config, + response, + request, + userContext + ); return await this.config.errorHandlers.onTokenTheftDetected( err.payload.sessionHandle, err.payload.userId, @@ -155,9 +165,15 @@ class SessionRecipe extends recipeModule_1.default { }); }; this.config = utils_1.validateAndNormaliseUserInput(this, appInfo, config); - logger_1.logDebugMessage("session init: antiCsrf: " + this.config.antiCsrf); + const antiCsrfToLog = + typeof this.config.antiCsrfFunctionOrString === "string" + ? this.config.antiCsrfFunctionOrString + : "function"; + logger_1.logDebugMessage("session init: antiCsrf: " + antiCsrfToLog); logger_1.logDebugMessage("session init: cookieDomain: " + this.config.cookieDomain); - logger_1.logDebugMessage("session init: cookieSameSite: " + this.config.cookieSameSite); + const sameSiteToPrint = + config !== undefined && config.cookieSameSite !== undefined ? config.cookieSameSite : "default function"; + logger_1.logDebugMessage("session init: cookieSameSite: " + sameSiteToPrint); logger_1.logDebugMessage("session init: cookieSecure: " + this.config.cookieSecure); logger_1.logDebugMessage( "session init: refreshTokenPath: " + this.config.refreshTokenPath.getAsStringDangerous() diff --git a/lib/build/recipe/session/recipeImplementation.js b/lib/build/recipe/session/recipeImplementation.js index 99edb7219..827ecd859 100644 --- a/lib/build/recipe/session/recipeImplementation.js +++ b/lib/build/recipe/session/recipeImplementation.js @@ -125,7 +125,8 @@ function getRecipeInterface(querier, config, appInfo, getRecipeImplAfterOverride getSession: async function ({ accessToken: accessTokenString, antiCsrfToken, options }) { if ( (options === null || options === void 0 ? void 0 : options.antiCsrfCheck) !== false && - config.antiCsrf === "VIA_CUSTOM_HEADER" + typeof config.antiCsrfFunctionOrString === "string" && + config.antiCsrfFunctionOrString === "VIA_CUSTOM_HEADER" ) { throw new Error( "Since the anti-csrf mode is VIA_CUSTOM_HEADER getSession can't check the CSRF token. Please either use VIA_TOKEN or set antiCsrfCheck to false" @@ -250,7 +251,11 @@ function getRecipeInterface(querier, config, appInfo, getRecipeImplAfterOverride return SessionFunctions.getSessionInformation(helpers, sessionHandle); }, refreshSession: async function ({ refreshToken, antiCsrfToken, disableAntiCsrf }) { - if (disableAntiCsrf !== true && config.antiCsrf === "VIA_CUSTOM_HEADER") { + if ( + disableAntiCsrf !== true && + typeof config.antiCsrfFunctionOrString === "string" && + config.antiCsrfFunctionOrString === "VIA_CUSTOM_HEADER" + ) { throw new Error( "Since the anti-csrf mode is VIA_CUSTOM_HEADER getSession can't check the CSRF token. Please either use VIA_TOKEN or set antiCsrfCheck to false" ); diff --git a/lib/build/recipe/session/sessionClass.d.ts b/lib/build/recipe/session/sessionClass.d.ts index 2e071042d..7553de3e0 100644 --- a/lib/build/recipe/session/sessionClass.d.ts +++ b/lib/build/recipe/session/sessionClass.d.ts @@ -53,5 +53,5 @@ export default class Session implements SessionContainerInterface { setClaimValue(claim: SessionClaim, value: T, userContext?: any): Promise; getClaimValue(claim: SessionClaim, userContext?: any): Promise; removeClaim(claim: SessionClaim, userContext?: any): Promise; - attachToRequestResponse(info: ReqResInfo): void; + attachToRequestResponse(info: ReqResInfo, userContext?: any): void; } diff --git a/lib/build/recipe/session/sessionClass.js b/lib/build/recipe/session/sessionClass.js index ec1a2ddd6..8d6180ffb 100644 --- a/lib/build/recipe/session/sessionClass.js +++ b/lib/build/recipe/session/sessionClass.js @@ -25,6 +25,7 @@ const utils_1 = require("./utils"); const jwt_1 = require("./jwt"); const logger_1 = require("../../logger"); const constants_1 = require("./constants"); +const utils_2 = require("../../utils"); class Session { constructor( helpers, @@ -68,7 +69,13 @@ class Session { // If we instead clear the cookies only when revokeSession // returns true, it can cause this kind of a bug: // https://github.com/supertokens/supertokens-node/issues/343 - cookieAndHeaders_1.clearSession(this.helpers.config, this.reqResInfo.res, this.reqResInfo.transferMethod); + cookieAndHeaders_1.clearSession( + this.helpers.config, + this.reqResInfo.res, + this.reqResInfo.transferMethod, + this.reqResInfo.req, + userContext === undefined ? utils_2.makeDefaultUserContextFromAPI(this.reqResInfo.req) : userContext + ); } } async getSessionDataFromDatabase(userContext) { @@ -169,7 +176,9 @@ class Session { this.accessToken, this.frontToken, this.helpers.config, - this.reqResInfo.transferMethod + this.reqResInfo.transferMethod, + this.reqResInfo.req, + userContext === undefined ? utils_2.makeDefaultUserContextFromAPI(this.reqResInfo.req) : userContext ); } } else { @@ -257,7 +266,7 @@ class Session { const update = claim.removeFromPayloadByMerge_internal({}, userContext); return this.mergeIntoAccessTokenPayload(update, userContext); } - attachToRequestResponse(info) { + attachToRequestResponse(info, userContext) { this.reqResInfo = info; if (this.accessTokenUpdated) { const { res, transferMethod } = info; @@ -266,7 +275,9 @@ class Session { this.accessToken, this.frontToken, this.helpers.config, - transferMethod + transferMethod, + info.req, + userContext !== undefined ? userContext : utils_2.makeDefaultUserContextFromAPI(info.req) ); if (this.refreshToken !== undefined) { cookieAndHeaders_1.setToken( @@ -275,7 +286,9 @@ class Session { "refresh", this.refreshToken.token, this.refreshToken.expiry, - transferMethod + transferMethod, + info.req, + userContext !== undefined ? userContext : utils_2.makeDefaultUserContextFromAPI(info.req) ); } if (this.antiCsrfToken !== undefined) { diff --git a/lib/build/recipe/session/sessionFunctions.js b/lib/build/recipe/session/sessionFunctions.js index dcb3b07b1..7e1f31adf 100644 --- a/lib/build/recipe/session/sessionFunctions.js +++ b/lib/build/recipe/session/sessionFunctions.js @@ -48,7 +48,8 @@ async function createNewSession( userDataInJWT: Object.assign({}, accessTokenPayload), userDataInDatabase: sessionDataInDatabase, useDynamicSigningKey: helpers.config.useDynamicAccessTokenSigningKey, - enableAntiCsrf: !disableAntiCsrf && helpers.config.antiCsrf === "VIA_TOKEN", + // We dont need to check if anti csrf is a function here because checking for "VIA_TOKEN" is enough + enableAntiCsrf: !disableAntiCsrf && helpers.config.antiCsrfFunctionOrString === "VIA_TOKEN", }; let response = await helpers.querier.sendPostRequest( new normalisedURLPath_1.default(`/${tenantId}/recipe/session`), @@ -89,7 +90,7 @@ async function getSession(helpers, parsedAccessToken, antiCsrfToken, doAntiCsrfC accessTokenInfo = await accessToken_1.getInfoFromAccessToken( parsedAccessToken, helpers.JWKS, - helpers.config.antiCsrf === "VIA_TOKEN" && doAntiCsrfCheck + helpers.config.antiCsrfFunctionOrString === "VIA_TOKEN" && doAntiCsrfCheck ); } catch (err) { /** @@ -156,7 +157,7 @@ async function getSession(helpers, parsedAccessToken, antiCsrfToken, doAntiCsrfC * which means token verification was successful */ if (doAntiCsrfCheck) { - if (helpers.config.antiCsrf === "VIA_TOKEN") { + if (helpers.config.antiCsrfFunctionOrString === "VIA_TOKEN") { if (accessTokenInfo !== undefined) { if (antiCsrfToken === undefined || antiCsrfToken !== accessTokenInfo.antiCsrfToken) { if (antiCsrfToken === undefined) { @@ -179,7 +180,10 @@ async function getSession(helpers, parsedAccessToken, antiCsrfToken, doAntiCsrfC } } } - } else if (helpers.config.antiCsrf === "VIA_CUSTOM_HEADER") { + } else if ( + typeof helpers.config.antiCsrfFunctionOrString === "string" && + helpers.config.antiCsrfFunctionOrString === "VIA_CUSTOM_HEADER" + ) { // The function should never be called by this (we check this outside the function as well) // There we can add a bit more information to the error, so that's the primary check, this is just making sure. throw new Error("Please either use VIA_TOKEN, NONE or call with doAntiCsrfCheck false"); @@ -202,7 +206,7 @@ async function getSession(helpers, parsedAccessToken, antiCsrfToken, doAntiCsrfC accessToken: parsedAccessToken.rawTokenString, antiCsrfToken, doAntiCsrfCheck, - enableAntiCsrf: helpers.config.antiCsrf === "VIA_TOKEN", + enableAntiCsrf: helpers.config.antiCsrfFunctionOrString === "VIA_TOKEN", checkDatabase: alwaysCheckCore, }; let response = await helpers.querier.sendPostRequest( @@ -279,9 +283,13 @@ async function refreshSession(helpers, refreshToken, antiCsrfToken, disableAntiC let requestBody = { refreshToken, antiCsrfToken, - enableAntiCsrf: !disableAntiCsrf && helpers.config.antiCsrf === "VIA_TOKEN", + enableAntiCsrf: !disableAntiCsrf && helpers.config.antiCsrfFunctionOrString === "VIA_TOKEN", }; - if (helpers.config.antiCsrf === "VIA_CUSTOM_HEADER" && !disableAntiCsrf) { + if ( + typeof helpers.config.antiCsrfFunctionOrString === "string" && + helpers.config.antiCsrfFunctionOrString === "VIA_CUSTOM_HEADER" && + !disableAntiCsrf + ) { // The function should never be called by this (we check this outside the function as well) // There we can add a bit more information to the error, so that's the primary check, this is just making sure. throw new Error("Please either use VIA_TOKEN, NONE or call with doAntiCsrfCheck false"); diff --git a/lib/build/recipe/session/sessionRequestFunctions.js b/lib/build/recipe/session/sessionRequestFunctions.js index 27a22477a..fee9b14bc 100644 --- a/lib/build/recipe/session/sessionRequestFunctions.js +++ b/lib/build/recipe/session/sessionRequestFunctions.js @@ -20,11 +20,14 @@ const error_1 = __importDefault(require("./error")); const LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME = "sIdRefreshToken"; async function getSessionFromRequest({ req, res, config, recipeInterfaceImpl, options, userContext }) { logger_1.logDebugMessage("getSession: Started"); - if (!res.wrapperUsed) { - res = framework_1.default[supertokens_1.default.getInstanceOrThrowError().framework].wrapResponse(res); - } - if (!req.wrapperUsed) { - req = framework_1.default[supertokens_1.default.getInstanceOrThrowError().framework].wrapRequest(req); + const configuredFramework = supertokens_1.default.getInstanceOrThrowError().framework; + if (configuredFramework !== "custom") { + if (!req.wrapperUsed) { + req = framework_1.default[configuredFramework].wrapRequest(req); + } + if (!res.wrapperUsed) { + res = framework_1.default[configuredFramework].wrapResponse(res); + } } userContext = utils_2.setRequestInUserContextIfNotDefined(userContext, req); logger_1.logDebugMessage("getSession: Wrapping done"); @@ -93,8 +96,15 @@ async function getSessionFromRequest({ req, res, config, recipeInterfaceImpl, op if (accessToken === undefined) { doAntiCsrfCheck = false; } - if (doAntiCsrfCheck && config.antiCsrf === "VIA_CUSTOM_HEADER") { - if (config.antiCsrf === "VIA_CUSTOM_HEADER") { + let antiCsrf = config.antiCsrfFunctionOrString; + if (typeof antiCsrf === "function") { + antiCsrf = antiCsrf({ + request: req, + userContext, + }); + } + if (doAntiCsrfCheck && antiCsrf === "VIA_CUSTOM_HEADER") { + if (antiCsrf === "VIA_CUSTOM_HEADER") { if (utils_2.getRidFromHeader(req) === undefined) { logger_1.logDebugMessage( "getSession: Returning TRY_REFRESH_TOKEN because custom header (rid) was not passed" @@ -128,16 +138,19 @@ async function getSessionFromRequest({ req, res, config, recipeInterfaceImpl, op // override how the session is attached to the response. // In that scenario the transferMethod passed to attachToRequestResponse likely doesn't // matter, still, we follow the general fallback logic - await session.attachToRequestResponse({ - req, - res, - transferMethod: - requestTransferMethod !== undefined - ? requestTransferMethod - : allowedTransferMethod !== "any" - ? allowedTransferMethod - : "header", - }); + await session.attachToRequestResponse( + { + req, + res, + transferMethod: + requestTransferMethod !== undefined + ? requestTransferMethod + : allowedTransferMethod !== "any" + ? allowedTransferMethod + : "header", + }, + userContext + ); } return session; } @@ -148,11 +161,14 @@ exports.getSessionFromRequest = getSessionFromRequest; */ async function refreshSessionInRequest({ res, req, userContext, config, recipeInterfaceImpl }) { logger_1.logDebugMessage("refreshSession: Started"); - if (!res.wrapperUsed) { - res = framework_1.default[supertokens_1.default.getInstanceOrThrowError().framework].wrapResponse(res); - } - if (!req.wrapperUsed) { - req = framework_1.default[supertokens_1.default.getInstanceOrThrowError().framework].wrapRequest(req); + const configuredFramework = supertokens_1.default.getInstanceOrThrowError().framework; + if (configuredFramework !== "custom") { + if (!req.wrapperUsed) { + req = framework_1.default[configuredFramework].wrapRequest(req); + } + if (!res.wrapperUsed) { + res = framework_1.default[configuredFramework].wrapResponse(res); + } } userContext = utils_2.setRequestInUserContextIfNotDefined(userContext, req); logger_1.logDebugMessage("refreshSession: Wrapping done"); @@ -190,7 +206,16 @@ async function refreshSessionInRequest({ res, req, userContext, config, recipeIn logger_1.logDebugMessage( "refreshSession: cleared legacy id refresh token because refresh token was not found" ); - cookieAndHeaders_1.setCookie(config, res, LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME, "", 0, "accessTokenPath"); + cookieAndHeaders_1.setCookie( + config, + res, + LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME, + "", + 0, + "accessTokenPath", + req, + userContext + ); } logger_1.logDebugMessage("refreshSession: UNAUTHORISED because refresh token in request is undefined"); throw new error_1.default({ @@ -203,7 +228,14 @@ async function refreshSessionInRequest({ res, req, userContext, config, recipeIn } let disableAntiCsrf = requestTransferMethod === "header"; const antiCsrfToken = cookieAndHeaders_1.getAntiCsrfTokenFromHeaders(req); - if (config.antiCsrf === "VIA_CUSTOM_HEADER" && !disableAntiCsrf) { + let antiCsrf = config.antiCsrfFunctionOrString; + if (typeof antiCsrf === "function") { + antiCsrf = antiCsrf({ + request: req, + userContext, + }); + } + if (antiCsrf === "VIA_CUSTOM_HEADER" && !disableAntiCsrf) { if (utils_2.getRidFromHeader(req) === undefined) { logger_1.logDebugMessage( "refreshSession: Returning UNAUTHORISED because custom header (rid) was not passed" @@ -243,7 +275,9 @@ async function refreshSessionInRequest({ res, req, userContext, config, recipeIn LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME, "", 0, - "accessTokenPath" + "accessTokenPath", + req, + userContext ); } } @@ -253,19 +287,31 @@ async function refreshSessionInRequest({ res, req, userContext, config, recipeIn // We clear the tokens in all token transfer methods we are not going to overwrite for (const transferMethod of constants_1.availableTokenTransferMethods) { if (transferMethod !== requestTransferMethod && refreshTokens[transferMethod] !== undefined) { - cookieAndHeaders_1.clearSession(config, res, transferMethod); + cookieAndHeaders_1.clearSession(config, res, transferMethod, req, userContext); } } - await session.attachToRequestResponse({ - req, - res, - transferMethod: requestTransferMethod, - }); + await session.attachToRequestResponse( + { + req, + res, + transferMethod: requestTransferMethod, + }, + userContext + ); logger_1.logDebugMessage("refreshSession: Success!"); // This token isn't handled by getToken/setToken to limit the scope of this legacy/migration code if (req.getCookieValue(LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME) !== undefined) { logger_1.logDebugMessage("refreshSession: cleared legacy id refresh token after successful refresh"); - cookieAndHeaders_1.setCookie(config, res, LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME, "", 0, "accessTokenPath"); + cookieAndHeaders_1.setCookie( + config, + res, + LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME, + "", + 0, + "accessTokenPath", + req, + userContext + ); } return session; } @@ -284,11 +330,14 @@ async function createNewSessionInRequest({ tenantId, }) { logger_1.logDebugMessage("createNewSession: Started"); - if (!req.wrapperUsed) { - req = framework_1.default[supertokens_1.default.getInstanceOrThrowError().framework].wrapRequest(req); - } - if (!res.wrapperUsed) { - res = framework_1.default[supertokens_1.default.getInstanceOrThrowError().framework].wrapResponse(res); + const configuredFramework = supertokens_1.default.getInstanceOrThrowError().framework; + if (configuredFramework !== "custom") { + if (!req.wrapperUsed) { + req = framework_1.default[configuredFramework].wrapRequest(req); + } + if (!res.wrapperUsed) { + res = framework_1.default[configuredFramework].wrapResponse(res); + } } logger_1.logDebugMessage("createNewSession: Wrapping done"); userContext = utils_2.setRequestInUserContextIfNotDefined(userContext, req); @@ -310,11 +359,23 @@ async function createNewSessionInRequest({ logger_1.logDebugMessage("createNewSession: using transfer method " + outputTransferMethod); if ( outputTransferMethod === "cookie" && - config.cookieSameSite === "none" && + config.getCookieSameSite({ + request: req, + userContext, + }) === "none" && !config.cookieSecure && !( (appInfo.topLevelAPIDomain === "localhost" || utils_2.isAnIpAddress(appInfo.topLevelAPIDomain)) && - (appInfo.topLevelWebsiteDomain === "localhost" || utils_2.isAnIpAddress(appInfo.topLevelWebsiteDomain)) + (appInfo.getTopLevelWebsiteDomain({ + request: req, + userContext, + }) === "localhost" || + utils_2.isAnIpAddress( + appInfo.getTopLevelWebsiteDomain({ + request: req, + userContext, + }) + )) ) ) { // We can allow insecure cookie when both website & API domain are localhost or an IP @@ -339,15 +400,18 @@ async function createNewSessionInRequest({ transferMethod !== outputTransferMethod && cookieAndHeaders_1.getToken(req, "access", transferMethod) !== undefined ) { - cookieAndHeaders_1.clearSession(config, res, transferMethod); + cookieAndHeaders_1.clearSession(config, res, transferMethod, req, userContext); } } logger_1.logDebugMessage("createNewSession: Cleared old tokens"); - await session.attachToRequestResponse({ - req, - res, - transferMethod: outputTransferMethod, - }); + await session.attachToRequestResponse( + { + req, + res, + transferMethod: outputTransferMethod, + }, + userContext + ); logger_1.logDebugMessage("createNewSession: Attached new tokens to res"); return session; } diff --git a/lib/build/recipe/session/types.d.ts b/lib/build/recipe/session/types.d.ts index 2303c715d..220ba2f20 100644 --- a/lib/build/recipe/session/types.d.ts +++ b/lib/build/recipe/session/types.d.ts @@ -86,11 +86,15 @@ export declare type TypeNormalisedInput = { refreshTokenPath: NormalisedURLPath; accessTokenPath: NormalisedURLPath; cookieDomain: string | undefined; - cookieSameSite: "strict" | "lax" | "none"; + getCookieSameSite: (input: { request: BaseRequest | undefined; userContext: any }) => "strict" | "lax" | "none"; cookieSecure: boolean; sessionExpiredStatusCode: number; errorHandlers: NormalisedErrorHandlers; - antiCsrf: "VIA_TOKEN" | "VIA_CUSTOM_HEADER" | "NONE"; + antiCsrfFunctionOrString: + | "VIA_TOKEN" + | "VIA_CUSTOM_HEADER" + | "NONE" + | ((input: { request: BaseRequest | undefined; userContext: any }) => "VIA_CUSTOM_HEADER" | "NONE"); getTokenTransferMethod: (input: { req: BaseRequest; forCreateNewSession: boolean; @@ -305,7 +309,7 @@ export interface SessionContainerInterface { setClaimValue(claim: SessionClaim, value: T, userContext?: any): Promise; getClaimValue(claim: SessionClaim, userContext?: any): Promise; removeClaim(claim: SessionClaim, userContext?: any): Promise; - attachToRequestResponse(reqResInfo: ReqResInfo): Promise | void; + attachToRequestResponse(reqResInfo: ReqResInfo, userContext?: any): Promise | void; } export declare type APIOptions = { recipeImplementation: RecipeInterface; diff --git a/lib/build/recipe/session/utils.d.ts b/lib/build/recipe/session/utils.d.ts index dbeaf47c7..6459666f0 100644 --- a/lib/build/recipe/session/utils.d.ts +++ b/lib/build/recipe/session/utils.d.ts @@ -51,7 +51,9 @@ export declare function setAccessTokenInResponse( accessToken: string, frontToken: string, config: TypeNormalisedInput, - transferMethod: TokenTransferMethod + transferMethod: TokenTransferMethod, + req: BaseRequest | undefined, + userContext: any ): void; export declare function getRequiredClaimValidators( session: SessionContainerInterface, diff --git a/lib/build/recipe/session/utils.js b/lib/build/recipe/session/utils.js index 3cc35050f..6657eb33f 100644 --- a/lib/build/recipe/session/utils.js +++ b/lib/build/recipe/session/utils.js @@ -103,15 +103,24 @@ function validateAndNormaliseUserInput(recipeInstance, appInfo, config) { ? new normalisedURLPath_1.default("/") : new normalisedURLPath_1.default(config.accessTokenPath); let protocolOfAPIDomain = getURLProtocol(appInfo.apiDomain.getAsStringDangerous()); - let protocolOfWebsiteDomain = getURLProtocol(appInfo.websiteDomain.getAsStringDangerous()); - let cookieSameSite = - appInfo.topLevelAPIDomain !== appInfo.topLevelWebsiteDomain || protocolOfAPIDomain !== protocolOfWebsiteDomain + let cookieSameSite = (input) => { + let protocolOfWebsiteDomain = getURLProtocol( + appInfo + .getOrigin({ + request: input.request, + userContext: input.userContext, + }) + .getAsStringDangerous() + ); + return appInfo.topLevelAPIDomain !== appInfo.getTopLevelWebsiteDomain(input) || + protocolOfAPIDomain !== protocolOfWebsiteDomain ? "none" : "lax"; - cookieSameSite = - config === undefined || config.cookieSameSite === undefined - ? cookieSameSite - : normaliseSameSiteOrThrowError(config.cookieSameSite); + }; + if (config !== undefined && config.cookieSameSite !== undefined) { + let normalisedCookieSameSite = normaliseSameSiteOrThrowError(config.cookieSameSite); + cookieSameSite = () => normalisedCookieSameSite; + } let cookieSecure = config === undefined || config.cookieSecure === undefined ? appInfo.apiDomain.getAsStringDangerous().startsWith("https") @@ -130,12 +139,19 @@ function validateAndNormaliseUserInput(recipeInstance, appInfo, config) { throw new Error("antiCsrf config must be one of 'NONE' or 'VIA_CUSTOM_HEADER' or 'VIA_TOKEN'"); } } - let antiCsrf = - config === undefined || config.antiCsrf === undefined - ? cookieSameSite === "none" - ? "VIA_CUSTOM_HEADER" - : "NONE" - : config.antiCsrf; + let antiCsrf = ({ request, userContext }) => { + const sameSite = cookieSameSite({ + request, + userContext, + }); + if (sameSite === "none") { + return "VIA_CUSTOM_HEADER"; + } + return "NONE"; + }; + if (config !== undefined && config.antiCsrf !== undefined) { + antiCsrf = config.antiCsrf; + } let errorHandlers = { onTokenTheftDetected: async (sessionHandle, userId, recipeUserId, request, response) => { return await sendTokenTheftDetectedResponse( @@ -194,11 +210,11 @@ function validateAndNormaliseUserInput(recipeInstance, appInfo, config) { ? defaultGetTokenTransferMethod : config.getTokenTransferMethod, cookieDomain, - cookieSameSite, + getCookieSameSite: cookieSameSite, cookieSecure, sessionExpiredStatusCode, errorHandlers, - antiCsrf, + antiCsrfFunctionOrString: antiCsrf, override, invalidClaimStatusCode, }; @@ -213,7 +229,7 @@ function normaliseSameSiteOrThrowError(sameSite) { return sameSite; } exports.normaliseSameSiteOrThrowError = normaliseSameSiteOrThrowError; -function setAccessTokenInResponse(res, accessToken, frontToken, config, transferMethod) { +function setAccessTokenInResponse(res, accessToken, frontToken, config, transferMethod, req, userContext) { cookieAndHeaders_1.setFrontTokenInHeaders(res, frontToken); cookieAndHeaders_1.setToken( config, @@ -225,7 +241,9 @@ function setAccessTokenInResponse(res, accessToken, frontToken, config, transfer // Even if the token is expired the presence of the token indicates that the user could have a valid refresh token // Setting them to infinity would require special case handling on the frontend and just adding 100 years seems enough. Date.now() + constants_1.hundredYearsInMs, - transferMethod + transferMethod, + req, + userContext ); if (config.exposeAccessTokenToFrontendInCookieBasedAuth && transferMethod === "cookie") { cookieAndHeaders_1.setToken( @@ -238,7 +256,9 @@ function setAccessTokenInResponse(res, accessToken, frontToken, config, transfer // Even if the token is expired the presence of the token indicates that the user could have a valid refresh token // Setting them to infinity would require special case handling on the frontend and just adding 100 years seems enough. Date.now() + constants_1.hundredYearsInMs, - "header" + "header", + req, + userContext ); } } diff --git a/lib/build/recipe/thirdparty/providers/bitbucket.js b/lib/build/recipe/thirdparty/providers/bitbucket.js index 500aae8a4..27588fc51 100644 --- a/lib/build/recipe/thirdparty/providers/bitbucket.js +++ b/lib/build/recipe/thirdparty/providers/bitbucket.js @@ -21,6 +21,7 @@ var __importDefault = Object.defineProperty(exports, "__esModule", { value: true }); const utils_1 = require("./utils"); const custom_1 = __importDefault(require("./custom")); +const logger_1 = require("../../../logger"); function Bitbucket(input) { if (input.config.name === undefined) { input.config.name = "Bitbucket"; @@ -63,16 +64,32 @@ function Bitbucket(input) { undefined, headers ); - rawUserInfoFromProvider.fromUserInfoAPI = userInfoFromAccessToken; + if (userInfoFromAccessToken.status >= 400) { + logger_1.logDebugMessage( + `Received response with status ${userInfoFromAccessToken.status} and body ${userInfoFromAccessToken.stringResponse}` + ); + throw new Error( + `Received response with status ${userInfoFromAccessToken.status} and body ${userInfoFromAccessToken.stringResponse}` + ); + } + rawUserInfoFromProvider.fromUserInfoAPI = userInfoFromAccessToken.jsonResponse; const userInfoFromEmail = await utils_1.doGetRequest( "https://api.bitbucket.org/2.0/user/emails", undefined, headers ); - rawUserInfoFromProvider.fromUserInfoAPI.email = userInfoFromEmail; + if (userInfoFromEmail.status >= 400) { + logger_1.logDebugMessage( + `Received response with status ${userInfoFromEmail.status} and body ${userInfoFromEmail.stringResponse}` + ); + throw new Error( + `Received response with status ${userInfoFromEmail.status} and body ${userInfoFromEmail.stringResponse}` + ); + } + rawUserInfoFromProvider.fromUserInfoAPI.email = userInfoFromEmail.jsonResponse; let email = undefined; let isVerified = false; - for (const emailInfo of userInfoFromEmail.values) { + for (const emailInfo of userInfoFromEmail.jsonResponse.values) { if (emailInfo.is_primary) { email = emailInfo.email; isVerified = emailInfo.is_confirmed; diff --git a/lib/build/recipe/thirdparty/providers/custom.js b/lib/build/recipe/thirdparty/providers/custom.js index 4d4a4bd2b..7dfba4747 100644 --- a/lib/build/recipe/thirdparty/providers/custom.js +++ b/lib/build/recipe/thirdparty/providers/custom.js @@ -10,6 +10,7 @@ const utils_1 = require("./utils"); const pkce_challenge_1 = __importDefault(require("pkce-challenge")); const configUtils_1 = require("./configUtils"); const jose_1 = require("jose"); +const logger_1 = require("../../../logger"); const DEV_OAUTH_AUTHORIZATION_URL = "https://supertokens.io/dev/oauth/redirect-to-provider"; exports.DEV_OAUTH_REDIRECT_URL = "https://supertokens.io/dev/oauth/redirect-to-app"; // If Third Party login is used with one of the following development keys, then the dev authorization url and the redirect url will be used. @@ -250,7 +251,16 @@ function NewProvider(input) { accessTokenAPIParams["redirect_uri"] = exports.DEV_OAUTH_REDIRECT_URL; } /* Transformation needed for dev keys END */ - return await utils_1.doPostRequest(tokenAPIURL, accessTokenAPIParams); + const tokenResponse = await utils_1.doPostRequest(tokenAPIURL, accessTokenAPIParams); + if (tokenResponse.status >= 400) { + logger_1.logDebugMessage( + `Received response with status ${tokenResponse.status} and body ${tokenResponse.stringResponse}` + ); + throw new Error( + `Received response with status ${tokenResponse.status} and body ${tokenResponse.stringResponse}` + ); + } + return tokenResponse.jsonResponse; }, getUserInfo: async function ({ oAuthTokens, userContext }) { const accessToken = oAuthTokens["access_token"]; @@ -313,7 +323,15 @@ function NewProvider(input) { queryParams, headers ); - rawUserInfoFromProvider.fromUserInfoAPI = userInfoFromAccessToken; + if (userInfoFromAccessToken.status >= 400) { + logger_1.logDebugMessage( + `Received response with status ${userInfoFromAccessToken.status} and body ${userInfoFromAccessToken.stringResponse}` + ); + throw new Error( + `Received response with status ${userInfoFromAccessToken.status} and body ${userInfoFromAccessToken.stringResponse}` + ); + } + rawUserInfoFromProvider.fromUserInfoAPI = userInfoFromAccessToken.jsonResponse; } const userInfoResult = getSupertokensUserInfoResultFromRawUserInfo(impl.config, rawUserInfoFromProvider); return { diff --git a/lib/build/recipe/thirdparty/providers/github.js b/lib/build/recipe/thirdparty/providers/github.js index 14b22ce21..a656dd895 100644 --- a/lib/build/recipe/thirdparty/providers/github.js +++ b/lib/build/recipe/thirdparty/providers/github.js @@ -5,22 +5,8 @@ var __importDefault = return mod && mod.__esModule ? mod : { default: mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * 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. - */ -const cross_fetch_1 = __importDefault(require("cross-fetch")); const custom_1 = __importDefault(require("./custom")); +const utils_1 = require("./utils"); function getSupertokensUserInfoFromRawUserInfoResponseForGithub(rawUserInfoResponse) { if (rawUserInfoResponse.fromUserInfoAPI === undefined) { throw new Error("rawUserInfoResponse.fromUserInfoAPI is not available"); @@ -58,24 +44,23 @@ function Github(input) { const basicAuthToken = Buffer.from( `${clientConfig.clientId}:${clientConfig.clientSecret === undefined ? "" : clientConfig.clientSecret}` ).toString("base64"); - const applicationsResponse = await cross_fetch_1.default( + const applicationResponse = await utils_1.doPostRequest( `https://api.github.com/applications/${clientConfig.clientId}/token`, { - headers: { - Authorization: `Basic ${basicAuthToken}`, - "Content-Type": "application/json", - }, - method: "POST", - body: JSON.stringify({ - access_token: accessToken, - }), + access_token: accessToken, + }, + { + Authorization: `Basic ${basicAuthToken}`, + "Content-Type": "application/json", } ); - if (applicationsResponse.status !== 200) { + if (applicationResponse.status !== 200) { throw new Error("Invalid access token"); } - const body = await applicationsResponse.json(); - if (body.app === undefined || body.app.client_id !== clientConfig.clientId) { + if ( + applicationResponse.jsonResponse.app === undefined || + applicationResponse.jsonResponse.app.client_id !== clientConfig.clientId + ) { throw new Error("Access token does not belong to your application"); } }; @@ -96,18 +81,18 @@ function Github(input) { Accept: "application/vnd.github.v3+json", }; const rawResponse = {}; - const emailInfoResp = await cross_fetch_1.default("https://api.github.com/user/emails", { headers }); + const emailInfoResp = await utils_1.doGetRequest("https://api.github.com/user/emails", undefined, headers); if (emailInfoResp.status >= 400) { - throw new Error(`Getting userInfo failed with ${emailInfoResp.status}: ${await emailInfoResp.text()}`); + throw new Error( + `Getting userInfo failed with ${emailInfoResp.status}: ${emailInfoResp.stringResponse}` + ); } - const emailInfo = await emailInfoResp.json(); - rawResponse.emails = emailInfo; - const userInfoResp = await cross_fetch_1.default("https://api.github.com/user", { headers }); + rawResponse.emails = emailInfoResp.jsonResponse; + const userInfoResp = await utils_1.doGetRequest("https://api.github.com/user", undefined, headers); if (userInfoResp.status >= 400) { - throw new Error(`Getting userInfo failed with ${userInfoResp.status}: ${await userInfoResp.text()}`); + throw new Error(`Getting userInfo failed with ${userInfoResp.status}: ${userInfoResp.stringResponse}`); } - const userInfo = await userInfoResp.json(); - rawResponse.user = userInfo; + rawResponse.user = userInfoResp.jsonResponse; const rawUserInfoFromProvider = { fromUserInfoAPI: rawResponse, fromIdTokenPayload: {}, diff --git a/lib/build/recipe/thirdparty/providers/gitlab.js b/lib/build/recipe/thirdparty/providers/gitlab.js index a7f121c5d..456cb51b7 100644 --- a/lib/build/recipe/thirdparty/providers/gitlab.js +++ b/lib/build/recipe/thirdparty/providers/gitlab.js @@ -20,7 +20,6 @@ var __importDefault = }; Object.defineProperty(exports, "__esModule", { value: true }); const custom_1 = __importDefault(require("./custom")); -// import fetch from "cross-fetch"; // import NormalisedURLDomain from "../../../normalisedURLDomain"; function Gitlab(input) { if (input.config.name === undefined) { @@ -96,7 +95,7 @@ exports.default = Gitlab; // }) { // let accessToken = accessTokenAPIResponse.access_token; // let authHeader = `Bearer ${accessToken}`; -// let response = await fetch(baseUrl + "/api/v4/user", { +// let response = await doFetch(baseUrl + "/api/v4/user", { // method: "get", // headers: { // Authorization: authHeader, diff --git a/lib/build/recipe/thirdparty/providers/linkedin.js b/lib/build/recipe/thirdparty/providers/linkedin.js index 9e1e482a8..3b5c26e7f 100644 --- a/lib/build/recipe/thirdparty/providers/linkedin.js +++ b/lib/build/recipe/thirdparty/providers/linkedin.js @@ -5,6 +5,21 @@ var __importDefault = return mod && mod.__esModule ? mod : { default: mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * 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. + */ +const logger_1 = require("../../../logger"); const custom_1 = __importDefault(require("./custom")); const utils_1 = require("./utils"); function Linkedin(input) { @@ -44,19 +59,36 @@ function Linkedin(input) { undefined, headers ); - rawUserInfoFromProvider.fromUserInfoAPI = userInfoFromAccessToken; + rawUserInfoFromProvider.fromUserInfoAPI = userInfoFromAccessToken.jsonResponse; + if (userInfoFromAccessToken.status >= 400) { + logger_1.logDebugMessage( + `Received response with status ${userInfoFromAccessToken.status} and body ${userInfoFromAccessToken.stringResponse}` + ); + throw new Error( + `Received response with status ${userInfoFromAccessToken.status} and body ${userInfoFromAccessToken.stringResponse}` + ); + } const emailAPIURL = "https://api.linkedin.com/v2/emailAddress"; const userInfoFromEmail = await utils_1.doGetRequest( emailAPIURL, { q: "members", projection: "(elements*(handle~))" }, headers ); - if (userInfoFromEmail.elements && userInfoFromEmail.elements.length > 0) { - rawUserInfoFromProvider.fromUserInfoAPI.email = userInfoFromEmail.elements[0]["handle~"].emailAddress; + if (userInfoFromEmail.status >= 400) { + logger_1.logDebugMessage( + `Received response with status ${userInfoFromEmail.status} and body ${userInfoFromEmail.stringResponse}` + ); + throw new Error( + `Received response with status ${userInfoFromEmail.status} and body ${userInfoFromEmail.stringResponse}` + ); + } + if (userInfoFromEmail.jsonResponse.elements && userInfoFromEmail.jsonResponse.elements.length > 0) { + rawUserInfoFromProvider.fromUserInfoAPI.email = + userInfoFromEmail.jsonResponse.elements[0]["handle~"].emailAddress; } rawUserInfoFromProvider.fromUserInfoAPI = Object.assign( Object.assign({}, rawUserInfoFromProvider.fromUserInfoAPI), - userInfoFromEmail + userInfoFromEmail.jsonResponse ); return { thirdPartyUserId: rawUserInfoFromProvider.fromUserInfoAPI.id, diff --git a/lib/build/recipe/thirdparty/providers/twitter.js b/lib/build/recipe/thirdparty/providers/twitter.js index 61818eb30..3e54592c7 100644 --- a/lib/build/recipe/thirdparty/providers/twitter.js +++ b/lib/build/recipe/thirdparty/providers/twitter.js @@ -36,6 +36,21 @@ var __importStar = return result; }; Object.defineProperty(exports, "__esModule", { value: true }); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * 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. + */ +const logger_1 = require("../../../logger"); const custom_1 = __importStar(require("./custom")); const utils_1 = require("./utils"); function Twitter(input) { @@ -101,9 +116,22 @@ function Twitter(input) { }, originalImplementation.config.tokenEndpointBodyParams ); - return await utils_1.doPostRequest(originalImplementation.config.tokenEndpoint, twitterOauthTokenParams, { - Authorization: `Basic ${basicAuthToken}`, - }); + const tokenResponse = await utils_1.doPostRequest( + originalImplementation.config.tokenEndpoint, + twitterOauthTokenParams, + { + Authorization: `Basic ${basicAuthToken}`, + } + ); + if (tokenResponse.status >= 400) { + logger_1.logDebugMessage( + `Received response with status ${tokenResponse.status} and body ${tokenResponse.stringResponse}` + ); + throw new Error( + `Received response with status ${tokenResponse.status} and body ${tokenResponse.stringResponse}` + ); + } + return tokenResponse.jsonResponse; }; if (oOverride !== undefined) { originalImplementation = oOverride(originalImplementation); diff --git a/lib/build/recipe/thirdparty/providers/utils.d.ts b/lib/build/recipe/thirdparty/providers/utils.d.ts index fe9b9e048..34ac7d565 100644 --- a/lib/build/recipe/thirdparty/providers/utils.d.ts +++ b/lib/build/recipe/thirdparty/providers/utils.d.ts @@ -9,7 +9,11 @@ export declare function doGetRequest( headers?: { [key: string]: string; } -): Promise; +): Promise<{ + jsonResponse: Record | undefined; + status: number; + stringResponse: string; +}>; export declare function doPostRequest( url: string, params: { @@ -18,7 +22,11 @@ export declare function doPostRequest( headers?: { [key: string]: string; } -): Promise; +): Promise<{ + jsonResponse: Record | undefined; + status: number; + stringResponse: string; +}>; export declare function verifyIdTokenFromJWKSEndpointAndGetPayload( idToken: string, jwks: jose.JWTVerifyGetKey, diff --git a/lib/build/recipe/thirdparty/providers/utils.js b/lib/build/recipe/thirdparty/providers/utils.js index 7e5896f2c..1d6c81d8d 100644 --- a/lib/build/recipe/thirdparty/providers/utils.js +++ b/lib/build/recipe/thirdparty/providers/utils.js @@ -42,11 +42,11 @@ var __importDefault = }; Object.defineProperty(exports, "__esModule", { value: true }); exports.discoverOIDCEndpoints = exports.verifyIdTokenFromJWKSEndpointAndGetPayload = exports.doPostRequest = exports.doGetRequest = void 0; -const cross_fetch_1 = __importDefault(require("cross-fetch")); const jose = __importStar(require("jose")); const normalisedURLDomain_1 = __importDefault(require("../../../normalisedURLDomain")); const normalisedURLPath_1 = __importDefault(require("../../../normalisedURLPath")); const logger_1 = require("../../../logger"); +const utils_1 = require("../../../utils"); async function doGetRequest(url, queryParams, headers) { logger_1.logDebugMessage( `GET request to ${url}, with query params ${JSON.stringify(queryParams)} and headers ${JSON.stringify(headers)}` @@ -56,18 +56,20 @@ async function doGetRequest(url, queryParams, headers) { } const finalURL = new URL(url); finalURL.search = new URLSearchParams(queryParams).toString(); - let response = await cross_fetch_1.default(finalURL.toString(), { + let response = await utils_1.doFetch(finalURL.toString(), { headers: headers, }); - if (response.status >= 400) { - logger_1.logDebugMessage( - `Received response with status ${response.status} and body ${await response.clone().text()}` - ); - throw new Error(`Received response with status ${response.status} and body ${await response.clone().text()}`); + const stringResponse = await response.text(); + let jsonResponse = undefined; + if (response.status < 400) { + jsonResponse = JSON.parse(stringResponse); } - const respData = await response.clone().json(); - logger_1.logDebugMessage(`Received response with status ${response.status} and body ${JSON.stringify(respData)}`); - return respData; + logger_1.logDebugMessage(`Received response with status ${response.status} and body ${stringResponse}`); + return { + stringResponse, + status: response.status, + jsonResponse, + }; } exports.doGetRequest = doGetRequest; async function doPostRequest(url, params, headers) { @@ -80,20 +82,22 @@ async function doPostRequest(url, params, headers) { `POST request to ${url}, with params ${JSON.stringify(params)} and headers ${JSON.stringify(headers)}` ); const body = new URLSearchParams(params).toString(); - let response = await cross_fetch_1.default(url, { + let response = await utils_1.doFetch(url, { method: "POST", body, headers, }); - if (response.status >= 400) { - logger_1.logDebugMessage( - `Received response with status ${response.status} and body ${await response.clone().text()}` - ); - throw new Error(`Received response with status ${response.status} and body ${await response.clone().text()}`); + const stringResponse = await response.text(); + let jsonResponse = undefined; + if (response.status < 400) { + jsonResponse = JSON.parse(stringResponse); } - const respData = await response.clone().json(); - logger_1.logDebugMessage(`Received response with status ${response.status} and body ${JSON.stringify(respData)}`); - return respData; + logger_1.logDebugMessage(`Received response with status ${response.status} and body ${stringResponse}`); + return { + stringResponse, + status: response.status, + jsonResponse, + }; } exports.doPostRequest = doPostRequest; async function verifyIdTokenFromJWKSEndpointAndGetPayload(idToken, jwks, otherOptions) { @@ -114,8 +118,14 @@ async function getOIDCDiscoveryInfo(issuer) { const oidcInfo = await doGetRequest( normalizedDomain.getAsStringDangerous() + normalizedPath.getAsStringDangerous() ); - oidcInfoMap[issuer] = oidcInfo; - return oidcInfo; + if (oidcInfo.status >= 400) { + logger_1.logDebugMessage( + `Received response with status ${oidcInfo.status} and body ${oidcInfo.stringResponse}` + ); + throw new Error(`Received response with status ${oidcInfo.status} and body ${oidcInfo.stringResponse}`); + } + oidcInfoMap[issuer] = oidcInfo.jsonResponse; + return oidcInfo.jsonResponse; } async function discoverOIDCEndpoints(config) { if (config.oidcDiscoveryEndpoint !== undefined) { diff --git a/lib/build/recipe/thirdpartyemailpassword/index.js b/lib/build/recipe/thirdpartyemailpassword/index.js index d52b53fa7..72f6ea4f8 100644 --- a/lib/build/recipe/thirdpartyemailpassword/index.js +++ b/lib/build/recipe/thirdpartyemailpassword/index.js @@ -121,6 +121,8 @@ class Wrapper { recipeId: recipeInstance.getRecipeId(), token: token.token, tenantId, + request: __1.getRequestFromUserContext(userContext), + userContext, }), }; } diff --git a/lib/build/recipe/thirdpartypasswordless/index.js b/lib/build/recipe/thirdpartypasswordless/index.js index 74818d841..a53f843e9 100644 --- a/lib/build/recipe/thirdpartypasswordless/index.js +++ b/lib/build/recipe/thirdpartypasswordless/index.js @@ -22,6 +22,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.sendSms = exports.sendEmail = exports.createMagicLink = exports.revokeCode = exports.revokeAllCodes = exports.updatePasswordlessUser = exports.createNewCodeForDevice = exports.listCodesByPreAuthSessionId = exports.listCodesByPhoneNumber = exports.listCodesByEmail = exports.listCodesByDeviceId = exports.consumeCode = exports.createCode = exports.passwordlessSignInUp = exports.thirdPartyManuallyCreateOrUpdateUser = exports.thirdPartyGetProvider = exports.Error = exports.init = void 0; const recipe_1 = __importDefault(require("./recipe")); const error_1 = __importDefault(require("./error")); +const __1 = require("../.."); class Wrapper { static async thirdPartyGetProvider(tenantId, thirdPartyId, clientType, userContext = {}) { return await recipe_1.default.getInstanceOrThrowError().recipeInterfaceImpl.thirdPartyGetProvider({ @@ -132,6 +133,7 @@ class Wrapper { var _a; return recipe_1.default.getInstanceOrThrowError().passwordlessRecipe.createMagicLink( Object.assign(Object.assign({}, input), { + request: __1.getRequestFromUserContext(input.userContext), userContext: (_a = input.userContext) !== null && _a !== void 0 ? _a : {}, }) ); diff --git a/lib/build/recipeModule.d.ts b/lib/build/recipeModule.d.ts index 64830a119..44c840f74 100644 --- a/lib/build/recipeModule.d.ts +++ b/lib/build/recipeModule.d.ts @@ -30,7 +30,7 @@ export default abstract class RecipeModule { method: HTTPMethod, userContext: any ): Promise; - abstract handleError(error: STError, request: BaseRequest, response: BaseResponse): Promise; + abstract handleError(error: STError, request: BaseRequest, response: BaseResponse, userContext: any): Promise; abstract getAllCORSHeaders(): string[]; abstract isErrorFromThisRecipe(err: any): err is STError; } diff --git a/lib/build/supertokens.d.ts b/lib/build/supertokens.d.ts index 1e7ab3210..2e7ace14e 100644 --- a/lib/build/supertokens.d.ts +++ b/lib/build/supertokens.d.ts @@ -73,6 +73,6 @@ export default class SuperTokens { status: "OK" | "UNKNOWN_MAPPING_ERROR"; }>; middleware: (request: BaseRequest, response: BaseResponse, userContext: any) => Promise; - errorHandler: (err: any, request: BaseRequest, response: BaseResponse) => Promise; + errorHandler: (err: any, request: BaseRequest, response: BaseResponse, userContext: any) => Promise; getRequestFromUserContext: (userContext: any | undefined) => BaseRequest | undefined; } diff --git a/lib/build/supertokens.js b/lib/build/supertokens.js index 5aaf75405..61c14e77d 100644 --- a/lib/build/supertokens.js +++ b/lib/build/supertokens.js @@ -225,7 +225,7 @@ class SuperTokens { return false; } }; - this.errorHandler = async (err, request, response) => { + this.errorHandler = async (err, request, response, userContext) => { logger_1.logDebugMessage("errorHandler: Started"); if (error_1.default.isErrorFromSuperTokens(err)) { logger_1.logDebugMessage("errorHandler: Error is from SuperTokens recipe. Message: " + err.message); @@ -241,7 +241,7 @@ class SuperTokens { logger_1.logDebugMessage( "errorHandler: Matched with recipeID: " + this.recipeModules[i].getRecipeId() ); - return await this.recipeModules[i].handleError(err, request, response); + return await this.recipeModules[i].handleError(err, request, response, userContext); } } } @@ -263,7 +263,15 @@ class SuperTokens { return userContext._default.request; }; logger_1.logDebugMessage("Started SuperTokens with debug logging (supertokens.init called)"); - logger_1.logDebugMessage("appInfo: " + JSON.stringify(config.appInfo)); + const originToPrint = + config.appInfo.origin === undefined + ? undefined + : typeof config.appInfo.origin === "string" + ? config.appInfo.origin + : "function"; + logger_1.logDebugMessage( + "appInfo: " + JSON.stringify(Object.assign(Object.assign({}, config.appInfo), { origin: originToPrint })) + ); this.framework = config.framework !== undefined ? config.framework : "express"; logger_1.logDebugMessage("framework: " + this.framework); this.appInfo = utils_1.normaliseInputAppInfoOrThrowError(config.appInfo); diff --git a/lib/build/types.d.ts b/lib/build/types.d.ts index 0c650218f..6a924d65d 100644 --- a/lib/build/types.d.ts +++ b/lib/build/types.d.ts @@ -4,9 +4,11 @@ import NormalisedURLDomain from "./normalisedURLDomain"; import NormalisedURLPath from "./normalisedURLPath"; import { TypeFramework } from "./framework/types"; import { RecipeLevelUser } from "./recipe/accountlinking/types"; +import { BaseRequest } from "./framework"; export declare type AppInfo = { appName: string; - websiteDomain: string; + websiteDomain?: string; + origin?: string | ((input: { request: BaseRequest | undefined; userContext: any }) => string); websiteBasePath?: string; apiDomain: string; apiBasePath?: string; @@ -14,10 +16,10 @@ export declare type AppInfo = { }; export declare type NormalisedAppinfo = { appName: string; - websiteDomain: NormalisedURLDomain; + getOrigin: (input: { request: BaseRequest | undefined; userContext: any }) => NormalisedURLDomain; apiDomain: NormalisedURLDomain; topLevelAPIDomain: string; - topLevelWebsiteDomain: string; + getTopLevelWebsiteDomain: (input: { request: BaseRequest | undefined; userContext: any }) => string; apiBasePath: NormalisedURLPath; apiGatewayPath: NormalisedURLPath; websiteBasePath: NormalisedURLPath; diff --git a/lib/build/utils.d.ts b/lib/build/utils.d.ts index 6d796ecce..b7b2b17ed 100644 --- a/lib/build/utils.d.ts +++ b/lib/build/utils.d.ts @@ -3,6 +3,7 @@ import type { AppInfo, NormalisedAppinfo, HTTPMethod, JSONObject } from "./types import type { BaseRequest, BaseResponse } from "./framework"; import { User } from "./user"; import { SessionContainer } from "./recipe/session"; +export declare const doFetch: typeof fetch; export declare function getLargestVersionFromIntersection(v1: string[], v2: string[]): string | undefined; export declare function maxVersion(version1: string, version2: string): string; export declare function normaliseInputAppInfoOrThrowError(appInfo: AppInfo): NormalisedAppinfo; diff --git a/lib/build/utils.js b/lib/build/utils.js index b210e2623..b6d6909f9 100644 --- a/lib/build/utils.js +++ b/lib/build/utils.js @@ -41,13 +41,20 @@ var __importDefault = return mod && mod.__esModule ? mod : { default: mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.normaliseEmail = exports.postWithFetch = exports.getFromObjectCaseInsensitive = exports.getTopLevelDomainForSameSiteResolution = exports.setRequestInUserContextIfNotDefined = exports.makeDefaultUserContextFromAPI = exports.humaniseMilliseconds = exports.frontendHasInterceptor = exports.getRidFromHeader = exports.doesRequestSupportFDI = exports.getBackwardsCompatibleUserInfo = exports.isAnIpAddress = exports.send200Response = exports.sendNon200Response = exports.sendNon200ResponseWithMessage = exports.normaliseHttpMethod = exports.normaliseInputAppInfoOrThrowError = exports.maxVersion = exports.getLargestVersionFromIntersection = void 0; +exports.normaliseEmail = exports.postWithFetch = exports.getFromObjectCaseInsensitive = exports.getTopLevelDomainForSameSiteResolution = exports.setRequestInUserContextIfNotDefined = exports.makeDefaultUserContextFromAPI = exports.humaniseMilliseconds = exports.frontendHasInterceptor = exports.getRidFromHeader = exports.doesRequestSupportFDI = exports.getBackwardsCompatibleUserInfo = exports.isAnIpAddress = exports.send200Response = exports.sendNon200Response = exports.sendNon200ResponseWithMessage = exports.normaliseHttpMethod = exports.normaliseInputAppInfoOrThrowError = exports.maxVersion = exports.getLargestVersionFromIntersection = exports.doFetch = void 0; const psl = __importStar(require("psl")); const normalisedURLDomain_1 = __importDefault(require("./normalisedURLDomain")); const normalisedURLPath_1 = __importDefault(require("./normalisedURLPath")); const logger_1 = require("./logger"); const constants_1 = require("./constants"); const cross_fetch_1 = __importDefault(require("cross-fetch")); +const doFetch = (...args) => { + if (typeof fetch !== "undefined") { + return fetch(...args); + } + return cross_fetch_1.default(...args); +}; +exports.doFetch = doFetch; function getLargestVersionFromIntersection(v1, v2) { let intersection = v1.filter((value) => v2.indexOf(value) !== -1); if (intersection.length === 0) { @@ -89,20 +96,37 @@ function normaliseInputAppInfoOrThrowError(appInfo) { if (appInfo.appName === undefined) { throw new Error("Please provide your appName inside the appInfo object when calling supertokens.init"); } - if (appInfo.websiteDomain === undefined) { - throw new Error("Please provide your websiteDomain inside the appInfo object when calling supertokens.init"); - } let apiGatewayPath = appInfo.apiGatewayPath !== undefined ? new normalisedURLPath_1.default(appInfo.apiGatewayPath) : new normalisedURLPath_1.default(""); - const websiteDomain = new normalisedURLDomain_1.default(appInfo.websiteDomain); + if (appInfo.origin === undefined && appInfo.websiteDomain === undefined) { + throw new Error( + "Please provide either origin or websiteDomain inside the appInfo object when calling supertokens.init" + ); + } + let websiteDomainFunction = (input) => { + let origin = appInfo.origin; + if (origin === undefined) { + origin = appInfo.websiteDomain; + } + // This should not be possible because we check for either origin or websiteDomain above + if (origin === undefined) { + throw new Error("Should never come here"); + } + if (typeof origin === "function") { + origin = origin(input); + } + return new normalisedURLDomain_1.default(origin); + }; const apiDomain = new normalisedURLDomain_1.default(appInfo.apiDomain); const topLevelAPIDomain = getTopLevelDomainForSameSiteResolution(apiDomain.getAsStringDangerous()); - const topLevelWebsiteDomain = getTopLevelDomainForSameSiteResolution(websiteDomain.getAsStringDangerous()); + const topLevelWebsiteDomain = (input) => { + return getTopLevelDomainForSameSiteResolution(websiteDomainFunction(input).getAsStringDangerous()); + }; return { appName: appInfo.appName, - websiteDomain, + getOrigin: websiteDomainFunction, apiDomain, apiBasePath: apiGatewayPath.appendPath( appInfo.apiBasePath === undefined @@ -115,7 +139,7 @@ function normaliseInputAppInfoOrThrowError(appInfo) { : new normalisedURLPath_1.default(appInfo.websiteBasePath), apiGatewayPath, topLevelAPIDomain, - topLevelWebsiteDomain, + getTopLevelWebsiteDomain: topLevelWebsiteDomain, }; } exports.normaliseInputAppInfoOrThrowError = normaliseInputAppInfoOrThrowError; @@ -269,6 +293,9 @@ function getTopLevelDomainForSameSiteResolution(url) { } let parsedURL = psl.parse(hostname); if (parsedURL.domain === null) { + if (hostname.endsWith(".amazonaws.com") && parsedURL.tld === hostname) { + return hostname; + } throw new Error("Please make sure that the apiDomain and websiteDomain have correct values"); } return parsedURL.domain; @@ -286,7 +313,7 @@ async function postWithFetch(url, headers, body, { successLog, errorLogHeader }) let error; let resp; try { - const fetchResp = await cross_fetch_1.default(url, { + const fetchResp = await exports.doFetch(url, { method: "POST", body: JSON.stringify(body), headers, diff --git a/lib/build/version.d.ts b/lib/build/version.d.ts index b4855d369..58a718bf4 100644 --- a/lib/build/version.d.ts +++ b/lib/build/version.d.ts @@ -1,4 +1,4 @@ // @ts-nocheck -export declare const version = "16.2.0"; +export declare const version = "16.3.4"; export declare const cdiSupported: string[]; export declare const dashboardVersion = "0.8"; diff --git a/lib/build/version.js b/lib/build/version.js index f924b34b1..1a39a60ae 100644 --- a/lib/build/version.js +++ b/lib/build/version.js @@ -15,7 +15,7 @@ exports.dashboardVersion = exports.cdiSupported = exports.version = void 0; * License for the specific language governing permissions and limitations * under the License. */ -exports.version = "16.2.0"; +exports.version = "16.3.4"; exports.cdiSupported = ["4.0"]; // Note: The actual script import for dashboard uses v{DASHBOARD_VERSION} exports.dashboardVersion = "0.8"; diff --git a/lib/ts/framework/awsLambda/framework.ts b/lib/ts/framework/awsLambda/framework.ts index da5cd2958..eaf9b5167 100644 --- a/lib/ts/framework/awsLambda/framework.ts +++ b/lib/ts/framework/awsLambda/framework.ts @@ -213,7 +213,10 @@ export class AWSResponse extends BaseResponse { sameSite: "strict" | "lax" | "none" ) => { let serialisedCookie = serializeCookieValue(key, value, domain, secure, httpOnly, expires, path, sameSite); - this.event.supertokens.response.cookies.push(serialisedCookie); + this.event.supertokens.response.cookies = [ + ...this.event.supertokens.response.cookies.filter((c) => !c.startsWith(key + "=")), + serialisedCookie, + ]; }; /** @@ -265,8 +268,18 @@ export class AWSResponse extends BaseResponse { } } if (supertokensHeaders[i].allowDuplicateKey && currentValue !== undefined) { - let newValue = `${currentValue}, ${supertokensHeaders[i].value}`; - headers[supertokensHeaders[i].key] = newValue; + /** + We only want to append if it does not already exist + For example if the caller is trying to add front token to the access control exposed headers property + we do not want to append if something else had already added it + */ + if ( + typeof currentValue !== "string" || + !currentValue.includes(supertokensHeaders[i].value.toString()) + ) { + let newValue = `${currentValue}, ${supertokensHeaders[i].value}`; + headers[supertokensHeaders[i].key] = newValue; + } } else { headers[supertokensHeaders[i].key] = supertokensHeaders[i].value; } @@ -344,7 +357,7 @@ export const middleware = (handler?: Handler): Handler => { }); return response.sendResponse(); } catch (err) { - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); if (response.responseSet) { return response.sendResponse(); } diff --git a/lib/ts/framework/custom/framework.ts b/lib/ts/framework/custom/framework.ts new file mode 100644 index 000000000..8dd2141d4 --- /dev/null +++ b/lib/ts/framework/custom/framework.ts @@ -0,0 +1,224 @@ +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * 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. + */ + +import type { HTTPMethod } from "../../types"; +import { makeDefaultUserContextFromAPI, normaliseHttpMethod } from "../../utils"; +import { BaseRequest } from "../request"; +import { BaseResponse } from "../response"; +import SuperTokens from "../../supertokens"; +import { SessionContainerInterface } from "../../recipe/session/types"; + +type RequestInfo = { + url: string; + method: HTTPMethod; + headers: Headers; + cookies: Record; + query: Record; + getJSONBody: () => Promise; + getFormBody: () => Promise; + setSession?: (session: SessionContainerInterface) => void; +}; + +export class PreParsedRequest extends BaseRequest { + private request: RequestInfo; + + private _session?: SessionContainerInterface | undefined; + public get session(): SessionContainerInterface | undefined { + return this._session; + } + public set session(value: SessionContainerInterface | undefined) { + this._session = value; + if (value !== undefined && this.request.setSession !== undefined) { + this.request.setSession(value); + } + } + + constructor(request: RequestInfo) { + super(); + this.original = request; + this.request = request; + } + + getFormData = async (): Promise => { + return this.request.getFormBody(); + }; + + getKeyValueFromQuery = (key: string): string | undefined => { + if (this.request.query === undefined) { + return undefined; + } + let value = this.request.query[key]; + if (value === undefined || typeof value !== "string") { + return undefined; + } + return value; + }; + + getJSONBody = async (): Promise => { + return this.request.getJSONBody(); + }; + + getMethod = (): HTTPMethod => { + return normaliseHttpMethod(this.request.method); + }; + + getCookieValue = (key: string): string | undefined => { + return this.request.cookies[key]; + }; + + getHeaderValue = (key: string): string | undefined => { + return this.request.headers.get(key) ?? undefined; + }; + + getOriginalURL = (): string => { + return this.request.url; + }; +} + +export type CookieInfo = { + key: string; + value: string; + domain: string | undefined; + secure: boolean; + httpOnly: boolean; + expires: number; + path: string; + sameSite: "strict" | "lax" | "none"; +}; + +export class CollectingResponse extends BaseResponse { + public statusCode: number; + public readonly headers: Headers; + public readonly cookies: CookieInfo[]; + public body?: string; + + constructor() { + super(); + this.headers = new Headers(); + this.statusCode = 200; + this.cookies = []; + } + + sendHTMLResponse = (html: string) => { + this.headers.set("Content-Type", "text/html"); + this.body = html; + }; + + setHeader = (key: string, value: string, allowDuplicateKey: boolean) => { + if (allowDuplicateKey) { + /** + We only want to append if it does not already exist + For example if the caller is trying to add front token to the access control exposed headers property + we do not want to append if something else had already added it + */ + if (!this.headers.get(key)?.includes(value)) { + this.headers.append(key, value); + } + } else { + this.headers.set(key, value); + } + }; + + removeHeader = (key: string) => { + this.headers.delete(key); + }; + + setCookie = ( + key: string, + value: string, + domain: string | undefined, + secure: boolean, + httpOnly: boolean, + expires: number, + path: string, + sameSite: "strict" | "lax" | "none" + ) => { + this.cookies.push({ key, value, domain, secure, httpOnly, expires, path, sameSite }); + }; + + /** + * @param {number} statusCode + */ + setStatusCode = (statusCode: number) => { + this.statusCode = statusCode; + }; + + sendJSONResponse = (content: any) => { + this.headers.set("Content-Type", "application/json"); + this.body = JSON.stringify(content); + }; +} + +export type NextFunction = (err?: any) => void; + +const identity = (i: any) => i; +export const middleware = ( + wrapRequest: (req: OrigReqType) => BaseRequest = identity, + wrapResponse: (req: OrigRespType) => BaseResponse = identity +) => { + return async (request: OrigReqType, response: OrigRespType, next?: NextFunction) => { + const wrappedReq = wrapRequest(request); + const wrappedResp = wrapResponse(response); + let supertokens; + const userContext = makeDefaultUserContextFromAPI(wrappedReq); + + try { + supertokens = SuperTokens.getInstanceOrThrowError(); + const result = await supertokens.middleware(wrappedReq, wrappedResp, userContext); + if (!result) { + if (next) { + next(); + } + return { handled: false }; + } + return { handled: true }; + } catch (err) { + if (supertokens) { + try { + await supertokens.errorHandler(err, wrappedReq, wrappedResp, userContext); + return { handled: true }; + } catch { + if (next) { + next(err); + } + return { error: err }; + } + } else { + if (next) { + next(err); + } + return { error: err }; + } + } + }; +}; + +export const errorHandler = () => { + return async (err: any, request: BaseRequest, response: BaseResponse, next: NextFunction) => { + let supertokens = SuperTokens.getInstanceOrThrowError(); + const userContext = makeDefaultUserContextFromAPI(request); + + try { + await supertokens.errorHandler(err, request, response, userContext); + } catch (err) { + return next(err); + } + }; +}; + +export const CustomFrameworkWrapper = { + middleware, + errorHandler, +}; diff --git a/lib/ts/framework/custom/index.ts b/lib/ts/framework/custom/index.ts new file mode 100644 index 000000000..0f01e9556 --- /dev/null +++ b/lib/ts/framework/custom/index.ts @@ -0,0 +1,20 @@ +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * 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. + */ + +import { CustomFrameworkWrapper } from "./framework"; +export { PreParsedRequest, CollectingResponse } from "./framework"; + +export const middleware = CustomFrameworkWrapper.middleware; +export const errorHandler = CustomFrameworkWrapper.errorHandler; diff --git a/lib/ts/framework/express/framework.ts b/lib/ts/framework/express/framework.ts index ca381fa5e..c4a97e23f 100644 --- a/lib/ts/framework/express/framework.ts +++ b/lib/ts/framework/express/framework.ts @@ -169,7 +169,7 @@ export const middleware = () => { } catch (err) { if (supertokens) { try { - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); } catch { next(err); } @@ -184,8 +184,9 @@ export const errorHandler = () => { let supertokens = SuperTokens.getInstanceOrThrowError(); let request = new ExpressRequest(req); let response = new ExpressResponse(res); + const userContext = makeDefaultUserContextFromAPI(request); try { - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); } catch (err) { return next(err); } diff --git a/lib/ts/framework/fastify/framework.ts b/lib/ts/framework/fastify/framework.ts index 4d47796cc..91bcd82ff 100644 --- a/lib/ts/framework/fastify/framework.ts +++ b/lib/ts/framework/fastify/framework.ts @@ -100,7 +100,14 @@ export class FastifyResponse extends BaseResponse { if (existingValue === undefined) { this.response.header(key, value); } else if (allowDuplicateKey) { - this.response.header(key, existingValue + ", " + value); + /** + We only want to append if it does not already exist + For example if the caller is trying to add front token to the access control exposed headers property + we do not want to append if something else had already added it + */ + if (typeof existingValue !== "string" || !existingValue.includes(value)) { + this.response.header(key, existingValue + ", " + value); + } } else { // we overwrite the current one with the new one this.response.header(key, value); @@ -125,43 +132,16 @@ export class FastifyResponse extends BaseResponse { sameSite: "strict" | "lax" | "none" ) => { let serialisedCookie = serializeCookieValue(key, value, domain, secure, httpOnly, expires, path, sameSite); - /** - * lets say if current value is undefined, prev -> undefined - * - * now if add AT, - * cookieValueToSetInHeader -> AT - * response header object will be: - * - * 'set-cookie': AT - * - * now if add RT, - * - * prev -> AT - * cookieValueToSetInHeader -> AT + RT - * and response header object will be: - * - * 'set-cookie': AT + AT + RT - * - * now if add IRT, - * - * prev -> AT + AT + RT - * cookieValueToSetInHeader -> IRT + AT + AT + RT - * and response header object will be: - * - * 'set-cookie': AT + AT + RT + IRT + AT + AT + RT - * - * To avoid this, we no longer get and use the previous value - * - * Old code: - * - * let prev: string | string[] | undefined = this.response.getHeader(COOKIE_HEADER) as - * | string - * | string[] - * | undefined; - * let cookieValueToSetInHeader = getCookieValueToSetInHeader(prev, serialisedCookie, key); - * this.response.header(COOKIE_HEADER, cookieValueToSetInHeader); - */ - this.response.header(COOKIE_HEADER, serialisedCookie); + + let oldHeaders: string | string[] | undefined = this.response.getHeader(COOKIE_HEADER); + if (oldHeaders === undefined) oldHeaders = []; + else if (!((oldHeaders as any) instanceof Array)) oldHeaders = [oldHeaders]; + + this.response.removeHeader(COOKIE_HEADER); + this.response.header(COOKIE_HEADER, [ + ...(oldHeaders as string[]).filter((h) => !h.startsWith(key + "=")), + serialisedCookie, + ]); }; /** @@ -194,7 +174,7 @@ function plugin(fastify: FastifyInstance, _: any, done: Function) { try { await supertokens.middleware(request, response, userContext); } catch (err) { - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); } }); done(); @@ -215,7 +195,8 @@ export const errorHandler = () => { let supertokens = SuperTokens.getInstanceOrThrowError(); let request = new FastifyRequest(req); let response = new FastifyResponse(res); - await supertokens.errorHandler(err, request, response); + let userContext = makeDefaultUserContextFromAPI(request); + await supertokens.errorHandler(err, request, response, userContext); }; }; diff --git a/lib/ts/framework/hapi/framework.ts b/lib/ts/framework/hapi/framework.ts index 408719a3c..d3d3fbf6b 100644 --- a/lib/ts/framework/hapi/framework.ts +++ b/lib/ts/framework/hapi/framework.ts @@ -200,9 +200,10 @@ const plugin: Plugin<{}> = { let err = (request.response as Boom).data || request.response; let req = new HapiRequest(request); let res = new HapiResponse(h as ExtendedResponseToolkit); + const userContext = makeDefaultUserContextFromAPI(req); if (err !== undefined && err !== null) { try { - await supertokens.errorHandler(err, req, res); + await supertokens.errorHandler(err, req, res, userContext); if (res.responseSet) { let resObj = res.sendResponse(true); (((request.app as any).lazyHeaders || []) as { diff --git a/lib/ts/framework/koa/framework.ts b/lib/ts/framework/koa/framework.ts index e3824d86d..20cf3a82c 100644 --- a/lib/ts/framework/koa/framework.ts +++ b/lib/ts/framework/koa/framework.ts @@ -105,7 +105,14 @@ export class KoaResponse extends BaseResponse { if (existingValue === undefined) { this.ctx.set(key, value); } else if (allowDuplicateKey) { - this.ctx.set(key, existingValue + ", " + value); + /** + We only want to append if it does not already exist + For example if the caller is trying to add front token to the access control exposed headers property + we do not want to append if something else had already added it + */ + if (typeof existingValue !== "string" || !existingValue.includes(value)) { + this.ctx.set(key, existingValue + ", " + value); + } } else { // we overwrite the current one with the new one this.ctx.set(key, value); @@ -136,6 +143,7 @@ export class KoaResponse extends BaseResponse { expires: new Date(expires), domain, path, + overwrite: true, }); }; @@ -174,7 +182,7 @@ export const middleware = () => { return await next(); } } catch (err) { - return await supertokens.errorHandler(err, request, response); + return await supertokens.errorHandler(err, request, response, userContext); } }; }; diff --git a/lib/ts/framework/loopback/framework.ts b/lib/ts/framework/loopback/framework.ts index 0beb6a173..caad8bd8f 100644 --- a/lib/ts/framework/loopback/framework.ts +++ b/lib/ts/framework/loopback/framework.ts @@ -159,7 +159,7 @@ export const middleware: Middleware = async (ctx: MiddlewareContext, next: Next) } return; } catch (err) { - return await supertokens.errorHandler(err, request, response); + return await supertokens.errorHandler(err, request, response, userContext); } }; diff --git a/lib/ts/framework/types.ts b/lib/ts/framework/types.ts index 5707c65d5..df3b82a35 100644 --- a/lib/ts/framework/types.ts +++ b/lib/ts/framework/types.ts @@ -12,12 +12,12 @@ * License for the specific language governing permissions and limitations * under the License. */ -export type TypeFramework = "express" | "fastify" | "hapi" | "loopback" | "koa" | "awsLambda"; +export type TypeFramework = "express" | "fastify" | "hapi" | "loopback" | "koa" | "awsLambda" | "custom"; import { BaseRequest, BaseResponse } from "."; export let SchemaFramework = { type: "string", - enum: ["express", "fastify", "hapi", "loopback", "koa", "awsLambda"], + enum: ["express", "fastify", "hapi", "loopback", "koa", "awsLambda", "custom"], }; export interface Framework { diff --git a/lib/ts/framework/utils.ts b/lib/ts/framework/utils.ts index ffadd5294..12da0cbbe 100644 --- a/lib/ts/framework/utils.ts +++ b/lib/ts/framework/utils.ts @@ -237,10 +237,17 @@ export function setHeaderForExpressLikeResponse(res: Response, key: string, valu res.setHeader(key, value); } } else if (allowDuplicateKey) { - if (res.header !== undefined) { - res.header(key, existingValue + ", " + value); - } else { - res.setHeader(key, existingValue + ", " + value); + /** + We only want to append if it does not already exist + For example if the caller is trying to add front token to the access control exposed headers property + we do not want to append if something else had already added it + */ + if (typeof existingValue !== "string" || !existingValue.includes(value)) { + if (res.header !== undefined) { + res.header(key, existingValue + ", " + value); + } else { + res.setHeader(key, existingValue + ", " + value); + } } } else { // we overwrite the current one with the new one diff --git a/lib/ts/nextjs.ts b/lib/ts/nextjs.ts index fc05d6d52..180e7b10b 100644 --- a/lib/ts/nextjs.ts +++ b/lib/ts/nextjs.ts @@ -12,7 +12,10 @@ * License for the specific language governing permissions and limitations * under the License. */ +import { serialize } from "cookie"; import { errorHandler } from "./framework/express"; +import { CollectingResponse, PreParsedRequest, middleware } from "./framework/custom"; +import { HTTPMethod } from "./types"; function next( request: any, response: any, @@ -32,6 +35,21 @@ function next( }); }; } + +type PartialNextRequest = { + method: string; + url: string; + headers: Headers; + formData: () => any; + json: () => any; + cookies: { + getAll: () => { + name: string; + value: string; + }[]; + }; +}; + export default class NextJS { static async superTokensNextWrapper( middleware: (next: (middlewareError?: any) => void) => Promise, @@ -58,5 +76,57 @@ export default class NextJS { } }); } + + static getAppDirRequestHandler(NextResponse: typeof Response) { + const stMiddleware = middleware((req) => { + const query = Object.fromEntries(new URL(req.url).searchParams.entries()); + const cookies: Record = Object.fromEntries( + req.cookies.getAll().map((cookie) => [cookie.name, cookie.value]) + ); + + return new PreParsedRequest({ + method: req.method as HTTPMethod, + url: req.url, + query: query, + headers: req.headers, + cookies, + getFormBody: () => req.formData(), + getJSONBody: () => req.json(), + }); + }); + + return async function handleCall(req: T) { + const baseResponse = new CollectingResponse(); + + const { handled, error } = await stMiddleware(req, baseResponse); + + if (error) { + throw error; + } + if (!handled) { + return new NextResponse("Not found", { status: 404 }); + } + + for (const respCookie of baseResponse.cookies) { + baseResponse.headers.append( + "Set-Cookie", + serialize(respCookie.key, respCookie.value, { + domain: respCookie.domain, + expires: new Date(respCookie.expires), + httpOnly: respCookie.httpOnly, + path: respCookie.path, + sameSite: respCookie.sameSite, + secure: respCookie.secure, + }) + ); + } + + return new NextResponse(baseResponse.body, { + headers: baseResponse.headers, + status: baseResponse.statusCode, + }); + }; + } } export let superTokensNextWrapper = NextJS.superTokensNextWrapper; +export let getAppDirRequestHandler = NextJS.getAppDirRequestHandler; diff --git a/lib/ts/querier.ts b/lib/ts/querier.ts index a4ba3b334..59ed5f95e 100644 --- a/lib/ts/querier.ts +++ b/lib/ts/querier.ts @@ -12,9 +12,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -import fetch, { Response } from "cross-fetch"; - -import { getLargestVersionFromIntersection } from "./utils"; +import { doFetch, getLargestVersionFromIntersection } from "./utils"; import { cdiSupported } from "./version"; import NormalisedURLDomain from "./normalisedURLDomain"; import NormalisedURLPath from "./normalisedURLPath"; @@ -58,7 +56,7 @@ export class Querier { "api-key": Querier.apiKey, }; } - let response = await fetch(url, { + let response = await doFetch(url, { method: "GET", headers, }); @@ -132,7 +130,7 @@ export class Querier { rid: this.rIdToCore, }; } - return fetch(url, { + return doFetch(url, { method: "POST", body: body !== undefined ? JSON.stringify(body) : undefined, headers, @@ -167,7 +165,7 @@ export class Querier { const searchParams = new URLSearchParams(params); finalURL.search = searchParams.toString(); - return fetch(finalURL.toString(), { + return doFetch(finalURL.toString(), { method: "DELETE", body: body !== undefined ? JSON.stringify(body) : undefined, headers, @@ -206,7 +204,7 @@ export class Querier { Object.entries(params).filter(([_, value]) => value !== undefined) as string[][] ); finalURL.search = searchParams.toString(); - return await fetch(finalURL.toString(), { + return doFetch(finalURL.toString(), { method: "GET", headers, }); @@ -243,7 +241,7 @@ export class Querier { Object.entries(params).filter(([_, value]) => value !== undefined) as string[][] ); finalURL.search = searchParams.toString(); - return await fetch(finalURL.toString(), { + return doFetch(finalURL.toString(), { method: "GET", headers, }); @@ -273,7 +271,7 @@ export class Querier { }; } - return fetch(url, { + return doFetch(url, { method: "PUT", body: body !== undefined ? JSON.stringify(body) : undefined, headers, @@ -350,10 +348,10 @@ export class Querier { err.message.includes("ECONNREFUSED") || err.code === "ECONNREFUSED") ) { - return await this.sendRequestHelper(path, method, requestFunc, numberOfTries - 1, retryInfoMap); + return this.sendRequestHelper(path, method, requestFunc, numberOfTries - 1, retryInfoMap); } - if (err instanceof Response) { + if ("status" in err && "text" in err) { if (err.status === RATE_LIMIT_STATUS_CODE) { const retriesLeft = retryInfoMap[url]; @@ -365,7 +363,7 @@ export class Querier { await new Promise((resolve) => setTimeout(resolve, delay)); - return await this.sendRequestHelper(path, method, requestFunc, numberOfTries, retryInfoMap); + return this.sendRequestHelper(path, method, requestFunc, numberOfTries, retryInfoMap); } } diff --git a/lib/ts/recipe/accountlinking/recipeImplementation.ts b/lib/ts/recipe/accountlinking/recipeImplementation.ts index 75cdefb25..4c8655921 100644 --- a/lib/ts/recipe/accountlinking/recipeImplementation.ts +++ b/lib/ts/recipe/accountlinking/recipeImplementation.ts @@ -30,12 +30,14 @@ export default function getRecipeImplementation( getUsers: async function ( this: RecipeInterface, { + tenantId, timeJoinedOrder, limit, paginationToken, includeRecipeIds, query, }: { + tenantId: string; timeJoinedOrder: "ASC" | "DESC"; limit?: number; paginationToken?: string; @@ -50,7 +52,7 @@ export default function getRecipeImplementation( if (includeRecipeIds !== undefined) { includeRecipeIdsStr = includeRecipeIds.join(","); } - let response = await querier.sendGetRequest(new NormalisedURLPath("/users"), { + let response = await querier.sendGetRequest(new NormalisedURLPath(`${tenantId ?? "public"}/users`), { includeRecipeIds: includeRecipeIdsStr, timeJoinedOrder: timeJoinedOrder, limit: limit, diff --git a/lib/ts/recipe/accountlinking/types.ts b/lib/ts/recipe/accountlinking/types.ts index e52d83cb7..65d15f44f 100644 --- a/lib/ts/recipe/accountlinking/types.ts +++ b/lib/ts/recipe/accountlinking/types.ts @@ -67,6 +67,7 @@ export type TypeNormalisedInput = { export type RecipeInterface = { getUsers: (input: { + tenantId: string; timeJoinedOrder: "ASC" | "DESC"; limit?: number; paginationToken?: string; diff --git a/lib/ts/recipe/dashboard/api/analytics.ts b/lib/ts/recipe/dashboard/api/analytics.ts index 010237300..720ba8783 100644 --- a/lib/ts/recipe/dashboard/api/analytics.ts +++ b/lib/ts/recipe/dashboard/api/analytics.ts @@ -19,7 +19,7 @@ import { Querier } from "../../../querier"; import NormalisedURLPath from "../../../normalisedURLPath"; import { version as SDKVersion } from "../../../version"; import STError from "../../../error"; -import fetch from "cross-fetch"; +import { doFetch } from "../../../utils"; export type Response = { status: "OK"; @@ -71,9 +71,12 @@ export default async function analyticsPost( }; } - const { apiDomain, websiteDomain, appName } = options.appInfo; + const { apiDomain, getOrigin: websiteDomain, appName } = options.appInfo; const data = { - websiteDomain: websiteDomain.getAsStringDangerous(), + websiteDomain: websiteDomain({ + request: undefined, + userContext: {}, + }).getAsStringDangerous(), apiDomain: apiDomain.getAsStringDangerous(), appName, sdk: "node", @@ -85,7 +88,7 @@ export default async function analyticsPost( }; try { - await fetch("https://api.supertokens.com/0/st/telemetry", { + await doFetch("https://api.supertokens.com/0/st/telemetry", { method: "POST", body: JSON.stringify(data), headers: { diff --git a/lib/ts/recipe/emailpassword/api/implementation.ts b/lib/ts/recipe/emailpassword/api/implementation.ts index 50fcdf5a9..0fa0e069c 100644 --- a/lib/ts/recipe/emailpassword/api/implementation.ts +++ b/lib/ts/recipe/emailpassword/api/implementation.ts @@ -106,6 +106,8 @@ export default function getAPIImplementation(): APIInterface { token: response.token, recipeId: options.recipeId, tenantId, + request: options.req, + userContext, }); logDebugMessage(`Sending password reset email to ${email}`); diff --git a/lib/ts/recipe/emailpassword/index.ts b/lib/ts/recipe/emailpassword/index.ts index 303f6def8..ac4de3649 100644 --- a/lib/ts/recipe/emailpassword/index.ts +++ b/lib/ts/recipe/emailpassword/index.ts @@ -19,7 +19,7 @@ import { RecipeInterface, APIOptions, APIInterface, TypeEmailPasswordEmailDelive import RecipeUserId from "../../recipeUserId"; import { DEFAULT_TENANT_ID } from "../multitenancy/constants"; import { getPasswordResetLink } from "./utils"; -import { getUser } from "../.."; +import { getRequestFromUserContext, getUser } from "../.."; export default class Wrapper { static init = Recipe.init; @@ -123,6 +123,8 @@ export default class Wrapper { recipeId: recipeInstance.getRecipeId(), token: token.token, tenantId: tenantId === undefined ? DEFAULT_TENANT_ID : tenantId, + request: getRequestFromUserContext(userContext), + userContext, }), }; } diff --git a/lib/ts/recipe/emailpassword/utils.ts b/lib/ts/recipe/emailpassword/utils.ts index 56ada8f62..9a31c7348 100644 --- a/lib/ts/recipe/emailpassword/utils.ts +++ b/lib/ts/recipe/emailpassword/utils.ts @@ -28,6 +28,7 @@ import { NormalisedAppinfo } from "../../types"; import { FORM_FIELD_EMAIL_ID, FORM_FIELD_PASSWORD_ID } from "./constants"; import { RecipeInterface, APIInterface } from "./types"; import BackwardCompatibilityService from "./emaildelivery/services/backwardCompatibility"; +import { BaseRequest } from "../../framework"; export function validateAndNormaliseUserInput( recipeInstance: Recipe, @@ -253,9 +254,16 @@ export function getPasswordResetLink(input: { token: string; recipeId: string; tenantId: string; + request: BaseRequest | undefined; + userContext: any; }): string { return ( - input.appInfo.websiteDomain.getAsStringDangerous() + + input.appInfo + .getOrigin({ + request: input.request, + userContext: input.userContext, + }) + .getAsStringDangerous() + input.appInfo.websiteBasePath.getAsStringDangerous() + "/reset-password?token=" + input.token + diff --git a/lib/ts/recipe/emailverification/api/implementation.ts b/lib/ts/recipe/emailverification/api/implementation.ts index 2dd7c808e..b5b244d88 100644 --- a/lib/ts/recipe/emailverification/api/implementation.ts +++ b/lib/ts/recipe/emailverification/api/implementation.ts @@ -93,9 +93,7 @@ export default function getAPIInterface(): APIInterface { newSession, }; } else { - if ((await session.getClaimValue(EmailVerificationClaim)) !== false) { - await session.setClaimValue(EmailVerificationClaim, false, userContext); - } + await session.setClaimValue(EmailVerificationClaim, false, userContext); return { status: "OK", @@ -201,6 +199,8 @@ export default function getAPIInterface(): APIInterface { token: response.token, recipeId: options.recipeId, tenantId, + request: options.req, + userContext, }); logDebugMessage(`Sending email verification email to ${emailInfo}`); diff --git a/lib/ts/recipe/emailverification/index.ts b/lib/ts/recipe/emailverification/index.ts index 2e7f55f07..ab6b8645b 100644 --- a/lib/ts/recipe/emailverification/index.ts +++ b/lib/ts/recipe/emailverification/index.ts @@ -25,6 +25,7 @@ import { import { EmailVerificationClaim } from "./emailVerificationClaim"; import RecipeUserId from "../../recipeUserId"; import { getEmailVerifyLink } from "./utils"; +import { getRequestFromUserContext } from "../.."; export default class Wrapper { static init = Recipe.init; @@ -97,6 +98,8 @@ export default class Wrapper { token: emailVerificationToken.token, recipeId: recipeInstance.getRecipeId(), tenantId, + request: getRequestFromUserContext(userContext), + userContext, }), }; } diff --git a/lib/ts/recipe/emailverification/recipe.ts b/lib/ts/recipe/emailverification/recipe.ts index 1ebd6e5bf..18abe8182 100644 --- a/lib/ts/recipe/emailverification/recipe.ts +++ b/lib/ts/recipe/emailverification/recipe.ts @@ -304,24 +304,20 @@ export default class Recipe extends RecipeModule { // got verified was already linked to the session's primary user ID, // but either way, we don't need to change any user ID. - // In this case, all we do is to update the emailverification claim if it's - // not already set to true (it is ok to assume true cause this function - // is only called when the email is verified). - if ((await input.session.getClaimValue(EmailVerificationClaim)) !== true) { - try { - // EmailVerificationClaim will be based on the recipeUserId - // and not the primary user ID. - await input.session.fetchAndSetClaim(EmailVerificationClaim, input.userContext); - } catch (err) { - // This should never happen, since we've just set the status above. - if ((err as Error).message === "UNKNOWN_USER_ID") { - throw new SessionError({ - type: SessionError.UNAUTHORISED, - message: "Unknown User ID provided", - }); - } - throw err; + // In this case, all we do is to update the emailverification claim + try { + // EmailVerificationClaim will be based on the recipeUserId + // and not the primary user ID. + await input.session.fetchAndSetClaim(EmailVerificationClaim, input.userContext); + } catch (err) { + // This should never happen, since we've just set the status above. + if ((err as Error).message === "UNKNOWN_USER_ID") { + throw new SessionError({ + type: SessionError.UNAUTHORISED, + message: "Unknown User ID provided", + }); } + throw err; } return; diff --git a/lib/ts/recipe/emailverification/utils.ts b/lib/ts/recipe/emailverification/utils.ts index 6d4ccebfa..358876c4c 100644 --- a/lib/ts/recipe/emailverification/utils.ts +++ b/lib/ts/recipe/emailverification/utils.ts @@ -17,6 +17,7 @@ import Recipe from "./recipe"; import { TypeInput, TypeNormalisedInput, RecipeInterface, APIInterface } from "./types"; import { NormalisedAppinfo } from "../../types"; import BackwardCompatibilityService from "./emaildelivery/services/backwardCompatibility"; +import { BaseRequest } from "../../framework"; export function validateAndNormaliseUserInput( _: Recipe, @@ -68,9 +69,16 @@ export function getEmailVerifyLink(input: { token: string; recipeId: string; tenantId: string; + request: BaseRequest | undefined; + userContext: any; }): string { return ( - input.appInfo.websiteDomain.getAsStringDangerous() + + input.appInfo + .getOrigin({ + request: input.request, + userContext: input.userContext, + }) + .getAsStringDangerous() + input.appInfo.websiteBasePath.getAsStringDangerous() + "/verify-email" + "?token=" + diff --git a/lib/ts/recipe/passwordless/api/implementation.ts b/lib/ts/recipe/passwordless/api/implementation.ts index 4958f0c8f..1b34bdade 100644 --- a/lib/ts/recipe/passwordless/api/implementation.ts +++ b/lib/ts/recipe/passwordless/api/implementation.ts @@ -241,7 +241,12 @@ export default function getAPIImplementation(): APIInterface { const flowType = input.options.config.flowType; if (flowType === "MAGIC_LINK" || flowType === "USER_INPUT_CODE_AND_MAGIC_LINK") { magicLink = - input.options.appInfo.websiteDomain.getAsStringDangerous() + + input.options.appInfo + .getOrigin({ + request: input.options.req, + userContext: input.userContext, + }) + .getAsStringDangerous() + input.options.appInfo.websiteBasePath.getAsStringDangerous() + "/verify" + "?rid=" + @@ -380,7 +385,12 @@ export default function getAPIImplementation(): APIInterface { const flowType = input.options.config.flowType; if (flowType === "MAGIC_LINK" || flowType === "USER_INPUT_CODE_AND_MAGIC_LINK") { magicLink = - input.options.appInfo.websiteDomain.getAsStringDangerous() + + input.options.appInfo + .getOrigin({ + request: input.options.req, + userContext: input.userContext, + }) + .getAsStringDangerous() + input.options.appInfo.websiteBasePath.getAsStringDangerous() + "/verify" + "?rid=" + diff --git a/lib/ts/recipe/passwordless/index.ts b/lib/ts/recipe/passwordless/index.ts index d688bdf1c..36110c883 100644 --- a/lib/ts/recipe/passwordless/index.ts +++ b/lib/ts/recipe/passwordless/index.ts @@ -23,6 +23,7 @@ import { TypePasswordlessSmsDeliveryInput, } from "./types"; import RecipeUserId from "../../recipeUserId"; +import { getRequestFromUserContext } from "../.."; export default class Wrapper { static init = Recipe.init; @@ -157,6 +158,7 @@ export default class Wrapper { ) { return Recipe.getInstanceOrThrowError().createMagicLink({ ...input, + request: getRequestFromUserContext(input.userContext), userContext: input.userContext ?? {}, }); } diff --git a/lib/ts/recipe/passwordless/recipe.ts b/lib/ts/recipe/passwordless/recipe.ts index 741dda92b..d34b6f2d7 100644 --- a/lib/ts/recipe/passwordless/recipe.ts +++ b/lib/ts/recipe/passwordless/recipe.ts @@ -211,11 +211,13 @@ export default class Recipe extends RecipeModule { | { email: string; tenantId: string; + request: BaseRequest | undefined; userContext?: any; } | { phoneNumber: string; tenantId: string; + request: BaseRequest | undefined; userContext?: any; } ): Promise => { @@ -243,7 +245,12 @@ export default class Recipe extends RecipeModule { const appInfo = this.getAppInfo(); let magicLink = - appInfo.websiteDomain.getAsStringDangerous() + + appInfo + .getOrigin({ + request: input.request, + userContext: input.userContext, + }) + .getAsStringDangerous() + appInfo.websiteBasePath.getAsStringDangerous() + "/verify" + "?rid=" + diff --git a/lib/ts/recipe/session/cookieAndHeaders.ts b/lib/ts/recipe/session/cookieAndHeaders.ts index 3b469a7ea..f30cdba0c 100644 --- a/lib/ts/recipe/session/cookieAndHeaders.ts +++ b/lib/ts/recipe/session/cookieAndHeaders.ts @@ -30,7 +30,12 @@ const frontTokenHeaderKey = "front-token"; const authModeHeaderKey = "st-auth-mode"; -export function clearSessionFromAllTokenTransferMethods(config: TypeNormalisedInput, res: BaseResponse) { +export function clearSessionFromAllTokenTransferMethods( + config: TypeNormalisedInput, + res: BaseResponse, + request: BaseRequest | undefined, + userContext: any +) { // We are clearing the session in all transfermethods to be sure to override cookies in case they have been already added to the response. // This is done to handle the following use-case: // If the app overrides signInPOST to check the ban status of the user after the original implementation and throwing an UNAUTHORISED error @@ -38,15 +43,21 @@ export function clearSessionFromAllTokenTransferMethods(config: TypeNormalisedIn // We can't know which to clear since we can't reliably query or remove the set-cookie header added to the response (causes issues in some frameworks, i.e.: hapi) // The safe solution in this case is to overwrite all the response cookies/headers with an empty value, which is what we are doing here for (const transferMethod of availableTokenTransferMethods) { - clearSession(config, res, transferMethod); + clearSession(config, res, transferMethod, request, userContext); } } -export function clearSession(config: TypeNormalisedInput, res: BaseResponse, transferMethod: TokenTransferMethod) { +export function clearSession( + config: TypeNormalisedInput, + res: BaseResponse, + transferMethod: TokenTransferMethod, + request: BaseRequest | undefined, + userContext: any +) { // If we can be specific about which transferMethod we want to clear, there is no reason to clear the other ones const tokenTypes: TokenType[] = ["access", "refresh"]; for (const token of tokenTypes) { - setToken(config, res, token, "", 0, transferMethod); + setToken(config, res, token, "", 0, transferMethod, request, userContext); } res.removeHeader(antiCsrfHeaderKey); @@ -125,7 +136,9 @@ export function setToken( tokenType: TokenType, value: string, expires: number, - transferMethod: TokenTransferMethod + transferMethod: TokenTransferMethod, + req: BaseRequest | undefined, + userContext: any ) { logDebugMessage(`setToken: Setting ${tokenType} token as ${transferMethod}`); if (transferMethod === "cookie") { @@ -135,7 +148,9 @@ export function setToken( getCookieNameFromTokenType(tokenType), value, expires, - tokenType === "refresh" ? "refreshTokenPath" : "accessTokenPath" + tokenType === "refresh" ? "refreshTokenPath" : "accessTokenPath", + req, + userContext ); } else if (transferMethod === "header") { setHeader(res, getResponseHeaderNameForTokenType(tokenType), value); @@ -164,11 +179,16 @@ export function setCookie( name: string, value: string, expires: number, - pathType: "refreshTokenPath" | "accessTokenPath" + pathType: "refreshTokenPath" | "accessTokenPath", + req: BaseRequest | undefined, + userContext: any ) { let domain = config.cookieDomain; let secure = config.cookieSecure; - let sameSite = config.cookieSameSite; + let sameSite = config.getCookieSameSite({ + request: req, + userContext, + }); let path = ""; if (pathType === "refreshTokenPath") { path = config.refreshTokenPath.getAsStringDangerous(); diff --git a/lib/ts/recipe/session/framework/awsLambda.ts b/lib/ts/recipe/session/framework/awsLambda.ts index 9433f3d02..b512c1bcb 100644 --- a/lib/ts/recipe/session/framework/awsLambda.ts +++ b/lib/ts/recipe/session/framework/awsLambda.ts @@ -33,7 +33,7 @@ export function verifySession(handler: Handler, verifySessionOptions?: VerifySes let handlerResult = await handler(event, context, callback); return response.sendResponse(handlerResult); } catch (err) { - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); if (response.responseSet) { return response.sendResponse({}); } diff --git a/lib/ts/recipe/session/framework/custom.ts b/lib/ts/recipe/session/framework/custom.ts new file mode 100644 index 000000000..65db71ffd --- /dev/null +++ b/lib/ts/recipe/session/framework/custom.ts @@ -0,0 +1,49 @@ +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * 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. + */ +import Session from "../recipe"; +import type { VerifySessionOptions } from ".."; +import SuperTokens from "../../../supertokens"; +import { makeDefaultUserContextFromAPI } from "../../../utils"; +import { BaseRequest, BaseResponse } from "../../../framework"; +import { NextFunction } from "../../../framework/custom/framework"; +import { SessionContainerInterface } from "../types"; + +export function verifySession( + options?: VerifySessionOptions +) { + return async (req: T, res: BaseResponse, next?: NextFunction) => { + const userContext = makeDefaultUserContextFromAPI(req); + + try { + const sessionRecipe = Session.getInstanceOrThrowError(); + req.session = await sessionRecipe.verifySession(options, req, res, userContext); + if (next !== undefined) { + next(); + } + return undefined; + } catch (err) { + try { + const supertokens = SuperTokens.getInstanceOrThrowError(); + await supertokens.errorHandler(err, req, res, userContext); + return undefined; + } catch { + if (next !== undefined) { + next(err); + } + return err; + } + } + }; +} diff --git a/lib/ts/recipe/session/framework/express.ts b/lib/ts/recipe/session/framework/express.ts index 01dbbb47a..6be24f722 100644 --- a/lib/ts/recipe/session/framework/express.ts +++ b/lib/ts/recipe/session/framework/express.ts @@ -33,7 +33,7 @@ export function verifySession(options?: VerifySessionOptions) { } catch (err) { try { const supertokens = SuperTokens.getInstanceOrThrowError(); - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); } catch { next(err); } diff --git a/lib/ts/recipe/session/framework/fastify.ts b/lib/ts/recipe/session/framework/fastify.ts index d308bbc96..f6182ab84 100644 --- a/lib/ts/recipe/session/framework/fastify.ts +++ b/lib/ts/recipe/session/framework/fastify.ts @@ -30,7 +30,7 @@ export function verifySession(options?: VerifySessionOptions) { req.session = await sessionRecipe.verifySession(options, request, response, userContext); } catch (err) { const supertokens = SuperTokens.getInstanceOrThrowError(); - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); throw err; } }; diff --git a/lib/ts/recipe/session/framework/hapi.ts b/lib/ts/recipe/session/framework/hapi.ts index 596344a1e..cec7e9afe 100644 --- a/lib/ts/recipe/session/framework/hapi.ts +++ b/lib/ts/recipe/session/framework/hapi.ts @@ -31,7 +31,7 @@ export function verifySession(options?: VerifySessionOptions) { } catch (err) { try { const supertokens = SuperTokens.getInstanceOrThrowError(); - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); if (response.responseSet) { let resObj = response.sendResponse(true); (((req.app as any).lazyHeaders || []) as { diff --git a/lib/ts/recipe/session/framework/koa.ts b/lib/ts/recipe/session/framework/koa.ts index e3af693b3..821bb72f4 100644 --- a/lib/ts/recipe/session/framework/koa.ts +++ b/lib/ts/recipe/session/framework/koa.ts @@ -32,7 +32,7 @@ export function verifySession(options?: VerifySessionOptions) { } catch (err) { try { const supertokens = SuperTokens.getInstanceOrThrowError(); - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); return; } catch { // We catch and ignore since we want to re-throw the original error if handling wasn't successful diff --git a/lib/ts/recipe/session/framework/loopback.ts b/lib/ts/recipe/session/framework/loopback.ts index 379565bc7..29534cc66 100644 --- a/lib/ts/recipe/session/framework/loopback.ts +++ b/lib/ts/recipe/session/framework/loopback.ts @@ -39,7 +39,7 @@ export function verifySession(options?: VerifySessionOptions): InterceptorOrKey } catch (err) { try { const supertokens = SuperTokens.getInstanceOrThrowError(); - await supertokens.errorHandler(err, request, response); + await supertokens.errorHandler(err, request, response, userContext); return; } catch { // We catch and ignore since we want to re-throw the original error if handling wasn't successful diff --git a/lib/ts/recipe/session/recipe.ts b/lib/ts/recipe/session/recipe.ts index dc9cb5ea6..21e471548 100644 --- a/lib/ts/recipe/session/recipe.ts +++ b/lib/ts/recipe/session/recipe.ts @@ -63,9 +63,17 @@ export default class SessionRecipe extends RecipeModule { constructor(recipeId: string, appInfo: NormalisedAppinfo, isInServerlessEnv: boolean, config?: TypeInput) { super(recipeId, appInfo); this.config = validateAndNormaliseUserInput(this, appInfo, config); - logDebugMessage("session init: antiCsrf: " + this.config.antiCsrf); + + const antiCsrfToLog: string = + typeof this.config.antiCsrfFunctionOrString === "string" + ? this.config.antiCsrfFunctionOrString + : "function"; + + logDebugMessage("session init: antiCsrf: " + antiCsrfToLog); logDebugMessage("session init: cookieDomain: " + this.config.cookieDomain); - logDebugMessage("session init: cookieSameSite: " + this.config.cookieSameSite); + const sameSiteToPrint = + config !== undefined && config.cookieSameSite !== undefined ? config.cookieSameSite : "default function"; + logDebugMessage("session init: cookieSameSite: " + sameSiteToPrint); logDebugMessage("session init: cookieSecure: " + this.config.cookieSecure); logDebugMessage("session init: refreshTokenPath: " + this.config.refreshTokenPath.getAsStringDangerous()); logDebugMessage("session init: sessionExpiredStatusCode: " + this.config.sessionExpiredStatusCode); @@ -190,7 +198,7 @@ export default class SessionRecipe extends RecipeModule { } }; - handleError = async (err: STError, request: BaseRequest, response: BaseResponse) => { + handleError = async (err: STError, request: BaseRequest, response: BaseResponse, userContext: any) => { if (err.fromRecipe === SessionRecipe.RECIPE_ID) { if (err.type === STError.UNAUTHORISED) { logDebugMessage("errorHandler: returning UNAUTHORISED"); @@ -200,7 +208,7 @@ export default class SessionRecipe extends RecipeModule { err.payload.clearTokens === true ) { logDebugMessage("errorHandler: Clearing tokens because of UNAUTHORISED response"); - clearSessionFromAllTokenTransferMethods(this.config, response); + clearSessionFromAllTokenTransferMethods(this.config, response, request, userContext); } return await this.config.errorHandlers.onUnauthorised(err.message, request, response); } else if (err.type === STError.TRY_REFRESH_TOKEN) { @@ -209,7 +217,7 @@ export default class SessionRecipe extends RecipeModule { } else if (err.type === STError.TOKEN_THEFT_DETECTED) { logDebugMessage("errorHandler: returning TOKEN_THEFT_DETECTED"); logDebugMessage("errorHandler: Clearing tokens because of TOKEN_THEFT_DETECTED response"); - clearSessionFromAllTokenTransferMethods(this.config, response); + clearSessionFromAllTokenTransferMethods(this.config, response, request, userContext); return await this.config.errorHandlers.onTokenTheftDetected( err.payload.sessionHandle, err.payload.userId, diff --git a/lib/ts/recipe/session/recipeImplementation.ts b/lib/ts/recipe/session/recipeImplementation.ts index 94c4e8fba..0344b6ec5 100644 --- a/lib/ts/recipe/session/recipeImplementation.ts +++ b/lib/ts/recipe/session/recipeImplementation.ts @@ -133,7 +133,11 @@ export default function getRecipeInterface( options?: VerifySessionOptions; userContext: any; }): Promise { - if (options?.antiCsrfCheck !== false && config.antiCsrf === "VIA_CUSTOM_HEADER") { + if ( + options?.antiCsrfCheck !== false && + typeof config.antiCsrfFunctionOrString === "string" && + config.antiCsrfFunctionOrString === "VIA_CUSTOM_HEADER" + ) { throw new Error( "Since the anti-csrf mode is VIA_CUSTOM_HEADER getSession can't check the CSRF token. Please either use VIA_TOKEN or set antiCsrfCheck to false" ); @@ -292,7 +296,11 @@ export default function getRecipeInterface( disableAntiCsrf, }: { refreshToken: string; antiCsrfToken?: string; disableAntiCsrf: boolean; userContext: any } ): Promise { - if (disableAntiCsrf !== true && config.antiCsrf === "VIA_CUSTOM_HEADER") { + if ( + disableAntiCsrf !== true && + typeof config.antiCsrfFunctionOrString === "string" && + config.antiCsrfFunctionOrString === "VIA_CUSTOM_HEADER" + ) { throw new Error( "Since the anti-csrf mode is VIA_CUSTOM_HEADER getSession can't check the CSRF token. Please either use VIA_TOKEN or set antiCsrfCheck to false" ); diff --git a/lib/ts/recipe/session/sessionClass.ts b/lib/ts/recipe/session/sessionClass.ts index ba0df0349..fcbb9c8cf 100644 --- a/lib/ts/recipe/session/sessionClass.ts +++ b/lib/ts/recipe/session/sessionClass.ts @@ -21,6 +21,7 @@ import { parseJWTWithoutSignatureVerification } from "./jwt"; import { logDebugMessage } from "../../logger"; import RecipeUserId from "../../recipeUserId"; import { protectedProps } from "./constants"; +import { makeDefaultUserContextFromAPI } from "../../utils"; export default class Session implements SessionContainerInterface { constructor( @@ -55,7 +56,13 @@ export default class Session implements SessionContainerInterface { // If we instead clear the cookies only when revokeSession // returns true, it can cause this kind of a bug: // https://github.com/supertokens/supertokens-node/issues/343 - clearSession(this.helpers.config, this.reqResInfo.res, this.reqResInfo.transferMethod); + clearSession( + this.helpers.config, + this.reqResInfo.res, + this.reqResInfo.transferMethod, + this.reqResInfo.req, + userContext === undefined ? makeDefaultUserContextFromAPI(this.reqResInfo.req) : userContext + ); } } @@ -167,7 +174,9 @@ export default class Session implements SessionContainerInterface { this.accessToken, this.frontToken, this.helpers.config, - this.reqResInfo.transferMethod + this.reqResInfo.transferMethod, + this.reqResInfo.req, + userContext === undefined ? makeDefaultUserContextFromAPI(this.reqResInfo.req) : userContext ); } } else { @@ -266,13 +275,21 @@ export default class Session implements SessionContainerInterface { return this.mergeIntoAccessTokenPayload(update, userContext); } - attachToRequestResponse(info: ReqResInfo) { + attachToRequestResponse(info: ReqResInfo, userContext?: any) { this.reqResInfo = info; if (this.accessTokenUpdated) { const { res, transferMethod } = info; - setAccessTokenInResponse(res, this.accessToken, this.frontToken, this.helpers.config, transferMethod); + setAccessTokenInResponse( + res, + this.accessToken, + this.frontToken, + this.helpers.config, + transferMethod, + info.req, + userContext !== undefined ? userContext : makeDefaultUserContextFromAPI(info.req) + ); if (this.refreshToken !== undefined) { setToken( this.helpers.config, @@ -280,7 +297,9 @@ export default class Session implements SessionContainerInterface { "refresh", this.refreshToken.token, this.refreshToken.expiry, - transferMethod + transferMethod, + info.req, + userContext !== undefined ? userContext : makeDefaultUserContextFromAPI(info.req) ); } if (this.antiCsrfToken !== undefined) { diff --git a/lib/ts/recipe/session/sessionFunctions.ts b/lib/ts/recipe/session/sessionFunctions.ts index d2c1ab71c..f1752dfa8 100644 --- a/lib/ts/recipe/session/sessionFunctions.ts +++ b/lib/ts/recipe/session/sessionFunctions.ts @@ -45,7 +45,8 @@ export async function createNewSession( userDataInJWT: { ...accessTokenPayload }, userDataInDatabase: sessionDataInDatabase, useDynamicSigningKey: helpers.config.useDynamicAccessTokenSigningKey, - enableAntiCsrf: !disableAntiCsrf && helpers.config.antiCsrf === "VIA_TOKEN", + // We dont need to check if anti csrf is a function here because checking for "VIA_TOKEN" is enough + enableAntiCsrf: !disableAntiCsrf && helpers.config.antiCsrfFunctionOrString === "VIA_TOKEN", }; let response = await helpers.querier.sendPostRequest( new NormalisedURLPath(`/${tenantId}/recipe/session`), @@ -107,7 +108,7 @@ export async function getSession( accessTokenInfo = await getInfoFromAccessToken( parsedAccessToken, helpers.JWKS, - helpers.config.antiCsrf === "VIA_TOKEN" && doAntiCsrfCheck + helpers.config.antiCsrfFunctionOrString === "VIA_TOKEN" && doAntiCsrfCheck ); } catch (err) { /** @@ -179,7 +180,7 @@ export async function getSession( * which means token verification was successful */ if (doAntiCsrfCheck) { - if (helpers.config.antiCsrf === "VIA_TOKEN") { + if (helpers.config.antiCsrfFunctionOrString === "VIA_TOKEN") { if (accessTokenInfo !== undefined) { if (antiCsrfToken === undefined || antiCsrfToken !== accessTokenInfo.antiCsrfToken) { if (antiCsrfToken === undefined) { @@ -202,7 +203,10 @@ export async function getSession( } } } - } else if (helpers.config.antiCsrf === "VIA_CUSTOM_HEADER") { + } else if ( + typeof helpers.config.antiCsrfFunctionOrString === "string" && + helpers.config.antiCsrfFunctionOrString === "VIA_CUSTOM_HEADER" + ) { // The function should never be called by this (we check this outside the function as well) // There we can add a bit more information to the error, so that's the primary check, this is just making sure. throw new Error("Please either use VIA_TOKEN, NONE or call with doAntiCsrfCheck false"); @@ -228,7 +232,7 @@ export async function getSession( accessToken: parsedAccessToken.rawTokenString, antiCsrfToken, doAntiCsrfCheck, - enableAntiCsrf: helpers.config.antiCsrf === "VIA_TOKEN", + enableAntiCsrf: helpers.config.antiCsrfFunctionOrString === "VIA_TOKEN", checkDatabase: alwaysCheckCore, }; @@ -316,10 +320,14 @@ export async function refreshSession( } = { refreshToken, antiCsrfToken, - enableAntiCsrf: !disableAntiCsrf && helpers.config.antiCsrf === "VIA_TOKEN", + enableAntiCsrf: !disableAntiCsrf && helpers.config.antiCsrfFunctionOrString === "VIA_TOKEN", }; - if (helpers.config.antiCsrf === "VIA_CUSTOM_HEADER" && !disableAntiCsrf) { + if ( + typeof helpers.config.antiCsrfFunctionOrString === "string" && + helpers.config.antiCsrfFunctionOrString === "VIA_CUSTOM_HEADER" && + !disableAntiCsrf + ) { // The function should never be called by this (we check this outside the function as well) // There we can add a bit more information to the error, so that's the primary check, this is just making sure. throw new Error("Please either use VIA_TOKEN, NONE or call with doAntiCsrfCheck false"); diff --git a/lib/ts/recipe/session/sessionRequestFunctions.ts b/lib/ts/recipe/session/sessionRequestFunctions.ts index 7ee13b775..0f58a948e 100644 --- a/lib/ts/recipe/session/sessionRequestFunctions.ts +++ b/lib/ts/recipe/session/sessionRequestFunctions.ts @@ -38,11 +38,15 @@ export async function getSessionFromRequest({ userContext?: any; }): Promise { logDebugMessage("getSession: Started"); - if (!res.wrapperUsed) { - res = frameworks[SuperTokens.getInstanceOrThrowError().framework].wrapResponse(res); - } - if (!req.wrapperUsed) { - req = frameworks[SuperTokens.getInstanceOrThrowError().framework].wrapRequest(req); + const configuredFramework = SuperTokens.getInstanceOrThrowError().framework; + if (configuredFramework !== "custom") { + if (!req.wrapperUsed) { + req = frameworks[configuredFramework].wrapRequest(req); + } + + if (!res.wrapperUsed) { + res = frameworks[configuredFramework].wrapResponse(res); + } } userContext = setRequestInUserContextIfNotDefined(userContext, req); logDebugMessage("getSession: Wrapping done"); @@ -122,8 +126,17 @@ export async function getSessionFromRequest({ doAntiCsrfCheck = false; } - if (doAntiCsrfCheck && config.antiCsrf === "VIA_CUSTOM_HEADER") { - if (config.antiCsrf === "VIA_CUSTOM_HEADER") { + let antiCsrf = config.antiCsrfFunctionOrString; + + if (typeof antiCsrf === "function") { + antiCsrf = antiCsrf({ + request: req, + userContext, + }); + } + + if (doAntiCsrfCheck && antiCsrf === "VIA_CUSTOM_HEADER") { + if (antiCsrf === "VIA_CUSTOM_HEADER") { if (getRidFromHeader(req) === undefined) { logDebugMessage("getSession: Returning TRY_REFRESH_TOKEN because custom header (rid) was not passed"); throw new SessionError({ @@ -158,16 +171,19 @@ export async function getSessionFromRequest({ // override how the session is attached to the response. // In that scenario the transferMethod passed to attachToRequestResponse likely doesn't // matter, still, we follow the general fallback logic - await session.attachToRequestResponse({ - req, - res, - transferMethod: - requestTransferMethod !== undefined - ? requestTransferMethod - : allowedTransferMethod !== "any" - ? allowedTransferMethod - : "header", - }); + await session.attachToRequestResponse( + { + req, + res, + transferMethod: + requestTransferMethod !== undefined + ? requestTransferMethod + : allowedTransferMethod !== "any" + ? allowedTransferMethod + : "header", + }, + userContext + ); } return session; } @@ -190,11 +206,15 @@ export async function refreshSessionInRequest({ recipeInterfaceImpl: RecipeInterface; }) { logDebugMessage("refreshSession: Started"); - if (!res.wrapperUsed) { - res = frameworks[SuperTokens.getInstanceOrThrowError().framework].wrapResponse(res); - } - if (!req.wrapperUsed) { - req = frameworks[SuperTokens.getInstanceOrThrowError().framework].wrapRequest(req); + const configuredFramework = SuperTokens.getInstanceOrThrowError().framework; + if (configuredFramework !== "custom") { + if (!req.wrapperUsed) { + req = frameworks[configuredFramework].wrapRequest(req); + } + + if (!res.wrapperUsed) { + res = frameworks[configuredFramework].wrapResponse(res); + } } userContext = setRequestInUserContextIfNotDefined(userContext, req); logDebugMessage("refreshSession: Wrapping done"); @@ -237,7 +257,7 @@ export async function refreshSessionInRequest({ // This token isn't handled by getToken/setToken to limit the scope of this legacy/migration code if (req.getCookieValue(LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME) !== undefined) { logDebugMessage("refreshSession: cleared legacy id refresh token because refresh token was not found"); - setCookie(config, res, LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME, "", 0, "accessTokenPath"); + setCookie(config, res, LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME, "", 0, "accessTokenPath", req, userContext); } logDebugMessage("refreshSession: UNAUTHORISED because refresh token in request is undefined"); @@ -252,7 +272,16 @@ export async function refreshSessionInRequest({ let disableAntiCsrf = requestTransferMethod === "header"; const antiCsrfToken = getAntiCsrfTokenFromHeaders(req); - if (config.antiCsrf === "VIA_CUSTOM_HEADER" && !disableAntiCsrf) { + let antiCsrf = config.antiCsrfFunctionOrString; + + if (typeof antiCsrf === "function") { + antiCsrf = antiCsrf({ + request: req, + userContext, + }); + } + + if (antiCsrf === "VIA_CUSTOM_HEADER" && !disableAntiCsrf) { if (getRidFromHeader(req) === undefined) { logDebugMessage("refreshSession: Returning UNAUTHORISED because custom header (rid) was not passed"); throw new SessionError({ @@ -285,7 +314,7 @@ export async function refreshSessionInRequest({ logDebugMessage( "refreshSession: cleared legacy id refresh token because refresh is clearing other tokens" ); - setCookie(config, res, LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME, "", 0, "accessTokenPath"); + setCookie(config, res, LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME, "", 0, "accessTokenPath", req, userContext); } } throw ex; @@ -295,21 +324,24 @@ export async function refreshSessionInRequest({ // We clear the tokens in all token transfer methods we are not going to overwrite for (const transferMethod of availableTokenTransferMethods) { if (transferMethod !== requestTransferMethod && refreshTokens[transferMethod] !== undefined) { - clearSession(config, res, transferMethod); + clearSession(config, res, transferMethod, req, userContext); } } - await session.attachToRequestResponse({ - req, - res, - transferMethod: requestTransferMethod, - }); + await session.attachToRequestResponse( + { + req, + res, + transferMethod: requestTransferMethod, + }, + userContext + ); logDebugMessage("refreshSession: Success!"); // This token isn't handled by getToken/setToken to limit the scope of this legacy/migration code if (req.getCookieValue(LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME) !== undefined) { logDebugMessage("refreshSession: cleared legacy id refresh token after successful refresh"); - setCookie(config, res, LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME, "", 0, "accessTokenPath"); + setCookie(config, res, LEGACY_ID_REFRESH_TOKEN_COOKIE_NAME, "", 0, "accessTokenPath", req, userContext); } return session; @@ -341,13 +373,17 @@ export async function createNewSessionInRequest({ tenantId: string; }) { logDebugMessage("createNewSession: Started"); - if (!req.wrapperUsed) { - req = frameworks[SuperTokens.getInstanceOrThrowError().framework].wrapRequest(req); - } + const configuredFramework = SuperTokens.getInstanceOrThrowError().framework; + if (configuredFramework !== "custom") { + if (!req.wrapperUsed) { + req = frameworks[configuredFramework].wrapRequest(req); + } - if (!res.wrapperUsed) { - res = frameworks[SuperTokens.getInstanceOrThrowError().framework].wrapResponse(res); + if (!res.wrapperUsed) { + res = frameworks[configuredFramework].wrapResponse(res); + } } + logDebugMessage("createNewSession: Wrapping done"); userContext = setRequestInUserContextIfNotDefined(userContext, req); @@ -380,11 +416,23 @@ export async function createNewSessionInRequest({ if ( outputTransferMethod === "cookie" && - config.cookieSameSite === "none" && + config.getCookieSameSite({ + request: req, + userContext, + }) === "none" && !config.cookieSecure && !( (appInfo.topLevelAPIDomain === "localhost" || isAnIpAddress(appInfo.topLevelAPIDomain)) && - (appInfo.topLevelWebsiteDomain === "localhost" || isAnIpAddress(appInfo.topLevelWebsiteDomain)) + (appInfo.getTopLevelWebsiteDomain({ + request: req, + userContext, + }) === "localhost" || + isAnIpAddress( + appInfo.getTopLevelWebsiteDomain({ + request: req, + userContext, + }) + )) ) ) { // We can allow insecure cookie when both website & API domain are localhost or an IP @@ -408,16 +456,19 @@ export async function createNewSessionInRequest({ for (const transferMethod of availableTokenTransferMethods) { if (transferMethod !== outputTransferMethod && getToken(req, "access", transferMethod) !== undefined) { - clearSession(config, res, transferMethod); + clearSession(config, res, transferMethod, req, userContext); } } logDebugMessage("createNewSession: Cleared old tokens"); - await session.attachToRequestResponse({ - req, - res, - transferMethod: outputTransferMethod, - }); + await session.attachToRequestResponse( + { + req, + res, + transferMethod: outputTransferMethod, + }, + userContext + ); logDebugMessage("createNewSession: Attached new tokens to res"); return session; diff --git a/lib/ts/recipe/session/types.ts b/lib/ts/recipe/session/types.ts index 8e81d5ca0..b3502fb59 100644 --- a/lib/ts/recipe/session/types.ts +++ b/lib/ts/recipe/session/types.ts @@ -111,11 +111,15 @@ export type TypeNormalisedInput = { refreshTokenPath: NormalisedURLPath; accessTokenPath: NormalisedURLPath; cookieDomain: string | undefined; - cookieSameSite: "strict" | "lax" | "none"; + getCookieSameSite: (input: { request: BaseRequest | undefined; userContext: any }) => "strict" | "lax" | "none"; cookieSecure: boolean; sessionExpiredStatusCode: number; errorHandlers: NormalisedErrorHandlers; - antiCsrf: "VIA_TOKEN" | "VIA_CUSTOM_HEADER" | "NONE"; + antiCsrfFunctionOrString: + | "VIA_TOKEN" + | "VIA_CUSTOM_HEADER" + | "NONE" + | ((input: { request: BaseRequest | undefined; userContext: any }) => "VIA_CUSTOM_HEADER" | "NONE"); getTokenTransferMethod: (input: { req: BaseRequest; @@ -367,7 +371,7 @@ export interface SessionContainerInterface { setClaimValue(claim: SessionClaim, value: T, userContext?: any): Promise; getClaimValue(claim: SessionClaim, userContext?: any): Promise; removeClaim(claim: SessionClaim, userContext?: any): Promise; - attachToRequestResponse(reqResInfo: ReqResInfo): Promise | void; + attachToRequestResponse(reqResInfo: ReqResInfo, userContext?: any): Promise | void; } export type APIOptions = { diff --git a/lib/ts/recipe/session/utils.ts b/lib/ts/recipe/session/utils.ts index 3179e0c1b..2e73b4f42 100644 --- a/lib/ts/recipe/session/utils.ts +++ b/lib/ts/recipe/session/utils.ts @@ -137,16 +137,31 @@ export function validateAndNormaliseUserInput( ? new NormalisedURLPath("/") : new NormalisedURLPath(config.accessTokenPath); let protocolOfAPIDomain = getURLProtocol(appInfo.apiDomain.getAsStringDangerous()); - let protocolOfWebsiteDomain = getURLProtocol(appInfo.websiteDomain.getAsStringDangerous()); - let cookieSameSite: "strict" | "lax" | "none" = - appInfo.topLevelAPIDomain !== appInfo.topLevelWebsiteDomain || protocolOfAPIDomain !== protocolOfWebsiteDomain + let cookieSameSite: (input: { + request: BaseRequest | undefined; + userContext: any; + }) => "strict" | "lax" | "none" = (input: { request: BaseRequest | undefined; userContext: any }) => { + let protocolOfWebsiteDomain = getURLProtocol( + appInfo + .getOrigin({ + request: input.request, + userContext: input.userContext, + }) + .getAsStringDangerous() + ); + + return appInfo.topLevelAPIDomain !== appInfo.getTopLevelWebsiteDomain(input) || + protocolOfAPIDomain !== protocolOfWebsiteDomain ? "none" : "lax"; - cookieSameSite = - config === undefined || config.cookieSameSite === undefined - ? cookieSameSite - : normaliseSameSiteOrThrowError(config.cookieSameSite); + }; + + if (config !== undefined && config.cookieSameSite !== undefined) { + let normalisedCookieSameSite = normaliseSameSiteOrThrowError(config.cookieSameSite); + + cookieSameSite = () => normalisedCookieSameSite; + } let cookieSecure = config === undefined || config.cookieSecure === undefined @@ -167,12 +182,29 @@ export function validateAndNormaliseUserInput( } } - let antiCsrf: "VIA_TOKEN" | "VIA_CUSTOM_HEADER" | "NONE" = - config === undefined || config.antiCsrf === undefined - ? cookieSameSite === "none" - ? "VIA_CUSTOM_HEADER" - : "NONE" - : config.antiCsrf; + let antiCsrf: + | "VIA_TOKEN" + | "VIA_CUSTOM_HEADER" + | "NONE" + | ((input: { request: BaseRequest | undefined; userContext: any }) => "VIA_CUSTOM_HEADER" | "NONE") = ({ + request, + userContext, + }) => { + const sameSite = cookieSameSite({ + request, + userContext, + }); + + if (sameSite === "none") { + return "VIA_CUSTOM_HEADER"; + } + + return "NONE"; + }; + + if (config !== undefined && config.antiCsrf !== undefined) { + antiCsrf = config.antiCsrf; + } let errorHandlers: NormalisedErrorHandlers = { onTokenTheftDetected: async ( @@ -229,11 +261,11 @@ export function validateAndNormaliseUserInput( ? defaultGetTokenTransferMethod : config.getTokenTransferMethod, cookieDomain, - cookieSameSite, + getCookieSameSite: cookieSameSite, cookieSecure, sessionExpiredStatusCode, errorHandlers, - antiCsrf, + antiCsrfFunctionOrString: antiCsrf, override, invalidClaimStatusCode, }; @@ -253,7 +285,9 @@ export function setAccessTokenInResponse( accessToken: string, frontToken: string, config: TypeNormalisedInput, - transferMethod: TokenTransferMethod + transferMethod: TokenTransferMethod, + req: BaseRequest | undefined, + userContext: any ) { setFrontTokenInHeaders(res, frontToken); setToken( @@ -266,7 +300,9 @@ export function setAccessTokenInResponse( // Even if the token is expired the presence of the token indicates that the user could have a valid refresh token // Setting them to infinity would require special case handling on the frontend and just adding 100 years seems enough. Date.now() + hundredYearsInMs, - transferMethod + transferMethod, + req, + userContext ); if (config.exposeAccessTokenToFrontendInCookieBasedAuth && transferMethod === "cookie") { @@ -280,7 +316,9 @@ export function setAccessTokenInResponse( // Even if the token is expired the presence of the token indicates that the user could have a valid refresh token // Setting them to infinity would require special case handling on the frontend and just adding 100 years seems enough. Date.now() + hundredYearsInMs, - "header" + "header", + req, + userContext ); } } diff --git a/lib/ts/recipe/thirdparty/providers/bitbucket.ts b/lib/ts/recipe/thirdparty/providers/bitbucket.ts index 0767aa6e8..56cc8073f 100644 --- a/lib/ts/recipe/thirdparty/providers/bitbucket.ts +++ b/lib/ts/recipe/thirdparty/providers/bitbucket.ts @@ -17,6 +17,7 @@ import { ProviderInput, TypeProvider } from "../types"; import { doGetRequest } from "./utils"; import NewProvider from "./custom"; +import { logDebugMessage } from "../../../logger"; export default function Bitbucket(input: ProviderInput): TypeProvider { if (input.config.name === undefined) { @@ -74,7 +75,16 @@ export default function Bitbucket(input: ProviderInput): TypeProvider { undefined, headers ); - rawUserInfoFromProvider.fromUserInfoAPI = userInfoFromAccessToken; + + if (userInfoFromAccessToken.status >= 400) { + logDebugMessage( + `Received response with status ${userInfoFromAccessToken.status} and body ${userInfoFromAccessToken.stringResponse}` + ); + throw new Error( + `Received response with status ${userInfoFromAccessToken.status} and body ${userInfoFromAccessToken.stringResponse}` + ); + } + rawUserInfoFromProvider.fromUserInfoAPI = userInfoFromAccessToken.jsonResponse; const userInfoFromEmail = await doGetRequest( "https://api.bitbucket.org/2.0/user/emails", @@ -82,11 +92,20 @@ export default function Bitbucket(input: ProviderInput): TypeProvider { headers ); - rawUserInfoFromProvider.fromUserInfoAPI.email = userInfoFromEmail; + if (userInfoFromEmail.status >= 400) { + logDebugMessage( + `Received response with status ${userInfoFromEmail.status} and body ${userInfoFromEmail.stringResponse}` + ); + throw new Error( + `Received response with status ${userInfoFromEmail.status} and body ${userInfoFromEmail.stringResponse}` + ); + } + + rawUserInfoFromProvider.fromUserInfoAPI.email = userInfoFromEmail.jsonResponse; let email = undefined; let isVerified = false; - for (const emailInfo of userInfoFromEmail.values) { + for (const emailInfo of userInfoFromEmail.jsonResponse!.values) { if (emailInfo.is_primary) { email = emailInfo.email; isVerified = emailInfo.is_confirmed; diff --git a/lib/ts/recipe/thirdparty/providers/custom.ts b/lib/ts/recipe/thirdparty/providers/custom.ts index 2564049c2..4b1bf65ca 100644 --- a/lib/ts/recipe/thirdparty/providers/custom.ts +++ b/lib/ts/recipe/thirdparty/providers/custom.ts @@ -3,6 +3,7 @@ import { doGetRequest, doPostRequest, verifyIdTokenFromJWKSEndpointAndGetPayload import pkceChallenge from "pkce-challenge"; import { getProviderConfigForClient } from "./configUtils"; import { JWTVerifyGetKey, createRemoteJWKSet } from "jose"; +import { logDebugMessage } from "../../../logger"; const DEV_OAUTH_AUTHORIZATION_URL = "https://supertokens.io/dev/oauth/redirect-to-provider"; export const DEV_OAUTH_REDIRECT_URL = "https://supertokens.io/dev/oauth/redirect-to-app"; @@ -269,7 +270,18 @@ export default function NewProvider(input: ProviderInput): TypeProvider { } /* Transformation needed for dev keys END */ - return await doPostRequest(tokenAPIURL, accessTokenAPIParams); + const tokenResponse = await doPostRequest(tokenAPIURL, accessTokenAPIParams); + + if (tokenResponse.status >= 400) { + logDebugMessage( + `Received response with status ${tokenResponse.status} and body ${tokenResponse.stringResponse}` + ); + throw new Error( + `Received response with status ${tokenResponse.status} and body ${tokenResponse.stringResponse}` + ); + } + + return tokenResponse.jsonResponse; }, getUserInfo: async function ({ oAuthTokens, userContext }): Promise { @@ -340,7 +352,17 @@ export default function NewProvider(input: ProviderInput): TypeProvider { } const userInfoFromAccessToken = await doGetRequest(impl.config.userInfoEndpoint, queryParams, headers); - rawUserInfoFromProvider.fromUserInfoAPI = userInfoFromAccessToken; + + if (userInfoFromAccessToken.status >= 400) { + logDebugMessage( + `Received response with status ${userInfoFromAccessToken.status} and body ${userInfoFromAccessToken.stringResponse}` + ); + throw new Error( + `Received response with status ${userInfoFromAccessToken.status} and body ${userInfoFromAccessToken.stringResponse}` + ); + } + + rawUserInfoFromProvider.fromUserInfoAPI = userInfoFromAccessToken.jsonResponse; } const userInfoResult = getSupertokensUserInfoResultFromRawUserInfo(impl.config, rawUserInfoFromProvider); diff --git a/lib/ts/recipe/thirdparty/providers/github.ts b/lib/ts/recipe/thirdparty/providers/github.ts index e9307658d..f556eba71 100644 --- a/lib/ts/recipe/thirdparty/providers/github.ts +++ b/lib/ts/recipe/thirdparty/providers/github.ts @@ -12,9 +12,9 @@ * License for the specific language governing permissions and limitations * under the License. */ -import fetch from "cross-fetch"; import { ProviderInput, TypeProvider, UserInfo } from "../types"; import NewProvider from "./custom"; +import { doGetRequest, doPostRequest } from "./utils"; function getSupertokensUserInfoFromRawUserInfoResponseForGithub(rawUserInfoResponse: { fromIdTokenPayload?: any; @@ -64,27 +64,25 @@ export default function Github(input: ProviderInput): TypeProvider { `${clientConfig.clientId}:${clientConfig.clientSecret === undefined ? "" : clientConfig.clientSecret}` ).toString("base64"); - const applicationsResponse = await fetch( + const applicationResponse = await doPostRequest( `https://api.github.com/applications/${clientConfig.clientId}/token`, { - headers: { - Authorization: `Basic ${basicAuthToken}`, - "Content-Type": "application/json", - }, - method: "POST", - body: JSON.stringify({ - access_token: accessToken, - }), + access_token: accessToken, + }, + { + Authorization: `Basic ${basicAuthToken}`, + "Content-Type": "application/json", } ); - if (applicationsResponse.status !== 200) { + if (applicationResponse.status !== 200) { throw new Error("Invalid access token"); } - const body = await applicationsResponse.json(); - - if (body.app === undefined || body.app.client_id !== clientConfig.clientId) { + if ( + applicationResponse.jsonResponse!.app === undefined || + applicationResponse.jsonResponse!.app.client_id !== clientConfig.clientId + ) { throw new Error("Access token does not belong to your application"); } }; @@ -111,19 +109,23 @@ export default function Github(input: ProviderInput): TypeProvider { }; const rawResponse: { [key: string]: any } = {}; - const emailInfoResp = await fetch("https://api.github.com/user/emails", { headers }); + const emailInfoResp = await doGetRequest("https://api.github.com/user/emails", undefined, headers); + if (emailInfoResp.status >= 400) { - throw new Error(`Getting userInfo failed with ${emailInfoResp.status}: ${await emailInfoResp.text()}`); + throw new Error( + `Getting userInfo failed with ${emailInfoResp.status}: ${emailInfoResp.stringResponse}` + ); } - const emailInfo = await emailInfoResp.json(); - rawResponse.emails = emailInfo; - const userInfoResp = await fetch("https://api.github.com/user", { headers }); + rawResponse.emails = emailInfoResp.jsonResponse; + + const userInfoResp = await doGetRequest("https://api.github.com/user", undefined, headers); + if (userInfoResp.status >= 400) { - throw new Error(`Getting userInfo failed with ${userInfoResp.status}: ${await userInfoResp.text()}`); + throw new Error(`Getting userInfo failed with ${userInfoResp.status}: ${userInfoResp.stringResponse}`); } - const userInfo = await userInfoResp.json(); - rawResponse.user = userInfo; + + rawResponse.user = userInfoResp.jsonResponse; const rawUserInfoFromProvider = { fromUserInfoAPI: rawResponse, diff --git a/lib/ts/recipe/thirdparty/providers/gitlab.ts b/lib/ts/recipe/thirdparty/providers/gitlab.ts index ef8552386..a390be591 100644 --- a/lib/ts/recipe/thirdparty/providers/gitlab.ts +++ b/lib/ts/recipe/thirdparty/providers/gitlab.ts @@ -15,7 +15,6 @@ import { TypeProvider, ProviderInput } from "../types"; import NewProvider from "./custom"; -// import fetch from "cross-fetch"; // import NormalisedURLDomain from "../../../normalisedURLDomain"; export default function Gitlab(input: ProviderInput): TypeProvider { @@ -102,7 +101,7 @@ export default function Gitlab(input: ProviderInput): TypeProvider { // }) { // let accessToken = accessTokenAPIResponse.access_token; // let authHeader = `Bearer ${accessToken}`; -// let response = await fetch(baseUrl + "/api/v4/user", { +// let response = await doFetch(baseUrl + "/api/v4/user", { // method: "get", // headers: { // Authorization: authHeader, diff --git a/lib/ts/recipe/thirdparty/providers/linkedin.ts b/lib/ts/recipe/thirdparty/providers/linkedin.ts index 4472eac17..9597101ec 100644 --- a/lib/ts/recipe/thirdparty/providers/linkedin.ts +++ b/lib/ts/recipe/thirdparty/providers/linkedin.ts @@ -12,6 +12,7 @@ * License for the specific language governing permissions and limitations * under the License. */ +import { logDebugMessage } from "../../../logger"; import { ProviderInput, TypeProvider } from "../types"; import NewProvider from "./custom"; import { doGetRequest } from "./utils"; @@ -63,7 +64,16 @@ export default function Linkedin(input: ProviderInput): TypeProvider { }; const userInfoFromAccessToken = await doGetRequest("https://api.linkedin.com/v2/me", undefined, headers); - rawUserInfoFromProvider.fromUserInfoAPI = userInfoFromAccessToken; + rawUserInfoFromProvider.fromUserInfoAPI = userInfoFromAccessToken.jsonResponse; + + if (userInfoFromAccessToken.status >= 400) { + logDebugMessage( + `Received response with status ${userInfoFromAccessToken.status} and body ${userInfoFromAccessToken.stringResponse}` + ); + throw new Error( + `Received response with status ${userInfoFromAccessToken.status} and body ${userInfoFromAccessToken.stringResponse}` + ); + } const emailAPIURL = "https://api.linkedin.com/v2/emailAddress"; const userInfoFromEmail = await doGetRequest( @@ -72,12 +82,23 @@ export default function Linkedin(input: ProviderInput): TypeProvider { headers ); - if (userInfoFromEmail.elements && userInfoFromEmail.elements.length > 0) { - rawUserInfoFromProvider.fromUserInfoAPI.email = userInfoFromEmail.elements[0]["handle~"].emailAddress; + if (userInfoFromEmail.status >= 400) { + logDebugMessage( + `Received response with status ${userInfoFromEmail.status} and body ${userInfoFromEmail.stringResponse}` + ); + throw new Error( + `Received response with status ${userInfoFromEmail.status} and body ${userInfoFromEmail.stringResponse}` + ); + } + + if (userInfoFromEmail.jsonResponse!.elements && userInfoFromEmail.jsonResponse!.elements.length > 0) { + rawUserInfoFromProvider.fromUserInfoAPI.email = userInfoFromEmail.jsonResponse!.elements[0][ + "handle~" + ].emailAddress; } rawUserInfoFromProvider.fromUserInfoAPI = { ...rawUserInfoFromProvider.fromUserInfoAPI, - ...userInfoFromEmail, + ...userInfoFromEmail.jsonResponse!, }; return { diff --git a/lib/ts/recipe/thirdparty/providers/twitter.ts b/lib/ts/recipe/thirdparty/providers/twitter.ts index 44b5ea6a3..cb60db8d3 100644 --- a/lib/ts/recipe/thirdparty/providers/twitter.ts +++ b/lib/ts/recipe/thirdparty/providers/twitter.ts @@ -12,6 +12,7 @@ * License for the specific language governing permissions and limitations * under the License. */ +import { logDebugMessage } from "../../../logger"; import { ProviderInput, TypeProvider } from "../types"; import NewProvider, { DEV_OAUTH_REDIRECT_URL, @@ -92,9 +93,24 @@ export default function Twitter(input: ProviderInput): TypeProvider { ...originalImplementation.config.tokenEndpointBodyParams, }; - return await doPostRequest(originalImplementation.config.tokenEndpoint!, twitterOauthTokenParams, { - Authorization: `Basic ${basicAuthToken}`, - }); + const tokenResponse = await doPostRequest( + originalImplementation.config.tokenEndpoint!, + twitterOauthTokenParams, + { + Authorization: `Basic ${basicAuthToken}`, + } + ); + + if (tokenResponse.status >= 400) { + logDebugMessage( + `Received response with status ${tokenResponse.status} and body ${tokenResponse.stringResponse}` + ); + throw new Error( + `Received response with status ${tokenResponse.status} and body ${tokenResponse.stringResponse}` + ); + } + + return tokenResponse.jsonResponse; }; if (oOverride !== undefined) { diff --git a/lib/ts/recipe/thirdparty/providers/utils.ts b/lib/ts/recipe/thirdparty/providers/utils.ts index 28dcf6e26..e1ed8a685 100644 --- a/lib/ts/recipe/thirdparty/providers/utils.ts +++ b/lib/ts/recipe/thirdparty/providers/utils.ts @@ -1,16 +1,20 @@ -import fetch from "cross-fetch"; import * as jose from "jose"; import { ProviderConfigForClientType } from "../types"; import NormalisedURLDomain from "../../../normalisedURLDomain"; import NormalisedURLPath from "../../../normalisedURLPath"; import { logDebugMessage } from "../../../logger"; +import { doFetch } from "../../../utils"; export async function doGetRequest( url: string, queryParams?: { [key: string]: string }, headers?: { [key: string]: string } -): Promise { +): Promise<{ + jsonResponse: Record | undefined; + status: number; + stringResponse: string; +}> { logDebugMessage( `GET request to ${url}, with query params ${JSON.stringify(queryParams)} and headers ${JSON.stringify(headers)}` ); @@ -22,25 +26,34 @@ export async function doGetRequest( } const finalURL = new URL(url); finalURL.search = new URLSearchParams(queryParams).toString(); - let response = await fetch(finalURL.toString(), { + let response = await doFetch(finalURL.toString(), { headers: headers, }); - if (response.status >= 400) { - logDebugMessage(`Received response with status ${response.status} and body ${await response.clone().text()}`); - throw new Error(`Received response with status ${response.status} and body ${await response.clone().text()}`); + const stringResponse = await response.text(); + let jsonResponse: Record | undefined = undefined; + + if (response.status < 400) { + jsonResponse = JSON.parse(stringResponse); } - const respData = await response.clone().json(); - logDebugMessage(`Received response with status ${response.status} and body ${JSON.stringify(respData)}`); - return respData; + logDebugMessage(`Received response with status ${response.status} and body ${stringResponse}`); + return { + stringResponse, + status: response.status, + jsonResponse, + }; } export async function doPostRequest( url: string, params: { [key: string]: any }, headers?: { [key: string]: string } -): Promise { +): Promise<{ + jsonResponse: Record | undefined; + status: number; + stringResponse: string; +}> { if (headers === undefined) { headers = {}; } @@ -53,20 +66,25 @@ export async function doPostRequest( ); const body = new URLSearchParams(params).toString(); - let response = await fetch(url, { + let response = await doFetch(url, { method: "POST", body, headers, }); - if (response.status >= 400) { - logDebugMessage(`Received response with status ${response.status} and body ${await response.clone().text()}`); - throw new Error(`Received response with status ${response.status} and body ${await response.clone().text()}`); + const stringResponse = await response.text(); + let jsonResponse: Record | undefined = undefined; + + if (response.status < 400) { + jsonResponse = JSON.parse(stringResponse); } - const respData = await response.clone().json(); - logDebugMessage(`Received response with status ${response.status} and body ${JSON.stringify(respData)}`); - return respData; + logDebugMessage(`Received response with status ${response.status} and body ${stringResponse}`); + return { + stringResponse, + status: response.status, + jsonResponse, + }; } export async function verifyIdTokenFromJWKSEndpointAndGetPayload( @@ -96,8 +114,13 @@ async function getOIDCDiscoveryInfo(issuer: string): Promise { normalizedDomain.getAsStringDangerous() + normalizedPath.getAsStringDangerous() ); - oidcInfoMap[issuer] = oidcInfo; - return oidcInfo; + if (oidcInfo.status >= 400) { + logDebugMessage(`Received response with status ${oidcInfo.status} and body ${oidcInfo.stringResponse}`); + throw new Error(`Received response with status ${oidcInfo.status} and body ${oidcInfo.stringResponse}`); + } + + oidcInfoMap[issuer] = oidcInfo.jsonResponse!; + return oidcInfo.jsonResponse!; } export async function discoverOIDCEndpoints(config: ProviderConfigForClientType): Promise { diff --git a/lib/ts/recipe/thirdpartyemailpassword/index.ts b/lib/ts/recipe/thirdpartyemailpassword/index.ts index 425d1f132..04d072df6 100644 --- a/lib/ts/recipe/thirdpartyemailpassword/index.ts +++ b/lib/ts/recipe/thirdpartyemailpassword/index.ts @@ -21,7 +21,7 @@ import { TypeEmailPasswordEmailDeliveryInput } from "../emailpassword/types"; import RecipeUserId from "../../recipeUserId"; import { DEFAULT_TENANT_ID } from "../multitenancy/constants"; import { getPasswordResetLink } from "../emailpassword/utils"; -import { getUser } from "../.."; +import { getRequestFromUserContext, getUser } from "../.."; export default class Wrapper { static init = Recipe.init; @@ -146,6 +146,8 @@ export default class Wrapper { recipeId: recipeInstance.getRecipeId(), token: token.token, tenantId, + request: getRequestFromUserContext(userContext), + userContext, }), }; } diff --git a/lib/ts/recipe/thirdpartypasswordless/index.ts b/lib/ts/recipe/thirdpartypasswordless/index.ts index 503d02194..2893d6bb9 100644 --- a/lib/ts/recipe/thirdpartypasswordless/index.ts +++ b/lib/ts/recipe/thirdpartypasswordless/index.ts @@ -25,6 +25,7 @@ import { import { TypeProvider } from "../thirdparty/types"; import { TypePasswordlessSmsDeliveryInput } from "../passwordless/types"; import RecipeUserId from "../../recipeUserId"; +import { getRequestFromUserContext } from "../.."; export default class Wrapper { static init = Recipe.init; @@ -194,6 +195,7 @@ export default class Wrapper { ) { return Recipe.getInstanceOrThrowError().passwordlessRecipe.createMagicLink({ ...input, + request: getRequestFromUserContext(input.userContext), userContext: input.userContext ?? {}, }); } diff --git a/lib/ts/recipeModule.ts b/lib/ts/recipeModule.ts index 73a665a88..b55331950 100644 --- a/lib/ts/recipeModule.ts +++ b/lib/ts/recipeModule.ts @@ -101,7 +101,7 @@ export default abstract class RecipeModule { userContext: any ): Promise; - abstract handleError(error: STError, request: BaseRequest, response: BaseResponse): Promise; + abstract handleError(error: STError, request: BaseRequest, response: BaseResponse, userContext: any): Promise; abstract getAllCORSHeaders(): string[]; diff --git a/lib/ts/supertokens.ts b/lib/ts/supertokens.ts index bbf65492a..4308d3115 100644 --- a/lib/ts/supertokens.ts +++ b/lib/ts/supertokens.ts @@ -50,7 +50,19 @@ export default class SuperTokens { constructor(config: TypeInput) { logDebugMessage("Started SuperTokens with debug logging (supertokens.init called)"); - logDebugMessage("appInfo: " + JSON.stringify(config.appInfo)); + const originToPrint = + config.appInfo.origin === undefined + ? undefined + : typeof config.appInfo.origin === "string" + ? config.appInfo.origin + : "function"; + logDebugMessage( + "appInfo: " + + JSON.stringify({ + ...config.appInfo, + origin: originToPrint, + }) + ); this.framework = config.framework !== undefined ? config.framework : "express"; logDebugMessage("framework: " + this.framework); @@ -369,7 +381,7 @@ export default class SuperTokens { } }; - errorHandler = async (err: any, request: BaseRequest, response: BaseResponse) => { + errorHandler = async (err: any, request: BaseRequest, response: BaseResponse, userContext: any) => { logDebugMessage("errorHandler: Started"); if (STError.isErrorFromSuperTokens(err)) { logDebugMessage("errorHandler: Error is from SuperTokens recipe. Message: " + err.message); @@ -382,7 +394,7 @@ export default class SuperTokens { logDebugMessage("errorHandler: Checking recipe for match: " + this.recipeModules[i].getRecipeId()); if (this.recipeModules[i].isErrorFromThisRecipe(err)) { logDebugMessage("errorHandler: Matched with recipeID: " + this.recipeModules[i].getRecipeId()); - return await this.recipeModules[i].handleError(err, request, response); + return await this.recipeModules[i].handleError(err, request, response, userContext); } } } diff --git a/lib/ts/types.ts b/lib/ts/types.ts index c3fd99584..6699e29c0 100644 --- a/lib/ts/types.ts +++ b/lib/ts/types.ts @@ -18,10 +18,12 @@ import NormalisedURLDomain from "./normalisedURLDomain"; import NormalisedURLPath from "./normalisedURLPath"; import { TypeFramework } from "./framework/types"; import { RecipeLevelUser } from "./recipe/accountlinking/types"; +import { BaseRequest } from "./framework"; export type AppInfo = { appName: string; - websiteDomain: string; + websiteDomain?: string; + origin?: string | ((input: { request: BaseRequest | undefined; userContext: any }) => string); websiteBasePath?: string; apiDomain: string; apiBasePath?: string; @@ -30,10 +32,10 @@ export type AppInfo = { export type NormalisedAppinfo = { appName: string; - websiteDomain: NormalisedURLDomain; + getOrigin: (input: { request: BaseRequest | undefined; userContext: any }) => NormalisedURLDomain; apiDomain: NormalisedURLDomain; topLevelAPIDomain: string; - topLevelWebsiteDomain: string; + getTopLevelWebsiteDomain: (input: { request: BaseRequest | undefined; userContext: any }) => string; apiBasePath: NormalisedURLPath; apiGatewayPath: NormalisedURLPath; websiteBasePath: NormalisedURLPath; diff --git a/lib/ts/utils.ts b/lib/ts/utils.ts index 3ccb32f2c..3123756b2 100644 --- a/lib/ts/utils.ts +++ b/lib/ts/utils.ts @@ -6,10 +6,17 @@ import NormalisedURLPath from "./normalisedURLPath"; import type { BaseRequest, BaseResponse } from "./framework"; import { logDebugMessage } from "./logger"; import { HEADER_FDI, HEADER_RID } from "./constants"; -import fetch from "cross-fetch"; +import crossFetch from "cross-fetch"; import { User } from "./user"; import { SessionContainer } from "./recipe/session"; +export const doFetch: typeof fetch = (...args) => { + if (typeof fetch !== "undefined") { + return fetch(...args); + } + return crossFetch(...args); +}; + export function getLargestVersionFromIntersection(v1: string[], v2: string[]): string | undefined { let intersection = v1.filter((value) => v2.indexOf(value) !== -1); if (intersection.length === 0) { @@ -51,22 +58,45 @@ export function normaliseInputAppInfoOrThrowError(appInfo: AppInfo): NormalisedA if (appInfo.appName === undefined) { throw new Error("Please provide your appName inside the appInfo object when calling supertokens.init"); } - if (appInfo.websiteDomain === undefined) { - throw new Error("Please provide your websiteDomain inside the appInfo object when calling supertokens.init"); - } + let apiGatewayPath = appInfo.apiGatewayPath !== undefined ? new NormalisedURLPath(appInfo.apiGatewayPath) : new NormalisedURLPath(""); - const websiteDomain = new NormalisedURLDomain(appInfo.websiteDomain); + if (appInfo.origin === undefined && appInfo.websiteDomain === undefined) { + throw new Error( + "Please provide either origin or websiteDomain inside the appInfo object when calling supertokens.init" + ); + } + + let websiteDomainFunction = (input: { request: BaseRequest | undefined; userContext: any }) => { + let origin = appInfo.origin; + + if (origin === undefined) { + origin = appInfo.websiteDomain; + } + + // This should not be possible because we check for either origin or websiteDomain above + if (origin === undefined) { + throw new Error("Should never come here"); + } + + if (typeof origin === "function") { + origin = origin(input); + } + return new NormalisedURLDomain(origin); + }; + const apiDomain = new NormalisedURLDomain(appInfo.apiDomain); const topLevelAPIDomain = getTopLevelDomainForSameSiteResolution(apiDomain.getAsStringDangerous()); - const topLevelWebsiteDomain = getTopLevelDomainForSameSiteResolution(websiteDomain.getAsStringDangerous()); + const topLevelWebsiteDomain = (input: { request: BaseRequest | undefined; userContext: any }) => { + return getTopLevelDomainForSameSiteResolution(websiteDomainFunction(input).getAsStringDangerous()); + }; return { appName: appInfo.appName, - websiteDomain, + getOrigin: websiteDomainFunction, apiDomain, apiBasePath: apiGatewayPath.appendPath( appInfo.apiBasePath === undefined @@ -79,7 +109,7 @@ export function normaliseInputAppInfoOrThrowError(appInfo: AppInfo): NormalisedA : new NormalisedURLPath(appInfo.websiteBasePath), apiGatewayPath, topLevelAPIDomain, - topLevelWebsiteDomain, + getTopLevelWebsiteDomain: topLevelWebsiteDomain, }; } @@ -250,8 +280,12 @@ export function getTopLevelDomainForSameSiteResolution(url: string): string { // we treat these as the same TLDs since we can use sameSite lax for all of them. return "localhost"; } + let parsedURL = psl.parse(hostname) as psl.ParsedDomain; if (parsedURL.domain === null) { + if (hostname.endsWith(".amazonaws.com") && parsedURL.tld === hostname) { + return hostname; + } throw new Error("Please make sure that the apiDomain and websiteDomain have correct values"); } return parsedURL.domain; @@ -276,7 +310,7 @@ export async function postWithFetch( let error; let resp: { status: number; body: any }; try { - const fetchResp = await fetch(url, { + const fetchResp = await doFetch(url, { method: "POST", body: JSON.stringify(body), headers, diff --git a/lib/ts/version.ts b/lib/ts/version.ts index b7ad51705..86c2c4b76 100644 --- a/lib/ts/version.ts +++ b/lib/ts/version.ts @@ -12,7 +12,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -export const version = "16.2.0"; +export const version = "16.3.4"; export const cdiSupported = ["4.0"]; diff --git a/package-lock.json b/package-lock.json index 4f03f222c..684022482 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "supertokens-node", - "version": "16.2.0", + "version": "16.3.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "supertokens-node", - "version": "16.2.0", + "version": "16.3.2", "license": "Apache-2.0", "dependencies": { "content-type": "^1.0.5", diff --git a/package.json b/package.json index c45de4c30..4227e3c5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "supertokens-node", - "version": "16.2.0", + "version": "16.3.4", "description": "NodeJS driver for SuperTokens core", "main": "index.js", "scripts": { diff --git a/recipe/session/framework/custom/index.d.ts b/recipe/session/framework/custom/index.d.ts new file mode 100644 index 000000000..737d51302 --- /dev/null +++ b/recipe/session/framework/custom/index.d.ts @@ -0,0 +1,3 @@ +export * from "../../../../lib/build/recipe/session/framework/custom"; +import * as _default from "../../../../lib/build/recipe/session/framework/custom"; +export default _default; diff --git a/recipe/session/framework/custom/index.js b/recipe/session/framework/custom/index.js new file mode 100644 index 000000000..92a33d0b5 --- /dev/null +++ b/recipe/session/framework/custom/index.js @@ -0,0 +1,6 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +exports.__esModule = true; +__export(require("../../../../lib/build/recipe/session/framework/custom")); diff --git a/test/accountlinking/emailverificationapis.test.js b/test/accountlinking/emailverificationapis.test.js index 6216a3f67..70f815613 100644 --- a/test/accountlinking/emailverificationapis.test.js +++ b/test/accountlinking/emailverificationapis.test.js @@ -478,7 +478,7 @@ describe(`emailverificationapiTests: ${printPath("[test/accountlinking/emailveri }); describe("isEmailVerifiedGET tests", function () { - it("calling isEmailVerifiedGET gives false for currently logged in user if email is not verified, and does not update session", async function () { + it("calling isEmailVerifiedGET gives false for currently logged in user if email is not verified, and updates session", async function () { const connectionURI = await startSTWithMultitenancyAndAccountLinking(); supertokens.init({ supertokens: { @@ -555,12 +555,10 @@ describe(`emailverificationapiTests: ${printPath("[test/accountlinking/emailveri assert(response.body.isVerified === false); let tokens = extractInfoFromResponse(response); - assert(tokens.accessToken === undefined); - assert(tokens.accessTokenFromAny === undefined); - assert(tokens.accessTokenFromHeader === undefined); + assert.notStrictEqual(tokens.accessTokenFromAny, undefined); }); - it("calling isEmailVerifiedGET gives true for currently logged in user if email is verified, and does not update session", async function () { + it("calling isEmailVerifiedGET gives true for currently logged in user if email is verified, and updates session", async function () { const connectionURI = await startSTWithMultitenancyAndAccountLinking(); supertokens.init({ supertokens: { @@ -643,9 +641,7 @@ describe(`emailverificationapiTests: ${printPath("[test/accountlinking/emailveri assert(response.body.isVerified === true); let tokens = extractInfoFromResponse(response); - assert(tokens.accessToken === undefined); - assert(tokens.accessTokenFromAny === undefined); - assert(tokens.accessTokenFromHeader === undefined); + assert.notStrictEqual(tokens.accessTokenFromAny, undefined); }); it("calling isEmailVerifiedGET gives false for currently logged in user if email is not verified, and updates session if needed", async function () { @@ -928,7 +924,7 @@ describe(`emailverificationapiTests: ${printPath("[test/accountlinking/emailveri assert(userInCallback.recipeUserId.getAsString() === epUser.loginMethods[0].recipeUserId.getAsString()); }); - it("calling generateEmailVerifyTokenPOST gives already verified for currently logged in user if email is verified, and does not update session", async function () { + it("calling generateEmailVerifyTokenPOST gives already verified for currently logged in user if email is verified, and updates session", async function () { let userInCallback = undefined; const connectionURI = await startSTWithMultitenancyAndAccountLinking(); supertokens.init({ @@ -1021,9 +1017,7 @@ describe(`emailverificationapiTests: ${printPath("[test/accountlinking/emailveri assert(response.body.status === "EMAIL_ALREADY_VERIFIED_ERROR"); let tokens = extractInfoFromResponse(response); - assert(tokens.accessToken === undefined); - assert(tokens.accessTokenFromAny === undefined); - assert(tokens.accessTokenFromHeader === undefined); + assert.notStrictEqual(tokens.accessTokenFromAny, undefined); assert(userInCallback === undefined); }); diff --git a/test/accountlinking/helperFunctions.test.js b/test/accountlinking/helperFunctions.test.js index e01417138..c44c0726b 100644 --- a/test/accountlinking/helperFunctions.test.js +++ b/test/accountlinking/helperFunctions.test.js @@ -29,6 +29,7 @@ let { ProcessState, PROCESS_STATE } = require("../../lib/build/processState"); let EmailPassword = require("../../recipe/emailpassword"); let EmailVerification = require("../../recipe/emailverification"); let ThirdParty = require("../../recipe/thirdparty"); +let Multitenancy = require("../../recipe/multitenancy"); let AccountLinking = require("../../recipe/accountlinking"); let AccountLinkingRecipe = require("../../lib/build/recipe/accountlinking/recipe").default; @@ -1137,6 +1138,70 @@ describe(`accountlinkingTests: ${printPath("[test/accountlinking/helperFunctions }); describe("listUsersByAccountInfo tests", function () { + it("listUsersByAccountInfo filters by tenantId", async function () { + const connectionURI = await startSTWithMultitenancyAndAccountLinking(); + + supertokens.init({ + supertokens: { + connectionURI, + }, + appInfo: { + apiDomain: "api.supertokens.io", + appName: "SuperTokens", + websiteDomain: "supertokens.io", + }, + recipeList: [ + Multitenancy.init(), + EmailPassword.init(), + ThirdParty.init({ + signInAndUpFeature: { + providers: [ + { + config: { + thirdPartyId: "google", + clients: [ + { + clientId: "", + clientSecret: "", + }, + ], + }, + }, + ], + }, + }), + Session.init(), + ], + }); + await Multitenancy.createOrUpdateTenant("tenant1", { + thirdPartyEnabled: true, + emailPasswordEnabled: true, + }); + + const { user: pubUser } = await EmailPassword.signUp("public", "test@example.com", "password123"); + + const { user: t1User } = await ThirdParty.manuallyCreateOrUpdateUser( + "tenant1", + "google", + "abc", + "test@example.com", + false + ); + + let t1UserList = await supertokens.listUsersByAccountInfo("tenant1", { + email: "test@example.com", + }); + + assert.strictEqual(t1UserList.length, 1); + assert.strictEqual(t1UserList[0].id, t1User.id); + + let pubUserList = await supertokens.listUsersByAccountInfo("public", { + email: "test@example.com", + }); + assert.strictEqual(pubUserList.length, 1); + assert.strictEqual(pubUserList[0].id, pubUser.id); + }); + it("listUsersByAccountInfo does and properly", async function () { const connectionURI = await startSTWithMultitenancyAndAccountLinking(); @@ -1242,6 +1307,67 @@ describe(`accountlinkingTests: ${printPath("[test/accountlinking/helperFunctions }); }); + describe("getUsers tests", function () { + it("getUsers filters by tenantId", async function () { + const connectionURI = await startSTWithMultitenancyAndAccountLinking(); + + supertokens.init({ + supertokens: { + connectionURI, + }, + appInfo: { + apiDomain: "api.supertokens.io", + appName: "SuperTokens", + websiteDomain: "supertokens.io", + }, + recipeList: [ + Multitenancy.init(), + EmailPassword.init(), + ThirdParty.init({ + signInAndUpFeature: { + providers: [ + { + config: { + thirdPartyId: "google", + clients: [ + { + clientId: "", + clientSecret: "", + }, + ], + }, + }, + ], + }, + }), + Session.init(), + ], + }); + await Multitenancy.createOrUpdateTenant("tenant1", { + thirdPartyEnabled: true, + emailPasswordEnabled: true, + }); + + const { user: pubUser } = await EmailPassword.signUp("public", "test@example.com", "password123"); + + const { user: t1User } = await ThirdParty.manuallyCreateOrUpdateUser( + "tenant1", + "google", + "abc", + "test@example.com", + false + ); + + let { users: t1UserList } = await supertokens.getUsersNewestFirst({ tenantId: "tenant1" }); + assert.strictEqual(t1UserList.length, 1); + assert.strictEqual(t1UserList[0].id, t1User.id); + + let { users: pubUserList } = await supertokens.getUsersNewestFirst({ tenantId: "public" }); + assert.strictEqual(pubUserList.length, 1); + assert.strictEqual(pubUserList[0].id, pubUser.id); + }); + }); + describe("isEmailChangeAllowed tests", function () { it("isEmailChangeAllowed returns false if checking for email which belongs to other primary and if email password user is not a primary user or is not linked, and account linking is enabled and email verification is required", async function () { const connectionURI = await startSTWithMultitenancyAndAccountLinking(); diff --git a/test/config.test.js b/test/config.test.js index e3802f6cd..3819cba8a 100644 --- a/test/config.test.js +++ b/test/config.test.js @@ -168,7 +168,7 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { } catch (err) { if ( err.message !== - "Please provide your websiteDomain inside the appInfo object when calling supertokens.init" + "Please provide either origin or websiteDomain inside the appInfo object when calling supertokens.init" ) { throw err; } @@ -284,7 +284,7 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { recipeList: [Session.init({ getTokenTransferMethod: () => "cookie", cookieSameSite: " Lax " })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "lax"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "lax"); resetAll(); } @@ -302,7 +302,7 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { recipeList: [Session.init({ getTokenTransferMethod: () => "cookie", cookieSameSite: "None " })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "none"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "none"); resetAll(); } @@ -320,7 +320,7 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { recipeList: [Session.init({ getTokenTransferMethod: () => "cookie", cookieSameSite: " STRICT " })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "strict"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "strict"); resetAll(); } @@ -384,7 +384,7 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { recipeList: [Session.init({ getTokenTransferMethod: () => "cookie", cookieSameSite: "lax" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "lax"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "lax"); resetAll(); } @@ -402,7 +402,7 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { recipeList: [Session.init({ getTokenTransferMethod: () => "cookie", cookieSameSite: "none" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "none"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "none"); resetAll(); } @@ -420,7 +420,7 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { recipeList: [Session.init({ getTokenTransferMethod: () => "cookie", cookieSameSite: "strict" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "strict"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "strict"); resetAll(); } @@ -438,7 +438,7 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { recipeList: [Session.init({ getTokenTransferMethod: () => "cookie" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "lax"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "lax"); resetAll(); } @@ -846,8 +846,8 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { }, recipeList: [Session.init({ getTokenTransferMethod: () => "cookie", antiCsrf: "VIA_CUSTOM_HEADER" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrf === "VIA_CUSTOM_HEADER"); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "lax"); + assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrfFunctionOrString === "VIA_CUSTOM_HEADER"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "lax"); assert(SessionRecipe.getInstanceOrThrowError().config.cookieSecure === true); resetAll(); } @@ -867,8 +867,8 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { recipeList: [Session.init({ getTokenTransferMethod: () => "cookie" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrf === "NONE"); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "lax"); + assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrfFunctionOrString({}) === "NONE"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "lax"); assert(SessionRecipe.getInstanceOrThrowError().config.cookieSecure === true); resetAll(); @@ -889,8 +889,8 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { recipeList: [Session.init({ getTokenTransferMethod: () => "cookie" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrf === "NONE"); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "lax"); + assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrfFunctionOrString({}) === "NONE"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "lax"); assert(SessionRecipe.getInstanceOrThrowError().config.cookieSecure === true); resetAll(); } @@ -910,8 +910,8 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { recipeList: [Session.init({ getTokenTransferMethod: () => "cookie" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrf === "NONE"); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "lax"); + assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrfFunctionOrString({}) === "NONE"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "lax"); assert(SessionRecipe.getInstanceOrThrowError().config.cookieSecure === true); resetAll(); } @@ -931,8 +931,8 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { recipeList: [Session.init({ getTokenTransferMethod: () => "cookie" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrf === "VIA_CUSTOM_HEADER"); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "none"); + assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrfFunctionOrString({}) === "VIA_CUSTOM_HEADER"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "none"); assert(SessionRecipe.getInstanceOrThrowError().config.cookieSecure === true); resetAll(); } @@ -952,8 +952,8 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { recipeList: [Session.init({ getTokenTransferMethod: () => "cookie" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrf === "NONE"); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "lax"); + assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrfFunctionOrString({}) === "NONE"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "lax"); assert(SessionRecipe.getInstanceOrThrowError().config.cookieSecure === true); resetAll(); } @@ -973,8 +973,8 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { recipeList: [Session.init({ getTokenTransferMethod: () => "cookie" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrf === "NONE"); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "lax"); + assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrfFunctionOrString({}) === "NONE"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "lax"); assert(SessionRecipe.getInstanceOrThrowError().config.cookieSecure === false); resetAll(); } @@ -993,8 +993,8 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { }, recipeList: [Session.init({ getTokenTransferMethod: () => "cookie", antiCsrf: "VIA_CUSTOM_HEADER" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrf === "VIA_CUSTOM_HEADER"); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "lax"); + assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrfFunctionOrString === "VIA_CUSTOM_HEADER"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "lax"); assert(SessionRecipe.getInstanceOrThrowError().config.cookieSecure === false); resetAll(); } @@ -1013,8 +1013,8 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { }, recipeList: [Session.init({ getTokenTransferMethod: () => "cookie" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrf === "VIA_CUSTOM_HEADER"); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "none"); + assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrfFunctionOrString({}) === "VIA_CUSTOM_HEADER"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "none"); assert(SessionRecipe.getInstanceOrThrowError().config.cookieSecure === true); resetAll(); } @@ -1033,8 +1033,8 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { }, recipeList: [Session.init({ getTokenTransferMethod: () => "cookie" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrf === "NONE"); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "lax"); + assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrfFunctionOrString({}) === "NONE"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "lax"); assert(SessionRecipe.getInstanceOrThrowError().config.cookieSecure === false); resetAll(); } @@ -1053,7 +1053,7 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { }, recipeList: [Session.init({ getTokenTransferMethod: () => "cookie", antiCsrf: "NONE" })], }); - assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrf === "NONE"); + assert(SessionRecipe.getInstanceOrThrowError().config.antiCsrfFunctionOrString === "NONE"); resetAll(); } @@ -1186,7 +1186,7 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { }); assert(SessionRecipe.getInstanceOrThrowError().config.cookieSecure); - assert(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite === "none"); + assert(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}) === "none"); resetAll(); } @@ -1206,7 +1206,7 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { recipeList: [Session.init({ getTokenTransferMethod: () => "cookie" })], }); assert.equal(SessionRecipe.getInstanceOrThrowError().config.cookieDomain, undefined); - assert.equal(SessionRecipe.getInstanceOrThrowError().config.cookieSameSite, "lax"); + assert.equal(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}), "lax"); assert.equal(SessionRecipe.getInstanceOrThrowError().config.cookieSecure, true); assert.equal( SessionRecipe.getInstanceOrThrowError().config.refreshTokenPath.getAsStringDangerous(), @@ -1251,6 +1251,77 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { assert.strictEqual(getTopLevelDomainForSameSiteResolution("http://localhost:3000"), "localhost"); assert.strictEqual(getTopLevelDomainForSameSiteResolution("http://test.com:3567"), "test.com"); assert.strictEqual(getTopLevelDomainForSameSiteResolution("https://test.com:3567"), "test.com"); + assert.strictEqual( + getTopLevelDomainForSameSiteResolution("https://ec2-xx-yyy-zzz-0.compute-1.amazonaws.com:3001"), + "ec2-xx-yyy-zzz-0.compute-1.amazonaws.com" + ); + }); + + it("should work well with ec2 public urls", async function () { + const connectionURI = await startST(); + + { + STExpress.init({ + supertokens: { + connectionURI, + }, + appInfo: { + appName: "Supertokens", + apiDomain: "https://ec2-xx-yyy-zzz-0.compute-1.amazonaws.com:3001", + websiteDomain: "https://blog.supertokens.com", + apiBasePath: "/", + }, + recipeList: [Session.init({ getTokenTransferMethod: () => "cookie" })], + }); + + assert.strictEqual(SessionRecipe.getInstanceOrThrowError().config.cookieDomain, undefined); + assert(SessionRecipe.getInstanceOrThrowError().config.cookieSecure); + assert.strictEqual(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}), "none"); + + resetAll(); + } + + { + STExpress.init({ + supertokens: { + connectionURI, + }, + appInfo: { + appName: "Supertokens", + apiDomain: "http://ec2-xx-yyy-zzz-0.compute-1.amazonaws.com:3001", + websiteDomain: "http://ec2-aa-bbb-ccc-0.compute-1.amazonaws.com:3000", + apiBasePath: "/", + }, + recipeList: [Session.init({ getTokenTransferMethod: () => "cookie" })], + }); + + assert.strictEqual(SessionRecipe.getInstanceOrThrowError().config.cookieDomain, undefined); + assert(!SessionRecipe.getInstanceOrThrowError().config.cookieSecure); + assert.strictEqual(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}), "none"); + + resetAll(); + } + + { + STExpress.init({ + supertokens: { + connectionURI, + }, + appInfo: { + appName: "Supertokens", + apiDomain: "http://ec2-xx-yyy-zzz-0.compute-1.amazonaws.com:3001", + websiteDomain: "http://ec2-xx-yyy-zzz-0.compute-1.amazonaws.com:3000", + apiBasePath: "/", + }, + recipeList: [Session.init({ getTokenTransferMethod: () => "cookie" })], + }); + + assert.strictEqual(SessionRecipe.getInstanceOrThrowError().config.cookieDomain, undefined); + assert(!SessionRecipe.getInstanceOrThrowError().config.cookieSecure); + assert.strictEqual(SessionRecipe.getInstanceOrThrowError().config.getCookieSameSite({}), "lax"); + + resetAll(); + } }); it("apiGatewayPath test", async function () { @@ -1508,4 +1579,111 @@ describe(`configTest: ${printPath("[test/config.test.js]")}`, function () { assert(SuperTokens.getInstanceOrThrowError().telemetryEnabled === false); }); + + it("Test that init throws if both website domain and origin is undefined", async function () { + const connectionURI = await startST(); + try { + STExpress.init({ + supertokens: { + connectionURI, + }, + appInfo: { + apiDomain: "api.supertokens.io", + appName: "SuperTokens", + }, + recipeList: [Session.init()], + telemetry: false, + }); + throw new Error("Init should have failed but didnt"); + } catch (e) { + if ( + e.message !== + "Please provide either origin or websiteDomain inside the appInfo object when calling supertokens.init" + ) { + throw e; + } + } + }); + + it("Test that init works fine when using origin", async function () { + const connectionURI = await startST(); + STExpress.init({ + supertokens: { + connectionURI, + }, + appInfo: { + apiDomain: "api.supertokens.io", + appName: "SuperTokens", + origin: "supertokens.io", + }, + recipeList: [Session.init()], + telemetry: false, + }); + + let originFromConfig = SuperTokens.getInstanceOrThrowError().appInfo.getOrigin(); + assert.equal(originFromConfig.getAsStringDangerous(), "https://supertokens.io"); + }); + + it("Test that init works fine when using a function for origin", async function () { + const connectionURI = await startST(); + STExpress.init({ + supertokens: { + connectionURI, + }, + appInfo: { + apiDomain: "api.supertokens.io", + appName: "SuperTokens", + origin: () => "supertokens.io", + }, + recipeList: [Session.init()], + telemetry: false, + }); + + let originFromConfig = SuperTokens.getInstanceOrThrowError().appInfo.getOrigin(); + assert.equal(originFromConfig.getAsStringDangerous(), "https://supertokens.io"); + }); + + it("Test that origin function returns correctly", async function () { + const connectionURI = await startST(); + STExpress.init({ + supertokens: { + connectionURI, + }, + appInfo: { + apiDomain: "api.supertokens.io", + appName: "SuperTokens", + origin: ({ userContext }) => userContext.url, + }, + recipeList: [Session.init()], + telemetry: false, + }); + + let originFromConfig = SuperTokens.getInstanceOrThrowError().appInfo.getOrigin({ + request: undefined, + userContext: { + url: "https://test.com", + }, + }); + assert.equal(originFromConfig.getAsStringDangerous(), "https://test.com"); + }); + + it("Test that if both website domain and origin are provided, origin is used", async function () { + const connectionURI = await startST(); + STExpress.init({ + supertokens: { + connectionURI, + }, + appInfo: { + apiDomain: "api.supertokens.io", + appName: "SuperTokens", + websiteDomain: "test.com", + origin: "supertokens.io", + }, + recipeList: [Session.init()], + telemetry: false, + }); + + let originFromConfig = SuperTokens.getInstanceOrThrowError().appInfo.getOrigin(); + assert.equal(originFromConfig.getAsStringDangerous(), "https://supertokens.io"); + }); }); diff --git a/test/emailpassword/emailverify.test.js b/test/emailpassword/emailverify.test.js index 3b940acd2..e5a1618fb 100644 --- a/test/emailpassword/emailverify.test.js +++ b/test/emailpassword/emailverify.test.js @@ -1408,7 +1408,7 @@ describe(`emailverify: ${printPath("[test/emailpassword/emailverify.test.js]")}` let infoFromResponse2 = extractInfoFromResponse(response); assert.strictEqual(response.statusCode, 200); assert.deepStrictEqual(response.body.status, "EMAIL_ALREADY_VERIFIED_ERROR"); - assert.strictEqual(infoFromResponse2.frontToken, undefined); + assert.notStrictEqual(infoFromResponse2.frontToken, undefined); // now we mark the email as unverified and try again await EmailVerification.unverifyEmail(userId, emailId); @@ -1426,4 +1426,58 @@ describe(`emailverify: ${printPath("[test/emailpassword/emailverify.test.js]")}` assert.deepStrictEqual(response.body.status, "OK"); assert.strictEqual(infoFromResponse2.frontToken, undefined); }); + + it("test that generate email verification token API updates session claims", async function () { + const connectionURI = await startST(); + let emailVerifyLink = ""; + + STExpress.init({ + supertokens: { + connectionURI, + }, + appInfo: { + apiDomain: "api.supertokens.io", + appName: "SuperTokens", + origin: ({ userContext }) => userContext.url, + }, + recipeList: [ + EmailPassword.init(), + EmailVerification.init({ + mode: "OPTIONAL", + emailDelivery: { + override: (original) => { + return { + ...original, + sendEmail: async (input) => { + emailVerifyLink = input.emailVerifyLink; + }, + }; + }, + }, + }), + Session.init(), + ], + }); + + const app = express(); + + app.use(middleware()); + + app.use(errorHandler()); + + let user = await EmailPassword.signUp("public", "test@example.com", "password1234"); + await EmailVerification.sendEmailVerificationEmail("public", user.user.id, user.recipeUserId, undefined, { + url: "localhost:3000", + }); + + let currentUrl = new URL(emailVerifyLink); + assert(currentUrl.origin === "http://localhost:3000"); + + await EmailVerification.sendEmailVerificationEmail("public", user.user.id, user.recipeUserId, undefined, { + url: "localhost:3002", + }); + + currentUrl = new URL(emailVerifyLink); + assert(currentUrl.origin === "http://localhost:3002"); + }); }); diff --git a/test/emailpassword/passwordreset.test.js b/test/emailpassword/passwordreset.test.js index 7cf0336da..5ef06366a 100644 --- a/test/emailpassword/passwordreset.test.js +++ b/test/emailpassword/passwordreset.test.js @@ -662,4 +662,96 @@ describe(`passwordreset: ${printPath("[test/emailpassword/passwordreset.test.js] assert(info.email === "test@example.com"); }); }); + + it("Test that reset password link uses the correct origin", async function () { + const connectionURI = await startST(); + let emailPasswordLink = ""; + STExpress.init({ + supertokens: { + connectionURI, + }, + appInfo: { + apiDomain: "api.supertokens.io", + appName: "SuperTokens", + origin: ({ request }) => { + if (request.getHeaderValue("origin") !== undefined) { + return request.getHeaderValue("origin"); + } + + return "localhost:3000"; + }, + }, + recipeList: [ + EmailPassword.init({ + emailDelivery: { + override: (original) => { + return { + ...original, + sendEmail: async (input) => { + emailPasswordLink = input.passwordResetLink; + }, + }; + }, + }, + }), + ], + }); + + const app = express(); + + app.use(middleware()); + + app.use(errorHandler()); + + await EmailPassword.signUp("public", "test@example.com", "password1234"); + + await new Promise((resolve) => + request(app) + .post("/auth/user/password/reset/token") + .send({ + formFields: [ + { + id: "email", + value: "test@example.com", + }, + ], + }) + .expect(200) + .end((err, res) => { + if (err) { + resolve(undefined); + } else { + resolve(JSON.parse(res.text)); + } + }) + ); + + let currentUrl = new URL(emailPasswordLink); + assert(currentUrl.origin === "http://localhost:3000"); + + await new Promise((resolve) => + request(app) + .post("/auth/user/password/reset/token") + .set("origin", "localhost:3002") + .send({ + formFields: [ + { + id: "email", + value: "test@example.com", + }, + ], + }) + .expect(200) + .end((err, res) => { + if (err) { + resolve(undefined); + } else { + resolve(JSON.parse(res.text)); + } + }) + ); + + currentUrl = new URL(emailPasswordLink); + assert(currentUrl.origin === "http://localhost:3002"); + }); }); diff --git a/test/framework/crossFramework.testgen.js b/test/framework/crossFramework.testgen.js index 451476b04..9bd3c2e0e 100644 --- a/test/framework/crossFramework.testgen.js +++ b/test/framework/crossFramework.testgen.js @@ -36,6 +36,11 @@ const loopbackRoutes = [ method: "post", verifySession: true, }, + { + path: "/session/multipleMerge", + method: "post", + verifySession: true, + }, { path: "/session/verify/optionalCSRF", method: "post", @@ -95,6 +100,7 @@ module.exports.addCrossFrameworkTests = (getTestCases, { allTokenTransferMethods route.handler( ExpressFramework.wrapRequest(req), ExpressFramework.wrapResponse(res), + req.session, next ), ]; @@ -181,6 +187,7 @@ module.exports.addCrossFrameworkTests = (getTestCases, { allTokenTransferMethods route.handler( FastifyFramework.wrapRequest(req), FastifyFramework.wrapResponse(res), + req.session, (err) => { throw err; } @@ -260,6 +267,7 @@ module.exports.addCrossFrameworkTests = (getTestCases, { allTokenTransferMethods await route.handler( HapiFramework.wrapRequest(req), HapiFramework.wrapResponse(res), + req.session, (err) => { throw err; } @@ -334,9 +342,14 @@ module.exports.addCrossFrameworkTests = (getTestCases, { allTokenTransferMethods for (const route of routes) { const handlers = [ (ctx) => - route.handler(KoaFramework.wrapRequest(ctx), KoaFramework.wrapResponse(ctx), (err) => { - throw err; - }), + route.handler( + KoaFramework.wrapRequest(ctx), + KoaFramework.wrapResponse(ctx), + ctx.session, + (err) => { + throw err; + } + ), ]; if (route.verifySession) { handlers.unshift(koaVerifySession(route.verifySessionOpts)); diff --git a/test/framework/crossframework/repeatedResponseHeader.test.js b/test/framework/crossframework/repeatedResponseHeader.test.js new file mode 100644 index 000000000..fa6702515 --- /dev/null +++ b/test/framework/crossframework/repeatedResponseHeader.test.js @@ -0,0 +1,105 @@ +const { addCrossFrameworkTests } = require("../crossFramework.testgen"); +let Session = require("../../../recipe/session"); +const { extractInfoFromResponse } = require("../../utils"); +let assert = require("assert"); +const SuperTokens = require("../../.."); + +addCrossFrameworkTests( + (setup, callServer, tokenTransferMethod) => { + describe("Updating token payload multiple times", () => { + it("should not repeat access token headers", async () => { + await setup({ + stConfig: { + appInfo: { + apiDomain: "http://api.supertokens.io", + appName: "SuperTokens", + websiteDomain: "http://supertokens.io", + apiBasePath: "/", + }, + recipeList: [Session.init()], + }, + routes: [ + { + path: "/create", + method: "post", + handler: async (req, res, next) => { + await Session.createNewSession( + req, + res, + "public", + SuperTokens.convertToRecipeUserId("id1"), + {}, + {} + ); + res.setStatusCode(200); + res.sendJSONResponse(""); + return res.response; + }, + }, + { + path: "/session/multipleMerge", + method: "post", + verifySession: true, + handler: async (req, res, session) => { + await session.mergeIntoAccessTokenPayload({ test1: Date.now() }); + await session.mergeIntoAccessTokenPayload({ test2: Date.now() }); + await session.mergeIntoAccessTokenPayload({ test3: Date.now() }); + res.setStatusCode(200); + res.sendJSONResponse(""); + }, + }, + ], + }); + + const createResp = await callServer({ + method: "post", + path: "/create", + headers: { + "st-auth-mode": tokenTransferMethod, + }, + }); + const info = extractInfoFromResponse(createResp); + + const verifyHeaders = + tokenTransferMethod === "header" + ? { authorization: `Bearer ${info.accessTokenFromAny}` } + : { + cookie: `sAccessToken=${encodeURIComponent(info.accessTokenFromAny)}`, + }; + if (info.antiCsrf) { + verifyHeaders.antiCsrf = info.antiCsrf; + } + + let resp = await callServer({ + method: "post", + path: "/session/multipleMerge", + headers: verifyHeaders, + }); + + const cookieHeader = resp.headers["set-cookie"]; + assert.strictEqual( + cookieHeader === undefined + ? 0 + : typeof cookieHeader == "string" + ? cookieHeader.startsWith("sAccessToken") + ? 1 + : 0 + : cookieHeader.filter((c) => c.startsWith("sAccessToken")).length ?? 0, + tokenTransferMethod === "cookie" ? 1 : 0 + ); + assert.strictEqual( + typeof resp.headers["st-access-token"], + tokenTransferMethod === "cookie" ? "undefined" : "string" + ); + assert.strictEqual(typeof resp.headers["front-token"], "string"); + const exposedHeaders = resp.headers["access-control-expose-headers"].split(" "); + assert.strictEqual(exposedHeaders.filter((c) => c.includes("front-token")).length, 1); + assert.strictEqual( + exposedHeaders.filter((c) => c.includes("st-access-token")).length, + tokenTransferMethod === "cookie" ? 0 : 1 + ); + }); + }); + }, + { allTokenTransferMethods: true } +); diff --git a/test/framework/custom.test.js b/test/framework/custom.test.js new file mode 100644 index 000000000..2f264a95b --- /dev/null +++ b/test/framework/custom.test.js @@ -0,0 +1,194 @@ +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * 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. + */ +const { printPath, setupST, startST, killAllST, cleanST, extractInfoFromResponse } = require("../utils"); +let assert = require("assert"); +let { ProcessState, PROCESS_STATE } = require("../../lib/build/processState"); +let SuperTokens = require("../.."); +let CustomFramework = require("../../framework/custom"); +let Session = require("../../recipe/session"); +let { verifySession } = require("../../recipe/session/framework/custom"); +let { Headers } = require("cross-fetch"); + +describe(`Custom framework: ${printPath("[test/framework/custom.test.js]")}`, function () { + beforeEach(async function () { + await killAllST(); + await setupST(); + ProcessState.getInstance().reset(); + }); + + afterEach(async function () { + try { + await this.server.close(); + } catch (err) {} + }); + after(async function () { + await killAllST(); + await cleanST(); + }); + + // - check if session verify middleware responds with a nice error even without the global error handler + it("test session verify middleware without error handler added", async function () { + const connectionURI = await startST(); + SuperTokens.init({ + framework: "custom", + supertokens: { + connectionURI, + }, + appInfo: { + apiDomain: "api.supertokens.io", + appName: "SuperTokens", + websiteDomain: "supertokens.io", + }, + recipeList: [Session.init({ getTokenTransferMethod: () => "cookie", antiCsrf: "VIA_TOKEN" })], + }); + + const req = new CustomFramework.PreParsedRequest({ + method: "get", + url: "/verify", + query: {}, + headers: new Headers(), + cookies: {}, + getFormBody: () => {}, + getJSONBody: () => {}, + }); + const resp = new CustomFramework.CollectingResponse(); + + const verifyResult = await verifySession()(req, resp); + + assert.strictEqual(verifyResult, undefined); + assert.strictEqual(resp.statusCode, 401); + assert.deepStrictEqual(JSON.parse(resp.body), { message: "unauthorised" }); + }); + + // check basic usage of session + it("test basic usage of sessions", async function () { + const connectionURI = await startST(); + SuperTokens.init({ + framework: "custom", + supertokens: { + connectionURI, + }, + appInfo: { + apiDomain: "api.supertokens.io", + appName: "SuperTokens", + websiteDomain: "supertokens.io", + }, + recipeList: [Session.init({ getTokenTransferMethod: () => "cookie", antiCsrf: "VIA_TOKEN" })], + }); + + const middleware = CustomFramework.middleware(); + + const req = new CustomFramework.PreParsedRequest({ + method: "get", + url: "/session/create", + query: {}, + headers: new Headers(), + cookies: {}, + getFormBody: () => {}, + getJSONBody: () => {}, + }); + const resp = new CustomFramework.CollectingResponse(); + + await Session.createNewSession(req, resp, "public", SuperTokens.convertToRecipeUserId("testUserId")); + + let res = extractInfoFromResponse(resp); + + assert(res.accessToken !== undefined); + assert(res.antiCsrf !== undefined); + assert(res.refreshToken !== undefined); + + const req2 = new CustomFramework.PreParsedRequest({ + method: "get", + url: "/session/refresh", + query: {}, + headers: new Headers([["anti-csrf", res.antiCsrf]]), + cookies: { + sAccessToken: res.accessToken, + sRefreshToken: res.refreshToken, + }, + getFormBody: () => {}, + getJSONBody: () => {}, + }); + const resp2 = new CustomFramework.CollectingResponse(); + + let verifyState3 = await ProcessState.getInstance().waitForEvent(PROCESS_STATE.CALLING_SERVICE_IN_VERIFY, 1500); + assert(verifyState3 === undefined); + + await Session.refreshSession(req2, resp2); + let res2 = extractInfoFromResponse(resp2); + + assert(res2.accessToken !== undefined); + assert(res2.antiCsrf !== undefined); + assert(res2.refreshToken !== undefined); + + const req3 = new CustomFramework.PreParsedRequest({ + method: "get", + url: "/session/verify", + query: {}, + headers: new Headers(), + cookies: { + sAccessToken: res2.accessToken, + }, + getFormBody: () => {}, + getJSONBody: () => {}, + }); + const resp3 = new CustomFramework.CollectingResponse(); + await verifySession()(req3, resp3); + + let res3 = extractInfoFromResponse(resp3); + let verifyState = await ProcessState.getInstance().waitForEvent(PROCESS_STATE.CALLING_SERVICE_IN_VERIFY); + + assert(verifyState !== undefined); + assert(res3.accessToken !== undefined); + + ProcessState.getInstance().reset(); + + const req4 = new CustomFramework.PreParsedRequest({ + method: "get", + url: "/session/verify", + query: {}, + headers: new Headers(), + cookies: { + sAccessToken: res3.accessToken, + }, + getFormBody: () => {}, + getJSONBody: () => {}, + }); + const resp4 = new CustomFramework.CollectingResponse(); + await verifySession()(req4, resp4); + let verifyState2 = await ProcessState.getInstance().waitForEvent(PROCESS_STATE.CALLING_SERVICE_IN_VERIFY, 1000); + assert(verifyState2 === undefined); + + const req5 = new CustomFramework.PreParsedRequest({ + method: "get", + url: "/session/verify", + query: {}, + headers: new Headers(), + cookies: { + sAccessToken: res3.accessToken, + }, + getFormBody: () => {}, + getJSONBody: () => {}, + }); + const resp5 = new CustomFramework.CollectingResponse(); + await verifySession()(req5, resp5); + await req5.session.revokeSession(); + let sessionRevokedResponseExtracted = extractInfoFromResponse(resp5); + assert.strictEqual(sessionRevokedResponseExtracted.accessTokenExpiry, "Thu, 01 Jan 1970 00:00:00 GMT"); + assert.strictEqual(sessionRevokedResponseExtracted.refreshTokenExpiry, "Thu, 01 Jan 1970 00:00:00 GMT"); + assert.strictEqual(sessionRevokedResponseExtracted.accessToken, ""); + assert.strictEqual(sessionRevokedResponseExtracted.refreshToken, ""); + }); +}); diff --git a/test/framework/loopback-server/index.js b/test/framework/loopback-server/index.js index 6b0761b28..d085b0831 100644 --- a/test/framework/loopback-server/index.js +++ b/test/framework/loopback-server/index.js @@ -87,6 +87,25 @@ __decorate( null ); Verify = __decorate([__param(0, core_1.inject(rest_1.RestBindings.Http.CONTEXT))], Verify); +let MultipleMerge = class MultipleMerge { + constructor(ctx) { + this.ctx = ctx; + } + async handler() { + const session = this.ctx.session; + await session.mergeIntoAccessTokenPayload({ test1: Date.now() }); + await session.mergeIntoAccessTokenPayload({ test2: Date.now() }); + await session.mergeIntoAccessTokenPayload({ test3: Date.now() }); + return ""; + } +}; +__decorate( + [rest_1.post("/session/multipleMerge"), core_1.intercept(loopback_2.verifySession()), rest_1.response(200)], + MultipleMerge.prototype, + "handler", + null +); +MultipleMerge = __decorate([__param(0, core_1.inject(rest_1.RestBindings.Http.CONTEXT))], MultipleMerge); let VerifyOptionalCSRF = class VerifyOptionalCSRF { constructor(ctx) { this.ctx = ctx; @@ -135,6 +154,7 @@ if (process.env.TEST_SKIP_MIDDLEWARE !== "true") { app.controller(Create); app.controller(CreateThrowing); app.controller(Verify); +app.controller(MultipleMerge); app.controller(Revoke); app.controller(VerifyOptionalCSRF); module.exports = app; diff --git a/test/framework/loopback-server/index.ts b/test/framework/loopback-server/index.ts index 01464483d..30309bacf 100644 --- a/test/framework/loopback-server/index.ts +++ b/test/framework/loopback-server/index.ts @@ -52,6 +52,19 @@ class Verify { }; } } +class MultipleMerge { + constructor(@inject(RestBindings.Http.CONTEXT) private ctx: MiddlewareContext) {} + @post("/session/multipleMerge") + @intercept(verifySession()) + @response(200) + async handler() { + const session = (this.ctx as any).session as Session.SessionContainer; + await session.mergeIntoAccessTokenPayload({ test1: Date.now() }); + await session.mergeIntoAccessTokenPayload({ test2: Date.now() }); + await session.mergeIntoAccessTokenPayload({ test3: Date.now() }); + return ""; + } +} class VerifyOptionalCSRF { constructor(@inject(RestBindings.Http.CONTEXT) private ctx: MiddlewareContext) {} @@ -88,6 +101,7 @@ if (process.env.TEST_SKIP_MIDDLEWARE !== "true") { app.controller(Create); app.controller(CreateThrowing); app.controller(Verify); +app.controller(MultipleMerge); app.controller(Revoke); app.controller(VerifyOptionalCSRF); module.exports = app; diff --git a/test/multitenancy/tenants-crud.test.js b/test/multitenancy/tenants-crud.test.js index 676477c84..4cdbe3ae7 100644 --- a/test/multitenancy/tenants-crud.test.js +++ b/test/multitenancy/tenants-crud.test.js @@ -211,6 +211,74 @@ describe(`tenants-crud: ${printPath("[test/multitenancy/tenants-crud.test.js]")} assert(tenantConfig.thirdParty.providers[0].clients[0].clientId === "abcd"); }); + it("test creation of thirdParty config with nulls", async function () { + const connectionURI = await startSTWithMultitenancy(); + SuperTokens.init({ + supertokens: { + connectionURI, + }, + appInfo: { + apiDomain: "api.supertokens.io", + appName: "SuperTokens", + websiteDomain: "supertokens.io", + }, + recipeList: [Multitenancy.init()], + }); + + const app = express(); + + app.use(middleware()); + app.use(errorHandler()); + + await Multitenancy.createOrUpdateTenant("t1", { emailPasswordEnabled: true }); + + const thirdPartyConfig = { + thirdPartyId: "google", + clients: [{ clientId: "abcd" }], + authorizationEndpointQueryParams: { + key1: null, + key2: "value", + }, + tokenEndpointBodyParams: { + key1: null, + key2: "value", + }, + userInfoEndpointQueryParams: { + key1: null, + key2: "value", + }, + userInfoEndpointHeaders: { + key1: null, + key2: "value", + }, + }; + + await Multitenancy.createOrUpdateThirdPartyConfig("t1", thirdPartyConfig); + + const tenantConfig = await Multitenancy.getTenant("t1"); + + assert(tenantConfig.thirdParty.providers.length === 1); + assert(tenantConfig.thirdParty.providers[0].thirdPartyId === "google"); + assert(tenantConfig.thirdParty.providers[0].clients.length === 1); + assert(tenantConfig.thirdParty.providers[0].clients[0].clientId === "abcd"); + assert.deepEqual( + tenantConfig.thirdParty.providers[0].authorizationEndpointQueryParams, + thirdPartyConfig.authorizationEndpointQueryParams + ); + assert.deepEqual( + tenantConfig.thirdParty.providers[0].tokenEndpointBodyParams, + thirdPartyConfig.tokenEndpointBodyParams + ); + assert.deepEqual( + tenantConfig.thirdParty.providers[0].userInfoEndpointQueryParams, + thirdPartyConfig.userInfoEndpointQueryParams + ); + assert.deepEqual( + tenantConfig.thirdParty.providers[0].userInfoEndpointHeaders, + thirdPartyConfig.userInfoEndpointHeaders + ); + }); + it("test deletion of thirdparty id", async function () { const connectionURI = await startSTWithMultitenancy(); SuperTokens.init({ diff --git a/test/passwordless/emailDelivery.test.js b/test/passwordless/emailDelivery.test.js index 1554a12da..13f55a9cc 100644 --- a/test/passwordless/emailDelivery.test.js +++ b/test/passwordless/emailDelivery.test.js @@ -24,6 +24,7 @@ let supertest = require("supertest"); const { middleware, errorHandler } = require("../../framework/express"); let express = require("express"); let { isCDIVersionCompatible } = require("../utils"); +const request = require("supertest"); describe(`emailDelivery: ${printPath("[test/passwordless/emailDelivery.test.js]")}`, function () { beforeEach(async function () { @@ -919,4 +920,88 @@ describe(`emailDelivery: ${printPath("[test/passwordless/emailDelivery.test.js]" assert.strictEqual(result.status, 500); assert(message === "Request failed with status code 500"); }); + + it("Test that passwordless email uses correct origin", async function () { + const connectionURI = await startST(); + let url = ""; + + STExpress.init({ + supertokens: { + connectionURI, + }, + appInfo: { + apiDomain: "api.supertokens.io", + appName: "SuperTokens", + origin: ({ request }) => { + if (request.getHeaderValue("origin") !== undefined) { + return request.getHeaderValue("origin"); + } + + return "localhost:3000"; + }, + }, + recipeList: [ + Passwordless.init({ + contactMethod: "EMAIL", + flowType: "MAGIC_LINK", + emailDelivery: { + override: (original) => { + return { + ...original, + sendEmail: async (input) => { + url = input.urlWithLinkCode; + }, + }; + }, + }, + }), + Session.init(), + ], + }); + + const app = express(); + + app.use(middleware()); + + app.use(errorHandler()); + + await new Promise((resolve) => + request(app) + .post("/auth/signinup/code") + .send({ + email: "test@example.com", + }) + .expect(200) + .end((err, res) => { + if (err) { + resolve(undefined); + } else { + resolve(JSON.parse(res.text)); + } + }) + ); + + let currentUrl = new URL(url); + assert(currentUrl.origin === "http://localhost:3000"); + + await new Promise((resolve) => + request(app) + .post("/auth/signinup/code") + .set("origin", "localhost:3002") + .send({ + email: "test@example.com", + }) + .expect(200) + .end((err, res) => { + if (err) { + resolve(undefined); + } else { + resolve(JSON.parse(res.text)); + } + }) + ); + + currentUrl = new URL(url); + assert(currentUrl.origin === "http://localhost:3002"); + }); }); diff --git a/test/sessionExpress.test.js b/test/sessionExpress.test.js index 51122336c..6a3ed3558 100644 --- a/test/sessionExpress.test.js +++ b/test/sessionExpress.test.js @@ -3251,4 +3251,85 @@ describe(`sessionExpress: ${printPath("[test/sessionExpress.test.js]")}`, functi assert(res2.antiCsrf.length > 1); assert(res2.refreshToken.length > 1); }); + + it("Test that token transfer method works correctly when using origin function", async function () { + const connectionURI = await startST(); + + SuperTokens.init({ + supertokens: { + connectionURI, + }, + appInfo: { + apiDomain: "api.supertokens.io", + appName: "SuperTokens", + origin: ({ request }) => { + if (request.getHeaderValue("origin") !== undefined) { + return request.getHeaderValue("origin"); + } + + return "localhost:3000"; + }, + }, + recipeList: [ + Session.init({ + getTokenTransferMethod: ({ req }) => { + if (req.getHeaderValue("origin") === "http://localhost:3002") { + return "cookie"; + } + + return "header"; + }, + }), + ], + }); + + const app = express(); + + app.use(middleware()); + + app.post("/create", async (req, res) => { + await Session.createNewSession(req, res, "public", SuperTokens.convertToRecipeUserId(""), {}, {}); + res.status(200).send(""); + }); + + app.use(errorHandler()); + + let res = await new Promise((resolve) => + request(app) + .post("/create") + .expect(200) + .end((err, res) => { + if (err) { + resolve(undefined); + } else { + resolve(res); + } + }) + ); + + let headers = res.headers; + assert(headers["st-access-token"] !== undefined); + assert(headers["st-refresh-token"] !== undefined); + assert(headers["set-cookie"] === undefined); + + res = await new Promise((resolve) => + request(app) + .post("/create") + .set("origin", "http://localhost:3002") + .expect(200) + .end((err, res) => { + if (err) { + resolve(undefined); + } else { + resolve(res); + } + }) + ); + + headers = res.headers; + + assert(headers["st-access-token"] === undefined); + assert(headers["st-refresh-token"] === undefined); + assert(headers["set-cookie"] !== undefined); + }); }); diff --git a/test/thirdparty/provider.test.js b/test/thirdparty/provider.test.js index 0202e7eac..2a7dcfe88 100644 --- a/test/thirdparty/provider.test.js +++ b/test/thirdparty/provider.test.js @@ -1147,6 +1147,7 @@ describe(`providerTest: ${printPath("[test/thirdparty/provider.test.js]")}`, fun it("Test that sign in up works if validateAccessToken does not throw", async function () { const connectionURI = await startST(); + let overridenValidateCalled = false; STExpress.init({ supertokens: { connectionURI, @@ -1165,26 +1166,19 @@ describe(`providerTest: ${printPath("[test/thirdparty/provider.test.js]")}`, fun override: (original) => { return { ...original, - exchangeAuthCodeForOAuthTokens: async (input) => { - return { - access_token: "accesstoken", - id_token: "idtoken", - }; - }, - getUserInfo: async function ({ oAuthTokens }) { - const time = Date.now(); - return { - thirdPartyUserId: "" + time, - email: { - id: `johndoeprovidertest+${time}@supertokens.com`, - isVerified: true, - }, - }; - }, }; }, config: { + tokenEndpoint: "http://localhost:8083/tokenendpoint", + userInfoEndpoint: "http://localhost:8083/userinfo", thirdPartyId: "custom", + userInfoMap: { + fromUserInfoAPI: { + userId: "userId", + email: "email", + emailVerified: "emailVerified", + }, + }, clients: [ { clientId: "test2", @@ -1192,6 +1186,7 @@ describe(`providerTest: ${printPath("[test/thirdparty/provider.test.js]")}`, fun }, ], validateAccessToken: async ({ accessToken }) => { + overridenValidateCalled = true; if (accessToken === "accesstoken") { return; } @@ -1210,6 +1205,21 @@ describe(`providerTest: ${printPath("[test/thirdparty/provider.test.js]")}`, fun app.use(middleware()); + app.post("/tokenendpoint", async (req, res) => { + res.json({ + access_token: "accesstoken", + id_token: "idtoken", + }); + }); + + app.get("/userinfo", async (req, res) => { + res.json({ + userId: "testiserid", + email: "testinguser@supertokens.com", + emailVerified: "true", + }); + }); + app.use(errorHandler()); // default error handler for app @@ -1217,6 +1227,8 @@ describe(`providerTest: ${printPath("[test/thirdparty/provider.test.js]")}`, fun res.status(500).send(err.message); }); + const server = app.listen(8083); + let response = await new Promise((resolve) => request(app) .post("/auth/signinup") @@ -1230,6 +1242,8 @@ describe(`providerTest: ${printPath("[test/thirdparty/provider.test.js]")}`, fun }, }) .end((err, res) => { + console.log(err); + console.log(res); if (err) { resolve(undefined); } else { @@ -1241,7 +1255,10 @@ describe(`providerTest: ${printPath("[test/thirdparty/provider.test.js]")}`, fun }) ); + assert.equal(overridenValidateCalled, true); assert.strictEqual(response.status, 200); assert.strictEqual(response.body.status, "OK"); + + server.close(); }); }); diff --git a/test/userContext.test.js b/test/userContext.test.js index 4483d98eb..ee9e838f7 100644 --- a/test/userContext.test.js +++ b/test/userContext.test.js @@ -427,7 +427,7 @@ describe(`userContext: ${printPath("[test/userContext.test.js]")}`, function () assert(createNewSessionContextWorks); }); - it("test that makeDefaultUserContext is not used anywhere apart from frameworks", async function () { + it("test that makeDefaultUserContext is not used anywhere apart from frameworks and a few other places", async function () { function recursive(dir, done) { let results = []; fs.readdir(dir, function (err, list) { @@ -469,6 +469,6 @@ describe(`userContext: ${printPath("[test/userContext.test.js]")}`, function () totalCount += count; } - assert(totalCount === 13); + assert(totalCount === 23); }); }); diff --git a/test/utils.js b/test/utils.js index 42ab19a96..2a2ee5613 100644 --- a/test/utils.js +++ b/test/utils.js @@ -41,6 +41,7 @@ const { join } = require("path"); const users = require("./users.json"); let assert = require("assert"); +const { CollectingResponse } = require("../framework/custom"); module.exports.printPath = function (path) { return `${createFormat([consoleOptions.yellow, consoleOptions.italic, consoleOptions.dim])}${path}${createFormat([ @@ -83,7 +84,7 @@ module.exports.setKeyValueInConfig = async function (key, value) { }; module.exports.extractInfoFromResponse = function (res) { - let antiCsrf = res.headers["anti-csrf"]; + let headers; let accessToken = undefined; let refreshToken = undefined; let accessTokenExpiry = undefined; @@ -95,49 +96,70 @@ module.exports.extractInfoFromResponse = function (res) { let accessTokenHttpOnly = false; let idRefreshTokenHttpOnly = false; let refreshTokenHttpOnly = false; - let frontToken = res.headers["front-token"]; - let cookies = res.headers["set-cookie"] || res.headers["Set-Cookie"]; - cookies = cookies === undefined ? [] : cookies; - if (!Array.isArray(cookies)) { - cookies = [cookies]; - } - cookies.forEach((i) => { - if (i.split(";")[0].split("=")[0] === "sAccessToken") { - /** - * if token is sAccessToken=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsInZlcnNpb24iOiIyIn0=.eyJzZXNzaW9uSGFuZGxlIjoiMWI4NDBhOTAtMjVmYy00ZjQ4LWE2YWMtMDc0MDIzZjNjZjQwIiwidXNlcklkIjoiIiwicmVmcmVzaFRva2VuSGFzaDEiOiJjYWNhZDNlMGNhMDVkNzRlNWYzNTc4NmFlMGQ2MzJjNDhmMTg1YmZmNmUxNThjN2I2OThkZDYwMzA1NzAyYzI0IiwidXNlckRhdGEiOnt9LCJhbnRpQ3NyZlRva2VuIjoiYTA2MjRjYWItZmIwNy00NTFlLWJmOTYtNWQ3YzU2MjMwZTE4IiwiZXhwaXJ5VGltZSI6MTYyNjUxMjM3NDU4NiwidGltZUNyZWF0ZWQiOjE2MjY1MDg3NzQ1ODYsImxtcnQiOjE2MjY1MDg3NzQ1ODZ9.f1sCkjt0OduS6I6FBQDBLV5zhHXpCU2GXnbe+8OCU6HKG00TX5CM8AyFlOlqzSHABZ7jES/+5k0Ff/rdD34cczlNqICcC4a23AjJg2a097rFrh8/8V7J5fr4UrHLIM4ojZNFz1NyVyDK/ooE6I7soHshEtEVr2XsnJ4q3d+fYs2wwx97PIT82hfHqgbRAzvlv952GYt+OH4bWQE4vTzDqGN7N2OKpn9l2fiCB1Ytzr3ocHRqKuQ8f6xW1n575Q1sSs9F9TtD7lrKfFQH+//6lyKFe2Q1SDc7YU4pE5Cy9Kc/LiqiTU+gsGIJL5qtMzUTG4lX38ugF4QDyNjDBMqCKw==; Max-Age=3599; Expires=Sat, 17 Jul 2021 08:59:34 GMT; Secure; HttpOnly; SameSite=Lax; Path=/' - * i.split(";")[0].split("=")[1] will result in eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsInZlcnNpb24iOiIyIn0 - */ - accessToken = decodeURIComponent(i.split(";")[0].split("=").slice(1).join("=")); - if (i.split(";")[2].includes("Expires=")) { - accessTokenExpiry = i.split(";")[2].split("=")[1]; - } else if (i.split(";")[2].includes("expires=")) { - accessTokenExpiry = i.split(";")[2].split("=")[1]; - } else { - accessTokenExpiry = i.split(";")[3].split("=")[1]; - } - if (i.split(";")[1].includes("Domain=")) { - accessTokenDomain = i.split(";")[1].split("=")[1]; - } - accessTokenHttpOnly = i.split(";").findIndex((j) => j.includes("HttpOnly")) !== -1; - } else if (i.split(";")[0].split("=")[0] === "sRefreshToken") { - refreshToken = i.split(";")[0].split("=").slice(1).join("="); - if (i.split(";")[2].includes("Expires=")) { - refreshTokenExpiry = i.split(";")[2].split("=")[1]; - } else if (i.split(";")[2].includes("expires=")) { - refreshTokenExpiry = i.split(";")[2].split("=")[1]; - } else { - refreshTokenExpiry = i.split(";")[3].split("=")[1]; - } - if (i.split(";")[1].includes("Domain=")) { - refreshTokenDomain = i.split(";")[1].split("=").slice(1).join("="); - } - refreshTokenHttpOnly = i.split(";").findIndex((j) => j.includes("HttpOnly")) !== -1; + if (res instanceof CollectingResponse) { + const accessTokenCookie = res.cookies.find((info) => info.key === "sAccessToken"); + if (accessTokenCookie) { + accessToken = accessTokenCookie.value; + accessTokenExpiry = new Date(accessTokenCookie.expires).toUTCString(); + accessTokenDomain = accessTokenCookie.domain; + accessTokenHttpOnly = accessTokenCookie.httpOnly; } - }); + const refreshTokenCookie = res.cookies.find((info) => info.key === "sRefreshToken"); + if (refreshTokenCookie) { + refreshToken = refreshTokenCookie.value; + refreshTokenExpiry = new Date(refreshTokenCookie.expires).toUTCString(); + refreshTokenDomain = refreshTokenCookie.domain; + refreshTokenHttpOnly = refreshTokenCookie.httpOnly; + } + headers = Object.fromEntries(res.headers.entries()); + } else { + headers = res.headers; + let cookies = res.headers["set-cookie"] || res.headers["Set-Cookie"]; + cookies = cookies === undefined ? [] : cookies; + if (!Array.isArray(cookies)) { + cookies = [cookies]; + } + + cookies.forEach((i) => { + if (i.split(";")[0].split("=")[0] === "sAccessToken") { + /** + * if token is sAccessToken=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsInZlcnNpb24iOiIyIn0=.eyJzZXNzaW9uSGFuZGxlIjoiMWI4NDBhOTAtMjVmYy00ZjQ4LWE2YWMtMDc0MDIzZjNjZjQwIiwidXNlcklkIjoiIiwicmVmcmVzaFRva2VuSGFzaDEiOiJjYWNhZDNlMGNhMDVkNzRlNWYzNTc4NmFlMGQ2MzJjNDhmMTg1YmZmNmUxNThjN2I2OThkZDYwMzA1NzAyYzI0IiwidXNlckRhdGEiOnt9LCJhbnRpQ3NyZlRva2VuIjoiYTA2MjRjYWItZmIwNy00NTFlLWJmOTYtNWQ3YzU2MjMwZTE4IiwiZXhwaXJ5VGltZSI6MTYyNjUxMjM3NDU4NiwidGltZUNyZWF0ZWQiOjE2MjY1MDg3NzQ1ODYsImxtcnQiOjE2MjY1MDg3NzQ1ODZ9.f1sCkjt0OduS6I6FBQDBLV5zhHXpCU2GXnbe+8OCU6HKG00TX5CM8AyFlOlqzSHABZ7jES/+5k0Ff/rdD34cczlNqICcC4a23AjJg2a097rFrh8/8V7J5fr4UrHLIM4ojZNFz1NyVyDK/ooE6I7soHshEtEVr2XsnJ4q3d+fYs2wwx97PIT82hfHqgbRAzvlv952GYt+OH4bWQE4vTzDqGN7N2OKpn9l2fiCB1Ytzr3ocHRqKuQ8f6xW1n575Q1sSs9F9TtD7lrKfFQH+//6lyKFe2Q1SDc7YU4pE5Cy9Kc/LiqiTU+gsGIJL5qtMzUTG4lX38ugF4QDyNjDBMqCKw==; Max-Age=3599; Expires=Sat, 17 Jul 2021 08:59:34 GMT; Secure; HttpOnly; SameSite=Lax; Path=/' + * i.split(";")[0].split("=")[1] will result in eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsInZlcnNpb24iOiIyIn0 + */ + accessToken = decodeURIComponent(i.split(";")[0].split("=").slice(1).join("=")); + if (i.split(";")[2].includes("Expires=")) { + accessTokenExpiry = i.split(";")[2].split("=")[1]; + } else if (i.split(";")[2].includes("expires=")) { + accessTokenExpiry = i.split(";")[2].split("=")[1]; + } else { + accessTokenExpiry = i.split(";")[3].split("=")[1]; + } + if (i.split(";")[1].includes("Domain=")) { + accessTokenDomain = i.split(";")[1].split("=")[1]; + } + accessTokenHttpOnly = i.split(";").findIndex((j) => j.includes("HttpOnly")) !== -1; + } else if (i.split(";")[0].split("=")[0] === "sRefreshToken") { + refreshToken = i.split(";")[0].split("=").slice(1).join("="); + if (i.split(";")[2].includes("Expires=")) { + refreshTokenExpiry = i.split(";")[2].split("=")[1]; + } else if (i.split(";")[2].includes("expires=")) { + refreshTokenExpiry = i.split(";")[2].split("=")[1]; + } else { + refreshTokenExpiry = i.split(";")[3].split("=")[1]; + } + if (i.split(";")[1].includes("Domain=")) { + refreshTokenDomain = i.split(";")[1].split("=").slice(1).join("="); + } + refreshTokenHttpOnly = i.split(";").findIndex((j) => j.includes("HttpOnly")) !== -1; + } + }); + } + let antiCsrf = headers["anti-csrf"]; + let frontToken = headers["front-token"]; - const refreshTokenFromHeader = res.headers["st-refresh-token"]; - const accessTokenFromHeader = res.headers["st-access-token"]; + const refreshTokenFromHeader = headers["st-refresh-token"]; + const accessTokenFromHeader = headers["st-access-token"]; const accessTokenFromAny = accessToken === undefined ? accessTokenFromHeader : accessToken; const refreshTokenFromAny = refreshToken === undefined ? refreshTokenFromHeader : refreshToken; diff --git a/test/with-typescript/index.ts b/test/with-typescript/index.ts index 40edd22e3..2e283f865 100644 --- a/test/with-typescript/index.ts +++ b/test/with-typescript/index.ts @@ -1,10 +1,12 @@ import * as express from "express"; +import { NextApiRequest, NextApiResponse } from "next"; import Supertokens, { RecipeUserId, User, getUser } from "../.."; import Session, { RecipeInterface, SessionClaimValidator, VerifySessionOptions } from "../../recipe/session"; import EmailVerification from "../../recipe/emailverification"; import EmailPassword from "../../recipe/emailpassword"; import { verifySession } from "../../recipe/session/framework/express"; import { middleware, errorHandler, SessionRequest } from "../../framework/express"; +import customFramework, { CollectingResponse, PreParsedRequest } from "../../framework/custom"; import NextJS from "../../nextjs"; import ThirdPartyEmailPassword from "../../recipe/thirdpartyemailpassword"; import ThirdParty from "../../recipe/thirdparty"; @@ -30,6 +32,7 @@ import Dashboard from "../../recipe/dashboard"; import JWT from "../../recipe/jwt"; import AccountLinking from "../../recipe/accountlinking"; import MultiFactorAuth from "../../recipe/multifactorauth"; +import { verifySession as customVerifySession } from "../../recipe/session/framework/custom"; UserRoles.init({ override: { @@ -916,10 +919,11 @@ Multitenancy.init({ }, }); -import { TypeInput } from "../../types"; +import { HTTPMethod, TypeInput } from "../../types"; import { TypeInput as SessionTypeInput } from "../../recipe/session/types"; import { TypeInput as EPTypeInput } from "../../recipe/emailpassword/types"; import SuperTokensError from "../../lib/build/error"; +import { serialize } from "cookie"; let app = express(); let sessionConfig: SessionTypeInput = { @@ -1918,3 +1922,55 @@ Supertokens.init({ Session.init(), ], }); + +const nextAppDirMiddleware = customFramework.middleware((req) => { + const query = Object.fromEntries(new URL(req.url!).searchParams.entries()); + + return new customFramework.PreParsedRequest({ + method: req.method as HTTPMethod, + url: req.url!, + query: query, + headers: req.headers, + cookies: req.cookies, + getFormBody: () => req.body, + getJSONBody: () => req.body, + }); +}); + +// We do not have Next13 typings here, but this is almost the exact same code we will have in the app dir example +async function handleCall(req: NextApiRequest): Promise { + const baseResponse = new customFramework.CollectingResponse(); + + const { handled, error } = await nextAppDirMiddleware(req, baseResponse); + + if (error) { + throw error; + } + if (!handled) { + return { + status: 404, + body: "Not Found", + }; + } + + for (const respCookie of baseResponse.cookies) { + baseResponse.headers.append( + "Set-Cookie", + serialize(respCookie.key, respCookie.value, { + domain: respCookie.domain, + expires: new Date(respCookie.expires), + httpOnly: respCookie.httpOnly, + path: respCookie.path, + sameSite: respCookie.sameSite, + secure: respCookie.secure, + }) + ); + } + + return { body: baseResponse.body, headers: baseResponse.headers, status: baseResponse.statusCode }; +} + +class NextResponse {} +NextJS.getAppDirRequestHandler(NextResponse); + +customVerifySession({ checkDatabase: true })(new PreParsedRequest({} as any), new CollectingResponse()); diff --git a/updateLibInExample b/updateLibInExample new file mode 100755 index 000000000..0e76b266d --- /dev/null +++ b/updateLibInExample @@ -0,0 +1,5 @@ +#!/bin/bash + +if ! [[ -z "${COMMIT_REF}" ]]; then + npm i git+$REPOSITORY_URL#$COMMIT_REF +fi