@supadata/js 1.0.0 → 1.0.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/README.md +22 -17
- package/dist/index.cjs +3 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +74 -0
- package/dist/index.d.ts +70 -8
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +12 -7
- package/dist/client.d.ts +0 -12
- package/dist/client.js +0 -43
- package/dist/index.js +0 -14
- package/dist/services/web.d.ts +0 -6
- package/dist/services/web.js +0 -9
- package/dist/services/youtube.d.ts +0 -14
- package/dist/services/youtube.js +0 -9
- package/dist/types.d.ts +0 -37
- package/dist/types.js +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Supadata JS SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@supadata/js)
|
|
4
|
+
[](http://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
6
|
+
The official TypeScript/JavaScript SDK for Supadata.
|
|
7
|
+
|
|
8
|
+
Get your free API key at [supadata.ai](https://supadata.ai) and start scraping data in minutes.
|
|
4
9
|
|
|
5
10
|
## Installation
|
|
6
11
|
|
|
@@ -11,29 +16,29 @@ npm install @supadata/js
|
|
|
11
16
|
## Usage
|
|
12
17
|
|
|
13
18
|
```typescript
|
|
14
|
-
import { Supadata, Transcript } from
|
|
19
|
+
import { Supadata, Transcript } from '@supadata/js';
|
|
15
20
|
|
|
16
21
|
// Initialize the client
|
|
17
22
|
const supadata = new Supadata({
|
|
18
|
-
apiKey:
|
|
23
|
+
apiKey: 'YOUR_API_KEY',
|
|
19
24
|
});
|
|
20
25
|
|
|
21
26
|
// Get YouTube transcript
|
|
22
27
|
const transcript = await supadata.youtube.transcript({
|
|
23
|
-
videoId:
|
|
28
|
+
videoId: 'VIDEO_ID',
|
|
24
29
|
});
|
|
25
30
|
|
|
26
31
|
// Translate YouTube transcript
|
|
27
32
|
const translated = await supadata.youtube.translate({
|
|
28
|
-
videoId:
|
|
29
|
-
lang:
|
|
33
|
+
videoId: 'VIDEO_ID',
|
|
34
|
+
lang: 'es',
|
|
30
35
|
});
|
|
31
36
|
|
|
32
37
|
// Scrape web content
|
|
33
|
-
const webContent = await supadata.web.scrape(
|
|
38
|
+
const webContent = await supadata.web.scrape('https://supadata.ai');
|
|
34
39
|
|
|
35
40
|
// Map website URLs
|
|
36
|
-
const siteMap = await supadata.web.map(
|
|
41
|
+
const siteMap = await supadata.web.map('https://supadata.ai');
|
|
37
42
|
```
|
|
38
43
|
|
|
39
44
|
## Error Handling
|
|
@@ -41,18 +46,18 @@ const siteMap = await supadata.web.map("https://supadata.ai");
|
|
|
41
46
|
The SDK throws `SupadataError` for API-related errors. You can catch and handle these errors as follows:
|
|
42
47
|
|
|
43
48
|
```typescript
|
|
44
|
-
import { SupadataError } from
|
|
49
|
+
import { SupadataError } from '@supadata/js';
|
|
45
50
|
|
|
46
51
|
try {
|
|
47
52
|
const transcript = await supadata.youtube.transcript({
|
|
48
|
-
videoId:
|
|
53
|
+
videoId: 'INVALID_ID',
|
|
49
54
|
});
|
|
50
|
-
} catch (
|
|
51
|
-
if (
|
|
52
|
-
console.error(error
|
|
53
|
-
console.error(
|
|
54
|
-
console.error(
|
|
55
|
-
console.error(
|
|
55
|
+
} catch (e) {
|
|
56
|
+
if (e instanceof SupadataError) {
|
|
57
|
+
console.error(e.error); // e.g., 'video-not-found'
|
|
58
|
+
console.error(e.message); // Human readable error message
|
|
59
|
+
console.error(e.details); // Detailed error description
|
|
60
|
+
console.error(e.documentationUrl); // Link to error documentation (optional)
|
|
56
61
|
}
|
|
57
62
|
}
|
|
58
63
|
```
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
'use strict';var e=class extends Error{error;details;documentationUrl;constructor(r){super(r.message||"An unexpected error occurred"),this.error=r.error||"internal-error",this.details=r.details||"An unexpected error occurred",this.documentationUrl=r.documentationUrl||"",this.name="SupadataError";}};var o={403:{error:"invalid-request",message:"Invalid or missing API key",details:"Please ensure you have provided a valid API key"},404:{error:"invalid-request",message:"Endpoint does not exist",details:"The API endpoint you are trying to access does not exist"},429:{error:"limit-exceeded",message:"Limit exceeded",details:"You have exceeded the allowed request rate or quota limits"}},g=(t,r)=>t in o?new e({...o[t],message:o[t].message,details:r||o[t].details}):new e({error:"internal-error",message:"An unexpected error occurred",details:r});var s=class{config;constructor(r){this.config=r;}async fetch(r,l){let m=`${this.config.baseUrl||"https://api.supadata.ai/v1"}${r.startsWith("/")?r:`/${r}`}`;if(l){let a=new URLSearchParams;Object.entries(l).forEach(([h,d])=>{d!=null&&a.append(h,String(d));}),m+=`?${a.toString()}`;}let n=await fetch(m,{method:"GET",headers:{"x-api-key":this.config.apiKey,"Content-Type":"application/json"}}),u=n.headers.get("content-type");if(!n.ok){if([403,404,429].includes(n.status)){let a=await n.json();throw g(n.status,a.message)}if(u?.includes("application/json")){let a=await n.json();throw new e(a)}else throw new e({error:"internal-error",message:"Unexpected error response format",details:await n.text()})}try{if(!u?.includes("application/json"))throw new e({error:"internal-error",message:"Invalid response format",details:"Expected JSON response but received different content type"});return await n.json()}catch(a){throw new e({error:"internal-error",message:"Failed to parse response",details:a instanceof Error?a.message:"Unknown error"})}}};var c=class extends s{async transcript(r){return this.fetch("/youtube/transcript",r)}async translate(r){return this.fetch("/youtube/transcript/translate",r)}};var p=class extends s{async scrape(r){return this.fetch("/web/scrape",{url:r})}async map(r){return this.fetch("/web/map",{url:r})}};var f=class{youtube;web;constructor(r){this.youtube=new c(r),this.web=new p(r);}};
|
|
2
|
+
exports.BaseClient=s;exports.Supadata=f;exports.SupadataError=e;exports.WebService=p;exports.YouTubeService=c;//# sourceMappingURL=index.cjs.map
|
|
3
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/gateway-error-mapper.ts","../src/client.ts","../src/services/youtube.ts","../src/services/web.ts","../src/index.ts"],"names":["SupadataError","error","GATEWAY_STATUS_ERRORS","mapGatewayError","statusCode","errorText","BaseClient","config","endpoint","params","url","queryParams","key","value","response","contentType","errorData","YouTubeService","WebService","Supadata"],"mappings":"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","file":"index.cjs","sourcesContent":["export interface TranscriptChunk {\n text: string;\n offset: number;\n duration: number;\n lang: string;\n}\n\nexport interface Transcript {\n content: TranscriptChunk[] | string;\n lang: string;\n availableLangs: string[];\n}\n\nexport interface TranslatedTranscript {\n content: TranscriptChunk[] | string;\n lang: string;\n}\n\nexport interface Scrape {\n url: string;\n content: string;\n name: string;\n description: string;\n ogUrl: string;\n countCharacters: number;\n urls: string[];\n}\n\nexport interface Map {\n urls: string[];\n}\n\nexport interface SupadataConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport class SupadataError extends Error {\n error:\n | 'invalid-request'\n | 'missing-parameters'\n | 'internal-error'\n | 'transcript-unavailable'\n | 'video-not-found'\n | 'video-id-invalid'\n | 'youtube-api-error'\n | 'limit-exceeded';\n details: string;\n documentationUrl: string;\n\n constructor(error: {\n error: SupadataError['error'];\n message?: string;\n details?: string;\n documentationUrl?: string;\n }) {\n super(error.message || 'An unexpected error occurred');\n this.error = error.error || 'internal-error';\n this.details = error.details || 'An unexpected error occurred';\n this.documentationUrl = error.documentationUrl || '';\n this.name = 'SupadataError';\n }\n}\n","import { SupadataError } from './types';\n\n/*\nThe API gateway returns errors in text/plain content type. \nAs a temporary workaround we're mapping them to SupadataError.\n*/\n\nconst GATEWAY_STATUS_ERRORS = {\n 403: {\n error: 'invalid-request' as const,\n message: 'Invalid or missing API key',\n details: 'Please ensure you have provided a valid API key',\n },\n 404: {\n error: 'invalid-request' as const,\n message: 'Endpoint does not exist',\n details: 'The API endpoint you are trying to access does not exist',\n },\n 429: {\n error: 'limit-exceeded' as const,\n message: 'Limit exceeded',\n details: 'You have exceeded the allowed request rate or quota limits',\n },\n};\n\nexport const mapGatewayError = (\n statusCode: number,\n errorText: string\n): SupadataError => {\n if (statusCode in GATEWAY_STATUS_ERRORS) {\n return new SupadataError({\n ...GATEWAY_STATUS_ERRORS[\n statusCode as keyof typeof GATEWAY_STATUS_ERRORS\n ],\n message:\n GATEWAY_STATUS_ERRORS[statusCode as keyof typeof GATEWAY_STATUS_ERRORS]\n .message,\n details:\n errorText ||\n GATEWAY_STATUS_ERRORS[statusCode as keyof typeof GATEWAY_STATUS_ERRORS]\n .details,\n });\n }\n\n // Default error if status code is not recognized\n return new SupadataError({\n error: 'internal-error',\n message: 'An unexpected error occurred',\n details: errorText,\n });\n};\n","import { SupadataConfig, SupadataError } from './types.js';\nimport { mapGatewayError } from './gateway-error-mapper.js';\n\nexport class BaseClient {\n protected config: SupadataConfig;\n\n constructor(config: SupadataConfig) {\n this.config = config;\n }\n\n async fetch<T>(\n endpoint: string,\n params: Record<string, unknown> | object\n ): Promise<T> {\n const baseUrl = this.config.baseUrl || 'https://api.supadata.ai/v1';\n let url = `${baseUrl}${\n endpoint.startsWith('/') ? endpoint : `/${endpoint}`\n }`;\n\n if (params) {\n const queryParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, String(value));\n }\n });\n url += `?${queryParams.toString()}`;\n }\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n },\n });\n\n const contentType = response.headers.get('content-type');\n\n if (!response.ok) {\n // First check for gateway-specific status codes\n if ([403, 404, 429].includes(response.status)) {\n const errorData = await response.json();\n throw mapGatewayError(response.status, errorData.message);\n }\n\n // Handle standard API errors\n if (contentType?.includes('application/json')) {\n const errorData = await response.json();\n throw new SupadataError(errorData);\n } else {\n // Fallback for unexpected non-JSON errors\n throw new SupadataError({\n error: 'internal-error',\n message: 'Unexpected error response format',\n details: await response.text(),\n });\n }\n }\n\n try {\n if (!contentType?.includes('application/json')) {\n throw new SupadataError({\n error: 'internal-error',\n message: 'Invalid response format',\n details: 'Expected JSON response but received different content type',\n });\n }\n\n return (await response.json()) as T;\n } catch (error) {\n throw new SupadataError({\n error: 'internal-error',\n message: 'Failed to parse response',\n details: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n}\n","import { BaseClient } from '../client.js';\nimport { Transcript, TranslatedTranscript } from '../types.js';\n\nexport interface TranscriptParams {\n videoId: string;\n lang?: string;\n text?: boolean;\n}\n\nexport interface TranslateParams extends TranscriptParams {\n lang: string;\n}\n\nexport class YouTubeService extends BaseClient {\n async transcript(params: TranscriptParams): Promise<Transcript> {\n return this.fetch<Transcript>('/youtube/transcript', params);\n }\n\n async translate(params: TranslateParams): Promise<TranslatedTranscript> {\n return this.fetch<TranslatedTranscript>(\n '/youtube/transcript/translate',\n params\n );\n }\n}\n","import { BaseClient } from '../client.js';\nimport { Scrape, Map } from '../types.js';\n\nexport class WebService extends BaseClient {\n async scrape(url: string): Promise<Scrape> {\n return this.fetch<Scrape>('/web/scrape', { url });\n }\n\n async map(url: string): Promise<Map> {\n return this.fetch<Map>('/web/map', { url });\n }\n}\n","import { SupadataConfig } from './types.js';\nimport { YouTubeService } from './services/youtube.js';\nimport { WebService } from './services/web.js';\n\nexport * from './types.js';\nexport * from './client.js';\nexport * from './services/youtube.js';\nexport * from './services/web.js';\n\nexport class Supadata {\n readonly youtube: YouTubeService;\n readonly web: WebService;\n\n constructor(config: SupadataConfig) {\n this.youtube = new YouTubeService(config);\n this.web = new WebService(config);\n }\n}\n"]}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
interface TranscriptChunk {
|
|
2
|
+
text: string;
|
|
3
|
+
offset: number;
|
|
4
|
+
duration: number;
|
|
5
|
+
lang: string;
|
|
6
|
+
}
|
|
7
|
+
interface Transcript {
|
|
8
|
+
content: TranscriptChunk[] | string;
|
|
9
|
+
lang: string;
|
|
10
|
+
availableLangs: string[];
|
|
11
|
+
}
|
|
12
|
+
interface TranslatedTranscript {
|
|
13
|
+
content: TranscriptChunk[] | string;
|
|
14
|
+
lang: string;
|
|
15
|
+
}
|
|
16
|
+
interface Scrape {
|
|
17
|
+
url: string;
|
|
18
|
+
content: string;
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
ogUrl: string;
|
|
22
|
+
countCharacters: number;
|
|
23
|
+
urls: string[];
|
|
24
|
+
}
|
|
25
|
+
interface Map {
|
|
26
|
+
urls: string[];
|
|
27
|
+
}
|
|
28
|
+
interface SupadataConfig {
|
|
29
|
+
apiKey: string;
|
|
30
|
+
baseUrl?: string;
|
|
31
|
+
}
|
|
32
|
+
declare class SupadataError extends Error {
|
|
33
|
+
error: 'invalid-request' | 'missing-parameters' | 'internal-error' | 'transcript-unavailable' | 'video-not-found' | 'video-id-invalid' | 'youtube-api-error' | 'limit-exceeded';
|
|
34
|
+
details: string;
|
|
35
|
+
documentationUrl: string;
|
|
36
|
+
constructor(error: {
|
|
37
|
+
error: SupadataError['error'];
|
|
38
|
+
message?: string;
|
|
39
|
+
details?: string;
|
|
40
|
+
documentationUrl?: string;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
declare class BaseClient {
|
|
45
|
+
protected config: SupadataConfig;
|
|
46
|
+
constructor(config: SupadataConfig);
|
|
47
|
+
fetch<T>(endpoint: string, params: Record<string, unknown> | object): Promise<T>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface TranscriptParams {
|
|
51
|
+
videoId: string;
|
|
52
|
+
lang?: string;
|
|
53
|
+
text?: boolean;
|
|
54
|
+
}
|
|
55
|
+
interface TranslateParams extends TranscriptParams {
|
|
56
|
+
lang: string;
|
|
57
|
+
}
|
|
58
|
+
declare class YouTubeService extends BaseClient {
|
|
59
|
+
transcript(params: TranscriptParams): Promise<Transcript>;
|
|
60
|
+
translate(params: TranslateParams): Promise<TranslatedTranscript>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
declare class WebService extends BaseClient {
|
|
64
|
+
scrape(url: string): Promise<Scrape>;
|
|
65
|
+
map(url: string): Promise<Map>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
declare class Supadata {
|
|
69
|
+
readonly youtube: YouTubeService;
|
|
70
|
+
readonly web: WebService;
|
|
71
|
+
constructor(config: SupadataConfig);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export { BaseClient, type Map, type Scrape, Supadata, type SupadataConfig, SupadataError, type Transcript, type TranscriptChunk, type TranscriptParams, type TranslateParams, type TranslatedTranscript, WebService, YouTubeService };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,74 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
interface TranscriptChunk {
|
|
2
|
+
text: string;
|
|
3
|
+
offset: number;
|
|
4
|
+
duration: number;
|
|
5
|
+
lang: string;
|
|
6
|
+
}
|
|
7
|
+
interface Transcript {
|
|
8
|
+
content: TranscriptChunk[] | string;
|
|
9
|
+
lang: string;
|
|
10
|
+
availableLangs: string[];
|
|
11
|
+
}
|
|
12
|
+
interface TranslatedTranscript {
|
|
13
|
+
content: TranscriptChunk[] | string;
|
|
14
|
+
lang: string;
|
|
15
|
+
}
|
|
16
|
+
interface Scrape {
|
|
17
|
+
url: string;
|
|
18
|
+
content: string;
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
ogUrl: string;
|
|
22
|
+
countCharacters: number;
|
|
23
|
+
urls: string[];
|
|
24
|
+
}
|
|
25
|
+
interface Map {
|
|
26
|
+
urls: string[];
|
|
27
|
+
}
|
|
28
|
+
interface SupadataConfig {
|
|
29
|
+
apiKey: string;
|
|
30
|
+
baseUrl?: string;
|
|
31
|
+
}
|
|
32
|
+
declare class SupadataError extends Error {
|
|
33
|
+
error: 'invalid-request' | 'missing-parameters' | 'internal-error' | 'transcript-unavailable' | 'video-not-found' | 'video-id-invalid' | 'youtube-api-error' | 'limit-exceeded';
|
|
34
|
+
details: string;
|
|
35
|
+
documentationUrl: string;
|
|
36
|
+
constructor(error: {
|
|
37
|
+
error: SupadataError['error'];
|
|
38
|
+
message?: string;
|
|
39
|
+
details?: string;
|
|
40
|
+
documentationUrl?: string;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
declare class BaseClient {
|
|
45
|
+
protected config: SupadataConfig;
|
|
46
|
+
constructor(config: SupadataConfig);
|
|
47
|
+
fetch<T>(endpoint: string, params: Record<string, unknown> | object): Promise<T>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface TranscriptParams {
|
|
51
|
+
videoId: string;
|
|
52
|
+
lang?: string;
|
|
53
|
+
text?: boolean;
|
|
54
|
+
}
|
|
55
|
+
interface TranslateParams extends TranscriptParams {
|
|
56
|
+
lang: string;
|
|
57
|
+
}
|
|
58
|
+
declare class YouTubeService extends BaseClient {
|
|
59
|
+
transcript(params: TranscriptParams): Promise<Transcript>;
|
|
60
|
+
translate(params: TranslateParams): Promise<TranslatedTranscript>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
declare class WebService extends BaseClient {
|
|
64
|
+
scrape(url: string): Promise<Scrape>;
|
|
65
|
+
map(url: string): Promise<Map>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
declare class Supadata {
|
|
9
69
|
readonly youtube: YouTubeService;
|
|
10
70
|
readonly web: WebService;
|
|
11
71
|
constructor(config: SupadataConfig);
|
|
12
72
|
}
|
|
73
|
+
|
|
74
|
+
export { BaseClient, type Map, type Scrape, Supadata, type SupadataConfig, SupadataError, type Transcript, type TranscriptChunk, type TranscriptParams, type TranslateParams, type TranslatedTranscript, WebService, YouTubeService };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var e=class extends Error{error;details;documentationUrl;constructor(r){super(r.message||"An unexpected error occurred"),this.error=r.error||"internal-error",this.details=r.details||"An unexpected error occurred",this.documentationUrl=r.documentationUrl||"",this.name="SupadataError";}};var c={403:{error:"invalid-request",message:"Invalid or missing API key",details:"Please ensure you have provided a valid API key"},404:{error:"invalid-request",message:"Endpoint does not exist",details:"The API endpoint you are trying to access does not exist"},429:{error:"limit-exceeded",message:"Limit exceeded",details:"You have exceeded the allowed request rate or quota limits"}},f=(t,r)=>t in c?new e({...c[t],message:c[t].message,details:r||c[t].details}):new e({error:"internal-error",message:"An unexpected error occurred",details:r});var s=class{config;constructor(r){this.config=r;}async fetch(r,m){let u=`${this.config.baseUrl||"https://api.supadata.ai/v1"}${r.startsWith("/")?r:`/${r}`}`;if(m){let a=new URLSearchParams;Object.entries(m).forEach(([T,l])=>{l!=null&&a.append(T,String(l));}),u+=`?${a.toString()}`;}let n=await fetch(u,{method:"GET",headers:{"x-api-key":this.config.apiKey,"Content-Type":"application/json"}}),g=n.headers.get("content-type");if(!n.ok){if([403,404,429].includes(n.status)){let a=await n.json();throw f(n.status,a.message)}if(g?.includes("application/json")){let a=await n.json();throw new e(a)}else throw new e({error:"internal-error",message:"Unexpected error response format",details:await n.text()})}try{if(!g?.includes("application/json"))throw new e({error:"internal-error",message:"Invalid response format",details:"Expected JSON response but received different content type"});return await n.json()}catch(a){throw new e({error:"internal-error",message:"Failed to parse response",details:a instanceof Error?a.message:"Unknown error"})}}};var p=class extends s{async transcript(r){return this.fetch("/youtube/transcript",r)}async translate(r){return this.fetch("/youtube/transcript/translate",r)}};var d=class extends s{async scrape(r){return this.fetch("/web/scrape",{url:r})}async map(r){return this.fetch("/web/map",{url:r})}};var h=class{youtube;web;constructor(r){this.youtube=new p(r),this.web=new d(r);}};
|
|
2
|
+
export{s as BaseClient,h as Supadata,e as SupadataError,d as WebService,p as YouTubeService};//# sourceMappingURL=index.mjs.map
|
|
3
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/gateway-error-mapper.ts","../src/client.ts","../src/services/youtube.ts","../src/services/web.ts","../src/index.ts"],"names":["SupadataError","error","GATEWAY_STATUS_ERRORS","mapGatewayError","statusCode","errorText","BaseClient","config","endpoint","params","url","queryParams","key","value","response","contentType","errorData","YouTubeService","WebService","Supadata"],"mappings":"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","file":"index.mjs","sourcesContent":["export interface TranscriptChunk {\n text: string;\n offset: number;\n duration: number;\n lang: string;\n}\n\nexport interface Transcript {\n content: TranscriptChunk[] | string;\n lang: string;\n availableLangs: string[];\n}\n\nexport interface TranslatedTranscript {\n content: TranscriptChunk[] | string;\n lang: string;\n}\n\nexport interface Scrape {\n url: string;\n content: string;\n name: string;\n description: string;\n ogUrl: string;\n countCharacters: number;\n urls: string[];\n}\n\nexport interface Map {\n urls: string[];\n}\n\nexport interface SupadataConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport class SupadataError extends Error {\n error:\n | 'invalid-request'\n | 'missing-parameters'\n | 'internal-error'\n | 'transcript-unavailable'\n | 'video-not-found'\n | 'video-id-invalid'\n | 'youtube-api-error'\n | 'limit-exceeded';\n details: string;\n documentationUrl: string;\n\n constructor(error: {\n error: SupadataError['error'];\n message?: string;\n details?: string;\n documentationUrl?: string;\n }) {\n super(error.message || 'An unexpected error occurred');\n this.error = error.error || 'internal-error';\n this.details = error.details || 'An unexpected error occurred';\n this.documentationUrl = error.documentationUrl || '';\n this.name = 'SupadataError';\n }\n}\n","import { SupadataError } from './types';\n\n/*\nThe API gateway returns errors in text/plain content type. \nAs a temporary workaround we're mapping them to SupadataError.\n*/\n\nconst GATEWAY_STATUS_ERRORS = {\n 403: {\n error: 'invalid-request' as const,\n message: 'Invalid or missing API key',\n details: 'Please ensure you have provided a valid API key',\n },\n 404: {\n error: 'invalid-request' as const,\n message: 'Endpoint does not exist',\n details: 'The API endpoint you are trying to access does not exist',\n },\n 429: {\n error: 'limit-exceeded' as const,\n message: 'Limit exceeded',\n details: 'You have exceeded the allowed request rate or quota limits',\n },\n};\n\nexport const mapGatewayError = (\n statusCode: number,\n errorText: string\n): SupadataError => {\n if (statusCode in GATEWAY_STATUS_ERRORS) {\n return new SupadataError({\n ...GATEWAY_STATUS_ERRORS[\n statusCode as keyof typeof GATEWAY_STATUS_ERRORS\n ],\n message:\n GATEWAY_STATUS_ERRORS[statusCode as keyof typeof GATEWAY_STATUS_ERRORS]\n .message,\n details:\n errorText ||\n GATEWAY_STATUS_ERRORS[statusCode as keyof typeof GATEWAY_STATUS_ERRORS]\n .details,\n });\n }\n\n // Default error if status code is not recognized\n return new SupadataError({\n error: 'internal-error',\n message: 'An unexpected error occurred',\n details: errorText,\n });\n};\n","import { SupadataConfig, SupadataError } from './types.js';\nimport { mapGatewayError } from './gateway-error-mapper.js';\n\nexport class BaseClient {\n protected config: SupadataConfig;\n\n constructor(config: SupadataConfig) {\n this.config = config;\n }\n\n async fetch<T>(\n endpoint: string,\n params: Record<string, unknown> | object\n ): Promise<T> {\n const baseUrl = this.config.baseUrl || 'https://api.supadata.ai/v1';\n let url = `${baseUrl}${\n endpoint.startsWith('/') ? endpoint : `/${endpoint}`\n }`;\n\n if (params) {\n const queryParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, String(value));\n }\n });\n url += `?${queryParams.toString()}`;\n }\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n },\n });\n\n const contentType = response.headers.get('content-type');\n\n if (!response.ok) {\n // First check for gateway-specific status codes\n if ([403, 404, 429].includes(response.status)) {\n const errorData = await response.json();\n throw mapGatewayError(response.status, errorData.message);\n }\n\n // Handle standard API errors\n if (contentType?.includes('application/json')) {\n const errorData = await response.json();\n throw new SupadataError(errorData);\n } else {\n // Fallback for unexpected non-JSON errors\n throw new SupadataError({\n error: 'internal-error',\n message: 'Unexpected error response format',\n details: await response.text(),\n });\n }\n }\n\n try {\n if (!contentType?.includes('application/json')) {\n throw new SupadataError({\n error: 'internal-error',\n message: 'Invalid response format',\n details: 'Expected JSON response but received different content type',\n });\n }\n\n return (await response.json()) as T;\n } catch (error) {\n throw new SupadataError({\n error: 'internal-error',\n message: 'Failed to parse response',\n details: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n}\n","import { BaseClient } from '../client.js';\nimport { Transcript, TranslatedTranscript } from '../types.js';\n\nexport interface TranscriptParams {\n videoId: string;\n lang?: string;\n text?: boolean;\n}\n\nexport interface TranslateParams extends TranscriptParams {\n lang: string;\n}\n\nexport class YouTubeService extends BaseClient {\n async transcript(params: TranscriptParams): Promise<Transcript> {\n return this.fetch<Transcript>('/youtube/transcript', params);\n }\n\n async translate(params: TranslateParams): Promise<TranslatedTranscript> {\n return this.fetch<TranslatedTranscript>(\n '/youtube/transcript/translate',\n params\n );\n }\n}\n","import { BaseClient } from '../client.js';\nimport { Scrape, Map } from '../types.js';\n\nexport class WebService extends BaseClient {\n async scrape(url: string): Promise<Scrape> {\n return this.fetch<Scrape>('/web/scrape', { url });\n }\n\n async map(url: string): Promise<Map> {\n return this.fetch<Map>('/web/map', { url });\n }\n}\n","import { SupadataConfig } from './types.js';\nimport { YouTubeService } from './services/youtube.js';\nimport { WebService } from './services/web.js';\n\nexport * from './types.js';\nexport * from './client.js';\nexport * from './services/youtube.js';\nexport * from './services/web.js';\n\nexport class Supadata {\n readonly youtube: YouTubeService;\n readonly web: WebService;\n\n constructor(config: SupadataConfig) {\n this.youtube = new YouTubeService(config);\n this.web = new WebService(config);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@supadata/js",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "TypeScript / JavaScript SDK for Supadata API",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
5
|
+
"homepage": "https://supadata.ai",
|
|
6
|
+
"repository": "https://github.com/supadata-ai/js",
|
|
7
|
+
"main": "./dist/index.cjs",
|
|
8
|
+
"module": "./dist/index.mjs",
|
|
8
9
|
"types": "./dist/index.d.ts",
|
|
9
10
|
"exports": {
|
|
10
11
|
".": {
|
|
11
12
|
"types": "./dist/index.d.ts",
|
|
12
|
-
"import": "./dist/index.
|
|
13
|
+
"import": "./dist/index.mjs",
|
|
14
|
+
"require": "./dist/index.cjs",
|
|
15
|
+
"default": "./dist/index.mjs"
|
|
13
16
|
}
|
|
14
17
|
},
|
|
15
18
|
"scripts": {
|
|
16
|
-
"
|
|
19
|
+
"dev": "tsup --watch",
|
|
20
|
+
"build": "tsup",
|
|
17
21
|
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
|
|
18
22
|
"prepare": "npm run build",
|
|
19
23
|
"format": "prettier --write \"src/**/*.{js,ts}\"",
|
|
@@ -41,6 +45,7 @@
|
|
|
41
45
|
"jest-fetch-mock": "^3.0.3",
|
|
42
46
|
"prettier": "^3.4.2",
|
|
43
47
|
"ts-jest": "^29.2.5",
|
|
44
|
-
"typescript": "^5.7.3"
|
|
48
|
+
"typescript": "^5.7.3",
|
|
49
|
+
"tsup": "^8.3.6"
|
|
45
50
|
}
|
|
46
51
|
}
|
package/dist/client.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { SupadataConfig, Error } from "./types.js";
|
|
2
|
-
export declare class BaseClient {
|
|
3
|
-
protected config: SupadataConfig;
|
|
4
|
-
constructor(config: SupadataConfig);
|
|
5
|
-
fetch<T>(endpoint: string, params: Record<string, unknown> | object): Promise<T>;
|
|
6
|
-
}
|
|
7
|
-
export declare class SupadataError extends Error {
|
|
8
|
-
code: Error["code"];
|
|
9
|
-
title: string;
|
|
10
|
-
documentationUrl: string;
|
|
11
|
-
constructor(error: Error);
|
|
12
|
-
}
|
package/dist/client.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
export class BaseClient {
|
|
2
|
-
config;
|
|
3
|
-
constructor(config) {
|
|
4
|
-
this.config = config;
|
|
5
|
-
}
|
|
6
|
-
async fetch(endpoint, params) {
|
|
7
|
-
const baseUrl = this.config.baseUrl || "https://api.supadata.ai/v1";
|
|
8
|
-
let url = `${baseUrl}${endpoint.startsWith("/") ? endpoint : `/${endpoint}`}`;
|
|
9
|
-
if (params) {
|
|
10
|
-
const queryParams = new URLSearchParams();
|
|
11
|
-
Object.entries(params).forEach(([key, value]) => {
|
|
12
|
-
if (value !== undefined && value !== null) {
|
|
13
|
-
queryParams.append(key, String(value));
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
url += `?${queryParams.toString()}`;
|
|
17
|
-
}
|
|
18
|
-
const response = await fetch(url, {
|
|
19
|
-
method: "GET",
|
|
20
|
-
headers: {
|
|
21
|
-
"x-api-key": this.config.apiKey,
|
|
22
|
-
"Content-Type": "application/json",
|
|
23
|
-
},
|
|
24
|
-
});
|
|
25
|
-
const data = await response.json();
|
|
26
|
-
if (!response.ok) {
|
|
27
|
-
const error = data;
|
|
28
|
-
throw new SupadataError(error);
|
|
29
|
-
}
|
|
30
|
-
return data;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
export class SupadataError extends Error {
|
|
34
|
-
code;
|
|
35
|
-
title;
|
|
36
|
-
documentationUrl;
|
|
37
|
-
constructor(error) {
|
|
38
|
-
super(error.description);
|
|
39
|
-
this.code = error.code;
|
|
40
|
-
this.title = error.title;
|
|
41
|
-
this.documentationUrl = error.documentationUrl;
|
|
42
|
-
}
|
|
43
|
-
}
|
package/dist/index.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { YouTubeService } from './services/youtube.js';
|
|
2
|
-
import { WebService } from './services/web.js';
|
|
3
|
-
export * from './types.js';
|
|
4
|
-
export * from './client.js';
|
|
5
|
-
export * from './services/youtube.js';
|
|
6
|
-
export * from './services/web.js';
|
|
7
|
-
export class Supadata {
|
|
8
|
-
youtube;
|
|
9
|
-
web;
|
|
10
|
-
constructor(config) {
|
|
11
|
-
this.youtube = new YouTubeService(config);
|
|
12
|
-
this.web = new WebService(config);
|
|
13
|
-
}
|
|
14
|
-
}
|
package/dist/services/web.d.ts
DELETED
package/dist/services/web.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { BaseClient } from "../client.js";
|
|
2
|
-
import { Transcript, TranslatedTranscript } from "../types.js";
|
|
3
|
-
export interface TranscriptParams {
|
|
4
|
-
videoId: string;
|
|
5
|
-
lang?: string;
|
|
6
|
-
text?: boolean;
|
|
7
|
-
}
|
|
8
|
-
export interface TranslateParams extends TranscriptParams {
|
|
9
|
-
lang: string;
|
|
10
|
-
}
|
|
11
|
-
export declare class YouTubeService extends BaseClient {
|
|
12
|
-
transcript(params: TranscriptParams): Promise<Transcript>;
|
|
13
|
-
translate(params: TranslateParams): Promise<TranslatedTranscript>;
|
|
14
|
-
}
|
package/dist/services/youtube.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { BaseClient } from "../client.js";
|
|
2
|
-
export class YouTubeService extends BaseClient {
|
|
3
|
-
async transcript(params) {
|
|
4
|
-
return this.fetch("/youtube/transcript", params);
|
|
5
|
-
}
|
|
6
|
-
async translate(params) {
|
|
7
|
-
return this.fetch("/youtube/transcript/translate", params);
|
|
8
|
-
}
|
|
9
|
-
}
|
package/dist/types.d.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
export interface TranscriptChunk {
|
|
2
|
-
text: string;
|
|
3
|
-
offset: number;
|
|
4
|
-
duration: number;
|
|
5
|
-
lang: string;
|
|
6
|
-
}
|
|
7
|
-
export interface Transcript {
|
|
8
|
-
content: TranscriptChunk[] | string;
|
|
9
|
-
lang: string;
|
|
10
|
-
availableLangs: string[];
|
|
11
|
-
}
|
|
12
|
-
export interface TranslatedTranscript {
|
|
13
|
-
content: TranscriptChunk[] | string;
|
|
14
|
-
lang: string;
|
|
15
|
-
}
|
|
16
|
-
export interface Scrape {
|
|
17
|
-
url: string;
|
|
18
|
-
content: string;
|
|
19
|
-
name: string;
|
|
20
|
-
description: string;
|
|
21
|
-
ogUrl: string;
|
|
22
|
-
countCharacters: number;
|
|
23
|
-
urls: string[];
|
|
24
|
-
}
|
|
25
|
-
export interface Map {
|
|
26
|
-
urls: string[];
|
|
27
|
-
}
|
|
28
|
-
export interface SupadataConfig {
|
|
29
|
-
apiKey: string;
|
|
30
|
-
baseUrl?: string;
|
|
31
|
-
}
|
|
32
|
-
export interface Error {
|
|
33
|
-
code: 'invalid-request' | 'missing-parameters' | 'internal-error' | 'transcript-unavailable' | 'video-not-found' | 'video-id-invalid' | 'youtube-api-error' | 'quota-exceeded' | 'rate-limit-exceeded';
|
|
34
|
-
title: string;
|
|
35
|
-
description: string;
|
|
36
|
-
documentationUrl: string;
|
|
37
|
-
}
|
package/dist/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|