A TypeScript query builder library for easily constructing queries for the Stripe Search API.
npm install stripe-search-qlimport { stripeQuery } from "stripe-search-ql";
// Exact match search
const query = stripeQuery()
.field("email")
.equals("amy@rocketrides.io")
.build();
// => 'email:"amy@rocketrides.io"'
// Numeric comparison
const amountQuery = stripeQuery()
.field("amount")
.greaterThan(1000)
.build();
// => 'amount>1000'
// Substring match
const substringQuery = stripeQuery()
.field("email")
.contains("amy")
.build();
// => 'email~"amy"'// AND operator
const andQuery = stripeQuery()
.field("email")
.equals("amy@rocketrides.io")
.and()
.field("currency")
.equals("usd")
.build();
// => 'email:"amy@rocketrides.io" AND currency:"usd"'
// OR operator
const orQuery = stripeQuery()
.field("currency")
.equals("usd")
.or()
.field("currency")
.equals("eur")
.build();
// => 'currency:"usd" OR currency:"eur"'// Exact match for metadata
const metadataQuery = stripeQuery()
.metadata("donation-id")
.equals("asdf-jkl")
.build();
// => 'metadata["donation-id"]:"asdf-jkl"'
// Substring match for metadata
const metadataSubstringQuery = stripeQuery()
.metadata("key")
.contains("value")
.build();
// => 'metadata["key"]~"value"'// Field negation
const negatedQuery = stripeQuery()
.not("currency")
.equals("jpy")
.build();
// => '-currency:"jpy"'
// Metadata negation
const negatedMetadataQuery = stripeQuery()
.notMetadata("donation-id")
.equals("asdf-jkl")
.build();
// => '-metadata["donation-id"]:"asdf-jkl"'// Check if field is NULL
const nullCheckQuery = stripeQuery()
.field("url")
.isNull()
.build();
// => 'url:null'
// Check if metadata key does not exist
const metadataNullQuery = stripeQuery()
.notMetadata("donation-id")
.isNull()
.build();
// => '-metadata["donation-id"]:null'// Greater than
stripeQuery().field("amount").greaterThan(1000).build();
// => 'amount>1000'
// Less than
stripeQuery().field("amount").lessThan(1000).build();
// => 'amount<1000'
// Greater than or equal
stripeQuery().field("amount").greaterThanOrEqual(1000).build();
// => 'amount>=1000'
// Less than or equal
stripeQuery().field("amount").lessThanOrEqual(1000).build();
// => 'amount<=1000'// Combining multiple conditions
const complexQuery = stripeQuery()
.field("email")
.equals("amy@rocketrides.io")
.and()
.metadata("donation-id")
.equals("asdf-jkl")
.and()
.field("amount")
.greaterThan(1000)
.build();
// => 'email:"amy@rocketrides.io" AND metadata["donation-id"]:"asdf-jkl" AND amount>1000'Creates a new query builder instance.
Returns: SearchQueryBuilder instance
field(field: string): FieldBuilder- Specify a field to build search conditionsnot(field: string): FieldBuilder- Specify a negated field to build search conditions
metadata(key: string): MetadataFieldBuilder- Specify a metadata field to build search conditionsnotMetadata(key: string): MetadataFieldBuilder- Specify a negated metadata field to build search conditions
and(): SearchQueryBuilder- Add AND operatoror(): SearchQueryBuilder- Add OR operator
build(): string- Returns the constructed query as a stringreset(): SearchQueryBuilder- Reset the query
equals(value: string | number | null): SearchQueryBuilder- Exact match (:)contains(value: string): SearchQueryBuilder- Substring match (~, minimum 3 characters)greaterThan(value: number): SearchQueryBuilder- Greater than (>)lessThan(value: number): SearchQueryBuilder- Less than (<)greaterThanOrEqual(value: number): SearchQueryBuilder- Greater than or equal (>=)lessThanOrEqual(value: number): SearchQueryBuilder- Less than or equal (<=)isNull(): SearchQueryBuilder- NULL value check
equals(value: string | number | null): SearchQueryBuilder- Exact match (:)contains(value: string): SearchQueryBuilder- Substring match (~, minimum 3 characters)isNull(): SearchQueryBuilder- NULL value check (when metadata key does not exist)
The constructed query can be used with the Stripe SDK or API client.
import { stripeQuery } from "stripe-search-ql";
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
// Build query
const query = stripeQuery()
.field("email")
.equals("customer@example.com")
.build();
// Search with Stripe API
const customers = await stripe.customers.search({
query: query,
});- Substring match (
~) requires a minimum of 3 characters - You cannot mix
ANDandORin the same query (Stripe Search API limitation) - Parentheses for specifying precedence are not supported (Stripe Search API limitation)
# Install dependencies
npm install
# Build
npm run build
# Test
npm test
# Test (watch mode)
npm run test:watch
# Linter
npm run lint
# Formatter
npm run format
# Type check
npm run typecheckMIT