Bandada library to validate users' credentials.
This package provides a function to validate users' credentials by using a set of extendable validators. |
---|
Install the @bandada/credentials
package with npm:
npm i @bandada/credentials
or yarn:
yarn add @bandada/credentials
# validateCredentials(credentials: Credentials, context: Context)
import { validateCredentials, githubFollowers } from "@bandada/credentials"
validateCredentials(
{
id: githubFollowers.id,
criteria: {
minFollowers: 100
}
},
{
accessToken: {
github: "token"
}
}
)
The library has been built to allow external devs to add their own validators. A validator is a simple file that exports 3 JavaScript values:
id
: The validator id. It must be unique and capitalized (snake case).criteriaABI
: The criteria ABI. It contains the structure of your criteria with its types.validate
: The validator handler. It usually consists of three steps: criteria types check, user data retrieval and credentials' validation.
import { Handler } from "@bandada/credentials"
// Typescript type for the handler criteria.
// This will be mainly used by this handler.
export type Criteria = {
minFollowers: number
}
const validator: Validator = {
id: "GITHUB_FOLLOWERS",
// The criteria application binary interface. It contains
// the structure of this validator credentials
// with its parameter types.
criteriaABI: {
minFollowers: "number"
},
/**
* It checks if a user has more than 'minFollowers' followers.
* @param criteria The criteria used to check user's credentials.
* @param context Utility functions and other context variables.
* @returns True if the user meets the credentials.
*/
async validate(criteria: Criteria, { utils }) {
// Step 1: use the API to get the user's parameters.
const { followers } = await utils.api("user")
// Step 2: check if they meet the validator credentials.
return followers >= criteria.minFollowers
}
}
export default validator
Testing your validator is also important. If you use Jest you can use some test utilities to mock the API function easily.
import {
addValidator,
testUtils,
validateCredentials
} from "@bandada/credentials"
import githubFollowers from "./index"
describe("GithubFollowers", () => {
beforeAll(() => {
addValidator(githubFollowers)
})
it("Should return true if a Github user has more than 100 followers", async () => {
testUtils.mockAPIOnce({
followers: 110
})
const result = await validateCredentials(
{
id: "GITHUB_FOLLOWERS",
criteria: {
minFollowers: 100
}
},
{
accessTokens: {
github: "token"
}
}
)
expect(result).toBeTruthy()
})
})
Once you create your own validator and publish your NPM package, you can open a PR to add your validator to the ones supported by Bandada (validators.ts
file). You can also add a new provider to the providers.ts
file.