@tapline/client 0.1.0

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.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +48 -0
  3. package/dist/base.d.ts +16 -0
  4. package/dist/base.d.ts.map +1 -0
  5. package/dist/base.js +151 -0
  6. package/dist/base.js.map +1 -0
  7. package/dist/cjs/base.d.ts +16 -0
  8. package/dist/cjs/base.d.ts.map +1 -0
  9. package/dist/cjs/base.js +158 -0
  10. package/dist/cjs/base.js.map +1 -0
  11. package/dist/cjs/client.d.ts +11 -0
  12. package/dist/cjs/client.d.ts.map +1 -0
  13. package/dist/cjs/client.js +21 -0
  14. package/dist/cjs/client.js.map +1 -0
  15. package/dist/cjs/errors.d.ts +13 -0
  16. package/dist/cjs/errors.d.ts.map +1 -0
  17. package/dist/cjs/errors.js +28 -0
  18. package/dist/cjs/errors.js.map +1 -0
  19. package/dist/cjs/index.d.ts +11 -0
  20. package/dist/cjs/index.d.ts.map +1 -0
  21. package/dist/cjs/index.js +55 -0
  22. package/dist/cjs/index.js.map +1 -0
  23. package/dist/cjs/package.json +1 -0
  24. package/dist/cjs/services/airbnb/client.d.ts +19 -0
  25. package/dist/cjs/services/airbnb/client.d.ts.map +1 -0
  26. package/dist/cjs/services/airbnb/client.js +36 -0
  27. package/dist/cjs/services/airbnb/client.js.map +1 -0
  28. package/dist/cjs/services/airbnb/index.d.ts +3 -0
  29. package/dist/cjs/services/airbnb/index.d.ts.map +1 -0
  30. package/dist/cjs/services/airbnb/index.js +22 -0
  31. package/dist/cjs/services/airbnb/index.js.map +1 -0
  32. package/dist/cjs/services/airbnb/types.d.ts +359 -0
  33. package/dist/cjs/services/airbnb/types.d.ts.map +1 -0
  34. package/dist/cjs/services/airbnb/types.js +4 -0
  35. package/dist/cjs/services/airbnb/types.js.map +1 -0
  36. package/dist/cjs/services/gmgn/client.d.ts +129 -0
  37. package/dist/cjs/services/gmgn/client.d.ts.map +1 -0
  38. package/dist/cjs/services/gmgn/client.js +312 -0
  39. package/dist/cjs/services/gmgn/client.js.map +1 -0
  40. package/dist/cjs/services/gmgn/index.d.ts +3 -0
  41. package/dist/cjs/services/gmgn/index.d.ts.map +1 -0
  42. package/dist/cjs/services/gmgn/index.js +22 -0
  43. package/dist/cjs/services/gmgn/index.js.map +1 -0
  44. package/dist/cjs/services/gmgn/types.d.ts +3051 -0
  45. package/dist/cjs/services/gmgn/types.d.ts.map +1 -0
  46. package/dist/cjs/services/gmgn/types.js +4 -0
  47. package/dist/cjs/services/gmgn/types.js.map +1 -0
  48. package/dist/cjs/services/youtube/client.d.ts +29 -0
  49. package/dist/cjs/services/youtube/client.d.ts.map +1 -0
  50. package/dist/cjs/services/youtube/client.js +66 -0
  51. package/dist/cjs/services/youtube/client.js.map +1 -0
  52. package/dist/cjs/services/youtube/index.d.ts +3 -0
  53. package/dist/cjs/services/youtube/index.d.ts.map +1 -0
  54. package/dist/cjs/services/youtube/index.js +22 -0
  55. package/dist/cjs/services/youtube/index.js.map +1 -0
  56. package/dist/cjs/services/youtube/types.d.ts +381 -0
  57. package/dist/cjs/services/youtube/types.d.ts.map +1 -0
  58. package/dist/cjs/services/youtube/types.js +4 -0
  59. package/dist/cjs/services/youtube/types.js.map +1 -0
  60. package/dist/cjs/types.d.ts +28 -0
  61. package/dist/cjs/types.d.ts.map +1 -0
  62. package/dist/cjs/types.js +3 -0
  63. package/dist/cjs/types.js.map +1 -0
  64. package/dist/client.d.ts +11 -0
  65. package/dist/client.d.ts.map +1 -0
  66. package/dist/client.js +17 -0
  67. package/dist/client.js.map +1 -0
  68. package/dist/errors.d.ts +13 -0
  69. package/dist/errors.d.ts.map +1 -0
  70. package/dist/errors.js +23 -0
  71. package/dist/errors.js.map +1 -0
  72. package/dist/index.d.ts +11 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +11 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/services/airbnb/client.d.ts +19 -0
  77. package/dist/services/airbnb/client.d.ts.map +1 -0
  78. package/dist/services/airbnb/client.js +32 -0
  79. package/dist/services/airbnb/client.js.map +1 -0
  80. package/dist/services/airbnb/index.d.ts +3 -0
  81. package/dist/services/airbnb/index.d.ts.map +1 -0
  82. package/dist/services/airbnb/index.js +4 -0
  83. package/dist/services/airbnb/index.js.map +1 -0
  84. package/dist/services/airbnb/types.d.ts +359 -0
  85. package/dist/services/airbnb/types.d.ts.map +1 -0
  86. package/dist/services/airbnb/types.js +3 -0
  87. package/dist/services/airbnb/types.js.map +1 -0
  88. package/dist/services/gmgn/client.d.ts +129 -0
  89. package/dist/services/gmgn/client.d.ts.map +1 -0
  90. package/dist/services/gmgn/client.js +308 -0
  91. package/dist/services/gmgn/client.js.map +1 -0
  92. package/dist/services/gmgn/index.d.ts +3 -0
  93. package/dist/services/gmgn/index.d.ts.map +1 -0
  94. package/dist/services/gmgn/index.js +4 -0
  95. package/dist/services/gmgn/index.js.map +1 -0
  96. package/dist/services/gmgn/types.d.ts +3051 -0
  97. package/dist/services/gmgn/types.d.ts.map +1 -0
  98. package/dist/services/gmgn/types.js +3 -0
  99. package/dist/services/gmgn/types.js.map +1 -0
  100. package/dist/services/youtube/client.d.ts +29 -0
  101. package/dist/services/youtube/client.d.ts.map +1 -0
  102. package/dist/services/youtube/client.js +62 -0
  103. package/dist/services/youtube/client.js.map +1 -0
  104. package/dist/services/youtube/index.d.ts +3 -0
  105. package/dist/services/youtube/index.d.ts.map +1 -0
  106. package/dist/services/youtube/index.js +4 -0
  107. package/dist/services/youtube/index.js.map +1 -0
  108. package/dist/services/youtube/types.d.ts +381 -0
  109. package/dist/services/youtube/types.d.ts.map +1 -0
  110. package/dist/services/youtube/types.js +3 -0
  111. package/dist/services/youtube/types.js.map +1 -0
  112. package/dist/types.d.ts +28 -0
  113. package/dist/types.d.ts.map +1 -0
  114. package/dist/types.js +2 -0
  115. package/dist/types.js.map +1 -0
  116. package/package.json +51 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tapline
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # @tapline/client
2
+
3
+ The official TypeScript client for the [Tapline](https://tapline.sh) API:
4
+ parsed, versioned JSON from live Airbnb, YouTube and GMGN, one API key, one
5
+ credit pool.
6
+
7
+ ```sh
8
+ npm install @tapline/client
9
+ export TAPLINE_API_KEY="your-api-key"
10
+ ```
11
+
12
+ ```ts
13
+ import { TaplineClient } from '@tapline/client';
14
+
15
+ const tapline = new TaplineClient();
16
+
17
+ const places = await tapline.airbnb.searchLocations({ query: 'London' });
18
+ const results = await tapline.airbnb.search({ place_id: places.suggestions[0].place_id, adults: 2 });
19
+
20
+ const video = await tapline.youtube.getMetadata({ video_id: 'dQw4w9WgXcQ' });
21
+ const comments = await tapline.youtube.getComments({ video_id: 'dQw4w9WgXcQ' });
22
+
23
+ const token = await tapline.gmgn.search({ chain: 'sol', q: 'bonk' });
24
+ ```
25
+
26
+ `TaplineClient` reads `TAPLINE_API_KEY` and `TAPLINE_BASE_URL` from the
27
+ environment, or takes `apiKey` and `baseUrl` in its constructor. Every method
28
+ takes the request body or parameters the API documents, under the same field
29
+ names, and resolves to the documented response type. Types are exported per
30
+ service:
31
+
32
+ ```ts
33
+ import type { airbnb, youtube, gmgn } from '@tapline/client';
34
+
35
+ let listing: airbnb.ParsedListing;
36
+ let channel: youtube.ChannelResponse;
37
+ let trending: gmgn.TrendingToken;
38
+ ```
39
+
40
+ Failed requests throw `TaplineError` with `status`, `code`, `requestId` and the
41
+ server's `message`. Requests that fail with a 429 or a 5xx are retried with
42
+ backoff, honouring `Retry-After`. Integers too large for a JavaScript number
43
+ arrive as strings instead of being rounded.
44
+
45
+ The service types, sub-clients and the root client are generated from the
46
+ API's OpenAPI document; `src/base.ts` and `src/errors.ts` are written by hand.
47
+
48
+ MIT licensed.
package/dist/base.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ import type { TaplineClientConfig } from './types.js';
2
+ export declare const DEFAULT_BASE_URL = "https://api.tapline.sh";
3
+ export declare class BaseClient {
4
+ private readonly client;
5
+ private readonly retry;
6
+ constructor(config?: TaplineClientConfig);
7
+ get<T>(path: string, params?: Record<string, unknown>): Promise<T>;
8
+ post<T>(path: string, body: unknown): Promise<T>;
9
+ private request;
10
+ private isRetryable;
11
+ private getStatus;
12
+ private computeDelay;
13
+ private parseRetryAfter;
14
+ private handleError;
15
+ }
16
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA6B,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGjF,eAAO,MAAM,gBAAgB,2BAA2B,CAAC;AAwDzD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;gBAEhC,MAAM,GAAE,mBAAwB;IAoBtC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIlE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;YAIxC,OAAO;IAwBrB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,WAAW;CAepB"}
package/dist/base.js ADDED
@@ -0,0 +1,151 @@
1
+ import axios, {} from 'axios';
2
+ import { parse as parseLossless } from 'lossless-json';
3
+ import { MissingApiKeyError, TaplineError } from './errors.js';
4
+ export const DEFAULT_BASE_URL = 'https://api.tapline.sh';
5
+ function materialiseNumber(value) {
6
+ if (value.indexOf('.') !== -1 || value.indexOf('e') !== -1 || value.indexOf('E') !== -1) {
7
+ return Number(value);
8
+ }
9
+ const n = Number(value);
10
+ return Number.isSafeInteger(n) ? n : value;
11
+ }
12
+ function parseResponseBody(data) {
13
+ if (typeof data !== 'string' || data.length === 0)
14
+ return data;
15
+ try {
16
+ return parseLossless(data, undefined, materialiseNumber);
17
+ }
18
+ catch {
19
+ return data;
20
+ }
21
+ }
22
+ const DEFAULT_RETRY_STATUS_CODES = [408, 425, 429, 500, 502, 503, 504];
23
+ const RETRYABLE_NETWORK_CODES = new Set([
24
+ 'ECONNRESET',
25
+ 'ETIMEDOUT',
26
+ 'ECONNABORTED',
27
+ 'ECONNREFUSED',
28
+ 'EAI_AGAIN',
29
+ 'ENOTFOUND',
30
+ 'EPIPE',
31
+ ]);
32
+ function resolveRetryConfig(config) {
33
+ return {
34
+ maxRetries: config?.maxRetries ?? 3,
35
+ initialDelayMs: config?.initialDelayMs ?? 500,
36
+ maxDelayMs: config?.maxDelayMs ?? 8000,
37
+ retryStatusCodes: new Set(config?.retryStatusCodes ?? DEFAULT_RETRY_STATUS_CODES),
38
+ onRetry: config?.onRetry,
39
+ };
40
+ }
41
+ function sleep(ms) {
42
+ return new Promise((resolve) => setTimeout(resolve, ms));
43
+ }
44
+ function envVar(name) {
45
+ return typeof process === 'undefined' ? undefined : process.env[name];
46
+ }
47
+ export class BaseClient {
48
+ client;
49
+ retry;
50
+ constructor(config = {}) {
51
+ const apiKey = config.apiKey ?? envVar('TAPLINE_API_KEY');
52
+ if (!apiKey)
53
+ throw new MissingApiKeyError();
54
+ const baseUrl = config.baseUrl ?? envVar('TAPLINE_BASE_URL') ?? DEFAULT_BASE_URL;
55
+ this.client = axios.create({
56
+ baseURL: baseUrl.replace(/\/+$/, ''),
57
+ headers: {
58
+ 'Content-Type': 'application/json',
59
+ 'X-API-Key': apiKey,
60
+ ...config.headers,
61
+ },
62
+ responseType: 'text',
63
+ transitional: { forcedJSONParsing: false },
64
+ transformResponse: [parseResponseBody],
65
+ paramsSerializer: { indexes: null },
66
+ });
67
+ this.retry = resolveRetryConfig(config.retry);
68
+ }
69
+ async get(path, params) {
70
+ return this.request(() => this.client.get(path, { params }));
71
+ }
72
+ async post(path, body) {
73
+ return this.request(() => this.client.post(path, body));
74
+ }
75
+ async request(send) {
76
+ let attempt = 0;
77
+ while (true) {
78
+ try {
79
+ const response = await send();
80
+ return response.data;
81
+ }
82
+ catch (e) {
83
+ const shouldRetry = attempt < this.retry.maxRetries && this.isRetryable(e);
84
+ if (!shouldRetry) {
85
+ this.handleError(e);
86
+ }
87
+ attempt += 1;
88
+ const delayMs = this.computeDelay(attempt, e);
89
+ this.retry.onRetry?.({
90
+ attempt,
91
+ delayMs,
92
+ status: this.getStatus(e),
93
+ error: e,
94
+ });
95
+ await sleep(delayMs);
96
+ }
97
+ }
98
+ }
99
+ isRetryable(e) {
100
+ if (!axios.isAxiosError(e))
101
+ return false;
102
+ const err = e;
103
+ if (err.response) {
104
+ return this.retry.retryStatusCodes.has(err.response.status);
105
+ }
106
+ if (err.code && RETRYABLE_NETWORK_CODES.has(err.code)) {
107
+ return true;
108
+ }
109
+ return Boolean(err.request);
110
+ }
111
+ getStatus(e) {
112
+ return axios.isAxiosError(e) ? e.response?.status : undefined;
113
+ }
114
+ computeDelay(attempt, e) {
115
+ const retryAfter = this.parseRetryAfter(e);
116
+ if (retryAfter !== null)
117
+ return retryAfter;
118
+ const exp = this.retry.initialDelayMs * 2 ** (attempt - 1);
119
+ const jitter = Math.floor(Math.random() * (this.retry.initialDelayMs / 2));
120
+ return Math.min(exp + jitter, this.retry.maxDelayMs);
121
+ }
122
+ parseRetryAfter(e) {
123
+ if (!axios.isAxiosError(e) || !e.response)
124
+ return null;
125
+ const header = e.response.headers?.['retry-after'];
126
+ if (typeof header !== 'string')
127
+ return null;
128
+ const seconds = Number(header);
129
+ if (Number.isFinite(seconds) && seconds >= 0)
130
+ return seconds * 1000;
131
+ const date = Date.parse(header);
132
+ if (Number.isFinite(date))
133
+ return Math.max(0, date - Date.now());
134
+ return null;
135
+ }
136
+ handleError(e) {
137
+ if (axios.isAxiosError(e) && e.response) {
138
+ const raw = e.response.data;
139
+ const body = typeof raw === 'object' && raw !== null && typeof raw.message === 'string'
140
+ ? raw
141
+ : {
142
+ code: 'unknown',
143
+ message: e.message,
144
+ request_id: e.response.headers?.['x-request-id'] ?? 'unknown',
145
+ };
146
+ throw new TaplineError(e.response.status, body);
147
+ }
148
+ throw e;
149
+ }
150
+ }
151
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { TaplineClientConfig } from './types.js';
2
+ export declare const DEFAULT_BASE_URL = "https://api.tapline.sh";
3
+ export declare class BaseClient {
4
+ private readonly client;
5
+ private readonly retry;
6
+ constructor(config?: TaplineClientConfig);
7
+ get<T>(path: string, params?: Record<string, unknown>): Promise<T>;
8
+ post<T>(path: string, body: unknown): Promise<T>;
9
+ private request;
10
+ private isRetryable;
11
+ private getStatus;
12
+ private computeDelay;
13
+ private parseRetryAfter;
14
+ private handleError;
15
+ }
16
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/base.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA6B,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGjF,eAAO,MAAM,gBAAgB,2BAA2B,CAAC;AAwDzD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;gBAEhC,MAAM,GAAE,mBAAwB;IAoBtC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIlE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;YAIxC,OAAO;IAwBrB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,WAAW;CAepB"}
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BaseClient = exports.DEFAULT_BASE_URL = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const lossless_json_1 = require("lossless-json");
9
+ const errors_js_1 = require("./errors.js");
10
+ exports.DEFAULT_BASE_URL = 'https://api.tapline.sh';
11
+ function materialiseNumber(value) {
12
+ if (value.indexOf('.') !== -1 || value.indexOf('e') !== -1 || value.indexOf('E') !== -1) {
13
+ return Number(value);
14
+ }
15
+ const n = Number(value);
16
+ return Number.isSafeInteger(n) ? n : value;
17
+ }
18
+ function parseResponseBody(data) {
19
+ if (typeof data !== 'string' || data.length === 0)
20
+ return data;
21
+ try {
22
+ return (0, lossless_json_1.parse)(data, undefined, materialiseNumber);
23
+ }
24
+ catch {
25
+ return data;
26
+ }
27
+ }
28
+ const DEFAULT_RETRY_STATUS_CODES = [408, 425, 429, 500, 502, 503, 504];
29
+ const RETRYABLE_NETWORK_CODES = new Set([
30
+ 'ECONNRESET',
31
+ 'ETIMEDOUT',
32
+ 'ECONNABORTED',
33
+ 'ECONNREFUSED',
34
+ 'EAI_AGAIN',
35
+ 'ENOTFOUND',
36
+ 'EPIPE',
37
+ ]);
38
+ function resolveRetryConfig(config) {
39
+ return {
40
+ maxRetries: config?.maxRetries ?? 3,
41
+ initialDelayMs: config?.initialDelayMs ?? 500,
42
+ maxDelayMs: config?.maxDelayMs ?? 8000,
43
+ retryStatusCodes: new Set(config?.retryStatusCodes ?? DEFAULT_RETRY_STATUS_CODES),
44
+ onRetry: config?.onRetry,
45
+ };
46
+ }
47
+ function sleep(ms) {
48
+ return new Promise((resolve) => setTimeout(resolve, ms));
49
+ }
50
+ function envVar(name) {
51
+ return typeof process === 'undefined' ? undefined : process.env[name];
52
+ }
53
+ class BaseClient {
54
+ client;
55
+ retry;
56
+ constructor(config = {}) {
57
+ const apiKey = config.apiKey ?? envVar('TAPLINE_API_KEY');
58
+ if (!apiKey)
59
+ throw new errors_js_1.MissingApiKeyError();
60
+ const baseUrl = config.baseUrl ?? envVar('TAPLINE_BASE_URL') ?? exports.DEFAULT_BASE_URL;
61
+ this.client = axios_1.default.create({
62
+ baseURL: baseUrl.replace(/\/+$/, ''),
63
+ headers: {
64
+ 'Content-Type': 'application/json',
65
+ 'X-API-Key': apiKey,
66
+ ...config.headers,
67
+ },
68
+ responseType: 'text',
69
+ transitional: { forcedJSONParsing: false },
70
+ transformResponse: [parseResponseBody],
71
+ paramsSerializer: { indexes: null },
72
+ });
73
+ this.retry = resolveRetryConfig(config.retry);
74
+ }
75
+ async get(path, params) {
76
+ return this.request(() => this.client.get(path, { params }));
77
+ }
78
+ async post(path, body) {
79
+ return this.request(() => this.client.post(path, body));
80
+ }
81
+ async request(send) {
82
+ let attempt = 0;
83
+ while (true) {
84
+ try {
85
+ const response = await send();
86
+ return response.data;
87
+ }
88
+ catch (e) {
89
+ const shouldRetry = attempt < this.retry.maxRetries && this.isRetryable(e);
90
+ if (!shouldRetry) {
91
+ this.handleError(e);
92
+ }
93
+ attempt += 1;
94
+ const delayMs = this.computeDelay(attempt, e);
95
+ this.retry.onRetry?.({
96
+ attempt,
97
+ delayMs,
98
+ status: this.getStatus(e),
99
+ error: e,
100
+ });
101
+ await sleep(delayMs);
102
+ }
103
+ }
104
+ }
105
+ isRetryable(e) {
106
+ if (!axios_1.default.isAxiosError(e))
107
+ return false;
108
+ const err = e;
109
+ if (err.response) {
110
+ return this.retry.retryStatusCodes.has(err.response.status);
111
+ }
112
+ if (err.code && RETRYABLE_NETWORK_CODES.has(err.code)) {
113
+ return true;
114
+ }
115
+ return Boolean(err.request);
116
+ }
117
+ getStatus(e) {
118
+ return axios_1.default.isAxiosError(e) ? e.response?.status : undefined;
119
+ }
120
+ computeDelay(attempt, e) {
121
+ const retryAfter = this.parseRetryAfter(e);
122
+ if (retryAfter !== null)
123
+ return retryAfter;
124
+ const exp = this.retry.initialDelayMs * 2 ** (attempt - 1);
125
+ const jitter = Math.floor(Math.random() * (this.retry.initialDelayMs / 2));
126
+ return Math.min(exp + jitter, this.retry.maxDelayMs);
127
+ }
128
+ parseRetryAfter(e) {
129
+ if (!axios_1.default.isAxiosError(e) || !e.response)
130
+ return null;
131
+ const header = e.response.headers?.['retry-after'];
132
+ if (typeof header !== 'string')
133
+ return null;
134
+ const seconds = Number(header);
135
+ if (Number.isFinite(seconds) && seconds >= 0)
136
+ return seconds * 1000;
137
+ const date = Date.parse(header);
138
+ if (Number.isFinite(date))
139
+ return Math.max(0, date - Date.now());
140
+ return null;
141
+ }
142
+ handleError(e) {
143
+ if (axios_1.default.isAxiosError(e) && e.response) {
144
+ const raw = e.response.data;
145
+ const body = typeof raw === 'object' && raw !== null && typeof raw.message === 'string'
146
+ ? raw
147
+ : {
148
+ code: 'unknown',
149
+ message: e.message,
150
+ request_id: e.response.headers?.['x-request-id'] ?? 'unknown',
151
+ };
152
+ throw new errors_js_1.TaplineError(e.response.status, body);
153
+ }
154
+ throw e;
155
+ }
156
+ }
157
+ exports.BaseClient = BaseClient;
158
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/base.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAuF;AACvF,iDAAuD;AAEvD,2CAA+D;AAElD,QAAA,gBAAgB,GAAG,wBAAwB,CAAC;AAEzD,SAAS,iBAAiB,CAAC,KAAa;IACtC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACxF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7C,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa;IACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,CAAC;QACH,OAAO,IAAA,qBAAa,EAAC,IAAI,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,0BAA0B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACvE,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,YAAY;IACZ,WAAW;IACX,cAAc;IACd,cAAc;IACd,WAAW;IACX,WAAW;IACX,OAAO;CACR,CAAC,CAAC;AAUH,SAAS,kBAAkB,CAAC,MAA+B;IACzD,OAAO;QACL,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,CAAC;QACnC,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,GAAG;QAC7C,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,IAAI;QACtC,gBAAgB,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,gBAAgB,IAAI,0BAA0B,CAAC;QACjF,OAAO,EAAE,MAAM,EAAE,OAAO;KACzB,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,MAAa,UAAU;IACJ,MAAM,CAAgB;IACtB,KAAK,CAAsB;IAE5C,YAAY,SAA8B,EAAE;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,8BAAkB,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,kBAAkB,CAAC,IAAI,wBAAgB,CAAC;QAEjF,IAAI,CAAC,MAAM,GAAG,eAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACpC,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,MAAM;gBACnB,GAAG,MAAM,CAAC,OAAO;aAClB;YACD,YAAY,EAAE,MAAM;YACpB,YAAY,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE;YAC1C,iBAAiB,EAAE,CAAC,iBAAiB,CAAC;YACtC,gBAAgB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,IAAY,EAAE,MAAgC;QACzD,OAAO,IAAI,CAAC,OAAO,CAAI,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAI,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,IAAa;QACvC,OAAO,IAAI,CAAC,OAAO,CAAI,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAI,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,IAAqC;QAC5D,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC;gBAC9B,OAAO,QAAQ,CAAC,IAAI,CAAC;YACvB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,WAAW,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC3E,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBACtB,CAAC;gBACD,OAAO,IAAI,CAAC,CAAC;gBACb,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;oBACnB,OAAO;oBACP,OAAO;oBACP,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;oBACzB,KAAK,EAAE,CAAC;iBACT,CAAC,CAAC;gBACH,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,CAAU;QAC5B,IAAI,CAAC,eAAK,CAAC,YAAY,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACzC,MAAM,GAAG,GAAG,CAAe,CAAC;QAC5B,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,IAAI,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAEO,SAAS,CAAC,CAAU;QAC1B,OAAO,eAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,CAAC;IAEO,YAAY,CAAC,OAAe,EAAE,CAAU;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,UAAU,KAAK,IAAI;YAAE,OAAO,UAAU,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC;IAEO,eAAe,CAAC,CAAU;QAChC,IAAI,CAAC,eAAK,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QACvD,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,CAAC;QACnD,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC;YAAE,OAAO,OAAO,GAAG,IAAI,CAAC;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,WAAW,CAAC,CAAU;QAC5B,IAAI,eAAK,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC5B,MAAM,IAAI,GACR,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;gBACxE,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC;oBACE,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC,IAAI,SAAS;iBAC9D,CAAC;YACR,MAAM,IAAI,wBAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;CACF;AA1GD,gCA0GC"}
@@ -0,0 +1,11 @@
1
+ import type { TaplineClientConfig } from './types.js';
2
+ import { AirbnbClient } from './services/airbnb/client.js';
3
+ import { YoutubeClient } from './services/youtube/client.js';
4
+ import { GmgnClient } from './services/gmgn/client.js';
5
+ export declare class TaplineClient {
6
+ readonly airbnb: AirbnbClient;
7
+ readonly youtube: YoutubeClient;
8
+ readonly gmgn: GmgnClient;
9
+ constructor(config?: TaplineClientConfig);
10
+ }
11
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,qBAAa,aAAa;IACxB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;gBAEd,MAAM,GAAE,mBAAwB;CAM7C"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ // Generated by generate-client from spec/openapi.json. Do not edit.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.TaplineClient = void 0;
5
+ const base_js_1 = require("./base.js");
6
+ const client_js_1 = require("./services/airbnb/client.js");
7
+ const client_js_2 = require("./services/youtube/client.js");
8
+ const client_js_3 = require("./services/gmgn/client.js");
9
+ class TaplineClient {
10
+ airbnb;
11
+ youtube;
12
+ gmgn;
13
+ constructor(config = {}) {
14
+ const base = new base_js_1.BaseClient(config);
15
+ this.airbnb = new client_js_1.AirbnbClient(base);
16
+ this.youtube = new client_js_2.YoutubeClient(base);
17
+ this.gmgn = new client_js_3.GmgnClient(base);
18
+ }
19
+ }
20
+ exports.TaplineClient = TaplineClient;
21
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":";AAAA,oEAAoE;;;AAEpE,uCAAuC;AAEvC,2DAA2D;AAC3D,4DAA6D;AAC7D,yDAAuD;AAEvD,MAAa,aAAa;IACf,MAAM,CAAe;IACrB,OAAO,CAAgB;IACvB,IAAI,CAAa;IAE1B,YAAY,SAA8B,EAAE;QAC1C,MAAM,IAAI,GAAG,IAAI,oBAAU,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,wBAAY,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,yBAAa,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,sBAAU,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACF;AAXD,sCAWC"}
@@ -0,0 +1,13 @@
1
+ import type { ApiErrorBody } from './types.js';
2
+ export declare class TaplineError extends Error {
3
+ readonly status: number;
4
+ readonly code: string;
5
+ readonly requestId: string;
6
+ readonly domain: string | undefined;
7
+ readonly details: unknown;
8
+ constructor(status: number, body: ApiErrorBody);
9
+ }
10
+ export declare class MissingApiKeyError extends Error {
11
+ constructor();
12
+ }
13
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAEd,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY;CAS/C;AAED,qBAAa,kBAAmB,SAAQ,KAAK;;CAK5C"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MissingApiKeyError = exports.TaplineError = void 0;
4
+ class TaplineError extends Error {
5
+ status;
6
+ code;
7
+ requestId;
8
+ domain;
9
+ details;
10
+ constructor(status, body) {
11
+ super(body.message);
12
+ this.name = 'TaplineError';
13
+ this.status = status;
14
+ this.code = body.code;
15
+ this.requestId = body.request_id;
16
+ this.domain = body.domain;
17
+ this.details = body.details;
18
+ }
19
+ }
20
+ exports.TaplineError = TaplineError;
21
+ class MissingApiKeyError extends Error {
22
+ constructor() {
23
+ super('No API key supplied. Pass apiKey when constructing the client, or set TAPLINE_API_KEY.');
24
+ this.name = 'MissingApiKeyError';
25
+ }
26
+ }
27
+ exports.MissingApiKeyError = MissingApiKeyError;
28
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AAEA,MAAa,YAAa,SAAQ,KAAK;IAC5B,MAAM,CAAS;IACf,IAAI,CAAS;IACb,SAAS,CAAS;IAClB,MAAM,CAAqB;IAC3B,OAAO,CAAU;IAE1B,YAAY,MAAc,EAAE,IAAkB;QAC5C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,CAAC;CACF;AAhBD,oCAgBC;AAED,MAAa,kBAAmB,SAAQ,KAAK;IAC3C;QACE,KAAK,CAAC,wFAAwF,CAAC,CAAC;QAChG,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC"}
@@ -0,0 +1,11 @@
1
+ export { TaplineClient } from './client.js';
2
+ export { BaseClient, DEFAULT_BASE_URL } from './base.js';
3
+ export { MissingApiKeyError, TaplineError } from './errors.js';
4
+ export type { ApiErrorBody, RetryConfig, TaplineClientConfig } from './types.js';
5
+ export { AirbnbClient } from './services/airbnb/client.js';
6
+ export { YoutubeClient } from './services/youtube/client.js';
7
+ export { GmgnClient } from './services/gmgn/client.js';
8
+ export * as airbnb from './services/airbnb/index.js';
9
+ export * as youtube from './services/youtube/index.js';
10
+ export * as gmgn from './services/gmgn/index.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,MAAM,MAAM,4BAA4B,CAAC;AACrD,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAC;AACvD,OAAO,KAAK,IAAI,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ // Generated by generate-client from spec/openapi.json. Do not edit.
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.gmgn = exports.youtube = exports.airbnb = exports.GmgnClient = exports.YoutubeClient = exports.AirbnbClient = exports.TaplineError = exports.MissingApiKeyError = exports.DEFAULT_BASE_URL = exports.BaseClient = exports.TaplineClient = void 0;
38
+ var client_js_1 = require("./client.js");
39
+ Object.defineProperty(exports, "TaplineClient", { enumerable: true, get: function () { return client_js_1.TaplineClient; } });
40
+ var base_js_1 = require("./base.js");
41
+ Object.defineProperty(exports, "BaseClient", { enumerable: true, get: function () { return base_js_1.BaseClient; } });
42
+ Object.defineProperty(exports, "DEFAULT_BASE_URL", { enumerable: true, get: function () { return base_js_1.DEFAULT_BASE_URL; } });
43
+ var errors_js_1 = require("./errors.js");
44
+ Object.defineProperty(exports, "MissingApiKeyError", { enumerable: true, get: function () { return errors_js_1.MissingApiKeyError; } });
45
+ Object.defineProperty(exports, "TaplineError", { enumerable: true, get: function () { return errors_js_1.TaplineError; } });
46
+ var client_js_2 = require("./services/airbnb/client.js");
47
+ Object.defineProperty(exports, "AirbnbClient", { enumerable: true, get: function () { return client_js_2.AirbnbClient; } });
48
+ var client_js_3 = require("./services/youtube/client.js");
49
+ Object.defineProperty(exports, "YoutubeClient", { enumerable: true, get: function () { return client_js_3.YoutubeClient; } });
50
+ var client_js_4 = require("./services/gmgn/client.js");
51
+ Object.defineProperty(exports, "GmgnClient", { enumerable: true, get: function () { return client_js_4.GmgnClient; } });
52
+ exports.airbnb = __importStar(require("./services/airbnb/index.js"));
53
+ exports.youtube = __importStar(require("./services/youtube/index.js"));
54
+ exports.gmgn = __importStar(require("./services/gmgn/index.js"));
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,oEAAoE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEpE,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AACtB,qCAAyD;AAAhD,qGAAA,UAAU,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AACrC,yCAA+D;AAAtD,+GAAA,kBAAkB,OAAA;AAAE,yGAAA,YAAY,OAAA;AAEzC,yDAA2D;AAAlD,yGAAA,YAAY,OAAA;AACrB,0DAA6D;AAApD,0GAAA,aAAa,OAAA;AACtB,uDAAuD;AAA9C,uGAAA,UAAU,OAAA;AACnB,qEAAqD;AACrD,uEAAuD;AACvD,iEAAiD"}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,19 @@
1
+ import type { BaseClient } from '../../base.js';
2
+ import type { GetCalendarRequest, GetDetailsRequest, GetPriceRequest, GetReviewsRequest, ParsedAutocompleteResponse, ParsedCalendarResponse, ParsedDetailsResponse, ParsedPriceResponse, ParsedReviewsResponse, ParsedSearchResponse, SearchLocationsParams, SearchRequest } from './types.js';
3
+ export declare class AirbnbClient {
4
+ private readonly base;
5
+ constructor(base: BaseClient);
6
+ /** Check the availability of an Airbnb listing by month. Costs 1 credit. */
7
+ getCalendar(body: GetCalendarRequest): Promise<ParsedCalendarResponse>;
8
+ /** Get details about an Airbnb listing. Costs 5 credits. */
9
+ getDetails(body: GetDetailsRequest): Promise<ParsedDetailsResponse>;
10
+ /** Find Airbnb locations matching a text query. Costs 1 credit. */
11
+ searchLocations(params: SearchLocationsParams): Promise<ParsedAutocompleteResponse>;
12
+ /** Get the price for an Airbnb listing over a date range. Costs 2 credits. */
13
+ getPrice(body: GetPriceRequest): Promise<ParsedPriceResponse>;
14
+ /** Get reviews for an Airbnb listing. Costs 2 credits. */
15
+ getReviews(body: GetReviewsRequest): Promise<ParsedReviewsResponse>;
16
+ /** Search for Airbnb listings within a radius, by place ID, or by text query. Costs 5 credits. */
17
+ search(body: SearchRequest): Promise<ParsedSearchResponse>;
18
+ }
19
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/services/airbnb/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/R,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAE7C,4EAA4E;IACtE,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAI5E,4DAA4D;IACtD,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIzE,mEAAmE;IAC7D,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAIzF,8EAA8E;IACxE,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAInE,0DAA0D;IACpD,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIzE,kGAAkG;IAC5F,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAGjE"}