@x402jobs/sdk 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -11,19 +11,24 @@ interface TopOptions {
11
11
  }
12
12
  interface Resource {
13
13
  id: string;
14
- url: string;
15
14
  name: string;
16
- description: string;
17
- icon_url: string | null;
18
- category: string;
19
- price: string;
20
- owner_id: string;
21
- created_at: string;
22
- updated_at: string;
23
- success_rate: number | null;
24
- calls: number;
25
- value_processed: string;
26
- last_called: string | null;
15
+ description?: string;
16
+ resource_url: string;
17
+ network?: string;
18
+ category?: string;
19
+ price?: string;
20
+ icon_url?: string | null;
21
+ owner_id?: string;
22
+ created_at?: string;
23
+ updated_at?: string;
24
+ success_rate?: number | null;
25
+ calls?: number;
26
+ value_processed?: string;
27
+ last_called?: string | null;
28
+ }
29
+ interface ResourceListOptions {
30
+ limit?: number;
31
+ sort?: 'popular' | 'recent' | 'name';
27
32
  }
28
33
  interface ResourceSearchOptions {
29
34
  query?: string;
@@ -91,7 +96,7 @@ type GetInput = string | {
91
96
  declare class ResourcesAPI {
92
97
  private http;
93
98
  constructor(http: HttpClient);
94
- list(): Promise<Resource[]>;
99
+ list(options?: ResourceListOptions): Promise<Resource[]>;
95
100
  get(input: GetInput): Promise<Resource>;
96
101
  search(options?: ResourceSearchOptions): Promise<Resource[]>;
97
102
  register(input: ResourceCreateInput): Promise<Resource>;
@@ -119,4 +124,4 @@ declare class X402Error extends Error {
119
124
  static fromStatus(status: number, message?: string): X402Error;
120
125
  }
121
126
 
122
- export { type ClientOptions, type ErrorCode, type Resource, type ResourceCreateInput, type ResourceSearchOptions, type ResourceUpdateInput, type Score, type TopOptions, type WalletConfig, X402Error, X402Jobs };
127
+ export { type ClientOptions, type ErrorCode, type Resource, type ResourceCreateInput, type ResourceListOptions, type ResourceSearchOptions, type ResourceUpdateInput, type Score, type TopOptions, type WalletConfig, X402Error, X402Jobs };
package/dist/index.d.ts CHANGED
@@ -11,19 +11,24 @@ interface TopOptions {
11
11
  }
12
12
  interface Resource {
13
13
  id: string;
14
- url: string;
15
14
  name: string;
16
- description: string;
17
- icon_url: string | null;
18
- category: string;
19
- price: string;
20
- owner_id: string;
21
- created_at: string;
22
- updated_at: string;
23
- success_rate: number | null;
24
- calls: number;
25
- value_processed: string;
26
- last_called: string | null;
15
+ description?: string;
16
+ resource_url: string;
17
+ network?: string;
18
+ category?: string;
19
+ price?: string;
20
+ icon_url?: string | null;
21
+ owner_id?: string;
22
+ created_at?: string;
23
+ updated_at?: string;
24
+ success_rate?: number | null;
25
+ calls?: number;
26
+ value_processed?: string;
27
+ last_called?: string | null;
28
+ }
29
+ interface ResourceListOptions {
30
+ limit?: number;
31
+ sort?: 'popular' | 'recent' | 'name';
27
32
  }
28
33
  interface ResourceSearchOptions {
29
34
  query?: string;
@@ -91,7 +96,7 @@ type GetInput = string | {
91
96
  declare class ResourcesAPI {
92
97
  private http;
93
98
  constructor(http: HttpClient);
94
- list(): Promise<Resource[]>;
99
+ list(options?: ResourceListOptions): Promise<Resource[]>;
95
100
  get(input: GetInput): Promise<Resource>;
96
101
  search(options?: ResourceSearchOptions): Promise<Resource[]>;
97
102
  register(input: ResourceCreateInput): Promise<Resource>;
@@ -119,4 +124,4 @@ declare class X402Error extends Error {
119
124
  static fromStatus(status: number, message?: string): X402Error;
120
125
  }
121
126
 
122
- export { type ClientOptions, type ErrorCode, type Resource, type ResourceCreateInput, type ResourceSearchOptions, type ResourceUpdateInput, type Score, type TopOptions, type WalletConfig, X402Error, X402Jobs };
127
+ export { type ClientOptions, type ErrorCode, type Resource, type ResourceCreateInput, type ResourceListOptions, type ResourceSearchOptions, type ResourceUpdateInput, type Score, type TopOptions, type WalletConfig, X402Error, X402Jobs };
package/dist/index.js CHANGED
@@ -78,7 +78,7 @@ var X402Error = class _X402Error extends Error {
78
78
  };
79
79
 
80
80
  // src/http.ts
81
- var DEFAULT_BASE_URL = "https://x402.jobs/api/v1";
81
+ var DEFAULT_BASE_URL = "https://api.x402.jobs/api/v1";
82
82
  var HttpClient = class {
83
83
  constructor(options = {}) {
84
84
  this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, "");
@@ -173,8 +173,12 @@ var ResourcesAPI = class {
173
173
  constructor(http) {
174
174
  this.http = http;
175
175
  }
176
- async list() {
177
- return this.http.get("/resources");
176
+ async list(options = {}) {
177
+ const params = {};
178
+ if (options.limit !== void 0) params["limit"] = options.limit;
179
+ if (options.sort) params["sort"] = options.sort;
180
+ const response = await this.http.get("/resources", params);
181
+ return response.resources;
178
182
  }
179
183
  async get(input) {
180
184
  if (typeof input === "string") {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/http.ts","../src/check.ts","../src/resources.ts","../src/client.ts"],"sourcesContent":["// Main export\nexport { X402Jobs } from './client'\n\n// Error class\nexport { X402Error } from './errors'\n\n// Type exports\nexport type {\n Score,\n TopOptions,\n Resource,\n ResourceSearchOptions,\n ResourceCreateInput,\n ResourceUpdateInput,\n ClientOptions,\n WalletConfig,\n ErrorCode,\n} from './types'\n","import type { ErrorCode } from './types'\n\nexport class X402Error extends Error {\n readonly code: ErrorCode\n readonly status: number\n\n constructor(code: ErrorCode, message: string, status: number) {\n super(message)\n this.name = 'X402Error'\n this.code = code\n this.status = status\n\n // Maintains proper stack trace for where error was thrown (V8 engines)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, X402Error)\n }\n }\n\n static notFound(message = 'Resource not found'): X402Error {\n return new X402Error('NOT_FOUND', message, 404)\n }\n\n static paymentRequired(message = 'Payment required'): X402Error {\n return new X402Error('PAYMENT_REQUIRED', message, 402)\n }\n\n static rateLimited(message = 'Too many requests'): X402Error {\n return new X402Error('RATE_LIMITED', message, 429)\n }\n\n static unauthorized(message = 'Invalid or missing API key'): X402Error {\n return new X402Error('UNAUTHORIZED', message, 401)\n }\n\n static forbidden(message = 'Access denied'): X402Error {\n return new X402Error('FORBIDDEN', message, 403)\n }\n\n static validationError(message: string): X402Error {\n return new X402Error('VALIDATION_ERROR', message, 400)\n }\n\n static serverError(message = 'Internal server error'): X402Error {\n return new X402Error('SERVER_ERROR', message, 500)\n }\n\n static fromStatus(status: number, message?: string): X402Error {\n switch (status) {\n case 400:\n return X402Error.validationError(message ?? 'Invalid request')\n case 401:\n return X402Error.unauthorized(message)\n case 402:\n return X402Error.paymentRequired(message)\n case 403:\n return X402Error.forbidden(message)\n case 404:\n return X402Error.notFound(message)\n case 429:\n return X402Error.rateLimited(message)\n default:\n return X402Error.serverError(message)\n }\n }\n}\n","import { X402Error } from './errors'\nimport type { ClientOptions } from './types'\n\ntype HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE'\n\ninterface RequestOptions {\n method?: HttpMethod\n body?: unknown\n params?: Record<string, string | number | boolean | undefined>\n}\n\nconst DEFAULT_BASE_URL = 'https://x402.jobs/api/v1'\n\nexport class HttpClient {\n private baseUrl: string\n private apiKey: string | undefined\n\n constructor(options: ClientOptions = {}) {\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n this.apiKey = options.apiKey\n }\n\n private buildUrl(path: string, params?: RequestOptions['params']): string {\n const url = new URL(path, this.baseUrl)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n return url.toString()\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n }\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`\n }\n\n return headers\n }\n\n private async parseResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type')\n\n if (!contentType?.includes('application/json')) {\n if (!response.ok) {\n throw X402Error.fromStatus(response.status, response.statusText)\n }\n return undefined as T\n }\n\n const data = (await response.json()) as { error?: { code?: string; message?: string } } | T\n\n if (!response.ok) {\n const errorData = data as { error?: { code?: string; message?: string } }\n const message = errorData?.error?.message ?? response.statusText\n throw X402Error.fromStatus(response.status, message)\n }\n\n return data as T\n }\n\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const { method = 'GET', body, params } = options\n const url = this.buildUrl(path, params)\n const headers = this.getHeaders()\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n }\n\n if (body !== undefined) {\n fetchOptions.body = JSON.stringify(body)\n }\n\n const response = await fetch(url, fetchOptions)\n return this.parseResponse<T>(response)\n }\n\n get<T>(path: string, params?: RequestOptions['params']): Promise<T> {\n return this.request<T>(path, { method: 'GET', params })\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'POST', body })\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PATCH', body })\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>(path, { method: 'DELETE' })\n }\n}\n","import type { HttpClient } from './http'\nimport type { Score, TopOptions } from './types'\n\nexport interface CheckAPI {\n (url: string): Promise<Score>\n many(urls: string[]): Promise<Score[]>\n exists(url: string): Promise<boolean>\n top(options?: TopOptions): Promise<Score[]>\n}\n\nexport function createCheckAPI(http: HttpClient): CheckAPI {\n const check = async (url: string): Promise<Score> => {\n return http.get<Score>('/resources/score', { url })\n }\n\n check.many = async (urls: string[]): Promise<Score[]> => {\n return Promise.all(urls.map((url) => check(url)))\n }\n\n check.exists = async (url: string): Promise<boolean> => {\n const result = await http.get<{ exists: boolean }>('/resources/exists', { url })\n return result.exists\n }\n\n check.top = async (options: TopOptions = {}): Promise<Score[]> => {\n const { limit = 20, category } = options\n return http.get<Score[]>('/resources/top', { limit, category })\n }\n\n return check\n}\n","import type { HttpClient } from './http'\nimport type {\n Resource,\n ResourceSearchOptions,\n ResourceCreateInput,\n ResourceUpdateInput,\n} from './types'\n\ntype GetInput = string | { id: string }\n\nexport class ResourcesAPI {\n constructor(private http: HttpClient) {}\n\n async list(): Promise<Resource[]> {\n return this.http.get<Resource[]>('/resources')\n }\n\n async get(input: GetInput): Promise<Resource> {\n if (typeof input === 'string') {\n return this.http.get<Resource>('/resources', { url: input })\n }\n return this.http.get<Resource>(`/resources/${input.id}`)\n }\n\n async search(options: ResourceSearchOptions = {}): Promise<Resource[]> {\n const params: Record<string, string | number | undefined> = {}\n\n if (options.query) params['q'] = options.query\n if (options.category) params['category'] = options.category\n if (options.minSuccessRate !== undefined) params['min_success_rate'] = options.minSuccessRate\n if (options.minCalls !== undefined) params['min_calls'] = options.minCalls\n if (options.limit !== undefined) params['limit'] = options.limit\n if (options.offset !== undefined) params['offset'] = options.offset\n\n return this.http.get<Resource[]>('/resources/search', params)\n }\n\n async register(input: ResourceCreateInput): Promise<Resource> {\n return this.http.post<Resource>('/resources', input)\n }\n\n async update(id: string, input: ResourceUpdateInput): Promise<Resource> {\n return this.http.patch<Resource>(`/resources/${id}`, input)\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/resources/${id}`)\n }\n}\n","import { HttpClient } from './http'\nimport { createCheckAPI, type CheckAPI } from './check'\nimport { ResourcesAPI } from './resources'\nimport type { ClientOptions } from './types'\n\nexport class X402Jobs {\n readonly check: CheckAPI\n readonly resources: ResourcesAPI\n\n constructor(options: ClientOptions = {}) {\n const http = new HttpClient(options)\n this.check = createCheckAPI(http)\n this.resources = new ResourcesAPI(http)\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/http.ts","../src/check.ts","../src/resources.ts","../src/client.ts"],"sourcesContent":["// Main export\nexport { X402Jobs } from './client'\n\n// Error class\nexport { X402Error } from './errors'\n\n// Type exports\nexport type {\n Score,\n TopOptions,\n Resource,\n ResourceListOptions,\n ResourceSearchOptions,\n ResourceCreateInput,\n ResourceUpdateInput,\n ClientOptions,\n WalletConfig,\n ErrorCode,\n} from './types'\n","import type { ErrorCode } from './types'\n\nexport class X402Error extends Error {\n readonly code: ErrorCode\n readonly status: number\n\n constructor(code: ErrorCode, message: string, status: number) {\n super(message)\n this.name = 'X402Error'\n this.code = code\n this.status = status\n\n // Maintains proper stack trace for where error was thrown (V8 engines)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, X402Error)\n }\n }\n\n static notFound(message = 'Resource not found'): X402Error {\n return new X402Error('NOT_FOUND', message, 404)\n }\n\n static paymentRequired(message = 'Payment required'): X402Error {\n return new X402Error('PAYMENT_REQUIRED', message, 402)\n }\n\n static rateLimited(message = 'Too many requests'): X402Error {\n return new X402Error('RATE_LIMITED', message, 429)\n }\n\n static unauthorized(message = 'Invalid or missing API key'): X402Error {\n return new X402Error('UNAUTHORIZED', message, 401)\n }\n\n static forbidden(message = 'Access denied'): X402Error {\n return new X402Error('FORBIDDEN', message, 403)\n }\n\n static validationError(message: string): X402Error {\n return new X402Error('VALIDATION_ERROR', message, 400)\n }\n\n static serverError(message = 'Internal server error'): X402Error {\n return new X402Error('SERVER_ERROR', message, 500)\n }\n\n static fromStatus(status: number, message?: string): X402Error {\n switch (status) {\n case 400:\n return X402Error.validationError(message ?? 'Invalid request')\n case 401:\n return X402Error.unauthorized(message)\n case 402:\n return X402Error.paymentRequired(message)\n case 403:\n return X402Error.forbidden(message)\n case 404:\n return X402Error.notFound(message)\n case 429:\n return X402Error.rateLimited(message)\n default:\n return X402Error.serverError(message)\n }\n }\n}\n","import { X402Error } from './errors'\nimport type { ClientOptions } from './types'\n\ntype HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE'\n\ninterface RequestOptions {\n method?: HttpMethod\n body?: unknown\n params?: Record<string, string | number | boolean | undefined>\n}\n\nconst DEFAULT_BASE_URL = 'https://api.x402.jobs/api/v1'\n\nexport class HttpClient {\n private baseUrl: string\n private apiKey: string | undefined\n\n constructor(options: ClientOptions = {}) {\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n this.apiKey = options.apiKey\n }\n\n private buildUrl(path: string, params?: RequestOptions['params']): string {\n const url = new URL(path, this.baseUrl)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n return url.toString()\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n }\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`\n }\n\n return headers\n }\n\n private async parseResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type')\n\n if (!contentType?.includes('application/json')) {\n if (!response.ok) {\n throw X402Error.fromStatus(response.status, response.statusText)\n }\n return undefined as T\n }\n\n const data = (await response.json()) as { error?: { code?: string; message?: string } } | T\n\n if (!response.ok) {\n const errorData = data as { error?: { code?: string; message?: string } }\n const message = errorData?.error?.message ?? response.statusText\n throw X402Error.fromStatus(response.status, message)\n }\n\n return data as T\n }\n\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const { method = 'GET', body, params } = options\n const url = this.buildUrl(path, params)\n const headers = this.getHeaders()\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n }\n\n if (body !== undefined) {\n fetchOptions.body = JSON.stringify(body)\n }\n\n const response = await fetch(url, fetchOptions)\n return this.parseResponse<T>(response)\n }\n\n get<T>(path: string, params?: RequestOptions['params']): Promise<T> {\n return this.request<T>(path, { method: 'GET', params })\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'POST', body })\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PATCH', body })\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>(path, { method: 'DELETE' })\n }\n}\n","import type { HttpClient } from './http'\nimport type { Score, TopOptions } from './types'\n\nexport interface CheckAPI {\n (url: string): Promise<Score>\n many(urls: string[]): Promise<Score[]>\n exists(url: string): Promise<boolean>\n top(options?: TopOptions): Promise<Score[]>\n}\n\nexport function createCheckAPI(http: HttpClient): CheckAPI {\n const check = async (url: string): Promise<Score> => {\n return http.get<Score>('/resources/score', { url })\n }\n\n check.many = async (urls: string[]): Promise<Score[]> => {\n return Promise.all(urls.map((url) => check(url)))\n }\n\n check.exists = async (url: string): Promise<boolean> => {\n const result = await http.get<{ exists: boolean }>('/resources/exists', { url })\n return result.exists\n }\n\n check.top = async (options: TopOptions = {}): Promise<Score[]> => {\n const { limit = 20, category } = options\n return http.get<Score[]>('/resources/top', { limit, category })\n }\n\n return check\n}\n","import type { HttpClient } from './http'\nimport type {\n Resource,\n ResourceListOptions,\n ResourceSearchOptions,\n ResourceCreateInput,\n ResourceUpdateInput,\n} from './types'\n\ntype GetInput = string | { id: string }\n\nexport class ResourcesAPI {\n constructor(private http: HttpClient) {}\n\n async list(options: ResourceListOptions = {}): Promise<Resource[]> {\n const params: Record<string, string | number | undefined> = {}\n if (options.limit !== undefined) params['limit'] = options.limit\n if (options.sort) params['sort'] = options.sort\n const response = await this.http.get<{ resources: Resource[] }>('/resources', params)\n return response.resources\n }\n\n async get(input: GetInput): Promise<Resource> {\n if (typeof input === 'string') {\n return this.http.get<Resource>('/resources', { url: input })\n }\n return this.http.get<Resource>(`/resources/${input.id}`)\n }\n\n async search(options: ResourceSearchOptions = {}): Promise<Resource[]> {\n const params: Record<string, string | number | undefined> = {}\n\n if (options.query) params['q'] = options.query\n if (options.category) params['category'] = options.category\n if (options.minSuccessRate !== undefined) params['min_success_rate'] = options.minSuccessRate\n if (options.minCalls !== undefined) params['min_calls'] = options.minCalls\n if (options.limit !== undefined) params['limit'] = options.limit\n if (options.offset !== undefined) params['offset'] = options.offset\n\n return this.http.get<Resource[]>('/resources/search', params)\n }\n\n async register(input: ResourceCreateInput): Promise<Resource> {\n return this.http.post<Resource>('/resources', input)\n }\n\n async update(id: string, input: ResourceUpdateInput): Promise<Resource> {\n return this.http.patch<Resource>(`/resources/${id}`, input)\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/resources/${id}`)\n }\n}\n","import { HttpClient } from './http'\nimport { createCheckAPI, type CheckAPI } from './check'\nimport { ResourcesAPI } from './resources'\nimport type { ClientOptions } from './types'\n\nexport class X402Jobs {\n readonly check: CheckAPI\n readonly resources: ResourcesAPI\n\n constructor(options: ClientOptions = {}) {\n const http = new HttpClient(options)\n this.check = createCheckAPI(http)\n this.resources = new ResourcesAPI(http)\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -51,7 +51,7 @@ var X402Error = class _X402Error extends Error {
51
51
  };
52
52
 
53
53
  // src/http.ts
54
- var DEFAULT_BASE_URL = "https://x402.jobs/api/v1";
54
+ var DEFAULT_BASE_URL = "https://api.x402.jobs/api/v1";
55
55
  var HttpClient = class {
56
56
  constructor(options = {}) {
57
57
  this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, "");
@@ -146,8 +146,12 @@ var ResourcesAPI = class {
146
146
  constructor(http) {
147
147
  this.http = http;
148
148
  }
149
- async list() {
150
- return this.http.get("/resources");
149
+ async list(options = {}) {
150
+ const params = {};
151
+ if (options.limit !== void 0) params["limit"] = options.limit;
152
+ if (options.sort) params["sort"] = options.sort;
153
+ const response = await this.http.get("/resources", params);
154
+ return response.resources;
151
155
  }
152
156
  async get(input) {
153
157
  if (typeof input === "string") {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/check.ts","../src/resources.ts","../src/client.ts"],"sourcesContent":["import type { ErrorCode } from './types'\n\nexport class X402Error extends Error {\n readonly code: ErrorCode\n readonly status: number\n\n constructor(code: ErrorCode, message: string, status: number) {\n super(message)\n this.name = 'X402Error'\n this.code = code\n this.status = status\n\n // Maintains proper stack trace for where error was thrown (V8 engines)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, X402Error)\n }\n }\n\n static notFound(message = 'Resource not found'): X402Error {\n return new X402Error('NOT_FOUND', message, 404)\n }\n\n static paymentRequired(message = 'Payment required'): X402Error {\n return new X402Error('PAYMENT_REQUIRED', message, 402)\n }\n\n static rateLimited(message = 'Too many requests'): X402Error {\n return new X402Error('RATE_LIMITED', message, 429)\n }\n\n static unauthorized(message = 'Invalid or missing API key'): X402Error {\n return new X402Error('UNAUTHORIZED', message, 401)\n }\n\n static forbidden(message = 'Access denied'): X402Error {\n return new X402Error('FORBIDDEN', message, 403)\n }\n\n static validationError(message: string): X402Error {\n return new X402Error('VALIDATION_ERROR', message, 400)\n }\n\n static serverError(message = 'Internal server error'): X402Error {\n return new X402Error('SERVER_ERROR', message, 500)\n }\n\n static fromStatus(status: number, message?: string): X402Error {\n switch (status) {\n case 400:\n return X402Error.validationError(message ?? 'Invalid request')\n case 401:\n return X402Error.unauthorized(message)\n case 402:\n return X402Error.paymentRequired(message)\n case 403:\n return X402Error.forbidden(message)\n case 404:\n return X402Error.notFound(message)\n case 429:\n return X402Error.rateLimited(message)\n default:\n return X402Error.serverError(message)\n }\n }\n}\n","import { X402Error } from './errors'\nimport type { ClientOptions } from './types'\n\ntype HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE'\n\ninterface RequestOptions {\n method?: HttpMethod\n body?: unknown\n params?: Record<string, string | number | boolean | undefined>\n}\n\nconst DEFAULT_BASE_URL = 'https://x402.jobs/api/v1'\n\nexport class HttpClient {\n private baseUrl: string\n private apiKey: string | undefined\n\n constructor(options: ClientOptions = {}) {\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n this.apiKey = options.apiKey\n }\n\n private buildUrl(path: string, params?: RequestOptions['params']): string {\n const url = new URL(path, this.baseUrl)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n return url.toString()\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n }\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`\n }\n\n return headers\n }\n\n private async parseResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type')\n\n if (!contentType?.includes('application/json')) {\n if (!response.ok) {\n throw X402Error.fromStatus(response.status, response.statusText)\n }\n return undefined as T\n }\n\n const data = (await response.json()) as { error?: { code?: string; message?: string } } | T\n\n if (!response.ok) {\n const errorData = data as { error?: { code?: string; message?: string } }\n const message = errorData?.error?.message ?? response.statusText\n throw X402Error.fromStatus(response.status, message)\n }\n\n return data as T\n }\n\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const { method = 'GET', body, params } = options\n const url = this.buildUrl(path, params)\n const headers = this.getHeaders()\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n }\n\n if (body !== undefined) {\n fetchOptions.body = JSON.stringify(body)\n }\n\n const response = await fetch(url, fetchOptions)\n return this.parseResponse<T>(response)\n }\n\n get<T>(path: string, params?: RequestOptions['params']): Promise<T> {\n return this.request<T>(path, { method: 'GET', params })\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'POST', body })\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PATCH', body })\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>(path, { method: 'DELETE' })\n }\n}\n","import type { HttpClient } from './http'\nimport type { Score, TopOptions } from './types'\n\nexport interface CheckAPI {\n (url: string): Promise<Score>\n many(urls: string[]): Promise<Score[]>\n exists(url: string): Promise<boolean>\n top(options?: TopOptions): Promise<Score[]>\n}\n\nexport function createCheckAPI(http: HttpClient): CheckAPI {\n const check = async (url: string): Promise<Score> => {\n return http.get<Score>('/resources/score', { url })\n }\n\n check.many = async (urls: string[]): Promise<Score[]> => {\n return Promise.all(urls.map((url) => check(url)))\n }\n\n check.exists = async (url: string): Promise<boolean> => {\n const result = await http.get<{ exists: boolean }>('/resources/exists', { url })\n return result.exists\n }\n\n check.top = async (options: TopOptions = {}): Promise<Score[]> => {\n const { limit = 20, category } = options\n return http.get<Score[]>('/resources/top', { limit, category })\n }\n\n return check\n}\n","import type { HttpClient } from './http'\nimport type {\n Resource,\n ResourceSearchOptions,\n ResourceCreateInput,\n ResourceUpdateInput,\n} from './types'\n\ntype GetInput = string | { id: string }\n\nexport class ResourcesAPI {\n constructor(private http: HttpClient) {}\n\n async list(): Promise<Resource[]> {\n return this.http.get<Resource[]>('/resources')\n }\n\n async get(input: GetInput): Promise<Resource> {\n if (typeof input === 'string') {\n return this.http.get<Resource>('/resources', { url: input })\n }\n return this.http.get<Resource>(`/resources/${input.id}`)\n }\n\n async search(options: ResourceSearchOptions = {}): Promise<Resource[]> {\n const params: Record<string, string | number | undefined> = {}\n\n if (options.query) params['q'] = options.query\n if (options.category) params['category'] = options.category\n if (options.minSuccessRate !== undefined) params['min_success_rate'] = options.minSuccessRate\n if (options.minCalls !== undefined) params['min_calls'] = options.minCalls\n if (options.limit !== undefined) params['limit'] = options.limit\n if (options.offset !== undefined) params['offset'] = options.offset\n\n return this.http.get<Resource[]>('/resources/search', params)\n }\n\n async register(input: ResourceCreateInput): Promise<Resource> {\n return this.http.post<Resource>('/resources', input)\n }\n\n async update(id: string, input: ResourceUpdateInput): Promise<Resource> {\n return this.http.patch<Resource>(`/resources/${id}`, input)\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/resources/${id}`)\n }\n}\n","import { HttpClient } from './http'\nimport { createCheckAPI, type CheckAPI } from './check'\nimport { ResourcesAPI } from './resources'\nimport type { ClientOptions } from './types'\n\nexport class X402Jobs {\n readonly check: CheckAPI\n readonly resources: ResourcesAPI\n\n constructor(options: ClientOptions = {}) {\n const http = new HttpClient(options)\n this.check = createCheckAPI(http)\n this.resources = new ResourcesAPI(http)\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/check.ts","../src/resources.ts","../src/client.ts"],"sourcesContent":["import type { ErrorCode } from './types'\n\nexport class X402Error extends Error {\n readonly code: ErrorCode\n readonly status: number\n\n constructor(code: ErrorCode, message: string, status: number) {\n super(message)\n this.name = 'X402Error'\n this.code = code\n this.status = status\n\n // Maintains proper stack trace for where error was thrown (V8 engines)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, X402Error)\n }\n }\n\n static notFound(message = 'Resource not found'): X402Error {\n return new X402Error('NOT_FOUND', message, 404)\n }\n\n static paymentRequired(message = 'Payment required'): X402Error {\n return new X402Error('PAYMENT_REQUIRED', message, 402)\n }\n\n static rateLimited(message = 'Too many requests'): X402Error {\n return new X402Error('RATE_LIMITED', message, 429)\n }\n\n static unauthorized(message = 'Invalid or missing API key'): X402Error {\n return new X402Error('UNAUTHORIZED', message, 401)\n }\n\n static forbidden(message = 'Access denied'): X402Error {\n return new X402Error('FORBIDDEN', message, 403)\n }\n\n static validationError(message: string): X402Error {\n return new X402Error('VALIDATION_ERROR', message, 400)\n }\n\n static serverError(message = 'Internal server error'): X402Error {\n return new X402Error('SERVER_ERROR', message, 500)\n }\n\n static fromStatus(status: number, message?: string): X402Error {\n switch (status) {\n case 400:\n return X402Error.validationError(message ?? 'Invalid request')\n case 401:\n return X402Error.unauthorized(message)\n case 402:\n return X402Error.paymentRequired(message)\n case 403:\n return X402Error.forbidden(message)\n case 404:\n return X402Error.notFound(message)\n case 429:\n return X402Error.rateLimited(message)\n default:\n return X402Error.serverError(message)\n }\n }\n}\n","import { X402Error } from './errors'\nimport type { ClientOptions } from './types'\n\ntype HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE'\n\ninterface RequestOptions {\n method?: HttpMethod\n body?: unknown\n params?: Record<string, string | number | boolean | undefined>\n}\n\nconst DEFAULT_BASE_URL = 'https://api.x402.jobs/api/v1'\n\nexport class HttpClient {\n private baseUrl: string\n private apiKey: string | undefined\n\n constructor(options: ClientOptions = {}) {\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n this.apiKey = options.apiKey\n }\n\n private buildUrl(path: string, params?: RequestOptions['params']): string {\n const url = new URL(path, this.baseUrl)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n return url.toString()\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n }\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`\n }\n\n return headers\n }\n\n private async parseResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type')\n\n if (!contentType?.includes('application/json')) {\n if (!response.ok) {\n throw X402Error.fromStatus(response.status, response.statusText)\n }\n return undefined as T\n }\n\n const data = (await response.json()) as { error?: { code?: string; message?: string } } | T\n\n if (!response.ok) {\n const errorData = data as { error?: { code?: string; message?: string } }\n const message = errorData?.error?.message ?? response.statusText\n throw X402Error.fromStatus(response.status, message)\n }\n\n return data as T\n }\n\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const { method = 'GET', body, params } = options\n const url = this.buildUrl(path, params)\n const headers = this.getHeaders()\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n }\n\n if (body !== undefined) {\n fetchOptions.body = JSON.stringify(body)\n }\n\n const response = await fetch(url, fetchOptions)\n return this.parseResponse<T>(response)\n }\n\n get<T>(path: string, params?: RequestOptions['params']): Promise<T> {\n return this.request<T>(path, { method: 'GET', params })\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'POST', body })\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PATCH', body })\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>(path, { method: 'DELETE' })\n }\n}\n","import type { HttpClient } from './http'\nimport type { Score, TopOptions } from './types'\n\nexport interface CheckAPI {\n (url: string): Promise<Score>\n many(urls: string[]): Promise<Score[]>\n exists(url: string): Promise<boolean>\n top(options?: TopOptions): Promise<Score[]>\n}\n\nexport function createCheckAPI(http: HttpClient): CheckAPI {\n const check = async (url: string): Promise<Score> => {\n return http.get<Score>('/resources/score', { url })\n }\n\n check.many = async (urls: string[]): Promise<Score[]> => {\n return Promise.all(urls.map((url) => check(url)))\n }\n\n check.exists = async (url: string): Promise<boolean> => {\n const result = await http.get<{ exists: boolean }>('/resources/exists', { url })\n return result.exists\n }\n\n check.top = async (options: TopOptions = {}): Promise<Score[]> => {\n const { limit = 20, category } = options\n return http.get<Score[]>('/resources/top', { limit, category })\n }\n\n return check\n}\n","import type { HttpClient } from './http'\nimport type {\n Resource,\n ResourceListOptions,\n ResourceSearchOptions,\n ResourceCreateInput,\n ResourceUpdateInput,\n} from './types'\n\ntype GetInput = string | { id: string }\n\nexport class ResourcesAPI {\n constructor(private http: HttpClient) {}\n\n async list(options: ResourceListOptions = {}): Promise<Resource[]> {\n const params: Record<string, string | number | undefined> = {}\n if (options.limit !== undefined) params['limit'] = options.limit\n if (options.sort) params['sort'] = options.sort\n const response = await this.http.get<{ resources: Resource[] }>('/resources', params)\n return response.resources\n }\n\n async get(input: GetInput): Promise<Resource> {\n if (typeof input === 'string') {\n return this.http.get<Resource>('/resources', { url: input })\n }\n return this.http.get<Resource>(`/resources/${input.id}`)\n }\n\n async search(options: ResourceSearchOptions = {}): Promise<Resource[]> {\n const params: Record<string, string | number | undefined> = {}\n\n if (options.query) params['q'] = options.query\n if (options.category) params['category'] = options.category\n if (options.minSuccessRate !== undefined) params['min_success_rate'] = options.minSuccessRate\n if (options.minCalls !== undefined) params['min_calls'] = options.minCalls\n if (options.limit !== undefined) params['limit'] = options.limit\n if (options.offset !== undefined) params['offset'] = options.offset\n\n return this.http.get<Resource[]>('/resources/search', params)\n }\n\n async register(input: ResourceCreateInput): Promise<Resource> {\n return this.http.post<Resource>('/resources', input)\n }\n\n async update(id: string, input: ResourceUpdateInput): Promise<Resource> {\n return this.http.patch<Resource>(`/resources/${id}`, input)\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete(`/resources/${id}`)\n }\n}\n","import { HttpClient } from './http'\nimport { createCheckAPI, type CheckAPI } from './check'\nimport { ResourcesAPI } from './resources'\nimport type { ClientOptions } from './types'\n\nexport class X402Jobs {\n readonly check: CheckAPI\n readonly resources: ResourcesAPI\n\n constructor(options: ClientOptions = {}) {\n const http = new HttpClient(options)\n this.check = createCheckAPI(http)\n this.resources = new ResourcesAPI(http)\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x402jobs/sdk",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "The official SDK for x402.jobs — trust, discovery, and resource management for x402",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",