@codedartdev/coinsentry-sdk 0.1.0 → 0.1.1
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/README.md +98 -1
- package/dist/brand/config.d.ts +35 -1
- package/dist/brand/config.d.ts.map +1 -1
- package/dist/brand/config.js +119 -15
- package/dist/brand/config.js.map +1 -1
- package/dist/brand/index.d.ts +2 -2
- package/dist/brand/index.d.ts.map +1 -1
- package/dist/brand/index.js +1 -1
- package/dist/brand/index.js.map +1 -1
- package/dist/brand/types.d.ts +31 -1
- package/dist/brand/types.d.ts.map +1 -1
- package/dist/brand/types.js.map +1 -1
- package/dist/client.d.ts +10 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +49 -6
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts +1 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +7 -0
- package/dist/errors.js.map +1 -1
- package/dist/http.d.ts +1 -1
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +38 -5
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/market.d.ts +97 -0
- package/dist/market.d.ts.map +1 -0
- package/dist/market.js +264 -0
- package/dist/market.js.map +1 -0
- package/dist/products.d.ts +16 -2
- package/dist/products.d.ts.map +1 -1
- package/dist/products.js +70 -6
- package/dist/products.js.map +1 -1
- package/dist/realtime.d.ts +2 -0
- package/dist/realtime.d.ts.map +1 -1
- package/dist/realtime.js +3 -0
- package/dist/realtime.js.map +1 -1
- package/dist/types.d.ts +12 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +6 -1
package/dist/brand/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/brand/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface SecurityTxtConfig {\n contact?: string | string[];\n contacts?: string[];\n canonical?: string;\n expires?: string;\n policy?: string;\n preferredLanguages?: string | string[];\n}\n\nexport type BrandLogoType = 'text' | 'image';\nexport type BackendBrandLogoType = BrandLogoType | 'url' | 'upload';\n\n/** Shape of the canonical payload returned by GET /api/brand/theme. */\nexport interface BrandConfig {\n brand: {\n name: string;\n logo: {\n /** Backend may still send url/upload; the frontend normalizes those to image. */\n type: BackendBrandLogoType;\n text: {\n base: string;\n accent: string;\n fontFamily?: string | null;\n colors?: {\n light?: {\n base?: string | null;\n accent?: string | null;\n };\n dark?: {\n base?: string | null;\n accent?: string | null;\n };\n };\n };\n imageUrl: string | null;\n darkImageUrl?: string | null;\n layout?: {\n width?: string | number | null;\n height?: string | number | null;\n } | null;\n };\n tagline: string;\n description: string;\n };\r\n /** Browser title and meta-description per locale.\r\n * Keys are BCP-47 locale strings matching the locales array in i18n/config.ts */\r\n seo: {\r\n title: Record<string, string>;\r\n description: Record<string, string>;\r\n };\r\n favicon: {\n default: string | null;\n dark?: string | null;\n };\n /** Default application locale (BCP-47). Must be one of the values in i18n/config.ts */\n defaultLocale: string;\n availableLocales?: string[];\n theme: {\
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/brand/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface SecurityTxtConfig {\n contact?: string | string[];\n contacts?: string[];\n canonical?: string;\n expires?: string;\n policy?: string;\n preferredLanguages?: string | string[];\n}\n\nexport type BrandLogoType = 'text' | 'image';\nexport type BackendBrandLogoType = BrandLogoType | 'url' | 'upload';\nexport type BrandThemeMode = 'light' | 'dark' | 'system';\nexport type BrandTypographyToken =\n | 'display'\n | 'title'\n | 'subtitle'\n | 'body'\n | 'label'\n | 'caption'\n | 'button'\n | 'code'\n | 'overline';\n\nexport type BrandTypography = Partial<Record<BrandTypographyToken, string>>;\n\n/** Shape of the canonical payload returned by GET /api/brand/theme. */\nexport interface BrandConfig {\n brand: {\n name: string;\n logo: {\n /** Backend may still send url/upload; the frontend normalizes those to image. */\n type: BackendBrandLogoType;\n text: {\n base: string;\n accent: string;\n fontFamily?: string | null;\n colors?: {\n light?: {\n base?: string | null;\n accent?: string | null;\n };\n dark?: {\n base?: string | null;\n accent?: string | null;\n };\n };\n };\n imageUrl: string | null;\n darkImageUrl?: string | null;\n layout?: {\n width?: string | number | null;\n height?: string | number | null;\n } | null;\n };\n tagline: string;\n description: string;\n };\r\n /** Browser title and meta-description per locale.\r\n * Keys are BCP-47 locale strings matching the locales array in i18n/config.ts */\r\n seo: {\r\n title: Record<string, string>;\r\n description: Record<string, string>;\r\n };\r\n favicon: {\n default: string | null;\n dark?: string | null;\n };\n /** Default application locale (BCP-47). Must be one of the values in i18n/config.ts */\n defaultLocale: string;\n availableLocales?: string[];\n theme: {\n defaultMode: BrandThemeMode;\n font: {\n sans: string;\n baseSize?: string | null;\n };\n typography?: BrandTypography | null;\n radius: string;\n colors: {\n light: ColorSet;\n dark: ColorSet;\r\n };\r\n };\r\n /** Left branding panel used in login / register split-screen layout */\r\n authPanel: {\r\n /** Main panel background colour (hex). A darker gradient is derived from it. */\r\n background: string;\r\n /** Radial glow accent colour (hex). Applied at low opacity as a centre highlight. */\r\n accentGlow: string;\r\n };\r\n /** Feature flags — all optional; defaults to disabled when absent */\r\n features?: {\n /** Show CPF field in the registration form (Brasil-specific). Default: false */\n registerCpf?: boolean;\n };\n registration_document?: {\n collect_tax_id?: boolean;\n field?: string;\n required?: boolean;\n read_only_after_registration?: boolean;\n };\n client_flow?: Array<{\n screen?: string;\n collect_tax_id?: boolean;\n [key: string]: unknown;\n }>;\n compliance_config?: {\n client_flow?: Array<{\n screen?: string;\n collect_tax_id?: boolean;\n [key: string]: unknown;\n }>;\n [key: string]: unknown;\n };\n flow_config?: {\n compliance_config?: {\n client_flow?: Array<{\n screen?: string;\n collect_tax_id?: boolean;\n [key: string]: unknown;\n }>;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n };\n securityTxt?: SecurityTxtConfig;\n security_txt?: SecurityTxtConfig;\n}\n\r\nexport interface ColorSet {\n primary: string;\n primaryForeground: string;\n background: string;\n foreground: string;\n secondary?: string;\n secondaryForeground?: string;\n warning?: string;\n warningForeground?: string;\n danger?: string;\n dangerForeground?: string;\n success?: string;\n successForeground?: string;\n rising?: string;\n risingForeground?: string;\n downing?: string;\n downingForeground?: string;\n card?: string;\n cardForeground?: string;\n muted?: string;\n mutedForeground?: string;\n border?: string;\n input?: string;\n ring?: string;\n textTitle?: string;\n textSubtitle?: string;\n textPrimary?: string;\n textSecondary?: string;\n textLink?: string;\n textButton?: string;\n}\n\r\n/** Utility: deep-partial for update patches */\r\nexport type DeepPartial<T> = {\r\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\r\n};\r\n"]}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type CoinSentryError } from './errors.js';
|
|
2
2
|
import { type CoinSentryHttpAdapter, type CoinSentryHttpRequest } from './http.js';
|
|
3
3
|
import { type CoinSentryPasswordResetPayload, type CoinSentryResetPasswordPayload } from './products.js';
|
|
4
|
-
import type {
|
|
4
|
+
import type { CoinSentryBrandConfigOptions, CoinSentryBrandConfigResponse, CoinSentryEntity, CoinSentryLoginResponse, CoinSentryRegisterPayload, CoinSentrySelectEntityResponse, CoinSentrySession } from './types.js';
|
|
5
5
|
import type { ClientFlowStep, KycFlowScreen, KycOverviewData, KycVerificationData } from './kyc/index.js';
|
|
6
6
|
export type CoinSentryClientOptions = {
|
|
7
7
|
baseUrl?: string;
|
|
@@ -102,9 +102,15 @@ export declare function createCoinSentryClient(options?: CoinSentryClientOptions
|
|
|
102
102
|
getRankingsByActiveReferrals: <T = unknown>(options?: import("./products.js").CoinSentryRequestOptions) => Promise<T>;
|
|
103
103
|
};
|
|
104
104
|
market: {
|
|
105
|
+
listMarkets: (options?: import("./products.js").CoinSentryRequestOptions) => Promise<import("./market.js").CoinSentryMarketListItem[]>;
|
|
106
|
+
getTicker: (symbol: string, options?: import("./products.js").CoinSentryRequestOptions) => Promise<import("./market.js").CoinSentryMarketTicker>;
|
|
105
107
|
getOrderbook: <T = unknown>(symbol: string, depth?: number, options?: import("./products.js").CoinSentryRequestOptions) => Promise<T>;
|
|
106
|
-
|
|
107
|
-
|
|
108
|
+
getOrderbookSnapshot: (symbol: string, depth?: number, options?: import("./products.js").CoinSentryRequestOptions) => Promise<import("./market.js").CoinSentryOrderbookSnapshot>;
|
|
109
|
+
getMarketDetails: <T = import("./market.js").CoinSentryMarketDetails>(symbol: string, options?: import("./products.js").CoinSentryRequestOptions) => Promise<T>;
|
|
110
|
+
getMarket: <T = import("./market.js").CoinSentryMarketDetails>(symbol: string, options?: import("./products.js").CoinSentryRequestOptions) => Promise<T>;
|
|
111
|
+
getTrades: (symbol: string, options?: import("./products.js").CoinSentryMarketTradesOptions) => Promise<import("./market.js").CoinSentryPublicTrade[]>;
|
|
112
|
+
getCandles: (symbol: string, options: import("./products.js").CoinSentryMarketCandlesOptions) => Promise<import("./market.js").CoinSentryMarketCandle[]>;
|
|
113
|
+
createOrder: <T = unknown>(payload: import("./market.js").CoinSentryCreateOrderPayload) => Promise<T>;
|
|
108
114
|
cancelOrder: (orderId: number) => Promise<unknown>;
|
|
109
115
|
cancelAllOrders: (symbol: string) => Promise<unknown>;
|
|
110
116
|
};
|
|
@@ -163,7 +169,7 @@ export declare function createCoinSentryClient(options?: CoinSentryClientOptions
|
|
|
163
169
|
upload(input: CoinSentryKycUploadPayload): Promise<unknown>;
|
|
164
170
|
};
|
|
165
171
|
brand: {
|
|
166
|
-
getConfig(): Promise<
|
|
172
|
+
getConfig(input?: CoinSentryBrandConfigOptions): Promise<CoinSentryBrandConfigResponse>;
|
|
167
173
|
};
|
|
168
174
|
};
|
|
169
175
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { CoinSentryApiError, normalizeCoinSentryError } from './errors.js';
|
|
1
|
+
import { CoinSentryApiError, coinSentryErrorFromResponse, isCoinSentryAbortError, normalizeCoinSentryError, } from './errors.js';
|
|
2
|
+
import { normalizeBrandConfig } from './brand/index.js';
|
|
2
3
|
import { normalizeCoinSentryLoginResponse } from './guards.js';
|
|
3
4
|
import { FetchHttpAdapter } from './http.js';
|
|
4
5
|
import { createCoinSentryProductServices, } from './products.js';
|
|
@@ -47,6 +48,18 @@ function unwrapEnvelopeData(payload) {
|
|
|
47
48
|
}
|
|
48
49
|
return payload;
|
|
49
50
|
}
|
|
51
|
+
function unwrapBrandConfig(payload) {
|
|
52
|
+
if (payload && typeof payload === 'object' && 'data' in payload) {
|
|
53
|
+
const data = payload.data;
|
|
54
|
+
return {
|
|
55
|
+
config: data?.payload ? normalizeBrandConfig(data.payload) : undefined,
|
|
56
|
+
brandKey: data?.brand_key,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return payload
|
|
60
|
+
? { config: normalizeBrandConfig(payload) }
|
|
61
|
+
: {};
|
|
62
|
+
}
|
|
50
63
|
export function createCoinSentryClient(options = {}) {
|
|
51
64
|
const http = options.http ?? new FetchHttpAdapter({
|
|
52
65
|
baseUrl: options.baseUrl ?? '/',
|
|
@@ -60,6 +73,8 @@ export function createCoinSentryClient(options = {}) {
|
|
|
60
73
|
return await http.request(input);
|
|
61
74
|
}
|
|
62
75
|
catch (error) {
|
|
76
|
+
if (isCoinSentryAbortError(error))
|
|
77
|
+
throw error;
|
|
63
78
|
const normalized = normalizeCoinSentryError(error);
|
|
64
79
|
options.onError?.(normalized.toJSON());
|
|
65
80
|
throw normalized;
|
|
@@ -221,16 +236,44 @@ export function createCoinSentryClient(options = {}) {
|
|
|
221
236
|
},
|
|
222
237
|
},
|
|
223
238
|
brand: {
|
|
224
|
-
async getConfig() {
|
|
239
|
+
async getConfig(input = {}) {
|
|
240
|
+
const headers = {};
|
|
241
|
+
if (input.etag)
|
|
242
|
+
headers['If-None-Match'] = input.etag;
|
|
225
243
|
const response = await request({
|
|
226
244
|
method: 'GET',
|
|
227
245
|
path: '/api/brand/theme',
|
|
246
|
+
query: input.brandKey ? { brand_key: input.brandKey } : undefined,
|
|
247
|
+
headers,
|
|
248
|
+
signal: input.signal,
|
|
249
|
+
responseType: 'response',
|
|
228
250
|
});
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
return
|
|
251
|
+
const etag = response.headers.get('etag') ?? undefined;
|
|
252
|
+
if (response.status === 304) {
|
|
253
|
+
return {
|
|
254
|
+
brandKey: input.brandKey,
|
|
255
|
+
etag: etag ?? input.etag,
|
|
256
|
+
notModified: true,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
const body = await response.json().catch(() => null);
|
|
260
|
+
if (!response.ok) {
|
|
261
|
+
const error = coinSentryErrorFromResponse({
|
|
262
|
+
status: response.status,
|
|
263
|
+
statusText: response.statusText,
|
|
264
|
+
body,
|
|
265
|
+
requestId: response.headers.get('x-request-id'),
|
|
266
|
+
});
|
|
267
|
+
options.onError?.(error.toJSON());
|
|
268
|
+
throw error;
|
|
232
269
|
}
|
|
233
|
-
|
|
270
|
+
const { config, brandKey } = unwrapBrandConfig(body);
|
|
271
|
+
return {
|
|
272
|
+
config,
|
|
273
|
+
brandKey: brandKey ?? input.brandKey,
|
|
274
|
+
etag,
|
|
275
|
+
notModified: false,
|
|
276
|
+
};
|
|
234
277
|
},
|
|
235
278
|
},
|
|
236
279
|
...productServices,
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAwB,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAA0D,MAAM,WAAW,CAAC;AACrG,OAAO,EACL,+BAA+B,GAGhC,MAAM,eAAe,CAAC;AA4DvB,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAEtC,MAAM,kBAAkB,GAA2C;IACjE,OAAO,EAAE,mBAAmB;IAC5B,KAAK,EAAE,mBAAmB;IAC1B,KAAK,EAAE,mBAAmB;IAC1B,aAAa,EAAE,qBAAqB;IACpC,WAAW,EAAE,qBAAqB;IAClC,YAAY,EAAE,0BAA0B;IACxC,iBAAiB,EAAE,+BAA+B;IAClD,mBAAmB,EAAE,iCAAiC;IACtD,OAAO,EAAE,qBAAqB;IAC9B,eAAe,EAAE,4BAA4B;IAC7C,MAAM,EAAE,oBAAoB;IAC5B,MAAM,EAAE,oBAAoB;CAC7B,CAAC;AAEF,SAAS,mBAAmB,CAAC,OAAe;IAC1C,OAAO,IAAI,kBAAkB,CAAC;QAC5B,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,CAAC;QACT,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACzC,MAAM,mBAAmB,CAAC,2CAA2C,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAG3B;IACC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;IAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE3F,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,mBAAmB,CAAC,2BAA2B,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,kBAAkB,CAAI,OAA4C;IACzE,IACE,OAAO;WACJ,OAAO,OAAO,KAAK,QAAQ;WAC3B,MAAM,IAAI,OAAO;WAChB,OAA8B,CAAC,IAAI,KAAK,SAAS,EACrD,CAAC;QACD,OAAQ,OAAuB,CAAC,IAAI,CAAC;IACvC,CAAC;IAED,OAAO,OAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAmC,EAAE;IAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,gBAAgB,CAAC;QAChD,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,GAAG;QAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IACH,IAAI,eAAe,GAAyB,IAAI,CAAC;IACjD,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,KAAK,UAAU,OAAO,CAAI,KAA4B;QACpD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAI,KAAK,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;YACnD,OAAO,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACvC,MAAM,UAAU,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,UAAU,QAAQ,CAAC,cAAyC,EAAE;QACjE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,IAAI,qBAAqB,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,IAAI,eAAe;YAAE,OAAO,eAAe,CAAC;QAC5C,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,iBAAiB,GAAG,CAAC,IAAI,GAAG,GAAG,iBAAiB,GAAG,OAAO,EAAE,CAAC;YACrF,OAAO;QACT,CAAC;QAED,eAAe,GAAG,OAAO,CAAO;YAC9B,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,sBAAsB;YAC5B,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACX,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACd,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,SAAS,SAAS,CAAC,MAAiC;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,SAAS,YAAY,CAAC,MAAiC;QACrD,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,SAAS,cAAc;QACrB,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,eAAe,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAC;IAEjE,OAAO;QACL,OAAO;QACP,MAAM,EAAE;YACN,GAAG,EAAE,SAAS;YACd,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,cAAc;SACzB;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;SACf;QACD,IAAI,EAAE;YACJ,KAAK,CAAC,KAAK,CAAC,OAA+B;gBACzC,MAAM,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAA0B;oBACtD,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,aAAa;oBACnB,WAAW,EAAE,KAAK;oBAClB,IAAI,EAAE;wBACJ,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,mBAAmB,EAAE,OAAO,CAAC,iBAAiB;wBAC9C,sBAAsB,EAAE,GAAG;qBAC5B;iBACF,CAAC,CAAC;gBACH,OAAO,gCAAgC,CAAC,QAAQ,CAAC,CAAC;YACpD,CAAC;YACD,KAAK,CAAC,QAAQ,CAAC,OAAkC;gBAC/C,MAAM,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChC,OAAO,OAAO,CAAU;oBACtB,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,gBAAgB;oBACtB,WAAW,EAAE,KAAK;oBAClB,IAAI,EAAE,OAAO;iBACd,CAAC,CAAC;YACL,CAAC;YACD,KAAK,CAAC,oBAAoB,CAAC,OAAuC;gBAChE,MAAM,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChC,OAAO,OAAO,CAAU;oBACtB,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,uBAAuB;oBAC7B,WAAW,EAAE,KAAK;oBAClB,IAAI,EAAE;wBACJ,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,mBAAmB,EAAE,OAAO,CAAC,iBAAiB;wBAC9C,sBAAsB,EAAE,GAAG;qBAC5B;iBACF,CAAC,CAAC;YACL,CAAC;YACD,KAAK,CAAC,aAAa,CAAC,OAAuC;gBACzD,MAAM,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChC,OAAO,OAAO,CAAU;oBACtB,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,sBAAsB;oBAC5B,WAAW,EAAE,KAAK;oBAClB,IAAI,EAAE,OAAO;iBACd,CAAC,CAAC;YACL,CAAC;YACD,KAAK,CAAC,MAAM;gBACV,OAAO,OAAO,CAAU,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,KAAK,CAAC,kBAAkB,CAAC,OAAmC;gBAC1D,MAAM,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAA0B;oBACtD,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,4BAA4B;oBAClC,WAAW,EAAE,KAAK;oBAClB,IAAI,EAAE,OAAO,CAAC,QAAQ;wBACpB,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE;wBACjC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;iBAC3B,CAAC,CAAC;gBACH,OAAO,gCAAgC,CAAC,QAAQ,CAAC,CAAC;YACpD,CAAC;SACF;QACD,OAAO,EAAE;YACP,KAAK,CAAC,OAAO;gBACX,OAAO,OAAO,CAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;YAC1E,CAAC;SACF;QACD,MAAM,EAAE;YACN,KAAK,CAAC,IAAI;gBACR,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAqD;oBACjF,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,kBAAkB;iBACzB,CAAC,CAAC;gBACH,OAAO,kBAAkB,CAAqB,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChE,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,OAAsC;gBACjD,OAAO,OAAO,CAAiC;oBAC7C,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,uBAAuB;oBAC7B,IAAI,EAAE,YAAY,IAAI,OAAO;wBAC3B,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE;wBACrC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;SACF;QACD,GAAG,EAAE;YACH,KAAK,CAAC,WAAW;gBACf,MAAM,QAAQ,GAAG,MAAM,OAAO,CAA+C;oBAC3E,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,aAAa;iBACpB,CAAC,CAAC;gBACH,OAAO,kBAAkB,CAAkB,QAAQ,CAAC,CAAC;YACvD,CAAC;YACD,KAAK,CAAC,SAAS;gBACb,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAuD;oBACnF,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,oBAAoB;iBAC3B,CAAC,CAAC;gBACH,OAAO,kBAAkB,CAAsB,QAAQ,CAAC,CAAC;YAC3D,CAAC;YACD,KAAK,CAAC,UAAU,CAAC,KAAiC;gBAChD,OAAO,OAAO,CAAU;oBACtB,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC;oBAC/B,IAAI,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;iBAC1B,CAAC,CAAC;YACL,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,KAAiC;gBAC5C,OAAO,OAAO,CAAU;oBACtB,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC;oBAC/B,IAAI,EAAE,KAAK,CAAC,QAAQ;iBACrB,CAAC,CAAC;YACL,CAAC;SACF;QACD,KAAK,EAAE;YACL,KAAK,CAAC,SAAS;gBACb,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAyE;oBACrG,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,kBAAkB;iBACzB,CAAC,CAAC;gBAEH,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;oBACnE,MAAM,IAAI,GAAI,QAA2D,CAAC,IAAI,CAAC;oBAC/E,OAAO,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;gBAC7B,CAAC;gBAED,OAAO,QAAiC,CAAC;YAC3C,CAAC;SACF;QACD,GAAG,eAAe;KACnB,CAAC;AACJ,CAAC","sourcesContent":["import { CoinSentryApiError, normalizeCoinSentryError, type CoinSentryError } from './errors.js';\nimport { normalizeCoinSentryLoginResponse } from './guards.js';\nimport { FetchHttpAdapter, type CoinSentryHttpAdapter, type CoinSentryHttpRequest } from './http.js';\nimport {\n createCoinSentryProductServices,\n type CoinSentryPasswordResetPayload,\n type CoinSentryResetPasswordPayload,\n} from './products.js';\nimport type {\n CoinSentryBrandConfig,\n CoinSentryEntity,\n CoinSentryLoginResponse,\n CoinSentryRegisterPayload,\n CoinSentrySelectEntityResponse,\n CoinSentrySession,\n} from './types.js';\nimport type { ClientFlowStep, KycFlowScreen, KycOverviewData, KycVerificationData } from './kyc/index.js';\n\nexport type CoinSentryClientOptions = {\n baseUrl?: string;\n locale?: string;\n timeoutMs?: number;\n http?: CoinSentryHttpAdapter;\n onError?: (error: CoinSentryError) => void;\n};\n\nexport type CoinSentryCsrfInitOptions = {\n force?: boolean;\n staleMs?: number;\n};\n\nexport type CoinSentryLoginPayload = {\n email: string;\n password: string;\n slideCaptchaToken: string;\n};\n\nexport type CoinSentryTwoFactorPayload = {\n code: string;\n recovery?: boolean;\n};\n\nexport type {\n CoinSentryPasswordResetPayload,\n CoinSentryResetPasswordPayload,\n} from './products.js';\n\nexport type CoinSentryEntitySelectPayload =\n | { entityUuid: string; entityId?: never }\n | { entityId: number; entityUuid?: never };\n\nexport type CoinSentryKycSubmitPayload = {\n step?: ClientFlowStep | null;\n stepKey?: string;\n screen?: KycFlowScreen;\n payload?: unknown;\n};\n\nexport type CoinSentryKycUploadPayload = {\n step?: ClientFlowStep | null;\n stepKey?: string;\n screen?: KycFlowScreen;\n formData: FormData;\n};\n\nexport type CoinSentryClient = ReturnType<typeof createCoinSentryClient>;\n\nconst DEFAULT_CSRF_STALE_MS = 120_000;\n\nconst KYC_STEP_ENDPOINTS: Partial<Record<KycFlowScreen, string>> = {\n account: '/api/v1/kyc/email',\n email: '/api/v1/kyc/email',\n phone: '/api/v1/kyc/phone',\n personal_data: '/api/v1/kyc/profile',\n tax_profile: '/api/v1/kyc/profile',\n company_data: '/api/v1/kyc/company-data',\n beneficial_owners: '/api/v1/kyc/beneficial-owners',\n transaction_profile: '/api/v1/kyc/transaction-profile',\n address: '/api/v1/kyc/address',\n document_upload: '/api/v1/kyc/document-photo',\n selfie: '/api/v1/kyc/selfie',\n review: '/api/v1/kyc/submit',\n};\n\nfunction createContractError(message: string): CoinSentryApiError {\n return new CoinSentryApiError({\n code: 'validation_failed',\n status: 0,\n message,\n });\n}\n\nfunction assertKycEndpoint(endpoint: string): string {\n if (!endpoint.startsWith('/api/v1/kyc/')) {\n throw createContractError('KYC endpoint must stay inside /api/v1/kyc');\n }\n\n return endpoint;\n}\n\nfunction resolveKycEndpoint(input: {\n step?: ClientFlowStep | null;\n screen?: KycFlowScreen;\n}): string {\n const screen = input.screen ?? input.step?.screen;\n const endpoint = input.step?.endpoint ?? (screen ? KYC_STEP_ENDPOINTS[screen] : undefined);\n\n if (!endpoint) {\n throw createContractError(`Unsupported KYC screen: ${screen ?? 'unknown'}`);\n }\n\n return assertKycEndpoint(endpoint);\n}\n\nfunction unwrapEnvelopeData<T>(payload: T | { data?: T; success?: boolean }): T {\n if (\n payload\n && typeof payload === 'object'\n && 'data' in payload\n && (payload as { data?: unknown }).data !== undefined\n ) {\n return (payload as { data: T }).data;\n }\n\n return payload as T;\n}\n\nexport function createCoinSentryClient(options: CoinSentryClientOptions = {}) {\n const http = options.http ?? new FetchHttpAdapter({\n baseUrl: options.baseUrl ?? '/',\n locale: options.locale,\n timeoutMs: options.timeoutMs,\n });\n let csrfInitPromise: Promise<void> | null = null;\n let csrfInitializedAt = 0;\n\n async function request<T>(input: CoinSentryHttpRequest): Promise<T> {\n try {\n return await http.request<T>(input);\n } catch (error) {\n const normalized = normalizeCoinSentryError(error);\n options.onError?.(normalized.toJSON());\n throw normalized;\n }\n }\n\n async function initCsrf(initOptions: CoinSentryCsrfInitOptions = {}): Promise<void> {\n const staleMs = initOptions.staleMs ?? DEFAULT_CSRF_STALE_MS;\n const now = Date.now();\n\n if (csrfInitPromise) return csrfInitPromise;\n if (!initOptions.force && csrfInitializedAt > 0 && now - csrfInitializedAt < staleMs) {\n return;\n }\n\n csrfInitPromise = request<void>({\n method: 'GET',\n path: '/sanctum/csrf-cookie',\n retryOnCsrf: false,\n }).then(() => {\n csrfInitializedAt = Date.now();\n }).finally(() => {\n csrfInitPromise = null;\n });\n\n return csrfInitPromise;\n }\n\n function setLocale(locale: string | null | undefined): void {\n http.setLocale?.(locale);\n }\n\n function setKycLocale(locale: string | null | undefined): void {\n http.setKycLocale?.(locale);\n }\n\n function clearKycLocale(): void {\n http.clearKycLocale?.();\n }\n\n const productServices = createCoinSentryProductServices(request);\n\n return {\n request,\n locale: {\n set: setLocale,\n setKyc: setKycLocale,\n clearKyc: clearKycLocale,\n },\n csrf: {\n init: initCsrf,\n },\n auth: {\n async login(payload: CoinSentryLoginPayload): Promise<CoinSentryLoginResponse> {\n await initCsrf({ force: true });\n const response = await request<CoinSentryLoginResponse>({\n method: 'POST',\n path: '/auth/login',\n retryOnCsrf: false,\n body: {\n email: payload.email,\n password: payload.password,\n slide_captcha_token: payload.slideCaptchaToken,\n slide_captcha_verified: '1',\n },\n });\n return normalizeCoinSentryLoginResponse(response);\n },\n async register(payload: CoinSentryRegisterPayload): Promise<unknown> {\n await initCsrf({ force: true });\n return request<unknown>({\n method: 'POST',\n path: '/auth/register',\n retryOnCsrf: false,\n body: payload,\n });\n },\n async requestPasswordReset(payload: CoinSentryPasswordResetPayload): Promise<unknown> {\n await initCsrf({ force: true });\n return request<unknown>({\n method: 'POST',\n path: '/auth/forgot-password',\n retryOnCsrf: false,\n body: {\n email: payload.email,\n slide_captcha_token: payload.slideCaptchaToken,\n slide_captcha_verified: '1',\n },\n });\n },\n async resetPassword(payload: CoinSentryResetPasswordPayload): Promise<unknown> {\n await initCsrf({ force: true });\n return request<unknown>({\n method: 'POST',\n path: '/auth/reset-password',\n retryOnCsrf: false,\n body: payload,\n });\n },\n async logout(): Promise<unknown> {\n return request<unknown>({ method: 'POST', path: '/auth/logout' });\n },\n async twoFactorChallenge(payload: CoinSentryTwoFactorPayload): Promise<CoinSentryLoginResponse> {\n await initCsrf({ force: true });\n const response = await request<CoinSentryLoginResponse>({\n method: 'POST',\n path: '/auth/two-factor-challenge',\n retryOnCsrf: false,\n body: payload.recovery\n ? { recovery_code: payload.code }\n : { code: payload.code },\n });\n return normalizeCoinSentryLoginResponse(response);\n },\n },\n session: {\n async refresh(): Promise<CoinSentrySession> {\n return request<CoinSentrySession>({ method: 'GET', path: '/api/user' });\n },\n },\n entity: {\n async list(): Promise<CoinSentryEntity[]> {\n const response = await request<CoinSentryEntity[] | { data?: CoinSentryEntity[] }>({\n method: 'GET',\n path: '/api/v1/entities',\n });\n return unwrapEnvelopeData<CoinSentryEntity[]>(response) ?? [];\n },\n async select(payload: CoinSentryEntitySelectPayload): Promise<CoinSentrySelectEntityResponse> {\n return request<CoinSentrySelectEntityResponse>({\n method: 'POST',\n path: '/api/v1/select-entity',\n body: 'entityUuid' in payload\n ? { entity_uuid: payload.entityUuid }\n : { entity_id: payload.entityId },\n });\n },\n },\n kyc: {\n async getOverview(): Promise<KycOverviewData> {\n const response = await request<KycOverviewData | { data?: KycOverviewData }>({\n method: 'GET',\n path: '/api/v1/kyc',\n });\n return unwrapEnvelopeData<KycOverviewData>(response);\n },\n async getStatus(): Promise<KycVerificationData> {\n const response = await request<KycVerificationData | { data?: KycVerificationData }>({\n method: 'GET',\n path: '/api/v1/kyc/status',\n });\n return unwrapEnvelopeData<KycVerificationData>(response);\n },\n async submitStep(input: CoinSentryKycSubmitPayload): Promise<unknown> {\n return request<unknown>({\n method: 'POST',\n path: resolveKycEndpoint(input),\n body: input.payload ?? {},\n });\n },\n async upload(input: CoinSentryKycUploadPayload): Promise<unknown> {\n return request<unknown>({\n method: 'POST',\n path: resolveKycEndpoint(input),\n body: input.formData,\n });\n },\n },\n brand: {\n async getConfig(): Promise<CoinSentryBrandConfig> {\n const response = await request<CoinSentryBrandConfig | { data?: { payload?: CoinSentryBrandConfig } }>({\n method: 'GET',\n path: '/api/brand/theme',\n });\n\n if (response && typeof response === 'object' && 'data' in response) {\n const data = (response as { data?: { payload?: CoinSentryBrandConfig } }).data;\n return data?.payload ?? {};\n }\n\n return response as CoinSentryBrandConfig;\n },\n },\n ...productServices,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CoinSentryApiError,\n coinSentryErrorFromResponse,\n isCoinSentryAbortError,\n normalizeCoinSentryError,\n type CoinSentryError,\n} from './errors.js';\nimport { normalizeBrandConfig, type BrandConfig } from './brand/index.js';\nimport { normalizeCoinSentryLoginResponse } from './guards.js';\nimport { FetchHttpAdapter, type CoinSentryHttpAdapter, type CoinSentryHttpRequest } from './http.js';\nimport {\n createCoinSentryProductServices,\n type CoinSentryPasswordResetPayload,\n type CoinSentryResetPasswordPayload,\n} from './products.js';\nimport type {\n CoinSentryBrandConfig,\n CoinSentryBrandConfigOptions,\n CoinSentryBrandConfigResponse,\n CoinSentryEntity,\n CoinSentryLoginResponse,\n CoinSentryRegisterPayload,\n CoinSentrySelectEntityResponse,\n CoinSentrySession,\n} from './types.js';\nimport type { ClientFlowStep, KycFlowScreen, KycOverviewData, KycVerificationData } from './kyc/index.js';\n\nexport type CoinSentryClientOptions = {\n baseUrl?: string;\n locale?: string;\n timeoutMs?: number;\n http?: CoinSentryHttpAdapter;\n onError?: (error: CoinSentryError) => void;\n};\n\nexport type CoinSentryCsrfInitOptions = {\n force?: boolean;\n staleMs?: number;\n};\n\nexport type CoinSentryLoginPayload = {\n email: string;\n password: string;\n slideCaptchaToken: string;\n};\n\nexport type CoinSentryTwoFactorPayload = {\n code: string;\n recovery?: boolean;\n};\n\nexport type {\n CoinSentryPasswordResetPayload,\n CoinSentryResetPasswordPayload,\n} from './products.js';\n\nexport type CoinSentryEntitySelectPayload =\n | { entityUuid: string; entityId?: never }\n | { entityId: number; entityUuid?: never };\n\nexport type CoinSentryKycSubmitPayload = {\n step?: ClientFlowStep | null;\n stepKey?: string;\n screen?: KycFlowScreen;\n payload?: unknown;\n};\n\nexport type CoinSentryKycUploadPayload = {\n step?: ClientFlowStep | null;\n stepKey?: string;\n screen?: KycFlowScreen;\n formData: FormData;\n};\n\nexport type CoinSentryClient = ReturnType<typeof createCoinSentryClient>;\n\nconst DEFAULT_CSRF_STALE_MS = 120_000;\n\nconst KYC_STEP_ENDPOINTS: Partial<Record<KycFlowScreen, string>> = {\n account: '/api/v1/kyc/email',\n email: '/api/v1/kyc/email',\n phone: '/api/v1/kyc/phone',\n personal_data: '/api/v1/kyc/profile',\n tax_profile: '/api/v1/kyc/profile',\n company_data: '/api/v1/kyc/company-data',\n beneficial_owners: '/api/v1/kyc/beneficial-owners',\n transaction_profile: '/api/v1/kyc/transaction-profile',\n address: '/api/v1/kyc/address',\n document_upload: '/api/v1/kyc/document-photo',\n selfie: '/api/v1/kyc/selfie',\n review: '/api/v1/kyc/submit',\n};\n\nfunction createContractError(message: string): CoinSentryApiError {\n return new CoinSentryApiError({\n code: 'validation_failed',\n status: 0,\n message,\n });\n}\n\nfunction assertKycEndpoint(endpoint: string): string {\n if (!endpoint.startsWith('/api/v1/kyc/')) {\n throw createContractError('KYC endpoint must stay inside /api/v1/kyc');\n }\n\n return endpoint;\n}\n\nfunction resolveKycEndpoint(input: {\n step?: ClientFlowStep | null;\n screen?: KycFlowScreen;\n}): string {\n const screen = input.screen ?? input.step?.screen;\n const endpoint = input.step?.endpoint ?? (screen ? KYC_STEP_ENDPOINTS[screen] : undefined);\n\n if (!endpoint) {\n throw createContractError(`Unsupported KYC screen: ${screen ?? 'unknown'}`);\n }\n\n return assertKycEndpoint(endpoint);\n}\n\nfunction unwrapEnvelopeData<T>(payload: T | { data?: T; success?: boolean }): T {\n if (\n payload\n && typeof payload === 'object'\n && 'data' in payload\n && (payload as { data?: unknown }).data !== undefined\n ) {\n return (payload as { data: T }).data;\n }\n\n return payload as T;\n}\n\ntype BrandingThemeEnvelope = {\n success?: boolean;\n data?: {\n brand_key?: string;\n payload?: BrandConfig;\n };\n};\n\nfunction unwrapBrandConfig(payload: unknown): { config?: CoinSentryBrandConfig; brandKey?: string } {\n if (payload && typeof payload === 'object' && 'data' in payload) {\n const data = (payload as BrandingThemeEnvelope).data;\n return {\n config: data?.payload ? normalizeBrandConfig(data.payload) : undefined,\n brandKey: data?.brand_key,\n };\n }\n\n return payload\n ? { config: normalizeBrandConfig(payload as BrandConfig) }\n : {};\n}\n\nexport function createCoinSentryClient(options: CoinSentryClientOptions = {}) {\n const http = options.http ?? new FetchHttpAdapter({\n baseUrl: options.baseUrl ?? '/',\n locale: options.locale,\n timeoutMs: options.timeoutMs,\n });\n let csrfInitPromise: Promise<void> | null = null;\n let csrfInitializedAt = 0;\n\n async function request<T>(input: CoinSentryHttpRequest): Promise<T> {\n try {\n return await http.request<T>(input);\n } catch (error) {\n if (isCoinSentryAbortError(error)) throw error;\n\n const normalized = normalizeCoinSentryError(error);\n options.onError?.(normalized.toJSON());\n throw normalized;\n }\n }\n\n async function initCsrf(initOptions: CoinSentryCsrfInitOptions = {}): Promise<void> {\n const staleMs = initOptions.staleMs ?? DEFAULT_CSRF_STALE_MS;\n const now = Date.now();\n\n if (csrfInitPromise) return csrfInitPromise;\n if (!initOptions.force && csrfInitializedAt > 0 && now - csrfInitializedAt < staleMs) {\n return;\n }\n\n csrfInitPromise = request<void>({\n method: 'GET',\n path: '/sanctum/csrf-cookie',\n retryOnCsrf: false,\n }).then(() => {\n csrfInitializedAt = Date.now();\n }).finally(() => {\n csrfInitPromise = null;\n });\n\n return csrfInitPromise;\n }\n\n function setLocale(locale: string | null | undefined): void {\n http.setLocale?.(locale);\n }\n\n function setKycLocale(locale: string | null | undefined): void {\n http.setKycLocale?.(locale);\n }\n\n function clearKycLocale(): void {\n http.clearKycLocale?.();\n }\n\n const productServices = createCoinSentryProductServices(request);\n\n return {\n request,\n locale: {\n set: setLocale,\n setKyc: setKycLocale,\n clearKyc: clearKycLocale,\n },\n csrf: {\n init: initCsrf,\n },\n auth: {\n async login(payload: CoinSentryLoginPayload): Promise<CoinSentryLoginResponse> {\n await initCsrf({ force: true });\n const response = await request<CoinSentryLoginResponse>({\n method: 'POST',\n path: '/auth/login',\n retryOnCsrf: false,\n body: {\n email: payload.email,\n password: payload.password,\n slide_captcha_token: payload.slideCaptchaToken,\n slide_captcha_verified: '1',\n },\n });\n return normalizeCoinSentryLoginResponse(response);\n },\n async register(payload: CoinSentryRegisterPayload): Promise<unknown> {\n await initCsrf({ force: true });\n return request<unknown>({\n method: 'POST',\n path: '/auth/register',\n retryOnCsrf: false,\n body: payload,\n });\n },\n async requestPasswordReset(payload: CoinSentryPasswordResetPayload): Promise<unknown> {\n await initCsrf({ force: true });\n return request<unknown>({\n method: 'POST',\n path: '/auth/forgot-password',\n retryOnCsrf: false,\n body: {\n email: payload.email,\n slide_captcha_token: payload.slideCaptchaToken,\n slide_captcha_verified: '1',\n },\n });\n },\n async resetPassword(payload: CoinSentryResetPasswordPayload): Promise<unknown> {\n await initCsrf({ force: true });\n return request<unknown>({\n method: 'POST',\n path: '/auth/reset-password',\n retryOnCsrf: false,\n body: payload,\n });\n },\n async logout(): Promise<unknown> {\n return request<unknown>({ method: 'POST', path: '/auth/logout' });\n },\n async twoFactorChallenge(payload: CoinSentryTwoFactorPayload): Promise<CoinSentryLoginResponse> {\n await initCsrf({ force: true });\n const response = await request<CoinSentryLoginResponse>({\n method: 'POST',\n path: '/auth/two-factor-challenge',\n retryOnCsrf: false,\n body: payload.recovery\n ? { recovery_code: payload.code }\n : { code: payload.code },\n });\n return normalizeCoinSentryLoginResponse(response);\n },\n },\n session: {\n async refresh(): Promise<CoinSentrySession> {\n return request<CoinSentrySession>({ method: 'GET', path: '/api/user' });\n },\n },\n entity: {\n async list(): Promise<CoinSentryEntity[]> {\n const response = await request<CoinSentryEntity[] | { data?: CoinSentryEntity[] }>({\n method: 'GET',\n path: '/api/v1/entities',\n });\n return unwrapEnvelopeData<CoinSentryEntity[]>(response) ?? [];\n },\n async select(payload: CoinSentryEntitySelectPayload): Promise<CoinSentrySelectEntityResponse> {\n return request<CoinSentrySelectEntityResponse>({\n method: 'POST',\n path: '/api/v1/select-entity',\n body: 'entityUuid' in payload\n ? { entity_uuid: payload.entityUuid }\n : { entity_id: payload.entityId },\n });\n },\n },\n kyc: {\n async getOverview(): Promise<KycOverviewData> {\n const response = await request<KycOverviewData | { data?: KycOverviewData }>({\n method: 'GET',\n path: '/api/v1/kyc',\n });\n return unwrapEnvelopeData<KycOverviewData>(response);\n },\n async getStatus(): Promise<KycVerificationData> {\n const response = await request<KycVerificationData | { data?: KycVerificationData }>({\n method: 'GET',\n path: '/api/v1/kyc/status',\n });\n return unwrapEnvelopeData<KycVerificationData>(response);\n },\n async submitStep(input: CoinSentryKycSubmitPayload): Promise<unknown> {\n return request<unknown>({\n method: 'POST',\n path: resolveKycEndpoint(input),\n body: input.payload ?? {},\n });\n },\n async upload(input: CoinSentryKycUploadPayload): Promise<unknown> {\n return request<unknown>({\n method: 'POST',\n path: resolveKycEndpoint(input),\n body: input.formData,\n });\n },\n },\n brand: {\n async getConfig(input: CoinSentryBrandConfigOptions = {}): Promise<CoinSentryBrandConfigResponse> {\n const headers: Record<string, string> = {};\n if (input.etag) headers['If-None-Match'] = input.etag;\n\n const response = await request<Response>({\n method: 'GET',\n path: '/api/brand/theme',\n query: input.brandKey ? { brand_key: input.brandKey } : undefined,\n headers,\n signal: input.signal,\n responseType: 'response',\n });\n const etag = response.headers.get('etag') ?? undefined;\n if (response.status === 304) {\n return {\n brandKey: input.brandKey,\n etag: etag ?? input.etag,\n notModified: true,\n };\n }\n\n const body = await response.json().catch(() => null);\n if (!response.ok) {\n const error = coinSentryErrorFromResponse({\n status: response.status,\n statusText: response.statusText,\n body,\n requestId: response.headers.get('x-request-id'),\n });\n options.onError?.(error.toJSON());\n throw error;\n }\n\n const { config, brandKey } = unwrapBrandConfig(body);\n return {\n config,\n brandKey: brandKey ?? input.brandKey,\n etag,\n notModified: false,\n };\n },\n },\n ...productServices,\n };\n}\n"]}
|
package/dist/errors.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export declare class CoinSentryApiError extends Error implements CoinSentryError
|
|
|
21
21
|
toJSON(): CoinSentryError;
|
|
22
22
|
}
|
|
23
23
|
export declare function isCoinSentryError(error: unknown): error is CoinSentryApiError;
|
|
24
|
+
export declare function isCoinSentryAbortError(error: unknown): boolean;
|
|
24
25
|
export declare function isCoinSentryErrorCode(value: unknown): value is CoinSentryErrorCode;
|
|
25
26
|
export declare function normalizeCoinSentryError(error: unknown): CoinSentryApiError;
|
|
26
27
|
export declare function coinSentryErrorFromResponse(input: {
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,eAAO,MAAM,sBAAsB,6PAczB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAExE,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,qBAAa,kBAAmB,SAAQ,KAAM,YAAW,eAAe;IACtE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;gBAEf,KAAK,EAAE,eAAe;IAWlC,MAAM,IAAI,eAAe;CAW1B;AAkDD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAG7E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAGlF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CA6B3E;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GAAG,kBAAkB,CAoBrB"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,eAAO,MAAM,sBAAsB,6PAczB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAExE,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,qBAAa,kBAAmB,SAAQ,KAAM,YAAW,eAAe;IACtE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;gBAEf,KAAK,EAAE,eAAe;IAWlC,MAAM,IAAI,eAAe;CAW1B;AAkDD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAG7E;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM9D;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAGlF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CA6B3E;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GAAG,kBAAkB,CAoBrB"}
|
package/dist/errors.js
CHANGED
|
@@ -97,6 +97,13 @@ export function isCoinSentryError(error) {
|
|
|
97
97
|
return error instanceof CoinSentryApiError
|
|
98
98
|
|| Boolean(error && typeof error === 'object' && 'code' in error && 'status' in error);
|
|
99
99
|
}
|
|
100
|
+
export function isCoinSentryAbortError(error) {
|
|
101
|
+
if (!error || typeof error !== 'object')
|
|
102
|
+
return false;
|
|
103
|
+
const record = error;
|
|
104
|
+
return record.name === 'AbortError'
|
|
105
|
+
|| record.code === 'ABORT_ERR';
|
|
106
|
+
}
|
|
100
107
|
export function isCoinSentryErrorCode(value) {
|
|
101
108
|
return typeof value === 'string'
|
|
102
109
|
&& COINSENTRY_ERROR_CODES.includes(value);
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CoinSentryFieldErrors } from './types.js';\n\nexport const COINSENTRY_ERROR_CODES = [\n 'unauthenticated',\n 'csrf_expired',\n 'kyc_required',\n 'entity_required',\n 'invalid_signature',\n 'origin_not_allowed',\n 'missing_signature_headers',\n 'validation_failed',\n 'rate_limited',\n 'forbidden',\n 'network_error',\n 'server_error',\n 'unknown_error',\n] as const;\n\nexport type CoinSentryErrorCode = typeof COINSENTRY_ERROR_CODES[number];\n\nexport type CoinSentryError = {\n code: CoinSentryErrorCode;\n status: number;\n message: string;\n reason?: string;\n fieldErrors?: CoinSentryFieldErrors;\n requestId?: string;\n details?: unknown;\n};\n\nexport class CoinSentryApiError extends Error implements CoinSentryError {\n readonly code: CoinSentryErrorCode;\n readonly status: number;\n readonly reason?: string;\n readonly fieldErrors?: CoinSentryFieldErrors;\n readonly requestId?: string;\n readonly details?: unknown;\n\n constructor(error: CoinSentryError) {\n super(error.message);\n this.name = 'CoinSentryApiError';\n this.code = error.code;\n this.status = error.status;\n this.reason = error.reason;\n this.fieldErrors = error.fieldErrors;\n this.requestId = error.requestId;\n this.details = error.details;\n }\n\n toJSON(): CoinSentryError {\n return {\n code: this.code,\n status: this.status,\n message: this.message,\n reason: this.reason,\n fieldErrors: this.fieldErrors,\n requestId: this.requestId,\n details: this.details,\n };\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' ? value as Record<string, unknown> : {};\n}\n\nfunction readString(...values: unknown[]): string | undefined {\n for (const value of values) {\n if (typeof value === 'string' && value.trim()) return value.trim();\n }\n return undefined;\n}\n\nfunction readFieldErrors(value: unknown): CoinSentryFieldErrors | undefined {\n if (!value || typeof value !== 'object') return undefined;\n const errors = value as Record<string, unknown>;\n const normalized: CoinSentryFieldErrors = {};\n\n for (const [field, fieldValue] of Object.entries(errors)) {\n if (Array.isArray(fieldValue)) {\n const messages = fieldValue\n .map((message) => String(message ?? '').trim())\n .filter(Boolean);\n if (messages.length > 0) normalized[field] = messages;\n }\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nfunction codeFromStatus(status: number, body: Record<string, unknown>, reason?: string): CoinSentryErrorCode {\n if (reason === 'invalid_signature' || reason === 'origin_not_allowed' || reason === 'missing_signature_headers') {\n return reason;\n }\n\n const error = readString(body.error);\n if (error === 'kyc_required') return 'kyc_required';\n if (error === 'entity_required' || error === 'entity_not_selected') return 'entity_required';\n\n if (status === 401) return 'unauthenticated';\n if (status === 419) return 'csrf_expired';\n if (status === 422) return 'validation_failed';\n if (status === 428) return 'kyc_required';\n if (status === 429) return 'rate_limited';\n if (status === 403) return 'forbidden';\n if (status >= 500) return 'server_error';\n\n return 'unknown_error';\n}\n\nexport function isCoinSentryError(error: unknown): error is CoinSentryApiError {\n return error instanceof CoinSentryApiError\n || Boolean(error && typeof error === 'object' && 'code' in error && 'status' in error);\n}\n\nexport function isCoinSentryErrorCode(value: unknown): value is CoinSentryErrorCode {\n return typeof value === 'string'\n && (COINSENTRY_ERROR_CODES as readonly string[]).includes(value);\n}\n\nexport function normalizeCoinSentryError(error: unknown): CoinSentryApiError {\n if (error instanceof CoinSentryApiError) return error;\n\n const record = asRecord(error);\n const response = asRecord(record.response);\n const body = asRecord(response.data ?? record.data);\n const nested = asRecord(body.data);\n const status = typeof response.status === 'number'\n ? response.status\n : typeof record.status === 'number'\n ? record.status\n : 0;\n const reason = readString(nested.reason, body.reason, nested.error, body.error);\n const message = readString(\n nested.message,\n body.message,\n reason,\n record.message,\n ) ?? 'CoinSentry request failed';\n\n return new CoinSentryApiError({\n code: status === 0 ? 'network_error' : codeFromStatus(status, body, reason),\n status,\n message,\n reason,\n fieldErrors: readFieldErrors(body.errors ?? nested.errors),\n requestId: readString(response.headers && asRecord(response.headers)['x-request-id'], body.request_id),\n details: body,\n });\n}\n\nexport function coinSentryErrorFromResponse(input: {\n status: number;\n statusText?: string;\n body?: unknown;\n requestId?: string | null;\n}): CoinSentryApiError {\n const body = asRecord(input.body);\n const nested = asRecord(body.data);\n const reason = readString(nested.reason, body.reason, nested.error, body.error);\n const message = readString(\n nested.message,\n body.message,\n reason,\n input.statusText,\n ) ?? `HTTP ${input.status}`;\n\n return new CoinSentryApiError({\n code: codeFromStatus(input.status, body, reason),\n status: input.status,\n message,\n reason,\n fieldErrors: readFieldErrors(body.errors ?? nested.errors),\n requestId: input.requestId ?? readString(body.request_id),\n details: input.body,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CoinSentryFieldErrors } from './types.js';\n\nexport const COINSENTRY_ERROR_CODES = [\n 'unauthenticated',\n 'csrf_expired',\n 'kyc_required',\n 'entity_required',\n 'invalid_signature',\n 'origin_not_allowed',\n 'missing_signature_headers',\n 'validation_failed',\n 'rate_limited',\n 'forbidden',\n 'network_error',\n 'server_error',\n 'unknown_error',\n] as const;\n\nexport type CoinSentryErrorCode = typeof COINSENTRY_ERROR_CODES[number];\n\nexport type CoinSentryError = {\n code: CoinSentryErrorCode;\n status: number;\n message: string;\n reason?: string;\n fieldErrors?: CoinSentryFieldErrors;\n requestId?: string;\n details?: unknown;\n};\n\nexport class CoinSentryApiError extends Error implements CoinSentryError {\n readonly code: CoinSentryErrorCode;\n readonly status: number;\n readonly reason?: string;\n readonly fieldErrors?: CoinSentryFieldErrors;\n readonly requestId?: string;\n readonly details?: unknown;\n\n constructor(error: CoinSentryError) {\n super(error.message);\n this.name = 'CoinSentryApiError';\n this.code = error.code;\n this.status = error.status;\n this.reason = error.reason;\n this.fieldErrors = error.fieldErrors;\n this.requestId = error.requestId;\n this.details = error.details;\n }\n\n toJSON(): CoinSentryError {\n return {\n code: this.code,\n status: this.status,\n message: this.message,\n reason: this.reason,\n fieldErrors: this.fieldErrors,\n requestId: this.requestId,\n details: this.details,\n };\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' ? value as Record<string, unknown> : {};\n}\n\nfunction readString(...values: unknown[]): string | undefined {\n for (const value of values) {\n if (typeof value === 'string' && value.trim()) return value.trim();\n }\n return undefined;\n}\n\nfunction readFieldErrors(value: unknown): CoinSentryFieldErrors | undefined {\n if (!value || typeof value !== 'object') return undefined;\n const errors = value as Record<string, unknown>;\n const normalized: CoinSentryFieldErrors = {};\n\n for (const [field, fieldValue] of Object.entries(errors)) {\n if (Array.isArray(fieldValue)) {\n const messages = fieldValue\n .map((message) => String(message ?? '').trim())\n .filter(Boolean);\n if (messages.length > 0) normalized[field] = messages;\n }\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nfunction codeFromStatus(status: number, body: Record<string, unknown>, reason?: string): CoinSentryErrorCode {\n if (reason === 'invalid_signature' || reason === 'origin_not_allowed' || reason === 'missing_signature_headers') {\n return reason;\n }\n\n const error = readString(body.error);\n if (error === 'kyc_required') return 'kyc_required';\n if (error === 'entity_required' || error === 'entity_not_selected') return 'entity_required';\n\n if (status === 401) return 'unauthenticated';\n if (status === 419) return 'csrf_expired';\n if (status === 422) return 'validation_failed';\n if (status === 428) return 'kyc_required';\n if (status === 429) return 'rate_limited';\n if (status === 403) return 'forbidden';\n if (status >= 500) return 'server_error';\n\n return 'unknown_error';\n}\n\nexport function isCoinSentryError(error: unknown): error is CoinSentryApiError {\n return error instanceof CoinSentryApiError\n || Boolean(error && typeof error === 'object' && 'code' in error && 'status' in error);\n}\n\nexport function isCoinSentryAbortError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n const record = error as Record<string, unknown>;\n return record.name === 'AbortError'\n || record.code === 'ABORT_ERR';\n}\n\nexport function isCoinSentryErrorCode(value: unknown): value is CoinSentryErrorCode {\n return typeof value === 'string'\n && (COINSENTRY_ERROR_CODES as readonly string[]).includes(value);\n}\n\nexport function normalizeCoinSentryError(error: unknown): CoinSentryApiError {\n if (error instanceof CoinSentryApiError) return error;\n\n const record = asRecord(error);\n const response = asRecord(record.response);\n const body = asRecord(response.data ?? record.data);\n const nested = asRecord(body.data);\n const status = typeof response.status === 'number'\n ? response.status\n : typeof record.status === 'number'\n ? record.status\n : 0;\n const reason = readString(nested.reason, body.reason, nested.error, body.error);\n const message = readString(\n nested.message,\n body.message,\n reason,\n record.message,\n ) ?? 'CoinSentry request failed';\n\n return new CoinSentryApiError({\n code: status === 0 ? 'network_error' : codeFromStatus(status, body, reason),\n status,\n message,\n reason,\n fieldErrors: readFieldErrors(body.errors ?? nested.errors),\n requestId: readString(response.headers && asRecord(response.headers)['x-request-id'], body.request_id),\n details: body,\n });\n}\n\nexport function coinSentryErrorFromResponse(input: {\n status: number;\n statusText?: string;\n body?: unknown;\n requestId?: string | null;\n}): CoinSentryApiError {\n const body = asRecord(input.body);\n const nested = asRecord(body.data);\n const reason = readString(nested.reason, body.reason, nested.error, body.error);\n const message = readString(\n nested.message,\n body.message,\n reason,\n input.statusText,\n ) ?? `HTTP ${input.status}`;\n\n return new CoinSentryApiError({\n code: codeFromStatus(input.status, body, reason),\n status: input.status,\n message,\n reason,\n fieldErrors: readFieldErrors(body.errors ?? nested.errors),\n requestId: input.requestId ?? readString(body.request_id),\n details: input.body,\n });\n}\n"]}
|
package/dist/http.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export type CoinSentryHttpRequest = {
|
|
|
6
6
|
body?: unknown;
|
|
7
7
|
headers?: Record<string, string>;
|
|
8
8
|
signal?: AbortSignal;
|
|
9
|
-
responseType?: 'json' | 'text' | 'blob';
|
|
9
|
+
responseType?: 'json' | 'text' | 'blob' | 'response';
|
|
10
10
|
retryOnCsrf?: boolean;
|
|
11
11
|
};
|
|
12
12
|
export interface CoinSentryHttpAdapter {
|
package/dist/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/E,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACrE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/E,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACrE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;IACrD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,SAAS,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IACpD,YAAY,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IACvD,cAAc,CAAC,IAAI,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AA0HF,qBAAa,gBAAiB,YAAW,qBAAqB;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,OAAO,GAAE,uBAA4B;IAOjD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAIlD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAIrD,cAAc,IAAI,IAAI;IAIhB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,CAAC,CAAC;YAI9C,gBAAgB;YA8BhB,KAAK;CAmDpB"}
|
package/dist/http.js
CHANGED
|
@@ -55,6 +55,38 @@ function shouldAttachXsrfToken(method, url, headers) {
|
|
|
55
55
|
return false;
|
|
56
56
|
return url.origin === window.location.origin;
|
|
57
57
|
}
|
|
58
|
+
function createAbortReason(name, message) {
|
|
59
|
+
if (typeof DOMException !== 'undefined') {
|
|
60
|
+
return new DOMException(message, name);
|
|
61
|
+
}
|
|
62
|
+
const error = new Error(message);
|
|
63
|
+
error.name = name;
|
|
64
|
+
return error;
|
|
65
|
+
}
|
|
66
|
+
function createRequestSignal(externalSignal, timeoutMs) {
|
|
67
|
+
const controller = new AbortController();
|
|
68
|
+
const cleanupCallbacks = [];
|
|
69
|
+
const abortFromExternal = () => {
|
|
70
|
+
controller.abort(externalSignal?.reason ?? createAbortReason('AbortError', 'CoinSentry request aborted'));
|
|
71
|
+
};
|
|
72
|
+
if (externalSignal) {
|
|
73
|
+
if (externalSignal.aborted) {
|
|
74
|
+
abortFromExternal();
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
externalSignal.addEventListener('abort', abortFromExternal, { once: true });
|
|
78
|
+
cleanupCallbacks.push(() => externalSignal.removeEventListener('abort', abortFromExternal));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const timeout = setTimeout(() => {
|
|
82
|
+
controller.abort(createAbortReason('TimeoutError', 'CoinSentry request timed out'));
|
|
83
|
+
}, timeoutMs);
|
|
84
|
+
cleanupCallbacks.push(() => clearTimeout(timeout));
|
|
85
|
+
return {
|
|
86
|
+
signal: controller.signal,
|
|
87
|
+
cleanup: () => cleanupCallbacks.forEach((cleanup) => cleanup()),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
58
90
|
async function parseResponse(response, responseType) {
|
|
59
91
|
if (response.status === 204)
|
|
60
92
|
return undefined;
|
|
@@ -105,6 +137,9 @@ export class FetchHttpAdapter {
|
|
|
105
137
|
await this.fetch({ method: 'GET', path: this.csrfPath });
|
|
106
138
|
return this.requestWithRetry(request, true);
|
|
107
139
|
}
|
|
140
|
+
if (request.responseType === 'response') {
|
|
141
|
+
return response;
|
|
142
|
+
}
|
|
108
143
|
const payload = await parseResponse(response, request.responseType);
|
|
109
144
|
if (!response.ok) {
|
|
110
145
|
throw coinSentryErrorFromResponse({
|
|
@@ -117,9 +152,7 @@ export class FetchHttpAdapter {
|
|
|
117
152
|
return payload;
|
|
118
153
|
}
|
|
119
154
|
async fetch(request) {
|
|
120
|
-
const
|
|
121
|
-
const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
122
|
-
const signal = request.signal ?? controller.signal;
|
|
155
|
+
const requestSignal = createRequestSignal(request.signal, this.timeoutMs);
|
|
123
156
|
const method = request.method ?? 'GET';
|
|
124
157
|
const url = resolveUrl(this.baseUrl, request.path, request.query);
|
|
125
158
|
const headers = new Headers({
|
|
@@ -164,11 +197,11 @@ export class FetchHttpAdapter {
|
|
|
164
197
|
headers,
|
|
165
198
|
body,
|
|
166
199
|
credentials: 'include',
|
|
167
|
-
signal,
|
|
200
|
+
signal: requestSignal.signal,
|
|
168
201
|
});
|
|
169
202
|
}
|
|
170
203
|
finally {
|
|
171
|
-
|
|
204
|
+
requestSignal.cleanup();
|
|
172
205
|
}
|
|
173
206
|
}
|
|
174
207
|
}
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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","sourcesContent":["import { coinSentryErrorFromResponse } from './errors.js';\n\nexport type CoinSentryHttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport type CoinSentryHttpRequest = {\n method?: CoinSentryHttpMethod;\n path: string;\n query?: Record<string, string | number | boolean | null | undefined>;\n body?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n responseType?: 'json' | 'text' | 'blob';\n retryOnCsrf?: boolean;\n};\n\nexport interface CoinSentryHttpAdapter {\n request<T>(request: CoinSentryHttpRequest): Promise<T>;\n setLocale?(locale: string | null | undefined): void;\n setKycLocale?(locale: string | null | undefined): void;\n clearKycLocale?(): void;\n}\n\nexport type FetchHttpAdapterOptions = {\n baseUrl?: string;\n locale?: string;\n timeoutMs?: number;\n csrfPath?: string;\n};\n\nfunction isFormDataBody(value: unknown): value is FormData {\n return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n\nfunction isUrlSearchParamsBody(value: unknown): value is URLSearchParams {\n return typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams;\n}\n\nfunction appendQuery(url: URL, query: CoinSentryHttpRequest['query']): void {\n if (!query) return;\n\n for (const [key, value] of Object.entries(query)) {\n if (value === null || value === undefined) continue;\n url.searchParams.set(key, String(value));\n }\n}\n\nfunction resolveUrl(baseUrl: string, path: string, query?: CoinSentryHttpRequest['query']): URL {\n const base = typeof window !== 'undefined'\n ? new URL(baseUrl || '/', window.location.origin)\n : new URL(baseUrl || '/', 'http://localhost');\n const url = new URL(path, base);\n appendQuery(url, query);\n return url;\n}\n\nfunction isKycRequestPath(path: string): boolean {\n return path.includes('/api/v1/kyc');\n}\n\nfunction canReadBrowserCookies(): boolean {\n return typeof document !== 'undefined' && typeof document.cookie === 'string';\n}\n\nfunction readCookie(name: string): string | undefined {\n if (!canReadBrowserCookies()) return undefined;\n\n const prefix = `${name}=`;\n let value: string | undefined;\n for (const item of document.cookie.split(';')) {\n const cookie = item.trim();\n if (cookie.startsWith(prefix)) {\n value = cookie.slice(prefix.length);\n }\n }\n\n if (!value) return undefined;\n\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction shouldAttachXsrfToken(method: string, url: URL, headers: Headers): boolean {\n if (method === 'GET' || headers.has('X-XSRF-TOKEN')) return false;\n if (typeof window === 'undefined') return false;\n return url.origin === window.location.origin;\n}\n\nasync function parseResponse<T>(response: Response, responseType: CoinSentryHttpRequest['responseType']): Promise<T> {\n if (response.status === 204) return undefined as T;\n if (responseType === 'text') return await response.text() as T;\n if (responseType === 'blob') return await response.blob() as T;\n\n const text = await response.text();\n if (!text) return null as T;\n\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as T;\n }\n}\n\nexport class FetchHttpAdapter implements CoinSentryHttpAdapter {\n private readonly baseUrl: string;\n private locale?: string;\n private kycLocale: string | null = null;\n private readonly timeoutMs: number;\n private readonly csrfPath: string;\n\n constructor(options: FetchHttpAdapterOptions = {}) {\n this.baseUrl = options.baseUrl ?? '/';\n this.locale = options.locale;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n this.csrfPath = options.csrfPath ?? '/sanctum/csrf-cookie';\n }\n\n setLocale(locale: string | null | undefined): void {\n this.locale = locale || undefined;\n }\n\n setKycLocale(locale: string | null | undefined): void {\n this.kycLocale = locale || null;\n }\n\n clearKycLocale(): void {\n this.kycLocale = null;\n }\n\n async request<T>(request: CoinSentryHttpRequest): Promise<T> {\n return this.requestWithRetry<T>(request, false);\n }\n\n private async requestWithRetry<T>(request: CoinSentryHttpRequest, retried: boolean): Promise<T> {\n const response = await this.fetch(request);\n\n if (\n response.status === 419\n && request.retryOnCsrf !== false\n && !retried\n && request.path !== this.csrfPath\n ) {\n await this.fetch({ method: 'GET', path: this.csrfPath });\n return this.requestWithRetry<T>(request, true);\n }\n\n const payload = await parseResponse<T>(response, request.responseType);\n if (!response.ok) {\n throw coinSentryErrorFromResponse({\n status: response.status,\n statusText: response.statusText,\n body: payload,\n requestId: response.headers.get('x-request-id'),\n });\n }\n\n return payload;\n }\n\n private async fetch(request: CoinSentryHttpRequest): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n const signal = request.signal ?? controller.signal;\n const method = request.method ?? 'GET';\n const url = resolveUrl(this.baseUrl, request.path, request.query);\n const headers = new Headers({\n Accept: 'application/json',\n 'X-Requested-With': 'XMLHttpRequest',\n ...request.headers,\n });\n\n if (this.locale && !headers.has('Accept-Language')) {\n headers.set('Accept-Language', isKycRequestPath(request.path) && this.kycLocale\n ? this.kycLocale\n : this.locale);\n } else if (!this.locale && this.kycLocale && isKycRequestPath(request.path) && !headers.has('Accept-Language')) {\n headers.set('Accept-Language', this.kycLocale);\n }\n\n if (shouldAttachXsrfToken(method, url, headers)) {\n const token = readCookie('XSRF-TOKEN');\n if (token) headers.set('X-XSRF-TOKEN', token);\n }\n\n let body: BodyInit | undefined;\n if (request.body !== undefined && method !== 'GET') {\n if (isFormDataBody(request.body)) {\n body = request.body;\n headers.delete('Content-Type');\n } else if (isUrlSearchParamsBody(request.body)) {\n body = request.body;\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n } else {\n body = JSON.stringify(request.body);\n if (!headers.has('Content-Type')) headers.set('Content-Type', 'application/json');\n }\n }\n\n try {\n return await fetch(url, {\n method,\n headers,\n body,\n credentials: 'include',\n signal,\n });\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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","sourcesContent":["import { coinSentryErrorFromResponse } from './errors.js';\n\nexport type CoinSentryHttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport type CoinSentryHttpRequest = {\n method?: CoinSentryHttpMethod;\n path: string;\n query?: Record<string, string | number | boolean | null | undefined>;\n body?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n responseType?: 'json' | 'text' | 'blob' | 'response';\n retryOnCsrf?: boolean;\n};\n\nexport interface CoinSentryHttpAdapter {\n request<T>(request: CoinSentryHttpRequest): Promise<T>;\n setLocale?(locale: string | null | undefined): void;\n setKycLocale?(locale: string | null | undefined): void;\n clearKycLocale?(): void;\n}\n\nexport type FetchHttpAdapterOptions = {\n baseUrl?: string;\n locale?: string;\n timeoutMs?: number;\n csrfPath?: string;\n};\n\nfunction isFormDataBody(value: unknown): value is FormData {\n return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n\nfunction isUrlSearchParamsBody(value: unknown): value is URLSearchParams {\n return typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams;\n}\n\nfunction appendQuery(url: URL, query: CoinSentryHttpRequest['query']): void {\n if (!query) return;\n\n for (const [key, value] of Object.entries(query)) {\n if (value === null || value === undefined) continue;\n url.searchParams.set(key, String(value));\n }\n}\n\nfunction resolveUrl(baseUrl: string, path: string, query?: CoinSentryHttpRequest['query']): URL {\n const base = typeof window !== 'undefined'\n ? new URL(baseUrl || '/', window.location.origin)\n : new URL(baseUrl || '/', 'http://localhost');\n const url = new URL(path, base);\n appendQuery(url, query);\n return url;\n}\n\nfunction isKycRequestPath(path: string): boolean {\n return path.includes('/api/v1/kyc');\n}\n\nfunction canReadBrowserCookies(): boolean {\n return typeof document !== 'undefined' && typeof document.cookie === 'string';\n}\n\nfunction readCookie(name: string): string | undefined {\n if (!canReadBrowserCookies()) return undefined;\n\n const prefix = `${name}=`;\n let value: string | undefined;\n for (const item of document.cookie.split(';')) {\n const cookie = item.trim();\n if (cookie.startsWith(prefix)) {\n value = cookie.slice(prefix.length);\n }\n }\n\n if (!value) return undefined;\n\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction shouldAttachXsrfToken(method: string, url: URL, headers: Headers): boolean {\n if (method === 'GET' || headers.has('X-XSRF-TOKEN')) return false;\n if (typeof window === 'undefined') return false;\n return url.origin === window.location.origin;\n}\n\nfunction createAbortReason(name: 'AbortError' | 'TimeoutError', message: string): Error {\n if (typeof DOMException !== 'undefined') {\n return new DOMException(message, name);\n }\n\n const error = new Error(message);\n error.name = name;\n return error;\n}\n\nfunction createRequestSignal(externalSignal: AbortSignal | undefined, timeoutMs: number): {\n signal: AbortSignal;\n cleanup: () => void;\n} {\n const controller = new AbortController();\n const cleanupCallbacks: Array<() => void> = [];\n\n const abortFromExternal = () => {\n controller.abort(\n externalSignal?.reason ?? createAbortReason('AbortError', 'CoinSentry request aborted'),\n );\n };\n\n if (externalSignal) {\n if (externalSignal.aborted) {\n abortFromExternal();\n } else {\n externalSignal.addEventListener('abort', abortFromExternal, { once: true });\n cleanupCallbacks.push(() => externalSignal.removeEventListener('abort', abortFromExternal));\n }\n }\n\n const timeout = setTimeout(() => {\n controller.abort(createAbortReason('TimeoutError', 'CoinSentry request timed out'));\n }, timeoutMs);\n\n cleanupCallbacks.push(() => clearTimeout(timeout));\n\n return {\n signal: controller.signal,\n cleanup: () => cleanupCallbacks.forEach((cleanup) => cleanup()),\n };\n}\n\nasync function parseResponse<T>(response: Response, responseType: CoinSentryHttpRequest['responseType']): Promise<T> {\n if (response.status === 204) return undefined as T;\n if (responseType === 'text') return await response.text() as T;\n if (responseType === 'blob') return await response.blob() as T;\n\n const text = await response.text();\n if (!text) return null as T;\n\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as T;\n }\n}\n\nexport class FetchHttpAdapter implements CoinSentryHttpAdapter {\n private readonly baseUrl: string;\n private locale?: string;\n private kycLocale: string | null = null;\n private readonly timeoutMs: number;\n private readonly csrfPath: string;\n\n constructor(options: FetchHttpAdapterOptions = {}) {\n this.baseUrl = options.baseUrl ?? '/';\n this.locale = options.locale;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n this.csrfPath = options.csrfPath ?? '/sanctum/csrf-cookie';\n }\n\n setLocale(locale: string | null | undefined): void {\n this.locale = locale || undefined;\n }\n\n setKycLocale(locale: string | null | undefined): void {\n this.kycLocale = locale || null;\n }\n\n clearKycLocale(): void {\n this.kycLocale = null;\n }\n\n async request<T>(request: CoinSentryHttpRequest): Promise<T> {\n return this.requestWithRetry<T>(request, false);\n }\n\n private async requestWithRetry<T>(request: CoinSentryHttpRequest, retried: boolean): Promise<T> {\n const response = await this.fetch(request);\n\n if (\n response.status === 419\n && request.retryOnCsrf !== false\n && !retried\n && request.path !== this.csrfPath\n ) {\n await this.fetch({ method: 'GET', path: this.csrfPath });\n return this.requestWithRetry<T>(request, true);\n }\n\n if (request.responseType === 'response') {\n return response as T;\n }\n\n const payload = await parseResponse<T>(response, request.responseType);\n if (!response.ok) {\n throw coinSentryErrorFromResponse({\n status: response.status,\n statusText: response.statusText,\n body: payload,\n requestId: response.headers.get('x-request-id'),\n });\n }\n\n return payload;\n }\n\n private async fetch(request: CoinSentryHttpRequest): Promise<Response> {\n const requestSignal = createRequestSignal(request.signal, this.timeoutMs);\n const method = request.method ?? 'GET';\n const url = resolveUrl(this.baseUrl, request.path, request.query);\n const headers = new Headers({\n Accept: 'application/json',\n 'X-Requested-With': 'XMLHttpRequest',\n ...request.headers,\n });\n\n if (this.locale && !headers.has('Accept-Language')) {\n headers.set('Accept-Language', isKycRequestPath(request.path) && this.kycLocale\n ? this.kycLocale\n : this.locale);\n } else if (!this.locale && this.kycLocale && isKycRequestPath(request.path) && !headers.has('Accept-Language')) {\n headers.set('Accept-Language', this.kycLocale);\n }\n\n if (shouldAttachXsrfToken(method, url, headers)) {\n const token = readCookie('XSRF-TOKEN');\n if (token) headers.set('X-XSRF-TOKEN', token);\n }\n\n let body: BodyInit | undefined;\n if (request.body !== undefined && method !== 'GET') {\n if (isFormDataBody(request.body)) {\n body = request.body;\n headers.delete('Content-Type');\n } else if (isUrlSearchParamsBody(request.body)) {\n body = request.body;\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n } else {\n body = JSON.stringify(request.body);\n if (!headers.has('Content-Type')) headers.set('Content-Type', 'application/json');\n }\n }\n\n try {\n return await fetch(url, {\n method,\n headers,\n body,\n credentials: 'include',\n signal: requestSignal.signal,\n });\n } finally {\n requestSignal.cleanup();\n }\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
export { COINSENTRY_ERROR_CODES, CoinSentryApiError, coinSentryErrorFromResponse, isCoinSentryError, isCoinSentryErrorCode, normalizeCoinSentryError, } from './errors.js';
|
|
1
|
+
export { COINSENTRY_ERROR_CODES, CoinSentryApiError, coinSentryErrorFromResponse, isCoinSentryAbortError, isCoinSentryError, isCoinSentryErrorCode, normalizeCoinSentryError, } from './errors.js';
|
|
2
2
|
export type { CoinSentryError, CoinSentryErrorCode, } from './errors.js';
|
|
3
3
|
export { FetchHttpAdapter, } from './http.js';
|
|
4
4
|
export type { CoinSentryHttpAdapter, CoinSentryHttpMethod, CoinSentryHttpRequest, FetchHttpAdapterOptions, } from './http.js';
|
|
5
5
|
export { hasCoinSentryActiveEntity, isCoinSentryEntityMinimal, isCoinSentryLoginIncomplete, isCoinSentryLoginMultipleEntities, isCoinSentryLoginSingleEntity, isCoinSentryLoginSuccess, isCoinSentryLoginTwoFactor, isCoinSentrySession, normalizeCoinSentryLoginResponse, requiresCoinSentryEntitySelection, } from './guards.js';
|
|
6
6
|
export { CoinSentryRealtime, createCoinSentryRealtime, } from './realtime.js';
|
|
7
7
|
export type { CoinSentryRealtimeAdapter, CoinSentryRealtimeHandler, CoinSentryRealtimeStatus, CoinSentryRealtimeSubscription, } from './realtime.js';
|
|
8
|
+
export { buildCreateOrderPayload, getOrderbookChannel, normalizeMarketCandles, normalizeMarketSymbol, normalizeOrderbookSnapshot, normalizePublicTrade, } from './market.js';
|
|
9
|
+
export type { CoinSentryCandleInterval, CoinSentryCreateOrderInput, CoinSentryCreateOrderPayload, CoinSentryMarketBalance, CoinSentryMarketCandle, CoinSentryMarketDetails, CoinSentryMarketListItem, CoinSentryMarketSymbol, CoinSentryMarketTicker, CoinSentryMarketTradingPair, CoinSentryOrderbookLevel, CoinSentryOrderbookSnapshot, CoinSentryPublicTrade, } from './market.js';
|
|
8
10
|
export { createCoinSentryClient, } from './client.js';
|
|
9
11
|
export type { CoinSentryClient, CoinSentryClientOptions, CoinSentryCsrfInitOptions, CoinSentryEntitySelectPayload, CoinSentryKycSubmitPayload, CoinSentryKycUploadPayload, CoinSentryLoginPayload, CoinSentryTwoFactorPayload, } from './client.js';
|
|
10
|
-
export type { CoinSentryEnvelope, CoinSentryOtcAvailableCoin, CoinSentryOtcCoin, CoinSentryOtcConvertExecuteRequest, CoinSentryOtcConvertQuote, CoinSentryOtcConvertQuoteRequest, CoinSentryOtcConvertResult, CoinSentryOtcRecurringExecution, CoinSentryOtcRecurringPlan, CoinSentryOtcRecurringPlanRequest, CoinSentryOtcTradingPair, CoinSentryOtcTradingPairsResponse, CoinSentryPaginationMeta, CoinSentryPaginationParams, CoinSentryPasswordResetPayload, CoinSentryQuery, CoinSentryRequestOptions, CoinSentryResetPasswordPayload, CoinSentryTwoFactorStatus, } from './products.js';
|
|
11
|
-
export type { CoinSentryBalance, CoinSentryBalanceAmount, CoinSentryBalanceInput, CoinSentryBalanceUpdate, CoinSentryBalances, CoinSentryBrandConfig, CoinSentryEntity, CoinSentryEntityMinimal, CoinSentryEntityRole, CoinSentryEntitySummary, CoinSentryEntityType, CoinSentryFieldErrors, CoinSentryKycLevel, CoinSentryKycStatus, CoinSentryLocale, CoinSentryLoginIncomplete, CoinSentryLoginMultipleEntities, CoinSentryPartialSession, CoinSentryLoginResponse, CoinSentryLoginSingleEntity, CoinSentryLoginSuccess, CoinSentryLoginTwoFactor, CoinSentryRegisterPayload, CoinSentrySelectEntityResponse, CoinSentrySession, CoinSentryUser, } from './types.js';
|
|
12
|
+
export type { CoinSentryEnvelope, CoinSentryMarketCandlesOptions, CoinSentryMarketTradesOptions, CoinSentryOtcAvailableCoin, CoinSentryOtcCoin, CoinSentryOtcConvertExecuteRequest, CoinSentryOtcConvertQuote, CoinSentryOtcConvertQuoteRequest, CoinSentryOtcConvertResult, CoinSentryOtcRecurringExecution, CoinSentryOtcRecurringPlan, CoinSentryOtcRecurringPlanRequest, CoinSentryOtcTradingPair, CoinSentryOtcTradingPairsResponse, CoinSentryPaginationMeta, CoinSentryPaginationParams, CoinSentryPasswordResetPayload, CoinSentryQuery, CoinSentryRequestOptions, CoinSentryResetPasswordPayload, CoinSentryTwoFactorStatus, } from './products.js';
|
|
13
|
+
export type { CoinSentryBalance, CoinSentryBalanceAmount, CoinSentryBalanceInput, CoinSentryBalanceUpdate, CoinSentryBalances, CoinSentryBrandConfig, CoinSentryBrandConfigOptions, CoinSentryBrandConfigResponse, CoinSentryEntity, CoinSentryEntityMinimal, CoinSentryEntityRole, CoinSentryEntitySummary, CoinSentryEntityType, CoinSentryFieldErrors, CoinSentryKycLevel, CoinSentryKycStatus, CoinSentryLocale, CoinSentryLoginIncomplete, CoinSentryLoginMultipleEntities, CoinSentryPartialSession, CoinSentryLoginResponse, CoinSentryLoginSingleEntity, CoinSentryLoginSuccess, CoinSentryLoginTwoFactor, CoinSentryRegisterPayload, CoinSentrySelectEntityResponse, CoinSentrySession, CoinSentryUser, } from './types.js';
|
|
12
14
|
export type { ClientFlowStep, KycCustomerType, KycFlowEntityType, KycFlowScreen, KycFlowSnapshot, KycFlowStateSummary, KycOverviewData, KycRequiredAction, KycRequirements, KycVerificationData, } from './kyc/index.js';
|
|
13
15
|
export { canOpenUniversalStep, ensureReviewStep, findStepByMissing, flowEntityTypeForCustomerType, getComplianceSteps, getKycProgress, getRequirementsClientFlow, hasKycClientFlow, hasResolvedKycRequirements, isUniversalStepCompleted, isKycFlowSnapshotConfigured, isKycOverviewFlowConfigured, normalizeCustomerType, mergeKycRequirementsWithAnchor, preserveSsrKycRequirementsAnchor, requirementsFromOverview, resolveActiveKycStep, resolveKycFlowSnapshot, statusFromOverview, } from './kyc/index.js';
|
|
14
|
-
export { buildBrandCss, buildBrandIconsMetadata, buildBrandManifest, fontSansToCssFamily, getBrandCssVariables, getBrandFaviconUrl, getLogoImageUrl, getLogoTextColors, getLogoTextFontFamily, inferImageMimeType, isImageLogoType, normalizeBrandConfig, normalizeFontSans, normalizeLogoDimension, normalizeLogoLayout, normalizeLogoType, resolveBrandThemeMode, } from './brand/index.js';
|
|
15
|
-
export type { BackendBrandLogoType, BrandConfig, BrandIconDescriptor, BrandLogoType, BrandManifestIcon, BrandMode, BrandWebManifest, ColorSet, DeepPartial, NormalizedLogoLayout, SecurityTxtConfig, } from './brand/index.js';
|
|
16
|
+
export { buildBrandCss, buildBrandIconsMetadata, buildBrandManifest, fontSansToCssFamily, getBrandCssVariables, getBrandFaviconUrl, getLogoImageUrl, getLogoTextColors, getLogoTextFontFamily, inferImageMimeType, isImageLogoType, normalizeBrandConfig, normalizeBrandTypography, normalizeFontBaseSize, normalizeFontSans, normalizeLogoDimension, normalizeLogoLayout, normalizeLogoType, normalizeTypographyValue, resolveBrandThemeMode, } from './brand/index.js';
|
|
17
|
+
export type { BackendBrandLogoType, BrandConfig, BrandIconDescriptor, BrandLogoType, BrandManifestIcon, BrandMode, BrandThemeMode, BrandTypography, BrandTypographyToken, BrandWebManifest, ColorSet, DeepPartial, NormalizedLogoLayout, SecurityTxtConfig, } from './brand/index.js';
|
|
16
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
export { COINSENTRY_ERROR_CODES, CoinSentryApiError, coinSentryErrorFromResponse, isCoinSentryError, isCoinSentryErrorCode, normalizeCoinSentryError, } from './errors.js';
|
|
1
|
+
export { COINSENTRY_ERROR_CODES, CoinSentryApiError, coinSentryErrorFromResponse, isCoinSentryAbortError, isCoinSentryError, isCoinSentryErrorCode, normalizeCoinSentryError, } from './errors.js';
|
|
2
2
|
export { FetchHttpAdapter, } from './http.js';
|
|
3
3
|
export { hasCoinSentryActiveEntity, isCoinSentryEntityMinimal, isCoinSentryLoginIncomplete, isCoinSentryLoginMultipleEntities, isCoinSentryLoginSingleEntity, isCoinSentryLoginSuccess, isCoinSentryLoginTwoFactor, isCoinSentrySession, normalizeCoinSentryLoginResponse, requiresCoinSentryEntitySelection, } from './guards.js';
|
|
4
4
|
export { CoinSentryRealtime, createCoinSentryRealtime, } from './realtime.js';
|
|
5
|
+
export { buildCreateOrderPayload, getOrderbookChannel, normalizeMarketCandles, normalizeMarketSymbol, normalizeOrderbookSnapshot, normalizePublicTrade, } from './market.js';
|
|
5
6
|
export { createCoinSentryClient, } from './client.js';
|
|
6
7
|
export { canOpenUniversalStep, ensureReviewStep, findStepByMissing, flowEntityTypeForCustomerType, getComplianceSteps, getKycProgress, getRequirementsClientFlow, hasKycClientFlow, hasResolvedKycRequirements, isUniversalStepCompleted, isKycFlowSnapshotConfigured, isKycOverviewFlowConfigured, normalizeCustomerType, mergeKycRequirementsWithAnchor, preserveSsrKycRequirementsAnchor, requirementsFromOverview, resolveActiveKycStep, resolveKycFlowSnapshot, statusFromOverview, } from './kyc/index.js';
|
|
7
|
-
export { buildBrandCss, buildBrandIconsMetadata, buildBrandManifest, fontSansToCssFamily, getBrandCssVariables, getBrandFaviconUrl, getLogoImageUrl, getLogoTextColors, getLogoTextFontFamily, inferImageMimeType, isImageLogoType, normalizeBrandConfig, normalizeFontSans, normalizeLogoDimension, normalizeLogoLayout, normalizeLogoType, resolveBrandThemeMode, } from './brand/index.js';
|
|
8
|
+
export { buildBrandCss, buildBrandIconsMetadata, buildBrandManifest, fontSansToCssFamily, getBrandCssVariables, getBrandFaviconUrl, getLogoImageUrl, getLogoTextColors, getLogoTextFontFamily, inferImageMimeType, isImageLogoType, normalizeBrandConfig, normalizeBrandTypography, normalizeFontBaseSize, normalizeFontSans, normalizeLogoDimension, normalizeLogoLayout, normalizeLogoType, normalizeTypographyValue, resolveBrandThemeMode, } from './brand/index.js';
|
|
8
9
|
//# sourceMappingURL=index.js.map
|