@opensea/cli 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,18 +1,47 @@
1
1
  // src/client.ts
2
2
  var DEFAULT_BASE_URL = "https://api.opensea.io";
3
3
  var DEFAULT_TIMEOUT_MS = 3e4;
4
+ var USER_AGENT = `opensea-cli/${"0.4.2"}`;
5
+ var DEFAULT_MAX_RETRIES = 0;
6
+ var DEFAULT_RETRY_BASE_DELAY_MS = 1e3;
7
+ function isRetryableStatus(status, method) {
8
+ if (status === 429) return true;
9
+ return status >= 500 && method === "GET";
10
+ }
11
+ function parseRetryAfter(header) {
12
+ if (!header) return void 0;
13
+ const seconds = Number(header);
14
+ if (!Number.isNaN(seconds)) return seconds * 1e3;
15
+ const date = Date.parse(header);
16
+ if (!Number.isNaN(date)) return Math.max(0, date - Date.now());
17
+ return void 0;
18
+ }
19
+ function sleep(ms) {
20
+ return new Promise((resolve) => setTimeout(resolve, ms));
21
+ }
4
22
  var OpenSeaClient = class {
5
23
  apiKey;
6
24
  baseUrl;
7
25
  defaultChain;
8
26
  timeoutMs;
9
27
  verbose;
28
+ maxRetries;
29
+ retryBaseDelay;
10
30
  constructor(config) {
11
31
  this.apiKey = config.apiKey;
12
32
  this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
13
33
  this.defaultChain = config.chain ?? "ethereum";
14
34
  this.timeoutMs = config.timeout ?? DEFAULT_TIMEOUT_MS;
15
35
  this.verbose = config.verbose ?? false;
36
+ this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;
37
+ this.retryBaseDelay = config.retryBaseDelay ?? DEFAULT_RETRY_BASE_DELAY_MS;
38
+ }
39
+ get defaultHeaders() {
40
+ return {
41
+ Accept: "application/json",
42
+ "User-Agent": USER_AGENT,
43
+ "x-api-key": this.apiKey
44
+ };
16
45
  }
17
46
  async get(path, params) {
18
47
  const url = new URL(`${this.baseUrl}${path}`);
@@ -26,21 +55,14 @@ var OpenSeaClient = class {
26
55
  if (this.verbose) {
27
56
  console.error(`[verbose] GET ${url.toString()}`);
28
57
  }
29
- const response = await fetch(url.toString(), {
30
- method: "GET",
31
- headers: {
32
- Accept: "application/json",
33
- "x-api-key": this.apiKey
58
+ const response = await this.fetchWithRetry(
59
+ url.toString(),
60
+ {
61
+ method: "GET",
62
+ headers: this.defaultHeaders
34
63
  },
35
- signal: AbortSignal.timeout(this.timeoutMs)
36
- });
37
- if (this.verbose) {
38
- console.error(`[verbose] ${response.status} ${response.statusText}`);
39
- }
40
- if (!response.ok) {
41
- const body = await response.text();
42
- throw new OpenSeaAPIError(response.status, body, path);
43
- }
64
+ path
65
+ );
44
66
  return response.json();
45
67
  }
46
68
  async post(path, body, params) {
@@ -52,34 +74,67 @@ var OpenSeaClient = class {
52
74
  }
53
75
  }
54
76
  }
55
- const headers = {
56
- Accept: "application/json",
57
- "x-api-key": this.apiKey
58
- };
77
+ const headers = { ...this.defaultHeaders };
59
78
  if (body) {
60
79
  headers["Content-Type"] = "application/json";
61
80
  }
62
81
  if (this.verbose) {
63
82
  console.error(`[verbose] POST ${url.toString()}`);
64
83
  }
65
- const response = await fetch(url.toString(), {
66
- method: "POST",
67
- headers,
68
- body: body ? JSON.stringify(body) : void 0,
69
- signal: AbortSignal.timeout(this.timeoutMs)
70
- });
71
- if (this.verbose) {
72
- console.error(`[verbose] ${response.status} ${response.statusText}`);
73
- }
74
- if (!response.ok) {
75
- const text = await response.text();
76
- throw new OpenSeaAPIError(response.status, text, path);
77
- }
84
+ const response = await this.fetchWithRetry(
85
+ url.toString(),
86
+ {
87
+ method: "POST",
88
+ headers,
89
+ body: body ? JSON.stringify(body) : void 0
90
+ },
91
+ path
92
+ );
78
93
  return response.json();
79
94
  }
80
95
  getDefaultChain() {
81
96
  return this.defaultChain;
82
97
  }
98
+ getApiKeyPrefix() {
99
+ if (this.apiKey.length < 8) return "***";
100
+ return `${this.apiKey.slice(0, 4)}...`;
101
+ }
102
+ async fetchWithRetry(url, init, path) {
103
+ for (let attempt = 0; ; attempt++) {
104
+ const response = await fetch(url, {
105
+ ...init,
106
+ signal: AbortSignal.timeout(this.timeoutMs)
107
+ });
108
+ if (this.verbose) {
109
+ console.error(`[verbose] ${response.status} ${response.statusText}`);
110
+ }
111
+ if (response.ok) {
112
+ return response;
113
+ }
114
+ const method = init.method ?? "GET";
115
+ if (attempt < this.maxRetries && isRetryableStatus(response.status, method)) {
116
+ const retryAfterMs = parseRetryAfter(
117
+ response.headers.get("Retry-After")
118
+ );
119
+ const backoffMs = this.retryBaseDelay * 2 ** attempt;
120
+ const jitterMs = Math.random() * this.retryBaseDelay;
121
+ const delayMs = Math.max(retryAfterMs ?? 0, backoffMs) + jitterMs;
122
+ if (this.verbose) {
123
+ console.error(
124
+ `[verbose] Retry ${attempt + 1}/${this.maxRetries} after ${Math.round(delayMs)}ms (status ${response.status})`
125
+ );
126
+ }
127
+ try {
128
+ await response.body?.cancel();
129
+ } catch {
130
+ }
131
+ await sleep(delayMs);
132
+ continue;
133
+ }
134
+ const text = await response.text();
135
+ throw new OpenSeaAPIError(response.status, text, path);
136
+ }
137
+ }
83
138
  };
