diff --git a/lib/Error.js b/lib/Error.js index f0f318c710..e038a4f79a 100644 --- a/lib/Error.js +++ b/lib/Error.js @@ -12,6 +12,7 @@ class StripeError extends Error { this.raw = raw; this.rawType = raw.type; this.code = raw.code; + this.doc_url = raw.doc_url; this.param = raw.param; this.detail = raw.detail; this.headers = raw.headers; @@ -38,6 +39,10 @@ class StripeError extends Error { return new StripeInvalidRequestError(rawStripeError); case 'api_error': return new StripeAPIError(rawStripeError); + case 'authentication_error': + return new StripeAuthenticationError(rawStripeError); + case 'rate_limit_error': + return new StripeRateLimitError(rawStripeError); case 'idempotency_error': return new StripeIdempotencyError(rawStripeError); case 'invalid_grant': @@ -116,6 +121,7 @@ class StripeIdempotencyError extends StripeError {} */ class StripeInvalidGrantError extends StripeError {} +module.exports.generate = StripeError.generate; module.exports.StripeError = StripeError; module.exports.StripeCardError = StripeCardError; module.exports.StripeInvalidRequestError = StripeInvalidRequestError; diff --git a/types/2020-03-02/index.d.ts b/types/2020-03-02/index.d.ts index e7c57aba6d..29b0239b87 100644 --- a/types/2020-03-02/index.d.ts +++ b/types/2020-03-02/index.d.ts @@ -1,7 +1,8 @@ /// /// -/// +/// /// +/// /// /// /// diff --git a/types/Errors.d.ts b/types/Errors.d.ts new file mode 100644 index 0000000000..fe063ffd57 --- /dev/null +++ b/types/Errors.d.ts @@ -0,0 +1,229 @@ +declare module 'stripe' { + namespace Stripe { + export type Errors = { + generate: typeof StripeError.generate; + StripeError: typeof StripeError; + StripeCardError: typeof StripeCardError; + StripeInvalidRequestError: typeof StripeInvalidRequestError; + StripeAPIError: typeof StripeAPIError; + StripeAuthenticationError: typeof StripeAuthenticationError; + StripePermissionError: typeof StripePermissionError; + StripeRateLimitError: typeof StripeRateLimitError; + StripeConnectionError: typeof StripeConnectionError; + StripeSignatureVerificationError: typeof StripeSignatureVerificationError; + StripeIdempotencyError: typeof StripeIdempotencyError; + StripeInvalidGrantError: typeof StripeInvalidGrantError; + }; + + export type RawErrorType = + | 'card_error' + | 'invalid_request_error' + | 'api_error' + | 'idempotency_error' + | 'rate_limit_error' + | 'authentication_error' + | 'invalid_grant'; + + type StripeRawError = { + message?: string; + + type: RawErrorType; + + headers?: {[header: string]: string}; + statusCode?: number; + requestId?: string; + + code?: string; + doc_code?: string; + decline_code?: string; + param?: string; + detail?: string; + + charge?: string; + payment_intent?: Stripe.PaymentIntent; + payment_method?: Stripe.PaymentMethod; + setup_intent?: Stripe.SetupIntent; + source?: Stripe.Source; + }; + + class StripeError extends Error { + constructor(rawError: StripeRawError); + + static generate( + rawError: StripeRawError & {type: 'card_error'} + ): StripeCardError; + static generate( + rawError: StripeRawError & {type: 'invalid_request_error'} + ): StripeInvalidRequestError; + static generate( + rawError: StripeRawError & {type: 'api_error'} + ): StripeAPIError; + static generate( + rawError: StripeRawError & {type: 'authentication_error'} + ): StripeAuthenticationError; + static generate( + rawError: StripeRawError & {type: 'rate_limit_error'} + ): StripeRateLimitError; + static generate( + rawError: StripeRawError & {type: 'idempotency_error'} + ): StripeIdempotencyError; + static generate( + rawError: StripeRawError & {type: 'invalid_grant'} + ): StripeInvalidGrantError; + static generate( + rawError: StripeRawError & {type: RawErrorType} + ): StripeError; + + /** + * A human-readable message giving more details about the error. For card errors, these messages can + * be shown to your users. + */ + readonly message: string; + + readonly type: keyof Errors; + + /** + * See the "error types" section at https://stripe.com/docs/api/errors + */ + readonly rawType: RawErrorType; + + /** + * For card errors, a short string describing the kind of card error that occurred. + * + * @docs https://stripe.com/docs/error-codes + */ + readonly code?: string; + + /** + * A URL to more information about the error code reported. + * + * @docs https://stripe.com/docs/error-codes + */ + readonly doc_url?: string; + + /** + * Typically a 4xx or 5xx. + */ + readonly statusCode?: number; + + readonly raw: unknown; + + readonly headers: { + [key: string]: string; + }; + + readonly requestId: string; + + /** + * The parameter the error relates to if the error is parameter-specific. You can use this to display a + * message near the correct form field, for example. + */ + readonly param?: string; + + /** @deprecated */ + readonly detail?: unknown; + + readonly charge?: string; + readonly decline_code?: string; + readonly payment_intent?: PaymentIntent; + readonly payment_method?: PaymentMethod; + readonly setup_intent?: SetupIntent; + readonly source?: Source; + } + + /** + * Card errors are the most common type of error you should expect to handle. + * They result when the user enters a card that can't be charged for some reason. + */ + class StripeCardError extends StripeError { + readonly type: 'StripeCardError'; + readonly rawType: 'card_error'; + + /** + * @docs https://stripe.com/docs/declines/codes + */ + readonly decline_code: string; + } + + /** + * Invalid request errors arise when your request has invalid parameters. + */ + class StripeInvalidRequestError extends StripeError { + readonly type: 'StripeInvalidRequestError'; + readonly rawType: 'invalid_request_error'; + } + + /** + * API errors cover any other type of problem (e.g., a temporary problem with Stripe's servers), + * and are extremely uncommon. + * + * It could also be raised in the case that a new error has been introduced in the API, + * but this version of the library doesn't know how to handle it. + */ + class StripeAPIError extends StripeError { + readonly type: 'StripeAPIError'; + readonly rawType: 'api_error'; + } + + /** + * Failure to properly authenticate yourself in the request. + */ + class StripeAuthenticationError extends StripeError { + readonly type: 'StripeAuthenticationError'; + readonly rawType: 'authentication_error'; + } + + /** + * Access was attempted on a resource that wasn't allowed. + */ + class StripePermissionError extends StripeError { + readonly type: 'StripePermissionError'; + } + + /** + * Too many requests hit the API too quickly. + * @docs https://stripe.com/docs/rate-limits + */ + class StripeRateLimitError extends StripeError { + readonly type: 'StripeRateLimitError'; + readonly rawType: 'rate_limit_error'; + } + + /** + * The library cannot connect to Stripe. + * This can happen for a variety of reasons, + * such as loss of network connectivity or a bad TLS certificate. + */ + class StripeConnectionError extends StripeError { + readonly type: 'StripeConnectionError'; + } + + /** + * The signature verification for a webhook failed. + * @docs https://stripe.com/docs/webhooks/signatures + */ + class StripeSignatureVerificationError extends StripeError { + readonly type: 'StripeSignatureVerificationError'; + } + + /** + * Idempotency errors occur when an `Idempotency-Key` is re-used on a request that does not match the first request's API endpoint and parameters. + * @docs https://stripe.com/docs/api/idempotent_requests?lang=node + */ + class StripeIdempotencyError extends StripeError { + readonly type: 'StripeIdempotencyError'; + readonly rawType: 'idempotency_error'; + } + + /** + * InvalidGrantError is raised when a specified code doesn't exist, is + * expired, has been used, or doesn't belong to you; a refresh token doesn't + * exist, or doesn't belong to you; or if an API key's mode (live or test) + * doesn't match the mode of a code or refresh token. + */ + class StripeInvalidGrantError extends StripeError { + readonly type: 'StripeInvalidGrantError'; + readonly rawType: 'invalid_grant'; + } + } +} diff --git a/types/lib.d.ts b/types/lib.d.ts index f1e2e2d349..75840de5e2 100644 --- a/types/lib.d.ts +++ b/types/lib.d.ts @@ -180,164 +180,5 @@ declare module 'stripe' { url?: string; version?: string; } - - export type Errors = { - StripeError: typeof StripeError; - StripeCardError: typeof StripeCardError; - StripeInvalidRequestError: typeof StripeInvalidRequestError; - StripeAPIError: typeof StripeAPIError; - StripeAuthenticationError: typeof StripeAuthenticationError; - StripePermissionError: typeof StripePermissionError; - StripeRateLimitError: typeof StripeRateLimitError; - StripeConnectionError: typeof StripeConnectionError; - StripeSignatureVerificationError: typeof StripeSignatureVerificationError; - StripeIdempotencyError: typeof StripeIdempotencyError; - }; - - export type RawErrorType = - | 'card_error' - | 'invalid_request_error' - | 'api_error' - | 'idempotency_error' - | 'rate_limit_error' - | 'authentication_error' - | 'invalid_grant'; - - class StripeError extends Error { - static populate(type: RawErrorType): StripeError; - - /** - * A human-readable message giving more details about the error. For card errors, these messages can - * be shown to your users. - */ - readonly message: string; - - readonly type: keyof Errors; - - /** - * See the "error types" section at https://stripe.com/docs/api/errors - */ - readonly rawType: RawErrorType; - - /** - * For card errors, a short string describing the kind of card error that occurred. - * - * @docs https://stripe.com/docs/error-codes - */ - readonly code?: string; - - /** - * Typically a 4xx or 5xx. - */ - readonly statusCode?: number; - - readonly raw: unknown; - - readonly headers: { - [key: string]: string; - }; - - readonly requestId: string; - - /** - * The parameter the error relates to if the error is parameter-specific. You can use this to display a - * message near the correct form field, for example. - */ - readonly param?: string; - - /** @deprecated */ - readonly detail?: unknown; - - readonly charge?: string; - readonly decline_code?: string; - readonly payment_intent?: PaymentIntent; - readonly payment_method?: PaymentMethod; - readonly setup_intent?: SetupIntent; - readonly source?: Source; - } - - /** - * Card errors are the most common type of error you should expect to handle. - * They result when the user enters a card that can't be charged for some reason. - */ - class StripeCardError extends StripeError { - readonly type: 'StripeCardError'; - readonly rawType: 'card_error'; - - /** - * @docs https://stripe.com/docs/declines/codes - */ - readonly decline_code: string; - } - - /** - * Invalid request errors arise when your request has invalid parameters. - */ - class StripeInvalidRequestError extends StripeError { - readonly type: 'StripeInvalidRequestError'; - readonly rawType: 'invalid_request_error'; - } - - /** - * API errors cover any other type of problem (e.g., a temporary problem with Stripe's servers), - * and are extremely uncommon. - * - * It could also be raised in the case that a new error has been introduced in the API, - * but this version of the library doesn't know how to handle it. - */ - class StripeAPIError extends StripeError { - readonly type: 'StripeAPIError'; - readonly rawType: 'api_error'; - } - - /** - * Failure to properly authenticate yourself in the request. - */ - class StripeAuthenticationError extends StripeError { - readonly type: 'StripeAuthenticationError'; - readonly rawType: 'authentication_error'; - } - - /** - * Access was attempted on a resource that wasn't allowed. - */ - class StripePermissionError extends StripeError { - readonly type: 'StripePermissionError'; - } - - /** - * Too many requests hit the API too quickly. - * @docs https://stripe.com/docs/rate-limits - */ - class StripeRateLimitError extends StripeError { - readonly type: 'StripeRateLimitError'; - readonly rawType: 'rate_limit_error'; - } - - /** - * The library cannot connect to Stripe. - * This can happen for a variety of reasons, - * such as loss of network connectivity or a bad TLS certificate. - */ - class StripeConnectionError extends StripeError { - readonly type: 'StripeConnectionError'; - } - - /** - * The signature verification for a webhook failed. - * @docs https://stripe.com/docs/webhooks/signatures - */ - class StripeSignatureVerificationError extends StripeError { - readonly type: 'StripeSignatureVerificationError'; - } - - /** - * Idempotency errors occur when an `Idempotency-Key` is re-used on a request that does not match the first request's API endpoint and parameters. - * @docs https://stripe.com/docs/api/idempotent_requests?lang=node - */ - class StripeIdempotencyError extends StripeError { - readonly type: 'StripeIdempotencyError'; - readonly rawType: 'idempotency_error'; - } } } diff --git a/types/test/typescriptTest.ts b/types/test/typescriptTest.ts index f772b46908..acb7799a34 100644 --- a/types/test/typescriptTest.ts +++ b/types/test/typescriptTest.ts @@ -132,3 +132,9 @@ stripe.setHost('host', 'port', 'protocol'); } } })(); + +const stripeCardError: Stripe.StripeCardError = Stripe.errors.generate({ + type: 'card_error', + code: 'card_declined', + charge: 'ch_123', +});