@stripe/link-sdk 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +23 -1
- package/dist/index.js +44 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -131,12 +131,34 @@ interface BankAccountDetails {
|
|
|
131
131
|
last4: string;
|
|
132
132
|
bank_name?: string;
|
|
133
133
|
}
|
|
134
|
+
type AgentWalletVerificationStatus = 'not_required' | 'ssn_verification' | 'identity_verification' | 'contact_support' | 'complete';
|
|
135
|
+
interface AgentWalletSpendLimits {
|
|
136
|
+
per_transaction: {
|
|
137
|
+
limit: number | null;
|
|
138
|
+
};
|
|
139
|
+
daily: {
|
|
140
|
+
limit: number | null;
|
|
141
|
+
used: number;
|
|
142
|
+
remaining: number | null;
|
|
143
|
+
};
|
|
144
|
+
thirty_day: {
|
|
145
|
+
limit: number | null;
|
|
146
|
+
used: number;
|
|
147
|
+
remaining: number | null;
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
interface AgentWalletVerificationRequirement {
|
|
151
|
+
status: AgentWalletVerificationStatus;
|
|
152
|
+
action_url: string | null;
|
|
153
|
+
}
|
|
134
154
|
interface UserInfo {
|
|
135
155
|
email?: string | null;
|
|
136
156
|
name?: string | null;
|
|
137
157
|
first_name?: string | null;
|
|
138
158
|
last_name?: string | null;
|
|
139
159
|
phone?: string | null;
|
|
160
|
+
agent_wallet_spend_limits?: AgentWalletSpendLimits;
|
|
161
|
+
agent_wallet_verification_requirement?: AgentWalletVerificationRequirement;
|
|
140
162
|
}
|
|
141
163
|
interface ProductCapability {
|
|
142
164
|
eligible: boolean;
|
|
@@ -411,4 +433,4 @@ declare class LinkApiError extends LinkSdkError {
|
|
|
411
433
|
|
|
412
434
|
declare function getDuplicateSpendRequest(error: unknown): SpendRequest | null;
|
|
413
435
|
|
|
414
|
-
export { type AccessTokenProvider, type ApprovalDetail, type Balance, type BalancesPage, type BankAccountDetails, type BillingAddress, type Card, type CardDetails, type CashBalance, type CreateReportParams, type CreateSpendRequestParams, type CredentialType, type CreditBalance, type GetAccessTokenOptions, type IBalancesResource, type IPaymentMethodsResource, type IReportResource, type IShippingAddressResource, type ISourcesResource, type ISpendRequestResource, type ITransactionsResource, type IUserInfoResource, type IWebBotAuthResource, type JsonPrimitive, type JsonValue, type LineItem, Link, LinkApiError, LinkConfigurationError, type LinkOptions, LinkResponseError, LinkSdkError, type LinkSdkLogger, LinkTransportError, type ListBalancesParams, type ListSourcesParams, type ListTransactionsParams, type NextAction, type NextActionResolution, type NextActionType, type PaymentMethod, type PaymentStatusDetails, type ProductCapability, REPORT_OUTCOMES, REPORT_TAGS, type RefundDetails, type ReportOutcome, type ReportRecord, type ReportTag, type RequestApprovalResponse, type SharedPaymentToken, type ShippingAddress, type ShippingAddressRecord, type Source, type SourcesPage, type SpendRequest, type SpendRequestStatus, type SpendRequestStatusDetails, type Total, type Transaction, type TransactionOrigin, type TransactionsPage, type UpdateSpendRequestParams, type UserInfo, type WebBotAuthBlock, Link as default, getDuplicateSpendRequest };
|
|
436
|
+
export { type AccessTokenProvider, type AgentWalletSpendLimits, type AgentWalletVerificationRequirement, type AgentWalletVerificationStatus, type ApprovalDetail, type Balance, type BalancesPage, type BankAccountDetails, type BillingAddress, type Card, type CardDetails, type CashBalance, type CreateReportParams, type CreateSpendRequestParams, type CredentialType, type CreditBalance, type GetAccessTokenOptions, type IBalancesResource, type IPaymentMethodsResource, type IReportResource, type IShippingAddressResource, type ISourcesResource, type ISpendRequestResource, type ITransactionsResource, type IUserInfoResource, type IWebBotAuthResource, type JsonPrimitive, type JsonValue, type LineItem, Link, LinkApiError, LinkConfigurationError, type LinkOptions, LinkResponseError, LinkSdkError, type LinkSdkLogger, LinkTransportError, type ListBalancesParams, type ListSourcesParams, type ListTransactionsParams, type NextAction, type NextActionResolution, type NextActionType, type PaymentMethod, type PaymentStatusDetails, type ProductCapability, REPORT_OUTCOMES, REPORT_TAGS, type RefundDetails, type ReportOutcome, type ReportRecord, type ReportTag, type RequestApprovalResponse, type SharedPaymentToken, type ShippingAddress, type ShippingAddressRecord, type Source, type SourcesPage, type SpendRequest, type SpendRequestStatus, type SpendRequestStatusDetails, type Total, type Transaction, type TransactionOrigin, type TransactionsPage, type UpdateSpendRequestParams, type UserInfo, type WebBotAuthBlock, Link as default, getDuplicateSpendRequest };
|
package/dist/index.js
CHANGED
|
@@ -632,19 +632,55 @@ var TransactionsResource = class extends BaseResource {
|
|
|
632
632
|
|
|
633
633
|
// src/resources/user-info.ts
|
|
634
634
|
import { z as z8 } from "zod";
|
|
635
|
+
var rollingSpendLimitSchema = z8.object({
|
|
636
|
+
limit: z8.number().int().nullable(),
|
|
637
|
+
used: z8.number().int(),
|
|
638
|
+
remaining: z8.number().int().nullable()
|
|
639
|
+
});
|
|
640
|
+
var agentWalletSpendLimitsSchema = z8.object({
|
|
641
|
+
per_transaction: z8.object({
|
|
642
|
+
limit: z8.number().int().nullable()
|
|
643
|
+
}),
|
|
644
|
+
daily: rollingSpendLimitSchema,
|
|
645
|
+
thirty_day: rollingSpendLimitSchema
|
|
646
|
+
});
|
|
647
|
+
var agentWalletVerificationRequirementSchema = z8.object({
|
|
648
|
+
status: z8.enum([
|
|
649
|
+
"not_required",
|
|
650
|
+
"ssn_verification",
|
|
651
|
+
"identity_verification",
|
|
652
|
+
"contact_support",
|
|
653
|
+
"complete"
|
|
654
|
+
]),
|
|
655
|
+
action_url: z8.string().nullable()
|
|
656
|
+
});
|
|
635
657
|
var userInfoSchema = z8.looseObject({
|
|
636
658
|
email: z8.string().nullable().optional(),
|
|
637
659
|
name: z8.string().nullable().optional(),
|
|
638
660
|
first_name: z8.string().nullable().optional(),
|
|
639
661
|
last_name: z8.string().nullable().optional(),
|
|
640
|
-
phone: z8.string().nullable().optional()
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
662
|
+
phone: z8.string().nullable().optional(),
|
|
663
|
+
agent_wallet_spend_limits: agentWalletSpendLimitsSchema.optional(),
|
|
664
|
+
agent_wallet_step_up: agentWalletVerificationRequirementSchema.optional()
|
|
665
|
+
}).transform(
|
|
666
|
+
({
|
|
667
|
+
email,
|
|
668
|
+
name,
|
|
669
|
+
first_name,
|
|
670
|
+
last_name,
|
|
671
|
+
phone,
|
|
672
|
+
agent_wallet_spend_limits,
|
|
673
|
+
agent_wallet_step_up
|
|
674
|
+
}) => ({
|
|
675
|
+
email: email ?? null,
|
|
676
|
+
name: name ?? null,
|
|
677
|
+
first_name: first_name ?? null,
|
|
678
|
+
last_name: last_name ?? null,
|
|
679
|
+
phone: phone ?? null,
|
|
680
|
+
...agent_wallet_spend_limits === void 0 ? {} : { agent_wallet_spend_limits },
|
|
681
|
+
...agent_wallet_step_up === void 0 ? {} : { agent_wallet_verification_requirement: agent_wallet_step_up }
|
|
682
|
+
})
|
|
683
|
+
);
|
|
648
684
|
var UserInfoResource = class extends BaseResource {
|
|
649
685
|
constructor(options) {
|
|
650
686
|
super(options, "/userinfo");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/resources/base.ts","../src/resources/balances.ts","../src/resources/payment-methods.ts","../src/resources/report.ts","../src/resources/shipping-address.ts","../src/resources/sources.ts","../src/resources/spend-request.ts","../src/resources/transactions.ts","../src/resources/user-info.ts","../src/resources/web-bot-auth.ts","../src/client.ts","../src/resources/interfaces.ts"],"sourcesContent":["import { ZodError, prettifyError } from 'zod';\n\nexport class LinkSdkError extends Error {\n readonly code: string;\n\n constructor(message: string, options?: { code?: string; cause?: unknown }) {\n super(message, { cause: options?.cause });\n this.name = new.target.name;\n this.code = options?.code ?? 'sdk_error';\n }\n}\n\nexport class LinkResponseError extends LinkSdkError {\n readonly status: number;\n\n constructor(\n operation: string,\n status: number,\n options?: { cause?: unknown },\n ) {\n const detail =\n options?.cause instanceof ZodError\n ? `: ${prettifyError(options.cause)}`\n : options?.cause instanceof Error\n ? `: ${options.cause.message}`\n : '';\n super(\n `Invalid response while attempting to ${operation} (${status})${detail}`,\n { code: 'invalid_response', cause: options?.cause },\n );\n this.status = status;\n }\n}\n\nexport class LinkConfigurationError extends LinkSdkError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, { code: 'configuration_error', ...options });\n }\n}\n\nexport class LinkTransportError extends LinkSdkError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, { code: 'transport_error', ...options });\n }\n}\n\nexport class LinkApiError extends LinkSdkError {\n readonly status: number;\n readonly rawBody: string | undefined;\n readonly details?: unknown;\n\n constructor(\n message: string,\n options: {\n status: number;\n code?: string;\n rawBody?: string;\n details?: unknown;\n cause?: unknown;\n },\n ) {\n super(message, { code: options.code ?? 'api_error', cause: options.cause });\n this.status = options.status;\n this.rawBody = options.rawBody;\n this.details = options.details;\n }\n}\n","import { LinkConfigurationError } from '@/errors';\nimport type { AccessTokenProvider } from '@/resources/interfaces';\n\nexport interface LinkSdkLogger {\n debug(message: string): void;\n}\n\ninterface LinkClientOptions {\n verbose?: boolean;\n defaultHeaders?: Record<string, string>;\n fetch?: typeof globalThis.fetch;\n apiBaseUrl?: string;\n spendRequestBaseUrl?: string;\n logger?: LinkSdkLogger;\n}\n\nexport type LinkOptions = LinkClientOptions &\n (\n | { accessToken: string; getAccessToken?: never }\n | { accessToken?: never; getAccessToken: AccessTokenProvider }\n );\n\nexport interface ResolvedLinkSdkConfig {\n verbose: boolean;\n getAccessToken: AccessTokenProvider;\n canRefreshAccessToken: boolean;\n fetch?: typeof globalThis.fetch;\n apiBaseUrl: string;\n spendRequestBaseUrl: string;\n logger: LinkSdkLogger;\n}\n\nconst DEFAULT_API_BASE_URL = 'https://api.link.com';\n\nfunction createDefaultHeadersFetch(\n baseFetch: typeof globalThis.fetch,\n defaultHeaders: Record<string, string>,\n): typeof globalThis.fetch {\n return ((input: RequestInfo | URL, init?: RequestInit) => {\n const headers = new Headers(init?.headers);\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (!headers.has(key)) {\n headers.set(key, value);\n }\n }\n return baseFetch(input, { ...init, headers });\n }) as typeof globalThis.fetch;\n}\n\nexport interface LinkSdkConfigDefaults {\n apiBaseUrl?: string;\n spendRequestBaseUrl?: string;\n}\n\nfunction createDefaultLogger(): LinkSdkLogger {\n return {\n debug() {},\n };\n}\n\nexport function resolveLinkSdkConfig(\n options: LinkOptions,\n defaults: LinkSdkConfigDefaults = {},\n): ResolvedLinkSdkConfig {\n const verbose = options.verbose ?? false;\n const logger = options.logger ?? createDefaultLogger();\n if (\n options.accessToken !== undefined &&\n options.getAccessToken !== undefined\n ) {\n throw new LinkConfigurationError(\n 'Pass either `accessToken` or `getAccessToken`, not both.',\n );\n }\n\n let getAccessToken: AccessTokenProvider;\n let canRefreshAccessToken: boolean;\n if (options.accessToken !== undefined) {\n if (options.accessToken.trim().length === 0) {\n throw new LinkConfigurationError('`accessToken` cannot be empty.');\n }\n const accessToken = options.accessToken;\n getAccessToken = () => accessToken;\n canRefreshAccessToken = false;\n } else if (typeof options.getAccessToken === 'function') {\n getAccessToken = options.getAccessToken;\n canRefreshAccessToken = true;\n } else {\n throw new LinkConfigurationError(\n 'Pass `accessToken` or `getAccessToken` to the Link client.',\n );\n }\n\n const apiBaseUrl =\n options.apiBaseUrl ?? defaults.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n const spendRequestBaseUrl =\n options.spendRequestBaseUrl ?? defaults.spendRequestBaseUrl ?? apiBaseUrl;\n\n const baseFetch = options.fetch ?? globalThis.fetch;\n const effectiveFetch =\n options.defaultHeaders && Object.keys(options.defaultHeaders).length > 0\n ? createDefaultHeadersFetch(baseFetch, options.defaultHeaders)\n : baseFetch;\n\n return {\n verbose,\n getAccessToken,\n canRefreshAccessToken,\n fetch: effectiveFetch,\n apiBaseUrl,\n spendRequestBaseUrl,\n logger,\n };\n}\n\nexport function requireFetchImplementation(\n config: Pick<ResolvedLinkSdkConfig, 'fetch'>,\n): typeof globalThis.fetch {\n if (!config.fetch) {\n throw new LinkConfigurationError(\n 'No fetch implementation available. Pass `fetch` in Link SDK options.',\n );\n }\n\n return config.fetch;\n}\n","import {\n type LinkOptions,\n requireFetchImplementation,\n resolveLinkSdkConfig,\n} from '@/config';\nimport { LinkApiError, LinkResponseError, LinkTransportError } from '@/errors';\nimport type { AccessTokenProvider } from '@/resources/interfaces';\n\nexport interface ApiFetchOptions {\n method: string;\n url: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n}\n\nexport interface ApiFetchResult {\n status: number;\n data: unknown;\n rawBody: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function extractErrorMessage(data: unknown, rawBody: string): string {\n if (isRecord(data)) {\n if (typeof data.error === 'string') {\n return data.error;\n }\n if (isRecord(data.error)) {\n const nested = data.error;\n if (typeof nested.message === 'string') {\n return nested.message;\n }\n if (typeof nested.code === 'string') {\n return nested.code;\n }\n }\n if (typeof data.message === 'string') {\n return data.message;\n }\n }\n\n return rawBody || 'unknown error';\n}\n\nexport abstract class BaseResource {\n protected readonly verbose: boolean;\n protected readonly getAccessToken: AccessTokenProvider;\n protected readonly canRefreshAccessToken: boolean;\n protected readonly fetchImpl: typeof globalThis.fetch;\n protected readonly endpoint: string;\n protected readonly logger: { debug(message: string): void };\n\n constructor(\n options: LinkOptions,\n endpointPath: string,\n base: 'api' | 'spend' = 'api',\n ) {\n const config = resolveLinkSdkConfig(options);\n this.verbose = config.verbose;\n this.getAccessToken = config.getAccessToken;\n this.canRefreshAccessToken = config.canRefreshAccessToken;\n this.fetchImpl = requireFetchImplementation(config);\n const baseUrl =\n base === 'spend' ? config.spendRequestBaseUrl : config.apiBaseUrl;\n this.endpoint = `${baseUrl}${endpointPath}`;\n this.logger = config.logger;\n }\n\n protected async rawFetch(opts: ApiFetchOptions): Promise<ApiFetchResult> {\n if (this.verbose) {\n this.logger.debug(`> ${opts.method} ${opts.url}`);\n }\n\n let response: Response;\n try {\n const init: RequestInit = {\n method: opts.method,\n ...(opts.headers !== undefined && { headers: opts.headers }),\n ...(opts.body !== undefined && { body: opts.body }),\n ...(opts.signal !== undefined && { signal: opts.signal }),\n };\n response = await this.fetchImpl(opts.url, init);\n } catch (error) {\n throw new LinkTransportError(\n `Request failed: ${opts.method} ${opts.url}`,\n { cause: error },\n );\n }\n const rawBody = await response.text();\n\n let data: unknown = null;\n try {\n data = JSON.parse(rawBody);\n } catch {\n // non-JSON response (e.g., from load balancer)\n }\n\n if (this.verbose) {\n this.logger.debug(`< ${response.status} ${response.statusText}`);\n }\n\n return { status: response.status, data, rawBody };\n }\n\n protected async apiFetch(opts: ApiFetchOptions): Promise<ApiFetchResult> {\n const token = await this.getAccessToken();\n const authedOpts = {\n ...opts,\n headers: {\n ...opts.headers,\n Authorization: `Bearer ${token}`,\n },\n };\n\n const res = await this.rawFetch(authedOpts);\n\n if (res.status === 401 && this.canRefreshAccessToken) {\n const refreshedToken = await this.getAccessToken({ forceRefresh: true });\n authedOpts.headers.Authorization = `Bearer ${refreshedToken}`;\n return this.rawFetch(authedOpts);\n }\n\n return res;\n }\n\n protected throwApiError(\n operation: string,\n status: number,\n data: unknown,\n rawBody: string,\n cause?: unknown,\n ): never {\n const msg = extractErrorMessage(data, rawBody);\n throw new LinkApiError(`Failed to ${operation} (${status}): ${msg}`, {\n status,\n rawBody,\n details: data,\n cause,\n });\n }\n\n protected parseResponse<T>(\n operation: string,\n status: number,\n parser: () => T,\n ): T {\n try {\n return parser();\n } catch (error) {\n throw new LinkResponseError(operation, status, { cause: error });\n }\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n IBalancesResource,\n ListBalancesParams,\n} from '@/resources/interfaces';\nimport type { BalancesPage } from '@/types/index';\nimport { z } from 'zod';\n\nconst currencyAmountsSchema = z.record(z.string(), z.number());\nconst balanceSchema = z.looseObject({\n source_id: z.string(),\n type: z.enum(['cash', 'credit']),\n cash: z\n .looseObject({ available: currencyAmountsSchema })\n .nullable()\n .optional(),\n credit: z.looseObject({ used: currencyAmountsSchema }).nullable().optional(),\n current: z.number(),\n currency: z.string(),\n as_of: z.string(),\n});\nconst balancesPageSchema = z.looseObject({\n data: z.array(balanceSchema),\n has_more: z.boolean().optional(),\n});\n\nexport class BalancesResource\n extends BaseResource\n implements IBalancesResource\n{\n constructor(options: LinkOptions) {\n super(options, '/balances');\n }\n\n private buildUrl(params: ListBalancesParams): string {\n const url = new URL(this.endpoint);\n\n if (params.sources !== undefined) {\n for (const source of params.sources) {\n url.searchParams.append('sources[]', source);\n }\n }\n if (params.limit !== undefined) {\n url.searchParams.set('limit', String(params.limit));\n }\n if (params.starting_after !== undefined) {\n url.searchParams.set('starting_after', params.starting_after);\n }\n if (params.ending_before !== undefined) {\n url.searchParams.set('ending_before', params.ending_before);\n }\n\n return url.toString();\n }\n\n async list(params: ListBalancesParams = {}): Promise<BalancesPage> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.buildUrl(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list balances', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list balances',\n status,\n () => balancesPageSchema.parse(data) as BalancesPage,\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type { IPaymentMethodsResource } from '@/resources/interfaces';\nimport type { PaymentMethod } from '@/types/index';\nimport { z } from 'zod';\n\nconst paymentMethodSchema = z.looseObject({\n id: z.string(),\n type: z.string(),\n is_default: z.boolean(),\n name: z.string(),\n nickname: z.optional(z.string().nullable()),\n});\nconst paymentMethodsResponseSchema = z.looseObject({\n payment_details: z.array(paymentMethodSchema),\n});\n\nexport class PaymentMethodsResource\n extends BaseResource\n implements IPaymentMethodsResource\n{\n constructor(options: LinkOptions) {\n super(options, '/payment-details');\n }\n\n async list(): Promise<PaymentMethod[]> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.endpoint,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list payment methods', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list payment methods',\n status,\n () =>\n paymentMethodsResponseSchema.parse(data)\n .payment_details as PaymentMethod[],\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n CreateReportParams,\n IReportResource,\n ReportRecord,\n} from '@/resources/interfaces';\nimport { z } from 'zod';\n\nconst reportRecordSchema = z.looseObject({\n object: z.string(),\n created_at: z.string(),\n domain: z.string(),\n outcome: z.string(),\n spend_request_id: z.string(),\n status: z.string(),\n});\n\nexport class ReportResource extends BaseResource implements IReportResource {\n constructor(options: LinkOptions) {\n super(options, '/agent_observations');\n }\n\n async create(params: CreateReportParams): Promise<ReportRecord> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: this.endpoint,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('create report', status, data, rawBody);\n }\n\n return this.parseResponse('create report', status, () =>\n reportRecordSchema.parse(data),\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type { IShippingAddressResource } from '@/resources/interfaces';\nimport type { ShippingAddressRecord } from '@/types/index';\nimport { z } from 'zod';\n\nconst shippingAddressSchema = z.looseObject({\n id: z.string(),\n is_default: z.boolean(),\n nickname: z.optional(z.string().nullable()),\n address: z.looseObject({}).nullable(),\n});\nconst shippingAddressesResponseSchema = z.looseObject({\n shipping_addresses: z.array(shippingAddressSchema),\n});\n\nexport class ShippingAddressResource\n extends BaseResource\n implements IShippingAddressResource\n{\n constructor(options: LinkOptions) {\n super(options, '/shipping_addresses');\n }\n\n async list(): Promise<ShippingAddressRecord[]> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.endpoint,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list shipping addresses', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list shipping addresses',\n status,\n () =>\n shippingAddressesResponseSchema.parse(data)\n .shipping_addresses as ShippingAddressRecord[],\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n ISourcesResource,\n ListSourcesParams,\n} from '@/resources/interfaces';\nimport type { SourcesPage } from '@/types/index';\nimport { z } from 'zod';\n\nconst nullableRecordSchema = z\n .record(z.string(), z.unknown())\n .nullable()\n .optional();\nconst sourceSchema = z.looseObject({\n id: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n type: z.string().nullable().optional(),\n capabilities: nullableRecordSchema,\n external_connection: nullableRecordSchema,\n granted_actions: z.array(z.string()).nullable().optional(),\n bank_account: nullableRecordSchema,\n card: nullableRecordSchema,\n});\nconst sourcesPageSchema = z.looseObject({\n data: z.array(sourceSchema),\n has_more: z.boolean().optional(),\n});\n\nexport class SourcesResource extends BaseResource implements ISourcesResource {\n constructor(options: LinkOptions) {\n super(options, '/sources');\n }\n\n private buildUrl(params: ListSourcesParams): string {\n const url = new URL(this.endpoint);\n\n if (params.limit !== undefined) {\n url.searchParams.set('limit', String(params.limit));\n }\n if (params.starting_after !== undefined) {\n url.searchParams.set('starting_after', params.starting_after);\n }\n if (params.ending_before !== undefined) {\n url.searchParams.set('ending_before', params.ending_before);\n }\n\n return url.toString();\n }\n\n async list(params: ListSourcesParams = {}): Promise<SourcesPage> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.buildUrl(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list sources', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list sources',\n status,\n () => sourcesPageSchema.parse(data) as SourcesPage,\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { LinkApiError } from '@/errors';\nimport { BaseResource } from '@/resources/base';\nimport type {\n CreateSpendRequestParams,\n ISpendRequestResource,\n UpdateSpendRequestParams,\n} from '@/resources/interfaces';\nimport type { RequestApprovalResponse, SpendRequest } from '@/types/index';\nimport { z } from 'zod';\n\nconst sharedPaymentTokenSchema = z.union([\n z.string().transform((id) => ({ id })),\n z.looseObject({ id: z.string() }),\n]);\n\nconst spendRequestSchema = z.looseObject({\n id: z.string(),\n payment_details: z.string().optional(),\n status: z.string(),\n line_items: z.array(z.unknown()).optional(),\n totals: z.array(z.unknown()).optional(),\n created_at: z.string(),\n updated_at: z.string(),\n shared_payment_token: sharedPaymentTokenSchema.nullable().optional(),\n});\n\nconst spendRequestsResponseSchema = z.looseObject({\n data: z.array(spendRequestSchema),\n});\n\nconst requestApprovalResponseSchema = z\n .looseObject({\n id: z.string(),\n approval_link: z.string(),\n })\n .transform(({ approval_link, ...response }) => ({\n ...response,\n approval_url: approval_link,\n }));\n\nconst duplicateSpendRequestErrorSchema = z.looseObject({\n error: z.looseObject({\n duplicate_spend_request: z.unknown().optional(),\n }),\n});\n\ntype InternalCreateSpendRequestParams = CreateSpendRequestParams & {\n approve?: boolean;\n expires_at?: number;\n};\n\ntype InternalUpdateSpendRequestParams = UpdateSpendRequestParams & {\n approve?: boolean;\n};\n\n/** Normalizes the legacy string SPT response into the current object shape. */\nfunction parseSpendRequest(value: unknown): SpendRequest {\n return spendRequestSchema.parse(value) as SpendRequest;\n}\n\nexport function getDuplicateSpendRequest(error: unknown): SpendRequest | null {\n if (!(error instanceof LinkApiError)) return null;\n const details = duplicateSpendRequestErrorSchema.safeParse(error.details);\n if (!details.success) return null;\n\n const duplicate = spendRequestSchema.safeParse(\n details.data.error.duplicate_spend_request,\n );\n return duplicate.success ? (duplicate.data as SpendRequest) : null;\n}\n\nexport class SpendRequestResource\n extends BaseResource\n implements ISpendRequestResource\n{\n constructor(options: LinkOptions) {\n super(options, '/spend_requests', 'spend');\n }\n\n async list(opts?: { includeHistory?: boolean }): Promise<SpendRequest[]> {\n const url = opts?.includeHistory\n ? `${this.endpoint}?include_history=true`\n : this.endpoint;\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list spend requests', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list spend requests',\n status,\n () => spendRequestsResponseSchema.parse(data).data as SpendRequest[],\n );\n }\n\n async create(\n params: InternalCreateSpendRequestParams,\n ): Promise<SpendRequest> {\n const { approve, ...body } = params;\n const url = approve ? `${this.endpoint}/create_delegated` : this.endpoint;\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('create spend request', status, data, rawBody);\n }\n return this.parseResponse('create spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n\n async update(\n id: string,\n params: InternalUpdateSpendRequestParams,\n ): Promise<SpendRequest> {\n const { approve, ...body } = params;\n const url = approve\n ? `${this.endpoint}/${id}/update_delegated`\n : `${this.endpoint}/${id}`;\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('update spend request', status, data, rawBody);\n }\n return this.parseResponse('update spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n\n async cancel(id: string): Promise<SpendRequest> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: `${this.endpoint}/${id}/cancel`,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('cancel spend request', status, data, rawBody);\n }\n return this.parseResponse('cancel spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n\n async requestApproval(id: string): Promise<RequestApprovalResponse> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: `${this.endpoint}/${id}/request_approval`,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('request approval', status, data, rawBody);\n }\n return this.parseResponse('request approval', status, () =>\n requestApprovalResponseSchema.parse(data),\n );\n }\n\n async retrieve(\n id: string,\n opts?: { include?: string[] },\n ): Promise<SpendRequest | null> {\n const url = new URL(`${this.endpoint}/${id}`);\n if (opts?.include?.length) {\n url.searchParams.set('include', opts.include.join(','));\n }\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: url.toString(),\n });\n\n if (status === 404) return null;\n if (status < 200 || status >= 300) {\n this.throwApiError('retrieve spend request', status, data, rawBody);\n }\n return this.parseResponse('retrieve spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n ITransactionsResource,\n ListTransactionsParams,\n} from '@/resources/interfaces';\nimport type { TransactionsPage } from '@/types/index';\nimport { z } from 'zod';\n\nconst transactionSchema = z.looseObject({\n id: z.string(),\n source_id: z.string().nullable(),\n amount: z.number(),\n currency: z.string(),\n created_date: z.string(),\n description: z.string(),\n origin: z.enum(['link', 'external_connection']),\n category: z.string().nullable(),\n status: z.string(),\n});\nconst transactionsPageSchema = z.union([\n z.array(transactionSchema).transform((data) => ({ data })),\n z.looseObject({\n data: z.array(transactionSchema),\n has_more: z.boolean().optional(),\n }),\n]);\n\nexport class TransactionsResource\n extends BaseResource\n implements ITransactionsResource\n{\n constructor(options: LinkOptions) {\n super(options, '/transactions');\n }\n\n private buildUrl(params: ListTransactionsParams): string {\n const url = new URL(this.endpoint);\n\n if (params.limit !== undefined) {\n url.searchParams.set('limit', String(params.limit));\n }\n if (params.starting_after !== undefined) {\n url.searchParams.set('starting_after', params.starting_after);\n }\n if (params.ending_before !== undefined) {\n url.searchParams.set('ending_before', params.ending_before);\n }\n if (params.start_date !== undefined) {\n url.searchParams.set('date_start', params.start_date);\n }\n if (params.end_date !== undefined) {\n url.searchParams.set('date_end', params.end_date);\n }\n if (params.category !== undefined) {\n url.searchParams.set('category', params.category);\n }\n if (params.origin !== undefined) {\n url.searchParams.set('origin', params.origin);\n }\n if (params.sources !== undefined) {\n for (const source of params.sources) {\n url.searchParams.append('sources[]', source);\n }\n }\n\n return url.toString();\n }\n\n async list(params: ListTransactionsParams = {}): Promise<TransactionsPage> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.buildUrl(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list transactions', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list transactions',\n status,\n () => transactionsPageSchema.parse(data) as TransactionsPage,\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type { IUserInfoResource } from '@/resources/interfaces';\nimport type { UserInfo } from '@/types/index';\nimport { z } from 'zod';\n\nconst userInfoSchema = z\n .looseObject({\n email: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n first_name: z.string().nullable().optional(),\n last_name: z.string().nullable().optional(),\n phone: z.string().nullable().optional(),\n })\n .transform(({ email, name, first_name, last_name, phone }) => ({\n email: email ?? null,\n name: name ?? null,\n first_name: first_name ?? null,\n last_name: last_name ?? null,\n phone: phone ?? null,\n }));\n\nexport class UserInfoResource\n extends BaseResource\n implements IUserInfoResource\n{\n constructor(options: LinkOptions) {\n super(options, '/userinfo');\n }\n\n async retrieve(): Promise<UserInfo> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.endpoint,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('retrieve user info', status, data, rawBody);\n }\n\n return this.parseResponse('retrieve user info', status, () =>\n userInfoSchema.parse(data),\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { LinkSdkError } from '@/errors';\nimport { BaseResource } from '@/resources/base';\nimport type { IWebBotAuthResource } from '@/resources/interfaces';\nimport type { WebBotAuthBlock } from '@/types/index';\nimport { z } from 'zod';\n\ninterface CacheEntry {\n block: WebBotAuthBlock;\n expiresAt: number;\n}\n\nconst EXPIRY_BUFFER_MS = 30_000;\n\nconst webBotAuthBlockSchema = z.looseObject({\n signature: z.string(),\n signature_input: z.string(),\n signature_agent: z.string(),\n authority: z.string(),\n expires_at: z.string(),\n});\nconst webBotAuthResponseSchema = z.looseObject({\n web_bot_auth: webBotAuthBlockSchema,\n});\n\nexport class WebBotAuthResource\n extends BaseResource\n implements IWebBotAuthResource\n{\n private readonly cache = new Map<string, CacheEntry>();\n\n constructor(options: LinkOptions) {\n super(options, '/web_bot_auth/sign');\n }\n\n async signUrl(url: string): Promise<WebBotAuthBlock> {\n let authority: string;\n try {\n authority = new URL(url).hostname;\n } catch (error) {\n throw new LinkSdkError(`Invalid URL: ${url}`, { cause: error });\n }\n\n const cached = this.cache.get(authority);\n if (cached && Date.now() < cached.expiresAt - EXPIRY_BUFFER_MS) {\n return cached.block;\n }\n\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: this.endpoint,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ url }),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('get web bot auth headers', status, data, rawBody);\n }\n\n const webBotAuth = this.parseResponse(\n 'get web bot auth headers',\n status,\n () => webBotAuthResponseSchema.parse(data).web_bot_auth,\n );\n const expiresAt = Date.parse(webBotAuth.expires_at);\n if (Number.isNaN(expiresAt)) {\n throw new LinkSdkError(\n `Credentials response has invalid expires_at: ${webBotAuth.expires_at}`,\n );\n }\n\n this.cache.set(authority, { block: webBotAuth, expiresAt });\n return webBotAuth;\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BalancesResource } from '@/resources/balances';\nimport type {\n IBalancesResource,\n IPaymentMethodsResource,\n IReportResource,\n IShippingAddressResource,\n ISourcesResource,\n ISpendRequestResource,\n ITransactionsResource,\n IUserInfoResource,\n IWebBotAuthResource,\n} from '@/resources/interfaces';\nimport { PaymentMethodsResource } from '@/resources/payment-methods';\nimport { ReportResource } from '@/resources/report';\nimport { ShippingAddressResource } from '@/resources/shipping-address';\nimport { SourcesResource } from '@/resources/sources';\nimport { SpendRequestResource } from '@/resources/spend-request';\nimport { TransactionsResource } from '@/resources/transactions';\nimport { UserInfoResource } from '@/resources/user-info';\nimport { WebBotAuthResource } from '@/resources/web-bot-auth';\n\nexport class Link {\n readonly spendRequests: ISpendRequestResource;\n readonly paymentMethods: IPaymentMethodsResource;\n readonly shippingAddresses: IShippingAddressResource;\n readonly userInfo: IUserInfoResource;\n readonly transactions: ITransactionsResource;\n readonly sources: ISourcesResource;\n readonly balances: IBalancesResource;\n readonly webBotAuth: IWebBotAuthResource;\n readonly reports: IReportResource;\n\n constructor(options: LinkOptions) {\n this.spendRequests = new SpendRequestResource(options);\n this.paymentMethods = new PaymentMethodsResource(options);\n this.shippingAddresses = new ShippingAddressResource(options);\n this.userInfo = new UserInfoResource(options);\n this.transactions = new TransactionsResource(options);\n this.sources = new SourcesResource(options);\n this.balances = new BalancesResource(options);\n this.webBotAuth = new WebBotAuthResource(options);\n this.reports = new ReportResource(options);\n }\n}\n\nexport default Link;\n","import type {\n ApprovalDetail,\n BalancesPage,\n CredentialType,\n LineItem,\n PaymentMethod,\n RequestApprovalResponse,\n ShippingAddressRecord,\n SourcesPage,\n SpendRequest,\n Total,\n TransactionOrigin,\n TransactionsPage,\n UserInfo,\n WebBotAuthBlock,\n} from '@/types/index';\n\nexport interface GetAccessTokenOptions {\n forceRefresh?: boolean;\n}\n\nexport type AccessTokenProvider = (\n options?: GetAccessTokenOptions,\n) => Promise<string> | string;\n\nexport interface CreateSpendRequestParams {\n payment_details?: string;\n credential_type?: CredentialType;\n network_id?: string;\n execution_method?: 'link_pay_token';\n merchant_account_id?: string;\n amount?: number;\n currency?: string;\n merchant_name?: string;\n merchant_url?: string;\n context: string;\n line_items?: LineItem[];\n totals?: Total[];\n request_approval?: boolean;\n test?: boolean;\n approval_details?: ApprovalDetail;\n metadata?: Record<string, string>;\n}\n\nexport interface UpdateSpendRequestParams {\n payment_details?: string;\n amount?: number;\n merchant_url?: string;\n profile_id?: string;\n merchant_id?: string;\n currency?: string;\n line_items?: LineItem[];\n totals?: Total[];\n}\n\nexport interface ISpendRequestResource {\n list(opts?: { includeHistory?: boolean }): Promise<SpendRequest[]>;\n create(params: CreateSpendRequestParams): Promise<SpendRequest>;\n update(id: string, params: UpdateSpendRequestParams): Promise<SpendRequest>;\n requestApproval(id: string): Promise<RequestApprovalResponse>;\n cancel(id: string): Promise<SpendRequest>;\n retrieve(\n id: string,\n opts?: { include?: string[] },\n ): Promise<SpendRequest | null>;\n}\n\nexport interface IPaymentMethodsResource {\n list(): Promise<PaymentMethod[]>;\n}\n\nexport interface IShippingAddressResource {\n list(): Promise<ShippingAddressRecord[]>;\n}\n\nexport interface IUserInfoResource {\n retrieve(): Promise<UserInfo>;\n}\n\nexport interface IWebBotAuthResource {\n signUrl(url: string): Promise<WebBotAuthBlock>;\n}\n\nexport interface ListTransactionsParams {\n limit?: number;\n starting_after?: string;\n ending_before?: string;\n start_date?: string;\n end_date?: string;\n category?: string;\n origin?: TransactionOrigin;\n sources?: string[];\n}\n\nexport interface ITransactionsResource {\n list(params?: ListTransactionsParams): Promise<TransactionsPage>;\n}\n\nexport interface ListSourcesParams {\n limit?: number;\n starting_after?: string;\n ending_before?: string;\n}\n\nexport interface ISourcesResource {\n list(params?: ListSourcesParams): Promise<SourcesPage>;\n}\n\nexport interface ListBalancesParams {\n sources?: string[];\n limit?: number;\n starting_after?: string;\n ending_before?: string;\n}\n\nexport interface IBalancesResource {\n list(params?: ListBalancesParams): Promise<BalancesPage>;\n}\n\nexport const REPORT_OUTCOMES = ['success', 'blocked', 'abandoned'] as const;\nexport type ReportOutcome = (typeof REPORT_OUTCOMES)[number];\n\nexport const REPORT_TAGS = [\n 'stripe_checkout',\n 'captcha',\n 'anti_bot_script',\n 'cdn_block',\n 'waf_block',\n 'dns_block',\n 'rate_limited',\n 'login_required',\n '3ds_challenge',\n 'page_inaccessible',\n 'timeout',\n 'site_error',\n 'payment_declined',\n 'other',\n] as const;\nexport type ReportTag = (typeof REPORT_TAGS)[number];\n\nexport interface CreateReportParams {\n domain: string;\n outcome: ReportOutcome;\n spend_request_id: string;\n tags?: ReportTag[];\n step?: string;\n freeform_context?: string;\n}\n\nexport interface ReportRecord {\n object: string;\n created_at: string;\n domain: string;\n outcome: string;\n spend_request_id: string;\n status: string;\n}\n\nexport interface IReportResource {\n create(params: CreateReportParams): Promise<ReportRecord>;\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/resources/base.ts","../src/resources/balances.ts","../src/resources/payment-methods.ts","../src/resources/report.ts","../src/resources/shipping-address.ts","../src/resources/sources.ts","../src/resources/spend-request.ts","../src/resources/transactions.ts","../src/resources/user-info.ts","../src/resources/web-bot-auth.ts","../src/client.ts","../src/resources/interfaces.ts"],"sourcesContent":["import { ZodError, prettifyError } from 'zod';\n\nexport class LinkSdkError extends Error {\n readonly code: string;\n\n constructor(message: string, options?: { code?: string; cause?: unknown }) {\n super(message, { cause: options?.cause });\n this.name = new.target.name;\n this.code = options?.code ?? 'sdk_error';\n }\n}\n\nexport class LinkResponseError extends LinkSdkError {\n readonly status: number;\n\n constructor(\n operation: string,\n status: number,\n options?: { cause?: unknown },\n ) {\n const detail =\n options?.cause instanceof ZodError\n ? `: ${prettifyError(options.cause)}`\n : options?.cause instanceof Error\n ? `: ${options.cause.message}`\n : '';\n super(\n `Invalid response while attempting to ${operation} (${status})${detail}`,\n { code: 'invalid_response', cause: options?.cause },\n );\n this.status = status;\n }\n}\n\nexport class LinkConfigurationError extends LinkSdkError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, { code: 'configuration_error', ...options });\n }\n}\n\nexport class LinkTransportError extends LinkSdkError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, { code: 'transport_error', ...options });\n }\n}\n\nexport class LinkApiError extends LinkSdkError {\n readonly status: number;\n readonly rawBody: string | undefined;\n readonly details?: unknown;\n\n constructor(\n message: string,\n options: {\n status: number;\n code?: string;\n rawBody?: string;\n details?: unknown;\n cause?: unknown;\n },\n ) {\n super(message, { code: options.code ?? 'api_error', cause: options.cause });\n this.status = options.status;\n this.rawBody = options.rawBody;\n this.details = options.details;\n }\n}\n","import { LinkConfigurationError } from '@/errors';\nimport type { AccessTokenProvider } from '@/resources/interfaces';\n\nexport interface LinkSdkLogger {\n debug(message: string): void;\n}\n\ninterface LinkClientOptions {\n verbose?: boolean;\n defaultHeaders?: Record<string, string>;\n fetch?: typeof globalThis.fetch;\n apiBaseUrl?: string;\n spendRequestBaseUrl?: string;\n logger?: LinkSdkLogger;\n}\n\nexport type LinkOptions = LinkClientOptions &\n (\n | { accessToken: string; getAccessToken?: never }\n | { accessToken?: never; getAccessToken: AccessTokenProvider }\n );\n\nexport interface ResolvedLinkSdkConfig {\n verbose: boolean;\n getAccessToken: AccessTokenProvider;\n canRefreshAccessToken: boolean;\n fetch?: typeof globalThis.fetch;\n apiBaseUrl: string;\n spendRequestBaseUrl: string;\n logger: LinkSdkLogger;\n}\n\nconst DEFAULT_API_BASE_URL = 'https://api.link.com';\n\nfunction createDefaultHeadersFetch(\n baseFetch: typeof globalThis.fetch,\n defaultHeaders: Record<string, string>,\n): typeof globalThis.fetch {\n return ((input: RequestInfo | URL, init?: RequestInit) => {\n const headers = new Headers(init?.headers);\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (!headers.has(key)) {\n headers.set(key, value);\n }\n }\n return baseFetch(input, { ...init, headers });\n }) as typeof globalThis.fetch;\n}\n\nexport interface LinkSdkConfigDefaults {\n apiBaseUrl?: string;\n spendRequestBaseUrl?: string;\n}\n\nfunction createDefaultLogger(): LinkSdkLogger {\n return {\n debug() {},\n };\n}\n\nexport function resolveLinkSdkConfig(\n options: LinkOptions,\n defaults: LinkSdkConfigDefaults = {},\n): ResolvedLinkSdkConfig {\n const verbose = options.verbose ?? false;\n const logger = options.logger ?? createDefaultLogger();\n if (\n options.accessToken !== undefined &&\n options.getAccessToken !== undefined\n ) {\n throw new LinkConfigurationError(\n 'Pass either `accessToken` or `getAccessToken`, not both.',\n );\n }\n\n let getAccessToken: AccessTokenProvider;\n let canRefreshAccessToken: boolean;\n if (options.accessToken !== undefined) {\n if (options.accessToken.trim().length === 0) {\n throw new LinkConfigurationError('`accessToken` cannot be empty.');\n }\n const accessToken = options.accessToken;\n getAccessToken = () => accessToken;\n canRefreshAccessToken = false;\n } else if (typeof options.getAccessToken === 'function') {\n getAccessToken = options.getAccessToken;\n canRefreshAccessToken = true;\n } else {\n throw new LinkConfigurationError(\n 'Pass `accessToken` or `getAccessToken` to the Link client.',\n );\n }\n\n const apiBaseUrl =\n options.apiBaseUrl ?? defaults.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n const spendRequestBaseUrl =\n options.spendRequestBaseUrl ?? defaults.spendRequestBaseUrl ?? apiBaseUrl;\n\n const baseFetch = options.fetch ?? globalThis.fetch;\n const effectiveFetch =\n options.defaultHeaders && Object.keys(options.defaultHeaders).length > 0\n ? createDefaultHeadersFetch(baseFetch, options.defaultHeaders)\n : baseFetch;\n\n return {\n verbose,\n getAccessToken,\n canRefreshAccessToken,\n fetch: effectiveFetch,\n apiBaseUrl,\n spendRequestBaseUrl,\n logger,\n };\n}\n\nexport function requireFetchImplementation(\n config: Pick<ResolvedLinkSdkConfig, 'fetch'>,\n): typeof globalThis.fetch {\n if (!config.fetch) {\n throw new LinkConfigurationError(\n 'No fetch implementation available. Pass `fetch` in Link SDK options.',\n );\n }\n\n return config.fetch;\n}\n","import {\n type LinkOptions,\n requireFetchImplementation,\n resolveLinkSdkConfig,\n} from '@/config';\nimport { LinkApiError, LinkResponseError, LinkTransportError } from '@/errors';\nimport type { AccessTokenProvider } from '@/resources/interfaces';\n\nexport interface ApiFetchOptions {\n method: string;\n url: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n}\n\nexport interface ApiFetchResult {\n status: number;\n data: unknown;\n rawBody: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function extractErrorMessage(data: unknown, rawBody: string): string {\n if (isRecord(data)) {\n if (typeof data.error === 'string') {\n return data.error;\n }\n if (isRecord(data.error)) {\n const nested = data.error;\n if (typeof nested.message === 'string') {\n return nested.message;\n }\n if (typeof nested.code === 'string') {\n return nested.code;\n }\n }\n if (typeof data.message === 'string') {\n return data.message;\n }\n }\n\n return rawBody || 'unknown error';\n}\n\nexport abstract class BaseResource {\n protected readonly verbose: boolean;\n protected readonly getAccessToken: AccessTokenProvider;\n protected readonly canRefreshAccessToken: boolean;\n protected readonly fetchImpl: typeof globalThis.fetch;\n protected readonly endpoint: string;\n protected readonly logger: { debug(message: string): void };\n\n constructor(\n options: LinkOptions,\n endpointPath: string,\n base: 'api' | 'spend' = 'api',\n ) {\n const config = resolveLinkSdkConfig(options);\n this.verbose = config.verbose;\n this.getAccessToken = config.getAccessToken;\n this.canRefreshAccessToken = config.canRefreshAccessToken;\n this.fetchImpl = requireFetchImplementation(config);\n const baseUrl =\n base === 'spend' ? config.spendRequestBaseUrl : config.apiBaseUrl;\n this.endpoint = `${baseUrl}${endpointPath}`;\n this.logger = config.logger;\n }\n\n protected async rawFetch(opts: ApiFetchOptions): Promise<ApiFetchResult> {\n if (this.verbose) {\n this.logger.debug(`> ${opts.method} ${opts.url}`);\n }\n\n let response: Response;\n try {\n const init: RequestInit = {\n method: opts.method,\n ...(opts.headers !== undefined && { headers: opts.headers }),\n ...(opts.body !== undefined && { body: opts.body }),\n ...(opts.signal !== undefined && { signal: opts.signal }),\n };\n response = await this.fetchImpl(opts.url, init);\n } catch (error) {\n throw new LinkTransportError(\n `Request failed: ${opts.method} ${opts.url}`,\n { cause: error },\n );\n }\n const rawBody = await response.text();\n\n let data: unknown = null;\n try {\n data = JSON.parse(rawBody);\n } catch {\n // non-JSON response (e.g., from load balancer)\n }\n\n if (this.verbose) {\n this.logger.debug(`< ${response.status} ${response.statusText}`);\n }\n\n return { status: response.status, data, rawBody };\n }\n\n protected async apiFetch(opts: ApiFetchOptions): Promise<ApiFetchResult> {\n const token = await this.getAccessToken();\n const authedOpts = {\n ...opts,\n headers: {\n ...opts.headers,\n Authorization: `Bearer ${token}`,\n },\n };\n\n const res = await this.rawFetch(authedOpts);\n\n if (res.status === 401 && this.canRefreshAccessToken) {\n const refreshedToken = await this.getAccessToken({ forceRefresh: true });\n authedOpts.headers.Authorization = `Bearer ${refreshedToken}`;\n return this.rawFetch(authedOpts);\n }\n\n return res;\n }\n\n protected throwApiError(\n operation: string,\n status: number,\n data: unknown,\n rawBody: string,\n cause?: unknown,\n ): never {\n const msg = extractErrorMessage(data, rawBody);\n throw new LinkApiError(`Failed to ${operation} (${status}): ${msg}`, {\n status,\n rawBody,\n details: data,\n cause,\n });\n }\n\n protected parseResponse<T>(\n operation: string,\n status: number,\n parser: () => T,\n ): T {\n try {\n return parser();\n } catch (error) {\n throw new LinkResponseError(operation, status, { cause: error });\n }\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n IBalancesResource,\n ListBalancesParams,\n} from '@/resources/interfaces';\nimport type { BalancesPage } from '@/types/index';\nimport { z } from 'zod';\n\nconst currencyAmountsSchema = z.record(z.string(), z.number());\nconst balanceSchema = z.looseObject({\n source_id: z.string(),\n type: z.enum(['cash', 'credit']),\n cash: z\n .looseObject({ available: currencyAmountsSchema })\n .nullable()\n .optional(),\n credit: z.looseObject({ used: currencyAmountsSchema }).nullable().optional(),\n current: z.number(),\n currency: z.string(),\n as_of: z.string(),\n});\nconst balancesPageSchema = z.looseObject({\n data: z.array(balanceSchema),\n has_more: z.boolean().optional(),\n});\n\nexport class BalancesResource\n extends BaseResource\n implements IBalancesResource\n{\n constructor(options: LinkOptions) {\n super(options, '/balances');\n }\n\n private buildUrl(params: ListBalancesParams): string {\n const url = new URL(this.endpoint);\n\n if (params.sources !== undefined) {\n for (const source of params.sources) {\n url.searchParams.append('sources[]', source);\n }\n }\n if (params.limit !== undefined) {\n url.searchParams.set('limit', String(params.limit));\n }\n if (params.starting_after !== undefined) {\n url.searchParams.set('starting_after', params.starting_after);\n }\n if (params.ending_before !== undefined) {\n url.searchParams.set('ending_before', params.ending_before);\n }\n\n return url.toString();\n }\n\n async list(params: ListBalancesParams = {}): Promise<BalancesPage> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.buildUrl(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list balances', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list balances',\n status,\n () => balancesPageSchema.parse(data) as BalancesPage,\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type { IPaymentMethodsResource } from '@/resources/interfaces';\nimport type { PaymentMethod } from '@/types/index';\nimport { z } from 'zod';\n\nconst paymentMethodSchema = z.looseObject({\n id: z.string(),\n type: z.string(),\n is_default: z.boolean(),\n name: z.string(),\n nickname: z.optional(z.string().nullable()),\n});\nconst paymentMethodsResponseSchema = z.looseObject({\n payment_details: z.array(paymentMethodSchema),\n});\n\nexport class PaymentMethodsResource\n extends BaseResource\n implements IPaymentMethodsResource\n{\n constructor(options: LinkOptions) {\n super(options, '/payment-details');\n }\n\n async list(): Promise<PaymentMethod[]> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.endpoint,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list payment methods', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list payment methods',\n status,\n () =>\n paymentMethodsResponseSchema.parse(data)\n .payment_details as PaymentMethod[],\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n CreateReportParams,\n IReportResource,\n ReportRecord,\n} from '@/resources/interfaces';\nimport { z } from 'zod';\n\nconst reportRecordSchema = z.looseObject({\n object: z.string(),\n created_at: z.string(),\n domain: z.string(),\n outcome: z.string(),\n spend_request_id: z.string(),\n status: z.string(),\n});\n\nexport class ReportResource extends BaseResource implements IReportResource {\n constructor(options: LinkOptions) {\n super(options, '/agent_observations');\n }\n\n async create(params: CreateReportParams): Promise<ReportRecord> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: this.endpoint,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('create report', status, data, rawBody);\n }\n\n return this.parseResponse('create report', status, () =>\n reportRecordSchema.parse(data),\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type { IShippingAddressResource } from '@/resources/interfaces';\nimport type { ShippingAddressRecord } from '@/types/index';\nimport { z } from 'zod';\n\nconst shippingAddressSchema = z.looseObject({\n id: z.string(),\n is_default: z.boolean(),\n nickname: z.optional(z.string().nullable()),\n address: z.looseObject({}).nullable(),\n});\nconst shippingAddressesResponseSchema = z.looseObject({\n shipping_addresses: z.array(shippingAddressSchema),\n});\n\nexport class ShippingAddressResource\n extends BaseResource\n implements IShippingAddressResource\n{\n constructor(options: LinkOptions) {\n super(options, '/shipping_addresses');\n }\n\n async list(): Promise<ShippingAddressRecord[]> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.endpoint,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list shipping addresses', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list shipping addresses',\n status,\n () =>\n shippingAddressesResponseSchema.parse(data)\n .shipping_addresses as ShippingAddressRecord[],\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n ISourcesResource,\n ListSourcesParams,\n} from '@/resources/interfaces';\nimport type { SourcesPage } from '@/types/index';\nimport { z } from 'zod';\n\nconst nullableRecordSchema = z\n .record(z.string(), z.unknown())\n .nullable()\n .optional();\nconst sourceSchema = z.looseObject({\n id: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n type: z.string().nullable().optional(),\n capabilities: nullableRecordSchema,\n external_connection: nullableRecordSchema,\n granted_actions: z.array(z.string()).nullable().optional(),\n bank_account: nullableRecordSchema,\n card: nullableRecordSchema,\n});\nconst sourcesPageSchema = z.looseObject({\n data: z.array(sourceSchema),\n has_more: z.boolean().optional(),\n});\n\nexport class SourcesResource extends BaseResource implements ISourcesResource {\n constructor(options: LinkOptions) {\n super(options, '/sources');\n }\n\n private buildUrl(params: ListSourcesParams): string {\n const url = new URL(this.endpoint);\n\n if (params.limit !== undefined) {\n url.searchParams.set('limit', String(params.limit));\n }\n if (params.starting_after !== undefined) {\n url.searchParams.set('starting_after', params.starting_after);\n }\n if (params.ending_before !== undefined) {\n url.searchParams.set('ending_before', params.ending_before);\n }\n\n return url.toString();\n }\n\n async list(params: ListSourcesParams = {}): Promise<SourcesPage> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.buildUrl(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list sources', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list sources',\n status,\n () => sourcesPageSchema.parse(data) as SourcesPage,\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { LinkApiError } from '@/errors';\nimport { BaseResource } from '@/resources/base';\nimport type {\n CreateSpendRequestParams,\n ISpendRequestResource,\n UpdateSpendRequestParams,\n} from '@/resources/interfaces';\nimport type { RequestApprovalResponse, SpendRequest } from '@/types/index';\nimport { z } from 'zod';\n\nconst sharedPaymentTokenSchema = z.union([\n z.string().transform((id) => ({ id })),\n z.looseObject({ id: z.string() }),\n]);\n\nconst spendRequestSchema = z.looseObject({\n id: z.string(),\n payment_details: z.string().optional(),\n status: z.string(),\n line_items: z.array(z.unknown()).optional(),\n totals: z.array(z.unknown()).optional(),\n created_at: z.string(),\n updated_at: z.string(),\n shared_payment_token: sharedPaymentTokenSchema.nullable().optional(),\n});\n\nconst spendRequestsResponseSchema = z.looseObject({\n data: z.array(spendRequestSchema),\n});\n\nconst requestApprovalResponseSchema = z\n .looseObject({\n id: z.string(),\n approval_link: z.string(),\n })\n .transform(({ approval_link, ...response }) => ({\n ...response,\n approval_url: approval_link,\n }));\n\nconst duplicateSpendRequestErrorSchema = z.looseObject({\n error: z.looseObject({\n duplicate_spend_request: z.unknown().optional(),\n }),\n});\n\ntype InternalCreateSpendRequestParams = CreateSpendRequestParams & {\n approve?: boolean;\n expires_at?: number;\n};\n\ntype InternalUpdateSpendRequestParams = UpdateSpendRequestParams & {\n approve?: boolean;\n};\n\n/** Normalizes the legacy string SPT response into the current object shape. */\nfunction parseSpendRequest(value: unknown): SpendRequest {\n return spendRequestSchema.parse(value) as SpendRequest;\n}\n\nexport function getDuplicateSpendRequest(error: unknown): SpendRequest | null {\n if (!(error instanceof LinkApiError)) return null;\n const details = duplicateSpendRequestErrorSchema.safeParse(error.details);\n if (!details.success) return null;\n\n const duplicate = spendRequestSchema.safeParse(\n details.data.error.duplicate_spend_request,\n );\n return duplicate.success ? (duplicate.data as SpendRequest) : null;\n}\n\nexport class SpendRequestResource\n extends BaseResource\n implements ISpendRequestResource\n{\n constructor(options: LinkOptions) {\n super(options, '/spend_requests', 'spend');\n }\n\n async list(opts?: { includeHistory?: boolean }): Promise<SpendRequest[]> {\n const url = opts?.includeHistory\n ? `${this.endpoint}?include_history=true`\n : this.endpoint;\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list spend requests', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list spend requests',\n status,\n () => spendRequestsResponseSchema.parse(data).data as SpendRequest[],\n );\n }\n\n async create(\n params: InternalCreateSpendRequestParams,\n ): Promise<SpendRequest> {\n const { approve, ...body } = params;\n const url = approve ? `${this.endpoint}/create_delegated` : this.endpoint;\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('create spend request', status, data, rawBody);\n }\n return this.parseResponse('create spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n\n async update(\n id: string,\n params: InternalUpdateSpendRequestParams,\n ): Promise<SpendRequest> {\n const { approve, ...body } = params;\n const url = approve\n ? `${this.endpoint}/${id}/update_delegated`\n : `${this.endpoint}/${id}`;\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('update spend request', status, data, rawBody);\n }\n return this.parseResponse('update spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n\n async cancel(id: string): Promise<SpendRequest> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: `${this.endpoint}/${id}/cancel`,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('cancel spend request', status, data, rawBody);\n }\n return this.parseResponse('cancel spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n\n async requestApproval(id: string): Promise<RequestApprovalResponse> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: `${this.endpoint}/${id}/request_approval`,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('request approval', status, data, rawBody);\n }\n return this.parseResponse('request approval', status, () =>\n requestApprovalResponseSchema.parse(data),\n );\n }\n\n async retrieve(\n id: string,\n opts?: { include?: string[] },\n ): Promise<SpendRequest | null> {\n const url = new URL(`${this.endpoint}/${id}`);\n if (opts?.include?.length) {\n url.searchParams.set('include', opts.include.join(','));\n }\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: url.toString(),\n });\n\n if (status === 404) return null;\n if (status < 200 || status >= 300) {\n this.throwApiError('retrieve spend request', status, data, rawBody);\n }\n return this.parseResponse('retrieve spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n ITransactionsResource,\n ListTransactionsParams,\n} from '@/resources/interfaces';\nimport type { TransactionsPage } from '@/types/index';\nimport { z } from 'zod';\n\nconst transactionSchema = z.looseObject({\n id: z.string(),\n source_id: z.string().nullable(),\n amount: z.number(),\n currency: z.string(),\n created_date: z.string(),\n description: z.string(),\n origin: z.enum(['link', 'external_connection']),\n category: z.string().nullable(),\n status: z.string(),\n});\nconst transactionsPageSchema = z.union([\n z.array(transactionSchema).transform((data) => ({ data })),\n z.looseObject({\n data: z.array(transactionSchema),\n has_more: z.boolean().optional(),\n }),\n]);\n\nexport class TransactionsResource\n extends BaseResource\n implements ITransactionsResource\n{\n constructor(options: LinkOptions) {\n super(options, '/transactions');\n }\n\n private buildUrl(params: ListTransactionsParams): string {\n const url = new URL(this.endpoint);\n\n if (params.limit !== undefined) {\n url.searchParams.set('limit', String(params.limit));\n }\n if (params.starting_after !== undefined) {\n url.searchParams.set('starting_after', params.starting_after);\n }\n if (params.ending_before !== undefined) {\n url.searchParams.set('ending_before', params.ending_before);\n }\n if (params.start_date !== undefined) {\n url.searchParams.set('date_start', params.start_date);\n }\n if (params.end_date !== undefined) {\n url.searchParams.set('date_end', params.end_date);\n }\n if (params.category !== undefined) {\n url.searchParams.set('category', params.category);\n }\n if (params.origin !== undefined) {\n url.searchParams.set('origin', params.origin);\n }\n if (params.sources !== undefined) {\n for (const source of params.sources) {\n url.searchParams.append('sources[]', source);\n }\n }\n\n return url.toString();\n }\n\n async list(params: ListTransactionsParams = {}): Promise<TransactionsPage> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.buildUrl(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list transactions', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list transactions',\n status,\n () => transactionsPageSchema.parse(data) as TransactionsPage,\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type { IUserInfoResource } from '@/resources/interfaces';\nimport type { UserInfo } from '@/types/index';\nimport { z } from 'zod';\n\nconst rollingSpendLimitSchema = z.object({\n limit: z.number().int().nullable(),\n used: z.number().int(),\n remaining: z.number().int().nullable(),\n});\n\nconst agentWalletSpendLimitsSchema = z.object({\n per_transaction: z.object({\n limit: z.number().int().nullable(),\n }),\n daily: rollingSpendLimitSchema,\n thirty_day: rollingSpendLimitSchema,\n});\n\nconst agentWalletVerificationRequirementSchema = z.object({\n status: z.enum([\n 'not_required',\n 'ssn_verification',\n 'identity_verification',\n 'contact_support',\n 'complete',\n ]),\n action_url: z.string().nullable(),\n});\n\nconst userInfoSchema = z\n .looseObject({\n email: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n first_name: z.string().nullable().optional(),\n last_name: z.string().nullable().optional(),\n phone: z.string().nullable().optional(),\n agent_wallet_spend_limits: agentWalletSpendLimitsSchema.optional(),\n agent_wallet_step_up: agentWalletVerificationRequirementSchema.optional(),\n })\n .transform(\n ({\n email,\n name,\n first_name,\n last_name,\n phone,\n agent_wallet_spend_limits,\n agent_wallet_step_up,\n }) => ({\n email: email ?? null,\n name: name ?? null,\n first_name: first_name ?? null,\n last_name: last_name ?? null,\n phone: phone ?? null,\n ...(agent_wallet_spend_limits === undefined\n ? {}\n : { agent_wallet_spend_limits }),\n ...(agent_wallet_step_up === undefined\n ? {}\n : { agent_wallet_verification_requirement: agent_wallet_step_up }),\n }),\n );\n\nexport class UserInfoResource\n extends BaseResource\n implements IUserInfoResource\n{\n constructor(options: LinkOptions) {\n super(options, '/userinfo');\n }\n\n async retrieve(): Promise<UserInfo> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.endpoint,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('retrieve user info', status, data, rawBody);\n }\n\n return this.parseResponse('retrieve user info', status, () =>\n userInfoSchema.parse(data),\n );\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { LinkSdkError } from '@/errors';\nimport { BaseResource } from '@/resources/base';\nimport type { IWebBotAuthResource } from '@/resources/interfaces';\nimport type { WebBotAuthBlock } from '@/types/index';\nimport { z } from 'zod';\n\ninterface CacheEntry {\n block: WebBotAuthBlock;\n expiresAt: number;\n}\n\nconst EXPIRY_BUFFER_MS = 30_000;\n\nconst webBotAuthBlockSchema = z.looseObject({\n signature: z.string(),\n signature_input: z.string(),\n signature_agent: z.string(),\n authority: z.string(),\n expires_at: z.string(),\n});\nconst webBotAuthResponseSchema = z.looseObject({\n web_bot_auth: webBotAuthBlockSchema,\n});\n\nexport class WebBotAuthResource\n extends BaseResource\n implements IWebBotAuthResource\n{\n private readonly cache = new Map<string, CacheEntry>();\n\n constructor(options: LinkOptions) {\n super(options, '/web_bot_auth/sign');\n }\n\n async signUrl(url: string): Promise<WebBotAuthBlock> {\n let authority: string;\n try {\n authority = new URL(url).hostname;\n } catch (error) {\n throw new LinkSdkError(`Invalid URL: ${url}`, { cause: error });\n }\n\n const cached = this.cache.get(authority);\n if (cached && Date.now() < cached.expiresAt - EXPIRY_BUFFER_MS) {\n return cached.block;\n }\n\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: this.endpoint,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ url }),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('get web bot auth headers', status, data, rawBody);\n }\n\n const webBotAuth = this.parseResponse(\n 'get web bot auth headers',\n status,\n () => webBotAuthResponseSchema.parse(data).web_bot_auth,\n );\n const expiresAt = Date.parse(webBotAuth.expires_at);\n if (Number.isNaN(expiresAt)) {\n throw new LinkSdkError(\n `Credentials response has invalid expires_at: ${webBotAuth.expires_at}`,\n );\n }\n\n this.cache.set(authority, { block: webBotAuth, expiresAt });\n return webBotAuth;\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BalancesResource } from '@/resources/balances';\nimport type {\n IBalancesResource,\n IPaymentMethodsResource,\n IReportResource,\n IShippingAddressResource,\n ISourcesResource,\n ISpendRequestResource,\n ITransactionsResource,\n IUserInfoResource,\n IWebBotAuthResource,\n} from '@/resources/interfaces';\nimport { PaymentMethodsResource } from '@/resources/payment-methods';\nimport { ReportResource } from '@/resources/report';\nimport { ShippingAddressResource } from '@/resources/shipping-address';\nimport { SourcesResource } from '@/resources/sources';\nimport { SpendRequestResource } from '@/resources/spend-request';\nimport { TransactionsResource } from '@/resources/transactions';\nimport { UserInfoResource } from '@/resources/user-info';\nimport { WebBotAuthResource } from '@/resources/web-bot-auth';\n\nexport class Link {\n readonly spendRequests: ISpendRequestResource;\n readonly paymentMethods: IPaymentMethodsResource;\n readonly shippingAddresses: IShippingAddressResource;\n readonly userInfo: IUserInfoResource;\n readonly transactions: ITransactionsResource;\n readonly sources: ISourcesResource;\n readonly balances: IBalancesResource;\n readonly webBotAuth: IWebBotAuthResource;\n readonly reports: IReportResource;\n\n constructor(options: LinkOptions) {\n this.spendRequests = new SpendRequestResource(options);\n this.paymentMethods = new PaymentMethodsResource(options);\n this.shippingAddresses = new ShippingAddressResource(options);\n this.userInfo = new UserInfoResource(options);\n this.transactions = new TransactionsResource(options);\n this.sources = new SourcesResource(options);\n this.balances = new BalancesResource(options);\n this.webBotAuth = new WebBotAuthResource(options);\n this.reports = new ReportResource(options);\n }\n}\n\nexport default Link;\n","import type {\n ApprovalDetail,\n BalancesPage,\n CredentialType,\n LineItem,\n PaymentMethod,\n RequestApprovalResponse,\n ShippingAddressRecord,\n SourcesPage,\n SpendRequest,\n Total,\n TransactionOrigin,\n TransactionsPage,\n UserInfo,\n WebBotAuthBlock,\n} from '@/types/index';\n\nexport interface GetAccessTokenOptions {\n forceRefresh?: boolean;\n}\n\nexport type AccessTokenProvider = (\n options?: GetAccessTokenOptions,\n) => Promise<string> | string;\n\nexport interface CreateSpendRequestParams {\n payment_details?: string;\n credential_type?: CredentialType;\n network_id?: string;\n execution_method?: 'link_pay_token';\n merchant_account_id?: string;\n amount?: number;\n currency?: string;\n merchant_name?: string;\n merchant_url?: string;\n context: string;\n line_items?: LineItem[];\n totals?: Total[];\n request_approval?: boolean;\n test?: boolean;\n approval_details?: ApprovalDetail;\n metadata?: Record<string, string>;\n}\n\nexport interface UpdateSpendRequestParams {\n payment_details?: string;\n amount?: number;\n merchant_url?: string;\n profile_id?: string;\n merchant_id?: string;\n currency?: string;\n line_items?: LineItem[];\n totals?: Total[];\n}\n\nexport interface ISpendRequestResource {\n list(opts?: { includeHistory?: boolean }): Promise<SpendRequest[]>;\n create(params: CreateSpendRequestParams): Promise<SpendRequest>;\n update(id: string, params: UpdateSpendRequestParams): Promise<SpendRequest>;\n requestApproval(id: string): Promise<RequestApprovalResponse>;\n cancel(id: string): Promise<SpendRequest>;\n retrieve(\n id: string,\n opts?: { include?: string[] },\n ): Promise<SpendRequest | null>;\n}\n\nexport interface IPaymentMethodsResource {\n list(): Promise<PaymentMethod[]>;\n}\n\nexport interface IShippingAddressResource {\n list(): Promise<ShippingAddressRecord[]>;\n}\n\nexport interface IUserInfoResource {\n retrieve(): Promise<UserInfo>;\n}\n\nexport interface IWebBotAuthResource {\n signUrl(url: string): Promise<WebBotAuthBlock>;\n}\n\nexport interface ListTransactionsParams {\n limit?: number;\n starting_after?: string;\n ending_before?: string;\n start_date?: string;\n end_date?: string;\n category?: string;\n origin?: TransactionOrigin;\n sources?: string[];\n}\n\nexport interface ITransactionsResource {\n list(params?: ListTransactionsParams): Promise<TransactionsPage>;\n}\n\nexport interface ListSourcesParams {\n limit?: number;\n starting_after?: string;\n ending_before?: string;\n}\n\nexport interface ISourcesResource {\n list(params?: ListSourcesParams): Promise<SourcesPage>;\n}\n\nexport interface ListBalancesParams {\n sources?: string[];\n limit?: number;\n starting_after?: string;\n ending_before?: string;\n}\n\nexport interface IBalancesResource {\n list(params?: ListBalancesParams): Promise<BalancesPage>;\n}\n\nexport const REPORT_OUTCOMES = ['success', 'blocked', 'abandoned'] as const;\nexport type ReportOutcome = (typeof REPORT_OUTCOMES)[number];\n\nexport const REPORT_TAGS = [\n 'stripe_checkout',\n 'captcha',\n 'anti_bot_script',\n 'cdn_block',\n 'waf_block',\n 'dns_block',\n 'rate_limited',\n 'login_required',\n '3ds_challenge',\n 'page_inaccessible',\n 'timeout',\n 'site_error',\n 'payment_declined',\n 'other',\n] as const;\nexport type ReportTag = (typeof REPORT_TAGS)[number];\n\nexport interface CreateReportParams {\n domain: string;\n outcome: ReportOutcome;\n spend_request_id: string;\n tags?: ReportTag[];\n step?: string;\n freeform_context?: string;\n}\n\nexport interface ReportRecord {\n object: string;\n created_at: string;\n domain: string;\n outcome: string;\n spend_request_id: string;\n status: string;\n}\n\nexport interface IReportResource {\n create(params: CreateReportParams): Promise<ReportRecord>;\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z"]}
|