84
139
  var OpenSeaAPIError = class extends Error {
85
140
  constructor(statusCode, responseBody, path) {
@@ -91,6 +146,68 @@ var OpenSeaAPIError = class extends Error {
91
146
  }
92
147
  };
93
148
 
149
+ // src/health.ts
150
+ async function checkHealth(client) {
151
+ const keyPrefix = client.getApiKeyPrefix();
152
+ try {
153
+ await client.get("/api/v2/collections", { limit: 1 });
154
+ } catch (error) {
155
+ let message;
156
+ if (error instanceof OpenSeaAPIError) {
157
+ message = error.statusCode === 429 ? "Rate limited: too many requests" : `API error (${error.statusCode}): ${error.responseBody}`;
158
+ } else {
159
+ message = `Network error: ${error.message}`;
160
+ }
161
+ return {
162
+ status: "error",
163
+ key_prefix: keyPrefix,
164
+ authenticated: false,
165
+ rate_limited: error instanceof OpenSeaAPIError && error.statusCode === 429,
166
+ message
167
+ };
168
+ }
169
+ try {
170
+ await client.get("/api/v2/listings/collection/boredapeyachtclub/all", {
171
+ limit: 1
172
+ });
173
+ return {
174
+ status: "ok",
175
+ key_prefix: keyPrefix,
176
+ authenticated: true,
177
+ rate_limited: false,
178
+ message: "Connectivity and authentication are working"
179
+ };
180
+ } catch (error) {
181
+ if (error instanceof OpenSeaAPIError) {
182
+ if (error.statusCode === 429) {
183
+ return {
184
+ status: "error",
185
+ key_prefix: keyPrefix,
186
+ authenticated: false,
187
+ rate_limited: true,
188
+ message: "Rate limited: too many requests"
189
+ };
190
+ }
191
+ if (error.statusCode === 401 || error.statusCode === 403) {
192
+ return {
193
+ status: "error",
194
+ key_prefix: keyPrefix,
195
+ authenticated: false,
196
+ rate_limited: false,
197
+ message: `Authentication failed (${error.statusCode}): invalid API key`
198
+ };
199
+ }
200
+ }
201
+ return {
202
+ status: "ok",
203
+ key_prefix: keyPrefix,
204
+ authenticated: false,
205
+ rate_limited: false,
206
+ message: "Connectivity is working but authentication could not be verified"
207
+ };
208
+ }
209
+ }
210
+
94
211
  // src/toon.ts
95
212
  var INDENT = " ";
96
213
  var NUMERIC_RE = /^-?\d+(?:\.\d+)?(?:e[+-]?\d+)?$/i;
@@ -362,14 +479,21 @@ function formatToon(data) {
362
479
  }
363
480
 
364
481
  // src/output.ts
482
+ var _outputOptions = {};
365
483
  function formatOutput(data, format) {
484
+ const processed = _outputOptions.fields ? filterFields(data, _outputOptions.fields) : data;
485
+ let result;
366
486
  if (format === "table") {
367
- return formatTable(data);
487
+ result = formatTable(processed);
488
+ } else if (format === "toon") {
489
+ result = formatToon(processed);
490
+ } else {
491
+ result = JSON.stringify(processed, null, 2);
368
492
  }
369
- if (format === "toon") {
370
- return formatToon(data);
493
+ if (_outputOptions.maxLines != null) {
494
+ result = truncateOutput(result, _outputOptions.maxLines);
371
495
  }
372
- return JSON.stringify(data, null, 2);
496
+ return result;
373
497
  }
374
498
  function formatTable(data) {
375
499
  if (Array.isArray(data)) {
@@ -405,6 +529,31 @@ function formatTable(data) {
405
529
  }
406
530
  return String(data);
407
531
  }
532
+ function pickFields(obj, fields) {
533
+ const result = {};
534
+ for (const field of fields) {
535
+ if (field in obj) {
536
+ result[field] = obj[field];
537
+ }
538
+ }
539
+ return result;
540
+ }
541
+ function filterFields(data, fields) {
542
+ if (Array.isArray(data)) {
543
+ return data.map((item) => filterFields(item, fields));
544
+ }
545
+ if (data && typeof data === "object") {
546
+ return pickFields(data, fields);
547
+ }
548
+ return data;
549
+ }
550
+ function truncateOutput(text, maxLines) {
551
+ const lines = text.split("\n");
552
+ if (lines.length <= maxLines) return text;
553
+ const omitted = lines.length - maxLines;
554
+ return lines.slice(0, maxLines).join("\n") + `
555
+ ... (${omitted} more line${omitted === 1 ? "" : "s"})`;
556
+ }
408
557
 
409
558
  // src/sdk.ts
410
559
  var OpenSeaCLI = class {
@@ -418,6 +567,7 @@ var OpenSeaCLI = class {
418
567
  tokens;
419
568
  search;
420
569
  swaps;
570
+ health;
421
571
  constructor(config) {
422
572
  this.client = new OpenSeaClient(config);
423
573
  this.collections = new CollectionsAPI(this.client);
@@ -429,6 +579,7 @@ var OpenSeaCLI = class {
429
579
  this.tokens = new TokensAPI(this.client);
430
580
  this.search = new SearchAPI(this.client);
431
581
  this.swaps = new SwapsAPI(this.client);
582
+ this.health = new HealthAPI(this.client);
432
583
  }
433
584
  };
434
585
  var CollectionsAPI = class {
@@ -646,10 +797,19 @@ var SwapsAPI = class {
646
797
  });
647
798
  }
648
799
  };
800
+ var HealthAPI = class {
801
+ constructor(client) {
802
+ this.client = client;
803
+ }
804
+ async check() {
805
+ return checkHealth(this.client);
806
+ }
807
+ };
649
808
  export {
650
809
  OpenSeaAPIError,
651
810
  OpenSeaCLI,
652
811
  OpenSeaClient,
812
+ checkHealth,
653
813
  formatOutput,
654
814
  formatToon
655
815
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/toon.ts","../src/output.ts","../src/sdk.ts"],"sourcesContent":["import type { OpenSeaClientConfig } from \"./types/index.js\"\n\nconst DEFAULT_BASE_URL = \"https://api.opensea.io\"\nconst DEFAULT_TIMEOUT_MS = 30_000\n\nexport class OpenSeaClient {\n private apiKey: string\n private baseUrl: string\n private defaultChain: string\n private timeoutMs: number\n private verbose: boolean\n\n constructor(config: OpenSeaClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n this.defaultChain = config.chain ?? \"ethereum\"\n this.timeoutMs = config.timeout ?? DEFAULT_TIMEOUT_MS\n this.verbose = config.verbose ?? false\n }\n\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n if (this.verbose) {\n console.error(`[verbose] GET ${url.toString()}`)\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async post<T>(\n path: string,\n body?: Record<string, unknown>,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n }\n\n if (body) {\n headers[\"Content-Type\"] = \"application/json\"\n }\n\n if (this.verbose) {\n console.error(`[verbose] POST ${url.toString()}`)\n }\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (!response.ok) {\n const text = await response.text()\n throw new OpenSeaAPIError(response.status, text, path)\n }\n\n return response.json() as Promise<T>\n }\n\n getDefaultChain(): string {\n return this.defaultChain\n }\n}\n\nexport class OpenSeaAPIError extends Error {\n constructor(\n public statusCode: number,\n public responseBody: string,\n public path: string,\n ) {\n super(`OpenSea API error ${statusCode} on ${path}: ${responseBody}`)\n this.name = \"OpenSeaAPIError\"\n }\n}\n","const INDENT = \" \"\n\nconst NUMERIC_RE = /^-?\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?$/i\nconst LEADING_ZERO_RE = /^0\\d+$/\nconst UNQUOTED_KEY_RE = /^[A-Za-z_][A-Za-z0-9_.]*$/\n\nfunction escapeString(s: string): string {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\")\n}\n\nfunction needsQuoting(value: string, delimiter: string): boolean {\n if (value === \"\") return true\n if (value !== value.trim()) return true\n if (value === \"true\" || value === \"false\" || value === \"null\") return true\n if (NUMERIC_RE.test(value) || LEADING_ZERO_RE.test(value)) return true\n if (/[:\"\\\\[\\]{}]/.test(value)) return true\n if (/[\\n\\r\\t]/.test(value)) return true\n if (value.includes(delimiter)) return true\n if (value.startsWith(\"-\")) return true\n return false\n}\n\nfunction encodeKey(key: string): string {\n if (UNQUOTED_KEY_RE.test(key)) return key\n return `\"${escapeString(key)}\"`\n}\n\nfunction encodePrimitive(value: unknown, delimiter: string): string {\n if (value === null) return \"null\"\n if (value === undefined) return \"null\"\n if (typeof value === \"boolean\") return String(value)\n if (typeof value === \"number\") return String(value)\n if (typeof value === \"string\") {\n if (needsQuoting(value, delimiter)) {\n return `\"${escapeString(value)}\"`\n }\n return value\n }\n return `\"${escapeString(String(value))}\"`\n}\n\nfunction isPrimitive(value: unknown): boolean {\n return (\n value === null ||\n value === undefined ||\n typeof value === \"boolean\" ||\n typeof value === \"number\" ||\n typeof value === \"string\"\n )\n}\n\nfunction isTabular(arr: unknown[]): boolean {\n if (arr.length === 0) return false\n const first = arr[0]\n if (first === null || typeof first !== \"object\" || Array.isArray(first))\n return false\n const keys = Object.keys(first as Record<string, unknown>).sort()\n for (const item of arr) {\n if (item === null || typeof item !== \"object\" || Array.isArray(item))\n return false\n const itemKeys = Object.keys(item as Record<string, unknown>).sort()\n if (itemKeys.length !== keys.length) return false\n for (let i = 0; i < keys.length; i++) {\n if (itemKeys[i] !== keys[i]) return false\n }\n for (const k of keys) {\n if (!isPrimitive((item as Record<string, unknown>)[k])) return false\n }\n }\n return true\n}\n\nfunction isPrimitiveArray(arr: unknown[]): boolean {\n return arr.every(isPrimitive)\n}\n\nfunction encodeValue(value: unknown, depth: number, delimiter: string): string {\n if (isPrimitive(value)) {\n return encodePrimitive(value, delimiter)\n }\n\n if (Array.isArray(value)) {\n return encodeArray(value, depth, delimiter)\n }\n\n if (typeof value === \"object\" && value !== null) {\n return encodeObject(value as Record<string, unknown>, depth, delimiter)\n }\n\n return encodePrimitive(value, delimiter)\n}\n\nfunction encodeObject(\n obj: Record<string, unknown>,\n depth: number,\n delimiter: string,\n): string {\n const entries = Object.entries(obj)\n if (entries.length === 0) return \"\"\n\n const lines: string[] = []\n const prefix = INDENT.repeat(depth)\n\n for (const [key, value] of entries) {\n const encodedKey = encodeKey(key)\n\n if (isPrimitive(value)) {\n lines.push(`${prefix}${encodedKey}: ${encodePrimitive(value, delimiter)}`)\n } else if (Array.isArray(value)) {\n lines.push(encodeArrayField(encodedKey, value, depth, delimiter))\n } else if (typeof value === \"object\" && value !== null) {\n const nested = value as Record<string, unknown>\n if (Object.keys(nested).length === 0) {\n lines.push(`${prefix}${encodedKey}:`)\n } else {\n lines.push(`${prefix}${encodedKey}:`)\n lines.push(encodeObject(nested, depth + 1, delimiter))\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nfunction encodeArrayField(\n encodedKey: string,\n arr: unknown[],\n depth: number,\n delimiter: string,\n): string {\n const prefix = INDENT.repeat(depth)\n\n if (arr.length === 0) {\n return `${prefix}${encodedKey}[0]:`\n }\n\n if (isPrimitiveArray(arr)) {\n const values = arr.map(v => encodePrimitive(v, delimiter)).join(delimiter)\n return `${prefix}${encodedKey}[${arr.length}]: ${values}`\n }\n\n if (isTabular(arr)) {\n const firstObj = arr[0] as Record<string, unknown>\n const fields = Object.keys(firstObj)\n const fieldHeader = fields.map(encodeKey).join(delimiter)\n const lines: string[] = []\n lines.push(`${prefix}${encodedKey}[${arr.length}]{${fieldHeader}}:`)\n const rowPrefix = INDENT.repeat(depth + 1)\n for (const item of arr) {\n const obj = item as Record<string, unknown>\n const row = fields\n .map(f => encodePrimitive(obj[f], delimiter))\n .join(delimiter)\n lines.push(`${rowPrefix}${row}`)\n }\n return lines.join(\"\\n\")\n }\n\n return encodeExpandedList(encodedKey, arr, depth, delimiter)\n}\n\nfunction encodeExpandedList(\n encodedKey: string,\n arr: unknown[],\n depth: number,\n delimiter: string,\n): string {\n const prefix = INDENT.repeat(depth)\n const itemPrefix = INDENT.repeat(depth + 1)\n const lines: string[] = []\n lines.push(`${prefix}${encodedKey}[${arr.length}]:`)\n\n for (const item of arr) {\n if (isPrimitive(item)) {\n lines.push(`${itemPrefix}- ${encodePrimitive(item, delimiter)}`)\n } else if (Array.isArray(item)) {\n if (isPrimitiveArray(item)) {\n const values = item\n .map(v => encodePrimitive(v, delimiter))\n .join(delimiter)\n lines.push(`${itemPrefix}- [${item.length}]: ${values}`)\n } else {\n lines.push(`${itemPrefix}- [${item.length}]:`)\n for (const inner of item) {\n lines.push(encodeValue(inner, depth + 2, delimiter))\n }\n }\n } else if (typeof item === \"object\" && item !== null) {\n const obj = item as Record<string, unknown>\n const entries = Object.entries(obj)\n if (entries.length === 0) {\n lines.push(`${itemPrefix}-`)\n } else {\n const [firstKey, firstValue] = entries[0]\n const ek = encodeKey(firstKey)\n\n if (Array.isArray(firstValue)) {\n const arrayLine = encodeArrayField(ek, firstValue, 0, delimiter)\n lines.push(`${itemPrefix}- ${arrayLine.trimStart()}`)\n } else if (isPrimitive(firstValue)) {\n lines.push(\n `${itemPrefix}- ${ek}: ${encodePrimitive(firstValue, delimiter)}`,\n )\n } else {\n lines.push(`${itemPrefix}- ${ek}:`)\n lines.push(\n encodeObject(\n firstValue as Record<string, unknown>,\n depth + 2,\n delimiter,\n ),\n )\n }\n\n for (let i = 1; i < entries.length; i++) {\n const [k, v] = entries[i]\n const encodedK = encodeKey(k)\n if (isPrimitive(v)) {\n lines.push(\n `${INDENT.repeat(depth + 2)}${encodedK}: ${encodePrimitive(v, delimiter)}`,\n )\n } else if (Array.isArray(v)) {\n lines.push(encodeArrayField(encodedK, v, depth + 2, delimiter))\n } else if (typeof v === \"object\" && v !== null) {\n lines.push(`${INDENT.repeat(depth + 2)}${encodedK}:`)\n lines.push(\n encodeObject(v as Record<string, unknown>, depth + 3, delimiter),\n )\n }\n }\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nfunction encodeArray(arr: unknown[], depth: number, delimiter: string): string {\n const prefix = INDENT.repeat(depth)\n\n if (arr.length === 0) {\n return `${prefix}[0]:`\n }\n\n if (isPrimitiveArray(arr)) {\n const values = arr.map(v => encodePrimitive(v, delimiter)).join(delimiter)\n return `${prefix}[${arr.length}]: ${values}`\n }\n\n if (isTabular(arr)) {\n const firstObj = arr[0] as Record<string, unknown>\n const fields = Object.keys(firstObj)\n const fieldHeader = fields.map(encodeKey).join(delimiter)\n const lines: string[] = []\n lines.push(`${prefix}[${arr.length}]{${fieldHeader}}:`)\n const rowPrefix = INDENT.repeat(depth + 1)\n for (const item of arr) {\n const obj = item as Record<string, unknown>\n const row = fields\n .map(f => encodePrimitive(obj[f], delimiter))\n .join(delimiter)\n lines.push(`${rowPrefix}${row}`)\n }\n return lines.join(\"\\n\")\n }\n\n const lines: string[] = []\n lines.push(`${prefix}[${arr.length}]:`)\n const itemPrefix = INDENT.repeat(depth + 1)\n for (const item of arr) {\n if (isPrimitive(item)) {\n lines.push(`${itemPrefix}- ${encodePrimitive(item, delimiter)}`)\n } else if (Array.isArray(item)) {\n if (isPrimitiveArray(item)) {\n const values = item\n .map(v => encodePrimitive(v, delimiter))\n .join(delimiter)\n lines.push(`${itemPrefix}- [${item.length}]: ${values}`)\n } else {\n lines.push(`${itemPrefix}- [${item.length}]:`)\n }\n } else if (typeof item === \"object\" && item !== null) {\n const obj = item as Record<string, unknown>\n const entries = Object.entries(obj)\n if (entries.length > 0) {\n const [firstKey, firstValue] = entries[0]\n const ek = encodeKey(firstKey)\n if (isPrimitive(firstValue)) {\n lines.push(\n `${itemPrefix}- ${ek}: ${encodePrimitive(firstValue, delimiter)}`,\n )\n } else {\n lines.push(`${itemPrefix}- ${ek}:`)\n lines.push(encodeValue(firstValue, depth + 2, delimiter))\n }\n for (let i = 1; i < entries.length; i++) {\n const [k, v] = entries[i]\n const encodedK = encodeKey(k)\n if (isPrimitive(v)) {\n lines.push(\n `${INDENT.repeat(depth + 2)}${encodedK}: ${encodePrimitive(v, delimiter)}`,\n )\n } else if (Array.isArray(v)) {\n lines.push(encodeArrayField(encodedK, v, depth + 2, delimiter))\n } else if (typeof v === \"object\" && v !== null) {\n lines.push(`${INDENT.repeat(depth + 2)}${encodedK}:`)\n lines.push(\n encodeObject(v as Record<string, unknown>, depth + 3, delimiter),\n )\n }\n }\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nexport function formatToon(data: unknown): string {\n if (isPrimitive(data)) {\n return encodePrimitive(data, \",\")\n }\n\n if (Array.isArray(data)) {\n return encodeArray(data, 0, \",\")\n }\n\n if (typeof data === \"object\" && data !== null) {\n return encodeObject(data as Record<string, unknown>, 0, \",\")\n }\n\n return String(data)\n}\n","import { formatToon } from \"./toon.js\"\n\nexport type OutputFormat = \"json\" | \"table\" | \"toon\"\n\nexport function formatOutput(data: unknown, format: OutputFormat): string {\n if (format === \"table\") {\n return formatTable(data)\n }\n if (format === \"toon\") {\n return formatToon(data)\n }\n return JSON.stringify(data, null, 2)\n}\n\nfunction formatTable(data: unknown): string {\n if (Array.isArray(data)) {\n if (data.length === 0) return \"(empty)\"\n const keys = Object.keys(data[0] as Record<string, unknown>)\n const widths = keys.map(key =>\n Math.max(\n key.length,\n ...data.map(row => {\n const val = (row as Record<string, unknown>)[key]\n return String(val ?? \"\").length\n }),\n ),\n )\n\n const header = keys.map((key, i) => key.padEnd(widths[i])).join(\" \")\n const separator = widths.map(w => \"-\".repeat(w)).join(\" \")\n const rows = data.map(row =>\n keys\n .map((key, i) => {\n const val = (row as Record<string, unknown>)[key]\n return String(val ?? \"\").padEnd(widths[i])\n })\n .join(\" \"),\n )\n\n return [header, separator, ...rows].join(\"\\n\")\n }\n\n if (data && typeof data === \"object\") {\n const entries = Object.entries(data as Record<string, unknown>)\n if (entries.length === 0) return \"(empty)\"\n const maxKeyLength = Math.max(...entries.map(([k]) => k.length))\n return entries\n .map(([key, value]) => {\n const displayValue =\n typeof value === \"object\" && value !== null\n ? JSON.stringify(value)\n : String(value ?? \"\")\n return `${key.padEnd(maxKeyLength)} ${displayValue}`\n })\n .join(\"\\n\")\n }\n\n return String(data)\n}\n","import { OpenSeaClient } from \"./client.js\"\nimport type {\n Account,\n AssetEvent,\n Chain,\n Collection,\n CollectionOrderBy,\n CollectionStats,\n Contract,\n EventType,\n GetTraitsResponse,\n Listing,\n NFT,\n Offer,\n OpenSeaClientConfig,\n SearchAssetType,\n SearchResponse,\n SwapQuoteResponse,\n Token,\n TokenDetails,\n} from \"./types/index.js\"\n\nexport class OpenSeaCLI {\n private client: OpenSeaClient\n\n readonly collections: CollectionsAPI\n readonly nfts: NFTsAPI\n readonly listings: ListingsAPI\n readonly offers: OffersAPI\n readonly events: EventsAPI\n readonly accounts: AccountsAPI\n readonly tokens: TokensAPI\n readonly search: SearchAPI\n readonly swaps: SwapsAPI\n\n constructor(config: OpenSeaClientConfig) {\n this.client = new OpenSeaClient(config)\n this.collections = new CollectionsAPI(this.client)\n this.nfts = new NFTsAPI(this.client)\n this.listings = new ListingsAPI(this.client)\n this.offers = new OffersAPI(this.client)\n this.events = new EventsAPI(this.client)\n this.accounts = new AccountsAPI(this.client)\n this.tokens = new TokensAPI(this.client)\n this.search = new SearchAPI(this.client)\n this.swaps = new SwapsAPI(this.client)\n }\n}\n\nclass CollectionsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(slug: string): Promise<Collection> {\n return this.client.get<Collection>(`/api/v2/collections/${slug}`)\n }\n\n async list(options?: {\n chain?: Chain\n limit?: number\n next?: string\n orderBy?: CollectionOrderBy\n creatorUsername?: string\n includeHidden?: boolean\n }): Promise<{ collections: Collection[]; next?: string }> {\n return this.client.get(\"/api/v2/collections\", {\n chain: options?.chain,\n limit: options?.limit,\n next: options?.next,\n order_by: options?.orderBy,\n creator_username: options?.creatorUsername,\n include_hidden: options?.includeHidden,\n })\n }\n\n async stats(slug: string): Promise<CollectionStats> {\n return this.client.get<CollectionStats>(`/api/v2/collections/${slug}/stats`)\n }\n\n async traits(slug: string): Promise<GetTraitsResponse> {\n return this.client.get<GetTraitsResponse>(`/api/v2/traits/${slug}`)\n }\n}\n\nclass NFTsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<{ nft: NFT }> {\n return this.client.get(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}`,\n )\n }\n\n async listByCollection(\n slug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/collection/${slug}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByContract(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByAccount(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/account/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async refresh(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<void> {\n await this.client.post(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}/refresh`,\n )\n }\n\n async getContract(chain: Chain, address: string): Promise<Contract> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}`)\n }\n}\n\nclass ListingsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/all`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async best(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/best`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Listing> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n}\n\nclass OffersAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}/all`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async collection(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Offer> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n\n async traits(\n collectionSlug: string,\n options: {\n type: string\n value: string\n limit?: number\n next?: string\n },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/traits`,\n {\n type: options.type,\n value: options.value,\n limit: options.limit,\n next: options.next,\n },\n )\n }\n}\n\nclass EventsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async list(options?: {\n eventType?: EventType\n after?: number\n before?: number\n limit?: number\n next?: string\n chain?: Chain\n }): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\"/api/v2/events\", {\n event_type: options?.eventType,\n after: options?.after,\n before: options?.before,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byAccount(\n address: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n chain?: Chain\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/accounts/${address}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byCollection(\n collectionSlug: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/collection/${collectionSlug}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async byNFT(\n chain: Chain,\n address: string,\n identifier: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\n `/api/v2/events/chain/${chain}/contract/${address}/nfts/${identifier}`,\n {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n },\n )\n }\n}\n\nclass AccountsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(address: string): Promise<Account> {\n return this.client.get(`/api/v2/accounts/${address}`)\n }\n}\n\nclass TokensAPI {\n constructor(private client: OpenSeaClient) {}\n\n async trending(options?: {\n limit?: number\n chains?: string[]\n next?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n // The tokens API uses \"cursor\" as its query param instead of \"next\".\n // The SDK accepts \"next\" for consistency with all other endpoints.\n return this.client.get(\"/api/v2/tokens/trending\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.next,\n })\n }\n\n async top(options?: {\n limit?: number\n chains?: string[]\n next?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n // The tokens API uses \"cursor\" as its query param instead of \"next\".\n // The SDK accepts \"next\" for consistency with all other endpoints.\n return this.client.get(\"/api/v2/tokens/top\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.next,\n })\n }\n\n async get(chain: Chain, address: string): Promise<TokenDetails> {\n return this.client.get(`/api/v2/chain/${chain}/token/${address}`)\n }\n}\n\nclass SearchAPI {\n constructor(private client: OpenSeaClient) {}\n\n async query(\n query: string,\n options?: {\n assetTypes?: SearchAssetType[]\n chains?: string[]\n limit?: number\n },\n ): Promise<SearchResponse> {\n return this.client.get<SearchResponse>(\"/api/v2/search\", {\n query,\n asset_types: options?.assetTypes?.join(\",\"),\n chains: options?.chains?.join(\",\"),\n limit: options?.limit,\n })\n }\n}\n\nclass SwapsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async quote(options: {\n fromChain: string\n fromAddress: string\n toChain: string\n toAddress: string\n quantity: string\n address: string\n slippage?: number\n recipient?: string\n }): Promise<SwapQuoteResponse> {\n return this.client.get(\"/api/v2/swap/quote\", {\n from_chain: options.fromChain,\n from_address: options.fromAddress,\n to_chain: options.toChain,\n to_address: options.toAddress,\n quantity: options.quantity,\n address: options.address,\n slippage: options.slippage,\n recipient: options.recipient,\n })\n }\n}\n"],"mappings":"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","names":["lines"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/health.ts","../src/toon.ts","../src/output.ts","../src/sdk.ts"],"sourcesContent":["import type { OpenSeaClientConfig } from \"./types/index.js\"\n\ndeclare const __VERSION__: string\n\nconst DEFAULT_BASE_URL = \"https://api.opensea.io\"\nconst DEFAULT_TIMEOUT_MS = 30_000\nconst USER_AGENT = `opensea-cli/${__VERSION__}`\nconst DEFAULT_MAX_RETRIES = 0\nconst DEFAULT_RETRY_BASE_DELAY_MS = 1_000\n\nfunction isRetryableStatus(status: number, method: string): boolean {\n if (status === 429) return true\n return status >= 500 && method === \"GET\"\n}\n\nfunction parseRetryAfter(header: string | null): number | undefined {\n if (!header) return undefined\n const seconds = Number(header)\n if (!Number.isNaN(seconds)) return seconds * 1000\n const date = Date.parse(header)\n if (!Number.isNaN(date)) return Math.max(0, date - Date.now())\n return undefined\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nexport class OpenSeaClient {\n private apiKey: string\n private baseUrl: string\n private defaultChain: string\n private timeoutMs: number\n private verbose: boolean\n private maxRetries: number\n private retryBaseDelay: number\n\n constructor(config: OpenSeaClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n this.defaultChain = config.chain ?? \"ethereum\"\n this.timeoutMs = config.timeout ?? DEFAULT_TIMEOUT_MS\n this.verbose = config.verbose ?? false\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES\n this.retryBaseDelay = config.retryBaseDelay ?? DEFAULT_RETRY_BASE_DELAY_MS\n }\n\n private get defaultHeaders(): Record<string, string> {\n return {\n Accept: \"application/json\",\n \"User-Agent\": USER_AGENT,\n \"x-api-key\": this.apiKey,\n }\n }\n\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n if (this.verbose) {\n console.error(`[verbose] GET ${url.toString()}`)\n }\n\n const response = await this.fetchWithRetry(\n url.toString(),\n {\n method: \"GET\",\n headers: this.defaultHeaders,\n },\n path,\n )\n\n return response.json() as Promise<T>\n }\n\n async post<T>(\n path: string,\n body?: Record<string, unknown>,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n const headers: Record<string, string> = { ...this.defaultHeaders }\n\n if (body) {\n headers[\"Content-Type\"] = \"application/json\"\n }\n\n if (this.verbose) {\n console.error(`[verbose] POST ${url.toString()}`)\n }\n\n const response = await this.fetchWithRetry(\n url.toString(),\n {\n method: \"POST\",\n headers,\n body: body ? JSON.stringify(body) : undefined,\n },\n path,\n )\n\n return response.json() as Promise<T>\n }\n\n getDefaultChain(): string {\n return this.defaultChain\n }\n\n getApiKeyPrefix(): string {\n if (this.apiKey.length < 8) return \"***\"\n return `${this.apiKey.slice(0, 4)}...`\n }\n\n private async fetchWithRetry(\n url: string,\n init: RequestInit,\n path: string,\n ): Promise<Response> {\n for (let attempt = 0; ; attempt++) {\n const response = await fetch(url, {\n ...init,\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (response.ok) {\n return response\n }\n\n const method = init.method ?? \"GET\"\n if (\n attempt < this.maxRetries &&\n isRetryableStatus(response.status, method)\n ) {\n const retryAfterMs = parseRetryAfter(\n response.headers.get(\"Retry-After\"),\n )\n const backoffMs = this.retryBaseDelay * 2 ** attempt\n const jitterMs = Math.random() * this.retryBaseDelay\n const delayMs = Math.max(retryAfterMs ?? 0, backoffMs) + jitterMs\n\n if (this.verbose) {\n console.error(\n `[verbose] Retry ${attempt + 1}/${this.maxRetries} after ${Math.round(delayMs)}ms (status ${response.status})`,\n )\n }\n\n try {\n await response.body?.cancel()\n } catch {\n // Stream may already be disturbed\n }\n await sleep(delayMs)\n continue\n }\n\n const text = await response.text()\n throw new OpenSeaAPIError(response.status, text, path)\n }\n }\n}\n\nexport class OpenSeaAPIError extends Error {\n constructor(\n public statusCode: number,\n public responseBody: string,\n public path: string,\n ) {\n super(`OpenSea API error ${statusCode} on ${path}: ${responseBody}`)\n this.name = \"OpenSeaAPIError\"\n }\n}\n","import { OpenSeaAPIError, type OpenSeaClient } from \"./client.js\"\nimport type { HealthResult } from \"./types/index.js\"\n\nexport async function checkHealth(\n client: OpenSeaClient,\n): Promise<HealthResult> {\n const keyPrefix = client.getApiKeyPrefix()\n\n // Step 1: Check basic connectivity with a public endpoint\n try {\n await client.get(\"/api/v2/collections\", { limit: 1 })\n } catch (error) {\n let message: string\n if (error instanceof OpenSeaAPIError) {\n message =\n error.statusCode === 429\n ? \"Rate limited: too many requests\"\n : `API error (${error.statusCode}): ${error.responseBody}`\n } else {\n message = `Network error: ${(error as Error).message}`\n }\n return {\n status: \"error\",\n key_prefix: keyPrefix,\n authenticated: false,\n rate_limited:\n error instanceof OpenSeaAPIError && error.statusCode === 429,\n message,\n }\n }\n\n // Step 2: Validate authentication with an endpoint that requires a valid API key\n try {\n await client.get(\"/api/v2/listings/collection/boredapeyachtclub/all\", {\n limit: 1,\n })\n return {\n status: \"ok\",\n key_prefix: keyPrefix,\n authenticated: true,\n rate_limited: false,\n message: \"Connectivity and authentication are working\",\n }\n } catch (error) {\n if (error instanceof OpenSeaAPIError) {\n if (error.statusCode === 429) {\n return {\n status: \"error\",\n key_prefix: keyPrefix,\n authenticated: false,\n rate_limited: true,\n message: \"Rate limited: too many requests\",\n }\n }\n if (error.statusCode === 401 || error.statusCode === 403) {\n return {\n status: \"error\",\n key_prefix: keyPrefix,\n authenticated: false,\n rate_limited: false,\n message: `Authentication failed (${error.statusCode}): invalid API key`,\n }\n }\n }\n // Non-auth error on listings endpoint — connectivity works but auth is unverified\n return {\n status: \"ok\",\n key_prefix: keyPrefix,\n authenticated: false,\n rate_limited: false,\n message:\n \"Connectivity is working but authentication could not be verified\",\n }\n }\n}\n","const INDENT = \" \"\n\nconst NUMERIC_RE = /^-?\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?$/i\nconst LEADING_ZERO_RE = /^0\\d+$/\nconst UNQUOTED_KEY_RE = /^[A-Za-z_][A-Za-z0-9_.]*$/\n\nfunction escapeString(s: string): string {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\")\n}\n\nfunction needsQuoting(value: string, delimiter: string): boolean {\n if (value === \"\") return true\n if (value !== value.trim()) return true\n if (value === \"true\" || value === \"false\" || value === \"null\") return true\n if (NUMERIC_RE.test(value) || LEADING_ZERO_RE.test(value)) return true\n if (/[:\"\\\\[\\]{}]/.test(value)) return true\n if (/[\\n\\r\\t]/.test(value)) return true\n if (value.includes(delimiter)) return true\n if (value.startsWith(\"-\")) return true\n return false\n}\n\nfunction encodeKey(key: string): string {\n if (UNQUOTED_KEY_RE.test(key)) return key\n return `\"${escapeString(key)}\"`\n}\n\nfunction encodePrimitive(value: unknown, delimiter: string): string {\n if (value === null) return \"null\"\n if (value === undefined) return \"null\"\n if (typeof value === \"boolean\") return String(value)\n if (typeof value === \"number\") return String(value)\n if (typeof value === \"string\") {\n if (needsQuoting(value, delimiter)) {\n return `\"${escapeString(value)}\"`\n }\n return value\n }\n return `\"${escapeString(String(value))}\"`\n}\n\nfunction isPrimitive(value: unknown): boolean {\n return (\n value === null ||\n value === undefined ||\n typeof value === \"boolean\" ||\n typeof value === \"number\" ||\n typeof value === \"string\"\n )\n}\n\nfunction isTabular(arr: unknown[]): boolean {\n if (arr.length === 0) return false\n const first = arr[0]\n if (first === null || typeof first !== \"object\" || Array.isArray(first))\n return false\n const keys = Object.keys(first as Record<string, unknown>).sort()\n for (const item of arr) {\n if (item === null || typeof item !== \"object\" || Array.isArray(item))\n return false\n const itemKeys = Object.keys(item as Record<string, unknown>).sort()\n if (itemKeys.length !== keys.length) return false\n for (let i = 0; i < keys.length; i++) {\n if (itemKeys[i] !== keys[i]) return false\n }\n for (const k of keys) {\n if (!isPrimitive((item as Record<string, unknown>)[k])) return false\n }\n }\n return true\n}\n\nfunction isPrimitiveArray(arr: unknown[]): boolean {\n return arr.every(isPrimitive)\n}\n\nfunction encodeValue(value: unknown, depth: number, delimiter: string): string {\n if (isPrimitive(value)) {\n return encodePrimitive(value, delimiter)\n }\n\n if (Array.isArray(value)) {\n return encodeArray(value, depth, delimiter)\n }\n\n if (typeof value === \"object\" && value !== null) {\n return encodeObject(value as Record<string, unknown>, depth, delimiter)\n }\n\n return encodePrimitive(value, delimiter)\n}\n\nfunction encodeObject(\n obj: Record<string, unknown>,\n depth: number,\n delimiter: string,\n): string {\n const entries = Object.entries(obj)\n if (entries.length === 0) return \"\"\n\n const lines: string[] = []\n const prefix = INDENT.repeat(depth)\n\n for (const [key, value] of entries) {\n const encodedKey = encodeKey(key)\n\n if (isPrimitive(value)) {\n lines.push(`${prefix}${encodedKey}: ${encodePrimitive(value, delimiter)}`)\n } else if (Array.isArray(value)) {\n lines.push(encodeArrayField(encodedKey, value, depth, delimiter))\n } else if (typeof value === \"object\" && value !== null) {\n const nested = value as Record<string, unknown>\n if (Object.keys(nested).length === 0) {\n lines.push(`${prefix}${encodedKey}:`)\n } else {\n lines.push(`${prefix}${encodedKey}:`)\n lines.push(encodeObject(nested, depth + 1, delimiter))\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nfunction encodeArrayField(\n encodedKey: string,\n arr: unknown[],\n depth: number,\n delimiter: string,\n): string {\n const prefix = INDENT.repeat(depth)\n\n if (arr.length === 0) {\n return `${prefix}${encodedKey}[0]:`\n }\n\n if (isPrimitiveArray(arr)) {\n const values = arr.map(v => encodePrimitive(v, delimiter)).join(delimiter)\n return `${prefix}${encodedKey}[${arr.length}]: ${values}`\n }\n\n if (isTabular(arr)) {\n const firstObj = arr[0] as Record<string, unknown>\n const fields = Object.keys(firstObj)\n const fieldHeader = fields.map(encodeKey).join(delimiter)\n const lines: string[] = []\n lines.push(`${prefix}${encodedKey}[${arr.length}]{${fieldHeader}}:`)\n const rowPrefix = INDENT.repeat(depth + 1)\n for (const item of arr) {\n const obj = item as Record<string, unknown>\n const row = fields\n .map(f => encodePrimitive(obj[f], delimiter))\n .join(delimiter)\n lines.push(`${rowPrefix}${row}`)\n }\n return lines.join(\"\\n\")\n }\n\n return encodeExpandedList(encodedKey, arr, depth, delimiter)\n}\n\nfunction encodeExpandedList(\n encodedKey: string,\n arr: unknown[],\n depth: number,\n delimiter: string,\n): string {\n const prefix = INDENT.repeat(depth)\n const itemPrefix = INDENT.repeat(depth + 1)\n const lines: string[] = []\n lines.push(`${prefix}${encodedKey}[${arr.length}]:`)\n\n for (const item of arr) {\n if (isPrimitive(item)) {\n lines.push(`${itemPrefix}- ${encodePrimitive(item, delimiter)}`)\n } else if (Array.isArray(item)) {\n if (isPrimitiveArray(item)) {\n const values = item\n .map(v => encodePrimitive(v, delimiter))\n .join(delimiter)\n lines.push(`${itemPrefix}- [${item.length}]: ${values}`)\n } else {\n lines.push(`${itemPrefix}- [${item.length}]:`)\n for (const inner of item) {\n lines.push(encodeValue(inner, depth + 2, delimiter))\n }\n }\n } else if (typeof item === \"object\" && item !== null) {\n const obj = item as Record<string, unknown>\n const entries = Object.entries(obj)\n if (entries.length === 0) {\n lines.push(`${itemPrefix}-`)\n } else {\n const [firstKey, firstValue] = entries[0]\n const ek = encodeKey(firstKey)\n\n if (Array.isArray(firstValue)) {\n const arrayLine = encodeArrayField(ek, firstValue, 0, delimiter)\n lines.push(`${itemPrefix}- ${arrayLine.trimStart()}`)\n } else if (isPrimitive(firstValue)) {\n lines.push(\n `${itemPrefix}- ${ek}: ${encodePrimitive(firstValue, delimiter)}`,\n )\n } else {\n lines.push(`${itemPrefix}- ${ek}:`)\n lines.push(\n encodeObject(\n firstValue as Record<string, unknown>,\n depth + 2,\n delimiter,\n ),\n )\n }\n\n for (let i = 1; i < entries.length; i++) {\n const [k, v] = entries[i]\n const encodedK = encodeKey(k)\n if (isPrimitive(v)) {\n lines.push(\n `${INDENT.repeat(depth + 2)}${encodedK}: ${encodePrimitive(v, delimiter)}`,\n )\n } else if (Array.isArray(v)) {\n lines.push(encodeArrayField(encodedK, v, depth + 2, delimiter))\n } else if (typeof v === \"object\" && v !== null) {\n lines.push(`${INDENT.repeat(depth + 2)}${encodedK}:`)\n lines.push(\n encodeObject(v as Record<string, unknown>, depth + 3, delimiter),\n )\n }\n }\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nfunction encodeArray(arr: unknown[], depth: number, delimiter: string): string {\n const prefix = INDENT.repeat(depth)\n\n if (arr.length === 0) {\n return `${prefix}[0]:`\n }\n\n if (isPrimitiveArray(arr)) {\n const values = arr.map(v => encodePrimitive(v, delimiter)).join(delimiter)\n return `${prefix}[${arr.length}]: ${values}`\n }\n\n if (isTabular(arr)) {\n const firstObj = arr[0] as Record<string, unknown>\n const fields = Object.keys(firstObj)\n const fieldHeader = fields.map(encodeKey).join(delimiter)\n const lines: string[] = []\n lines.push(`${prefix}[${arr.length}]{${fieldHeader}}:`)\n const rowPrefix = INDENT.repeat(depth + 1)\n for (const item of arr) {\n const obj = item as Record<string, unknown>\n const row = fields\n .map(f => encodePrimitive(obj[f], delimiter))\n .join(delimiter)\n lines.push(`${rowPrefix}${row}`)\n }\n return lines.join(\"\\n\")\n }\n\n const lines: string[] = []\n lines.push(`${prefix}[${arr.length}]:`)\n const itemPrefix = INDENT.repeat(depth + 1)\n for (const item of arr) {\n if (isPrimitive(item)) {\n lines.push(`${itemPrefix}- ${encodePrimitive(item, delimiter)}`)\n } else if (Array.isArray(item)) {\n if (isPrimitiveArray(item)) {\n const values = item\n .map(v => encodePrimitive(v, delimiter))\n .join(delimiter)\n lines.push(`${itemPrefix}- [${item.length}]: ${values}`)\n } else {\n lines.push(`${itemPrefix}- [${item.length}]:`)\n }\n } else if (typeof item === \"object\" && item !== null) {\n const obj = item as Record<string, unknown>\n const entries = Object.entries(obj)\n if (entries.length > 0) {\n const [firstKey, firstValue] = entries[0]\n const ek = encodeKey(firstKey)\n if (isPrimitive(firstValue)) {\n lines.push(\n `${itemPrefix}- ${ek}: ${encodePrimitive(firstValue, delimiter)}`,\n )\n } else {\n lines.push(`${itemPrefix}- ${ek}:`)\n lines.push(encodeValue(firstValue, depth + 2, delimiter))\n }\n for (let i = 1; i < entries.length; i++) {\n const [k, v] = entries[i]\n const encodedK = encodeKey(k)\n if (isPrimitive(v)) {\n lines.push(\n `${INDENT.repeat(depth + 2)}${encodedK}: ${encodePrimitive(v, delimiter)}`,\n )\n } else if (Array.isArray(v)) {\n lines.push(encodeArrayField(encodedK, v, depth + 2, delimiter))\n } else if (typeof v === \"object\" && v !== null) {\n lines.push(`${INDENT.repeat(depth + 2)}${encodedK}:`)\n lines.push(\n encodeObject(v as Record<string, unknown>, depth + 3, delimiter),\n )\n }\n }\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nexport function formatToon(data: unknown): string {\n if (isPrimitive(data)) {\n return encodePrimitive(data, \",\")\n }\n\n if (Array.isArray(data)) {\n return encodeArray(data, 0, \",\")\n }\n\n if (typeof data === \"object\" && data !== null) {\n return encodeObject(data as Record<string, unknown>, 0, \",\")\n }\n\n return String(data)\n}\n","import { formatToon } from \"./toon.js\"\n\nexport type OutputFormat = \"json\" | \"table\" | \"toon\"\n\nexport interface OutputOptions {\n fields?: string[]\n maxLines?: number\n}\n\nlet _outputOptions: OutputOptions = {}\n\nexport function setOutputOptions(options: OutputOptions): void {\n _outputOptions = options\n}\n\nexport function formatOutput(data: unknown, format: OutputFormat): string {\n const processed = _outputOptions.fields\n ? filterFields(data, _outputOptions.fields)\n : data\n\n let result: string\n if (format === \"table\") {\n result = formatTable(processed)\n } else if (format === \"toon\") {\n result = formatToon(processed)\n } else {\n result = JSON.stringify(processed, null, 2)\n }\n\n if (_outputOptions.maxLines != null) {\n result = truncateOutput(result, _outputOptions.maxLines)\n }\n\n return result\n}\n\nfunction formatTable(data: unknown): string {\n if (Array.isArray(data)) {\n if (data.length === 0) return \"(empty)\"\n const keys = Object.keys(data[0] as Record<string, unknown>)\n const widths = keys.map(key =>\n Math.max(\n key.length,\n ...data.map(row => {\n const val = (row as Record<string, unknown>)[key]\n return String(val ?? \"\").length\n }),\n ),\n )\n\n const header = keys.map((key, i) => key.padEnd(widths[i])).join(\" \")\n const separator = widths.map(w => \"-\".repeat(w)).join(\" \")\n const rows = data.map(row =>\n keys\n .map((key, i) => {\n const val = (row as Record<string, unknown>)[key]\n return String(val ?? \"\").padEnd(widths[i])\n })\n .join(\" \"),\n )\n\n return [header, separator, ...rows].join(\"\\n\")\n }\n\n if (data && typeof data === \"object\") {\n const entries = Object.entries(data as Record<string, unknown>)\n if (entries.length === 0) return \"(empty)\"\n const maxKeyLength = Math.max(...entries.map(([k]) => k.length))\n return entries\n .map(([key, value]) => {\n const displayValue =\n typeof value === \"object\" && value !== null\n ? JSON.stringify(value)\n : String(value ?? \"\")\n return `${key.padEnd(maxKeyLength)} ${displayValue}`\n })\n .join(\"\\n\")\n }\n\n return String(data)\n}\n\nfunction pickFields(\n obj: Record<string, unknown>,\n fields: string[],\n): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const field of fields) {\n if (field in obj) {\n result[field] = obj[field]\n }\n }\n return result\n}\n\nfunction filterFields(data: unknown, fields: string[]): unknown {\n if (Array.isArray(data)) {\n return data.map(item => filterFields(item, fields))\n }\n if (data && typeof data === \"object\") {\n return pickFields(data as Record<string, unknown>, fields)\n }\n return data\n}\n\nfunction truncateOutput(text: string, maxLines: number): string {\n const lines = text.split(\"\\n\")\n if (lines.length <= maxLines) return text\n const omitted = lines.length - maxLines\n return (\n lines.slice(0, maxLines).join(\"\\n\") +\n `\\n... (${omitted} more line${omitted === 1 ? \"\" : \"s\"})`\n )\n}\n","import { OpenSeaClient } from \"./client.js\"\nimport { checkHealth } from \"./health.js\"\nimport type {\n Account,\n AssetEvent,\n Chain,\n Collection,\n CollectionOrderBy,\n CollectionStats,\n Contract,\n EventType,\n GetTraitsResponse,\n HealthResult,\n Listing,\n NFT,\n Offer,\n OpenSeaClientConfig,\n SearchAssetType,\n SearchResponse,\n SwapQuoteResponse,\n Token,\n TokenDetails,\n} from \"./types/index.js\"\n\nexport class OpenSeaCLI {\n private client: OpenSeaClient\n\n readonly collections: CollectionsAPI\n readonly nfts: NFTsAPI\n readonly listings: ListingsAPI\n readonly offers: OffersAPI\n readonly events: EventsAPI\n readonly accounts: AccountsAPI\n readonly tokens: TokensAPI\n readonly search: SearchAPI\n readonly swaps: SwapsAPI\n readonly health: HealthAPI\n\n constructor(config: OpenSeaClientConfig) {\n this.client = new OpenSeaClient(config)\n this.collections = new CollectionsAPI(this.client)\n this.nfts = new NFTsAPI(this.client)\n this.listings = new ListingsAPI(this.client)\n this.offers = new OffersAPI(this.client)\n this.events = new EventsAPI(this.client)\n this.accounts = new AccountsAPI(this.client)\n this.tokens = new TokensAPI(this.client)\n this.search = new SearchAPI(this.client)\n this.swaps = new SwapsAPI(this.client)\n this.health = new HealthAPI(this.client)\n }\n}\n\nclass CollectionsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(slug: string): Promise<Collection> {\n return this.client.get<Collection>(`/api/v2/collections/${slug}`)\n }\n\n async list(options?: {\n chain?: Chain\n limit?: number\n next?: string\n orderBy?: CollectionOrderBy\n creatorUsername?: string\n includeHidden?: boolean\n }): Promise<{ collections: Collection[]; next?: string }> {\n return this.client.get(\"/api/v2/collections\", {\n chain: options?.chain,\n limit: options?.limit,\n next: options?.next,\n order_by: options?.orderBy,\n creator_username: options?.creatorUsername,\n include_hidden: options?.includeHidden,\n })\n }\n\n async stats(slug: string): Promise<CollectionStats> {\n return this.client.get<CollectionStats>(`/api/v2/collections/${slug}/stats`)\n }\n\n async traits(slug: string): Promise<GetTraitsResponse> {\n return this.client.get<GetTraitsResponse>(`/api/v2/traits/${slug}`)\n }\n}\n\nclass NFTsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<{ nft: NFT }> {\n return this.client.get(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}`,\n )\n }\n\n async listByCollection(\n slug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/collection/${slug}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByContract(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByAccount(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/account/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async refresh(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<void> {\n await this.client.post(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}/refresh`,\n )\n }\n\n async getContract(chain: Chain, address: string): Promise<Contract> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}`)\n }\n}\n\nclass ListingsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/all`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async best(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/best`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Listing> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n}\n\nclass OffersAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}/all`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async collection(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Offer> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n\n async traits(\n collectionSlug: string,\n options: {\n type: string\n value: string\n limit?: number\n next?: string\n },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/traits`,\n {\n type: options.type,\n value: options.value,\n limit: options.limit,\n next: options.next,\n },\n )\n }\n}\n\nclass EventsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async list(options?: {\n eventType?: EventType\n after?: number\n before?: number\n limit?: number\n next?: string\n chain?: Chain\n }): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\"/api/v2/events\", {\n event_type: options?.eventType,\n after: options?.after,\n before: options?.before,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byAccount(\n address: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n chain?: Chain\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/accounts/${address}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byCollection(\n collectionSlug: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/collection/${collectionSlug}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async byNFT(\n chain: Chain,\n address: string,\n identifier: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\n `/api/v2/events/chain/${chain}/contract/${address}/nfts/${identifier}`,\n {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n },\n )\n }\n}\n\nclass AccountsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(address: string): Promise<Account> {\n return this.client.get(`/api/v2/accounts/${address}`)\n }\n}\n\nclass TokensAPI {\n constructor(private client: OpenSeaClient) {}\n\n async trending(options?: {\n limit?: number\n chains?: string[]\n next?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n // The tokens API uses \"cursor\" as its query param instead of \"next\".\n // The SDK accepts \"next\" for consistency with all other endpoints.\n return this.client.get(\"/api/v2/tokens/trending\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.next,\n })\n }\n\n async top(options?: {\n limit?: number\n chains?: string[]\n next?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n // The tokens API uses \"cursor\" as its query param instead of \"next\".\n // The SDK accepts \"next\" for consistency with all other endpoints.\n return this.client.get(\"/api/v2/tokens/top\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.next,\n })\n }\n\n async get(chain: Chain, address: string): Promise<TokenDetails> {\n return this.client.get(`/api/v2/chain/${chain}/token/${address}`)\n }\n}\n\nclass SearchAPI {\n constructor(private client: OpenSeaClient) {}\n\n async query(\n query: string,\n options?: {\n assetTypes?: SearchAssetType[]\n chains?: string[]\n limit?: number\n },\n ): Promise<SearchResponse> {\n return this.client.get<SearchResponse>(\"/api/v2/search\", {\n query,\n asset_types: options?.assetTypes?.join(\",\"),\n chains: options?.chains?.join(\",\"),\n limit: options?.limit,\n })\n }\n}\n\nclass SwapsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async quote(options: {\n fromChain: string\n fromAddress: string\n toChain: string\n toAddress: string\n quantity: string\n address: string\n slippage?: number\n recipient?: string\n }): Promise<SwapQuoteResponse> {\n return this.client.get(\"/api/v2/swap/quote\", {\n from_chain: options.fromChain,\n from_address: options.fromAddress,\n to_chain: options.toChain,\n to_address: options.toAddress,\n quantity: options.quantity,\n address: options.address,\n slippage: options.slippage,\n recipient: options.recipient,\n })\n }\n}\n\nclass HealthAPI {\n constructor(private client: OpenSeaClient) {}\n\n async check(): Promise<HealthResult> {\n return checkHealth(this.client)\n }\n}\n"],"mappings":"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","names":["lines"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensea/cli",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "type": "module",
5
5
  "description": "OpenSea CLI - Query the OpenSea API from the command line or programmatically",
6
6
  "main": "dist/index.js",