@lobehub/market-sdk 0.0.5 → 0.0.7

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
@@ -145,7 +145,7 @@ interface MarketSDKOptions {
145
145
  }
146
146
 
147
147
  /**
148
- * LobeHub Market SDK 客户端
148
+ * LobeHub Market SDK Client
149
149
  */
150
150
  declare class MarketSDK {
151
151
  private baseUrl;
@@ -153,32 +153,32 @@ declare class MarketSDK {
153
153
  private discoveryDoc?;
154
154
  private headers;
155
155
  /**
156
- * 创建 MarketSDK 实例
157
- * @param options SDK 配置选项
156
+ * Create MarketSDK instance
157
+ * @param options SDK configuration options
158
158
  */
159
159
  constructor(options?: MarketSDKOptions);
160
160
  /**
161
- * 发送请求并处理响应
162
- * @param url 请求URL
163
- * @param options fetch选项
164
- * @returns 响应数据
161
+ * Send request and handle response
162
+ * @param url Request URL
163
+ * @param options fetch options
164
+ * @returns Response data
165
165
  */
166
166
  private request;
167
167
  /**
168
- * 构建查询字符串
169
- * @param params 查询参数
170
- * @returns 查询字符串
168
+ * Build query string
169
+ * @param params Query parameters
170
+ * @returns Query string
171
171
  */
172
172
  private buildQueryString;
173
173
  /**
174
- * 获取市场服务发现文档
175
- * @returns 服务发现文档
174
+ * Get market service discovery document
175
+ * @returns Service discovery document
176
176
  */
177
177
  getDiscoveryDocument(): Promise<DiscoveryDocument>;
178
178
  /**
179
- * 获取插件列表
180
- * @param params 查询参数
181
- * @returns 插件列表响应
179
+ * Get plugin list
180
+ * @param params Query parameters
181
+ * @returns Plugin list response
182
182
  */
183
183
  getPluginList(params?: {
184
184
  page?: number;
@@ -191,30 +191,30 @@ declare class MarketSDK {
191
191
  locale?: string;
192
192
  }): Promise<PluginListResponse>;
193
193
  /**
194
- * 获取插件清单
195
- * @param identifier 插件标识符
196
- * @param locale 语言
197
- * @param version 版本
198
- * @returns 插件清单
194
+ * Get plugin manifest
195
+ * @param identifier Plugin identifier
196
+ * @param locale Language
197
+ * @param version Version
198
+ * @returns Plugin manifest
199
199
  */
200
200
  getPluginManifest(identifier: string, locale?: string, version?: string): Promise<PluginManifest>;
201
201
  /**
202
- * 导入插件清单 (需要管理员权限)
203
- * @param manifests 插件清单数组
204
- * @param ownerId 所有者ID
205
- * @returns 导入结果
202
+ * Import plugin manifests (requires admin privileges)
203
+ * @param manifests Plugin manifest array
204
+ * @param ownerId Owner ID
205
+ * @returns Import result
206
206
  */
207
207
  importManifests(manifests: PluginManifest[], ownerId?: number): Promise<{
208
208
  success: number;
209
209
  failed: number;
210
210
  }>;
211
211
  /**
212
- * 设置认证令牌
213
- * @param token 认证令牌
212
+ * Set authentication token
213
+ * @param token Authentication token
214
214
  */
215
215
  setAuthToken(token: string): void;
216
216
  /**
217
- * 清除认证令牌
217
+ * Clear authentication token
218
218
  */
219
219
  clearAuthToken(): void;
220
220
  }
package/dist/index.mjs CHANGED
@@ -12,10 +12,12 @@ var InstallationMethodEnum = z.enum([
12
12
  ]);
13
13
 
14
14
  // src/market-sdk.ts
15
+ import debug from "debug";
16
+ var log = debug("lobe-market-sdk");
15
17
  var MarketSDK = class {
16
18
  /**
17
- * 创建 MarketSDK 实例
18
- * @param options SDK 配置选项
19
+ * Create MarketSDK instance
20
+ * @param options SDK configuration options
19
21
  */
20
22
  constructor(options = {}) {
21
23
  this.baseUrl = options.baseUrl || "https://market.lobehub.com/api";
@@ -24,14 +26,16 @@ var MarketSDK = class {
24
26
  "Content-Type": "application/json",
25
27
  ...options.apiKey ? { Authorization: `Bearer ${options.apiKey}` } : {}
26
28
  };
29
+ log("MarketSDK instance created: %O", { baseUrl: this.baseUrl, defaultLocale: this.defaultLocale });
27
30
  }
28
31
  /**
29
- * 发送请求并处理响应
30
- * @param url 请求URL
31
- * @param options fetch选项
32
- * @returns 响应数据
32
+ * Send request and handle response
33
+ * @param url Request URL
34
+ * @param options fetch options
35
+ * @returns Response data
33
36
  */
34
37
  async request(url, options = {}) {
38
+ log("Sending request: %s", `${this.baseUrl}${url}`);
35
39
  const response = await fetch(`${this.baseUrl}${url}`, {
36
40
  ...options,
37
41
  headers: {
@@ -40,62 +44,80 @@ var MarketSDK = class {
40
44
  }
41
45
  });
42
46
  if (!response.ok) {
43
- throw new Error(`\u8BF7\u6C42\u5931\u8D25: ${response.status} ${response.statusText}`);
47
+ const errorMsg = `Request failed: ${response.status} ${response.statusText}`;
48
+ log("Request error: %s", errorMsg);
49
+ throw new Error(errorMsg);
44
50
  }
51
+ log("Request successful: %s", url);
45
52
  return response.json();
46
53
  }
47
54
  /**
48
- * 构建查询字符串
49
- * @param params 查询参数
50
- * @returns 查询字符串
55
+ * Build query string
56
+ * @param params Query parameters
57
+ * @returns Query string
51
58
  */
52
59
  buildQueryString(params) {
53
60
  const query = Object.entries(params).filter(([_, value]) => value !== void 0 && value !== null).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`).join("&");
54
61
  return query ? `?${query}` : "";
55
62
  }
56
63
  /**
57
- * 获取市场服务发现文档
58
- * @returns 服务发现文档
64
+ * Get market service discovery document
65
+ * @returns Service discovery document
59
66
  */
60
67
  async getDiscoveryDocument() {
61
- if (this.discoveryDoc) return this.discoveryDoc;
68
+ log("Getting service discovery document");
69
+ if (this.discoveryDoc) {
70
+ log("Returning cached discovery document");
71
+ return this.discoveryDoc;
72
+ }
62
73
  this.discoveryDoc = await this.request("/market/.well-known/discovery");
74
+ log("Successfully retrieved service discovery document");
63
75
  return this.discoveryDoc;
64
76
  }
65
77
  /**
66
- * 获取插件列表
67
- * @param params 查询参数
68
- * @returns 插件列表响应
78
+ * Get plugin list
79
+ * @param params Query parameters
80
+ * @returns Plugin list response
69
81
  */
70
82
  async getPluginList(params = {}) {
71
83
  const locale = params.locale || this.defaultLocale;
72
84
  const queryParams = { ...params, locale };
73
85
  const queryString = this.buildQueryString(queryParams);
74
- return this.request(`/v1/plugins${queryString}`);
86
+ log("Getting plugin list: %O", queryParams);
87
+ const result = await this.request(`/v1/plugins${queryString}`);
88
+ log("Retrieved %d plugins", result.items.length);
89
+ return result;
75
90
  }
76
91
  /**
77
- * 获取插件清单
78
- * @param identifier 插件标识符
79
- * @param locale 语言
80
- * @param version 版本
81
- * @returns 插件清单
92
+ * Get plugin manifest
93
+ * @param identifier Plugin identifier
94
+ * @param locale Language
95
+ * @param version Version
96
+ * @returns Plugin manifest
82
97
  */
83
98
  async getPluginManifest(identifier, locale, version) {
99
+ log("Getting plugin manifest: %O", { identifier, version, locale });
84
100
  const localeParam = locale || this.defaultLocale;
85
101
  const params = { locale: localeParam };
86
102
  if (version) {
87
103
  params.version = version;
88
104
  }
89
105
  const queryString = this.buildQueryString(params);
90
- return this.request(`/v1/plugins/${identifier}/manifest${queryString}`);
106
+ const manifest = await this.request(`/v1/plugins/${identifier}/manifest${queryString}`);
107
+ log("Successfully retrieved plugin manifest: %s", identifier);
108
+ return manifest;
91
109
  }
92
110
  /**
93
- * 导入插件清单 (需要管理员权限)
94
- * @param manifests 插件清单数组
95
- * @param ownerId 所有者ID
96
- * @returns 导入结果
111
+ * Import plugin manifests (requires admin privileges)
112
+ * @param manifests Plugin manifest array
113
+ * @param ownerId Owner ID
114
+ * @returns Import result
97
115
  */
98
116
  async importManifests(manifests, ownerId) {
117
+ log(`Starting batch import of ${manifests.length} manifests`);
118
+ if (ownerId) {
119
+ log(`Using specified owner ID: ${ownerId}`);
120
+ }
99
121
  const response = await this.request("/v1/admin/plugins/import", {
100
122
  method: "POST",
101
123
  body: JSON.stringify({
@@ -103,19 +125,22 @@ var MarketSDK = class {
103
125
  ownerId
104
126
  })
105
127
  });
128
+ log(`Batch import completed: ${response.data.success} successful, ${response.data.failed} failed`);
106
129
  return response.data;
107
130
  }
108
131
  /**
109
- * 设置认证令牌
110
- * @param token 认证令牌
132
+ * Set authentication token
133
+ * @param token Authentication token
111
134
  */
112
135
  setAuthToken(token) {
136
+ log("Setting authentication token");
113
137
  this.headers.Authorization = `Bearer ${token}`;
114
138
  }
115
139
  /**
116
- * 清除认证令牌
140
+ * Clear authentication token
117
141
  */
118
142
  clearAuthToken() {
143
+ log("Clearing authentication token");
119
144
  delete this.headers.Authorization;
120
145
  }
121
146
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/market-sdk.ts"],"sourcesContent":["import { z } from 'zod';\n\n// 插件类型\nexport const PluginTypeEnum = z.enum(['lobe', 'openai', 'mcp']);\nexport type PluginType = z.infer<typeof PluginTypeEnum>;\n\n// 连接类型\nexport const ConnectionTypeEnum = z.enum(['http', 'stdio']);\nexport type ConnectionType = z.infer<typeof ConnectionTypeEnum>;\n\n// 安装方法\nexport const InstallationMethodEnum = z.enum([\n 'npm',\n 'docker',\n 'git',\n 'binaryUrl',\n 'manual',\n 'none',\n]);\nexport type InstallationMethod = z.infer<typeof InstallationMethodEnum>;\n\n// 系统依赖项\nexport interface SystemDependency {\n name: string;\n type?: string;\n requiredVersion?: string;\n checkCommand?: string;\n installInstructions?: Record<string, string>;\n versionParsingRequired?: boolean;\n notes?: string;\n}\n\n// 连接配置\nexport interface ConnectionConfig {\n type: string;\n command?: string;\n args?: string[];\n url?: string;\n}\n\n// 部署选项\nexport interface DeploymentOption {\n installationMethod: string;\n installationDetails?: Record<string, any>;\n connection: ConnectionConfig;\n isRecommended?: boolean;\n notes?: string;\n systemDependencies?: SystemDependency[];\n}\n\n// 兼容性信息\nexport interface PluginCompatibility {\n platforms?: string[];\n minAppVersion?: string;\n maxAppVersion?: string;\n}\n\n// 插件项\nexport interface PluginItem {\n identifier: string;\n version: string;\n isLatest: boolean;\n name: string;\n createdAt: string;\n type: PluginType;\n manifestUrl?: string;\n manifestVersion: string;\n icon?: string;\n author?: string;\n homepage?: string;\n category?: string;\n connectionType?: ConnectionType;\n compatibility?: PluginCompatibility;\n capabilities: {\n tools: boolean;\n prompts: boolean;\n resources: boolean;\n };\n description: string;\n tags?: string[];\n authRequirement?: string;\n isInstallable?: boolean;\n toolsCount?: number;\n promptsCount?: number;\n resourcesCount?: number;\n isValidated?: boolean;\n installCount?: number;\n ratingAverage?: number;\n ratingCount?: number;\n commentCount?: number;\n}\n\n// 插件列表响应\nexport interface PluginListResponse {\n items: PluginItem[];\n totalCount: number;\n currentPage: number;\n pageSize: number;\n totalPages: number;\n categories: string[];\n tags: string[];\n}\n\n// 工具项定义\nexport interface PluginTool {\n name: string;\n description?: string;\n parameters?: Record<string, any>;\n}\n\n// 资源项定义\nexport interface PluginResource {\n uri: string;\n name?: string;\n mimeType?: string;\n}\n\n// 提示词参数定义\nexport interface PromptArgument {\n name: string;\n required?: boolean;\n description?: string;\n type?: string;\n}\n\n// 提示词项定义\nexport interface PluginPrompt {\n name: string;\n description: string;\n arguments?: PromptArgument[];\n}\n\n// 插件清单\nexport interface PluginManifest {\n id: string;\n name: string;\n version: string;\n description: string;\n category?: string;\n tags?: string[];\n author?: {\n name: string;\n url?: string;\n };\n homepage?: string;\n icon?: string;\n capabilities?: {\n tools?: boolean;\n prompts?: boolean;\n resources?: boolean;\n };\n deploymentOptions?: DeploymentOption[];\n compatibility?: PluginCompatibility;\n // 工具定义\n tools?: PluginTool[];\n // 资源定义\n resources?: PluginResource[];\n // 提示词定义 \n prompts?: PluginPrompt[];\n // 验证信息\n isValidated?: boolean;\n validatedAt?: string;\n}\n\n// 市场服务发现文档\nexport interface DiscoveryDocument {\n issuer: string;\n market_index_schema_version: number;\n resource_types_supported: string[];\n resource_endpoints: Record<string, string>;\n manifest_endpoint_template: string | Record<string, string>;\n support_locales: string[];\n response_types_supported: string[];\n authentication?: {\n schemes_supported: Array<'none' | 'apiKey' | 'oauth2'>;\n };\n api_documentation_url?: string;\n policy_url?: string;\n terms_of_service_url?: string;\n}\n\n// SDK 配置选项\nexport interface MarketSDKOptions {\n baseUrl?: string;\n defaultLocale?: string;\n apiKey?: string;\n}\n","import {\n DiscoveryDocument,\n MarketSDKOptions,\n PluginItem,\n PluginListResponse,\n PluginManifest,\n} from './types';\n\n/**\n * LobeHub Market SDK 客户端\n */\nexport class MarketSDK {\n private baseUrl: string;\n private defaultLocale: string;\n private discoveryDoc?: DiscoveryDocument;\n private headers: Record<string, string>;\n\n /**\n * 创建 MarketSDK 实例\n * @param options SDK 配置选项\n */\n constructor(options: MarketSDKOptions = {}) {\n this.baseUrl = options.baseUrl || 'https://market.lobehub.com/api';\n this.defaultLocale = options.defaultLocale || 'zh-CN';\n this.headers = {\n 'Content-Type': 'application/json',\n ...(options.apiKey ? { Authorization: `Bearer ${options.apiKey}` } : {}),\n };\n }\n\n /**\n * 发送请求并处理响应\n * @param url 请求URL\n * @param options fetch选项\n * @returns 响应数据\n */\n private async request<T>(url: string, options: RequestInit = {}): Promise<T> {\n const response = await fetch(`${this.baseUrl}${url}`, {\n ...options,\n headers: {\n ...this.headers,\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n throw new Error(`请求失败: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<T>;\n }\n\n /**\n * 构建查询字符串\n * @param params 查询参数\n * @returns 查询字符串\n */\n private buildQueryString(params: Record<string, any>): string {\n const query = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join('&');\n \n return query ? `?${query}` : '';\n }\n\n /**\n * 获取市场服务发现文档\n * @returns 服务发现文档\n */\n async getDiscoveryDocument(): Promise<DiscoveryDocument> {\n if (this.discoveryDoc) return this.discoveryDoc;\n\n this.discoveryDoc = await this.request<DiscoveryDocument>('/market/.well-known/discovery');\n return this.discoveryDoc;\n }\n\n /**\n * 获取插件列表\n * @param params 查询参数\n * @returns 插件列表响应\n */\n async getPluginList(params: {\n page?: number;\n pageSize?: number;\n category?: string;\n tags?: string;\n q?: string;\n sort?: 'installCount' | 'createdAt' | 'updatedAt' | 'ratingAverage';\n order?: 'asc' | 'desc';\n locale?: string;\n } = {}): Promise<PluginListResponse> {\n const locale = params.locale || this.defaultLocale;\n const queryParams = { ...params, locale };\n const queryString = this.buildQueryString(queryParams);\n\n return this.request<PluginListResponse>(`/v1/plugins${queryString}`);\n }\n\n /**\n * 获取插件清单\n * @param identifier 插件标识符\n * @param locale 语言\n * @param version 版本\n * @returns 插件清单\n */\n async getPluginManifest(\n identifier: string,\n locale?: string,\n version?: string,\n ): Promise<PluginManifest> {\n const localeParam = locale || this.defaultLocale;\n const params: Record<string, string> = { locale: localeParam };\n if (version) {\n params.version = version;\n }\n const queryString = this.buildQueryString(params);\n\n return this.request<PluginManifest>(`/v1/plugins/${identifier}/manifest${queryString}`);\n }\n\n /**\n * 导入插件清单 (需要管理员权限)\n * @param manifests 插件清单数组\n * @param ownerId 所有者ID\n * @returns 导入结果\n */\n async importManifests(manifests: PluginManifest[], ownerId?: number): Promise<{ success: number; failed: number }> {\n const response = await this.request<{ data: { success: number; failed: number } }>('/v1/admin/plugins/import', {\n method: 'POST',\n body: JSON.stringify({\n manifests,\n ownerId,\n }),\n });\n\n return response.data;\n }\n\n /**\n * 设置认证令牌\n * @param token 认证令牌\n */\n setAuthToken(token: string): void {\n this.headers.Authorization = `Bearer ${token}`;\n }\n\n /**\n * 清除认证令牌\n */\n clearAuthToken(): void {\n delete this.headers.Authorization;\n }\n} "],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/types.ts","../src/market-sdk.ts"],"sourcesContent":["import { z } from 'zod';\n\n// 插件类型\nexport const PluginTypeEnum = z.enum(['lobe', 'openai', 'mcp']);\nexport type PluginType = z.infer<typeof PluginTypeEnum>;\n\n// 连接类型\nexport const ConnectionTypeEnum = z.enum(['http', 'stdio']);\nexport type ConnectionType = z.infer<typeof ConnectionTypeEnum>;\n\n// 安装方法\nexport const InstallationMethodEnum = z.enum([\n 'npm',\n 'docker',\n 'git',\n 'binaryUrl',\n 'manual',\n 'none',\n]);\nexport type InstallationMethod = z.infer<typeof InstallationMethodEnum>;\n\n// 系统依赖项\nexport interface SystemDependency {\n name: string;\n type?: string;\n requiredVersion?: string;\n checkCommand?: string;\n installInstructions?: Record<string, string>;\n versionParsingRequired?: boolean;\n notes?: string;\n}\n\n// 连接配置\nexport interface ConnectionConfig {\n type: string;\n command?: string;\n args?: string[];\n url?: string;\n}\n\n// 部署选项\nexport interface DeploymentOption {\n installationMethod: string;\n installationDetails?: Record<string, any>;\n connection: ConnectionConfig;\n isRecommended?: boolean;\n notes?: string;\n systemDependencies?: SystemDependency[];\n}\n\n// 兼容性信息\nexport interface PluginCompatibility {\n platforms?: string[];\n minAppVersion?: string;\n maxAppVersion?: string;\n}\n\n// 插件项\nexport interface PluginItem {\n identifier: string;\n version: string;\n isLatest: boolean;\n name: string;\n createdAt: string;\n type: PluginType;\n manifestUrl?: string;\n manifestVersion: string;\n icon?: string;\n author?: string;\n homepage?: string;\n category?: string;\n connectionType?: ConnectionType;\n compatibility?: PluginCompatibility;\n capabilities: {\n tools: boolean;\n prompts: boolean;\n resources: boolean;\n };\n description: string;\n tags?: string[];\n authRequirement?: string;\n isInstallable?: boolean;\n toolsCount?: number;\n promptsCount?: number;\n resourcesCount?: number;\n isValidated?: boolean;\n installCount?: number;\n ratingAverage?: number;\n ratingCount?: number;\n commentCount?: number;\n}\n\n// 插件列表响应\nexport interface PluginListResponse {\n items: PluginItem[];\n totalCount: number;\n currentPage: number;\n pageSize: number;\n totalPages: number;\n categories: string[];\n tags: string[];\n}\n\n// 工具项定义\nexport interface PluginTool {\n name: string;\n description?: string;\n parameters?: Record<string, any>;\n}\n\n// 资源项定义\nexport interface PluginResource {\n uri: string;\n name?: string;\n mimeType?: string;\n}\n\n// 提示词参数定义\nexport interface PromptArgument {\n name: string;\n required?: boolean;\n description?: string;\n type?: string;\n}\n\n// 提示词项定义\nexport interface PluginPrompt {\n name: string;\n description: string;\n arguments?: PromptArgument[];\n}\n\n// 插件清单\nexport interface PluginManifest {\n id: string;\n name: string;\n version: string;\n description: string;\n category?: string;\n tags?: string[];\n author?: {\n name: string;\n url?: string;\n };\n homepage?: string;\n icon?: string;\n capabilities?: {\n tools?: boolean;\n prompts?: boolean;\n resources?: boolean;\n };\n deploymentOptions?: DeploymentOption[];\n compatibility?: PluginCompatibility;\n // 工具定义\n tools?: PluginTool[];\n // 资源定义\n resources?: PluginResource[];\n // 提示词定义 \n prompts?: PluginPrompt[];\n // 验证信息\n isValidated?: boolean;\n validatedAt?: string;\n}\n\n// 市场服务发现文档\nexport interface DiscoveryDocument {\n issuer: string;\n market_index_schema_version: number;\n resource_types_supported: string[];\n resource_endpoints: Record<string, string>;\n manifest_endpoint_template: string | Record<string, string>;\n support_locales: string[];\n response_types_supported: string[];\n authentication?: {\n schemes_supported: Array<'none' | 'apiKey' | 'oauth2'>;\n };\n api_documentation_url?: string;\n policy_url?: string;\n terms_of_service_url?: string;\n}\n\n// SDK 配置选项\nexport interface MarketSDKOptions {\n baseUrl?: string;\n defaultLocale?: string;\n apiKey?: string;\n}\n","import {\n DiscoveryDocument,\n MarketSDKOptions,\n PluginItem,\n PluginListResponse,\n PluginManifest,\n} from './types';\nimport debug from 'debug';\n\n// Create debug instance\nconst log = debug('lobe-market-sdk');\n\n/**\n * LobeHub Market SDK Client\n */\nexport class MarketSDK {\n private baseUrl: string;\n private defaultLocale: string;\n private discoveryDoc?: DiscoveryDocument;\n private headers: Record<string, string>;\n\n /**\n * Create MarketSDK instance\n * @param options SDK configuration options\n */\n constructor(options: MarketSDKOptions = {}) {\n this.baseUrl = options.baseUrl || 'https://market.lobehub.com/api';\n this.defaultLocale = options.defaultLocale || 'zh-CN';\n this.headers = {\n 'Content-Type': 'application/json',\n ...(options.apiKey ? { Authorization: `Bearer ${options.apiKey}` } : {}),\n };\n log('MarketSDK instance created: %O', { baseUrl: this.baseUrl, defaultLocale: this.defaultLocale });\n }\n\n /**\n * Send request and handle response\n * @param url Request URL\n * @param options fetch options\n * @returns Response data\n */\n private async request<T>(url: string, options: RequestInit = {}): Promise<T> {\n log('Sending request: %s', `${this.baseUrl}${url}`);\n \n const response = await fetch(`${this.baseUrl}${url}`, {\n ...options,\n headers: {\n ...this.headers,\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const errorMsg = `Request failed: ${response.status} ${response.statusText}`;\n log('Request error: %s', errorMsg);\n throw new Error(errorMsg);\n }\n\n log('Request successful: %s', url);\n return response.json() as Promise<T>;\n }\n\n /**\n * Build query string\n * @param params Query parameters\n * @returns Query string\n */\n private buildQueryString(params: Record<string, any>): string {\n const query = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join('&');\n \n return query ? `?${query}` : '';\n }\n\n /**\n * Get market service discovery document\n * @returns Service discovery document\n */\n async getDiscoveryDocument(): Promise<DiscoveryDocument> {\n log('Getting service discovery document');\n if (this.discoveryDoc) {\n log('Returning cached discovery document');\n return this.discoveryDoc;\n }\n\n this.discoveryDoc = await this.request<DiscoveryDocument>('/market/.well-known/discovery');\n log('Successfully retrieved service discovery document');\n return this.discoveryDoc;\n }\n\n /**\n * Get plugin list\n * @param params Query parameters\n * @returns Plugin list response\n */\n async getPluginList(params: {\n page?: number;\n pageSize?: number;\n category?: string;\n tags?: string;\n q?: string;\n sort?: 'installCount' | 'createdAt' | 'updatedAt' | 'ratingAverage';\n order?: 'asc' | 'desc';\n locale?: string;\n } = {}): Promise<PluginListResponse> {\n const locale = params.locale || this.defaultLocale;\n const queryParams = { ...params, locale };\n const queryString = this.buildQueryString(queryParams);\n\n log('Getting plugin list: %O', queryParams);\n\n const result = await this.request<PluginListResponse>(`/v1/plugins${queryString}`);\n log('Retrieved %d plugins', result.items.length);\n return result;\n }\n\n /**\n * Get plugin manifest\n * @param identifier Plugin identifier\n * @param locale Language\n * @param version Version\n * @returns Plugin manifest\n */\n async getPluginManifest(\n identifier: string,\n locale?: string,\n version?: string,\n ): Promise<PluginManifest> {\n log('Getting plugin manifest: %O', { identifier, version, locale });\n const localeParam = locale || this.defaultLocale;\n const params: Record<string, string> = { locale: localeParam };\n if (version) {\n params.version = version;\n }\n const queryString = this.buildQueryString(params);\n\n const manifest = await this.request<PluginManifest>(`/v1/plugins/${identifier}/manifest${queryString}`);\n log('Successfully retrieved plugin manifest: %s', identifier);\n return manifest;\n }\n\n /**\n * Import plugin manifests (requires admin privileges)\n * @param manifests Plugin manifest array\n * @param ownerId Owner ID\n * @returns Import result\n */\n async importManifests(manifests: PluginManifest[], ownerId?: number): Promise<{ success: number; failed: number }> {\n log(`Starting batch import of ${manifests.length} manifests`);\n if (ownerId) {\n log(`Using specified owner ID: ${ownerId}`);\n }\n\n const response = await this.request<{ data: { success: number; failed: number } }>('/v1/admin/plugins/import', {\n method: 'POST',\n body: JSON.stringify({\n manifests,\n ownerId,\n }),\n });\n\n log(`Batch import completed: ${response.data.success} successful, ${response.data.failed} failed`);\n return response.data;\n }\n\n /**\n * Set authentication token\n * @param token Authentication token\n */\n setAuthToken(token: string): void {\n log('Setting authentication token');\n this.headers.Authorization = `Bearer ${token}`;\n }\n\n /**\n * Clear authentication token\n */\n clearAuthToken(): void {\n log('Clearing authentication token');\n delete this.headers.Authorization;\n }\n} "],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/market-sdk",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "description": "LobeHub Market JavaScript SDK",
5
5
  "keywords": [
6
6
  "lobehub",
@@ -30,7 +30,11 @@
30
30
  "prepublishOnly": "npm run build",
31
31
  "release": "npm publish"
32
32
  },
33
+ "dependencies": {
34
+ "debug": "^4.4.1"
35
+ },
33
36
  "devDependencies": {
37
+ "@types/debug": "^4.1.12",
34
38
  "tsup": "^8.4.0",
35
39
  "typescript": "^5.8.3",
36
40
  "zod": "^3.24.4"