@yassirbenmoussa/aicommerce-sdk 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,11 +7,11 @@ AI-powered product recommendations for e-commerce. This SDK allows you to easily
|
|
|
7
7
|
### npm / yarn / pnpm
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npm install @
|
|
10
|
+
npm install @yassirbenmoussa/aicommerce-sdk
|
|
11
11
|
# or
|
|
12
|
-
yarn add @
|
|
12
|
+
yarn add @yassirbenmoussa/aicommerce-sdk
|
|
13
13
|
# or
|
|
14
|
-
pnpm add @
|
|
14
|
+
pnpm add @yassirbenmoussa/aicommerce-sdk
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
### Script Tag (CDN)
|
|
@@ -25,7 +25,7 @@ pnpm add @ai-commerce/sdk
|
|
|
25
25
|
### ES Modules / TypeScript
|
|
26
26
|
|
|
27
27
|
```typescript
|
|
28
|
-
import { AICommerce } from '@
|
|
28
|
+
import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';
|
|
29
29
|
|
|
30
30
|
// Initialize the client
|
|
31
31
|
const client = new AICommerce({
|
|
@@ -42,7 +42,7 @@ console.log(response.products); // Recommended products
|
|
|
42
42
|
### CommonJS
|
|
43
43
|
|
|
44
44
|
```javascript
|
|
45
|
-
const { AICommerce } = require('@
|
|
45
|
+
const { AICommerce } = require('@yassirbenmoussa/aicommerce-sdk');
|
|
46
46
|
|
|
47
47
|
const client = new AICommerce({
|
|
48
48
|
apiKey: 'your-api-key',
|
|
@@ -139,13 +139,13 @@ import type {
|
|
|
139
139
|
ChatResponse,
|
|
140
140
|
Product,
|
|
141
141
|
ChatContext
|
|
142
|
-
} from '@
|
|
142
|
+
} from '@yassirbenmoussa/aicommerce-sdk';
|
|
143
143
|
```
|
|
144
144
|
|
|
145
145
|
## Error Handling
|
|
146
146
|
|
|
147
147
|
```typescript
|
|
148
|
-
import { AICommerce, AICommerceError } from '@
|
|
148
|
+
import { AICommerce, AICommerceError } from '@yassirbenmoussa/aicommerce-sdk';
|
|
149
149
|
|
|
150
150
|
try {
|
|
151
151
|
const response = await client.chat('Hello');
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/index.ts"],"names":["AICommerce","AICommerceError"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Session,\r\n APIError,\r\n} from './types';\r\n\r\n/**\r\n * AI Commerce SDK Client\r\n * \r\n * @example\r\n * ```typescript\r\n * import { AICommerce } from '@ai-commerce/sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop under $1000');\r\n * console.log(response.products);\r\n * ```\r\n */\r\nexport class AICommerce {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly timeout: number;\r\n private sessionToken: string | null = null;\r\n\r\n constructor(config: AICommerceConfig) {\r\n if (!config.apiKey) {\r\n throw new Error('AICommerce: apiKey is required');\r\n }\r\n\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = this.normalizeUrl(config.baseUrl || this.detectBaseUrl());\r\n this.timeout = config.timeout || 30000;\r\n }\r\n\r\n /**\r\n * Detect the base URL based on environment\r\n */\r\n private detectBaseUrl(): string {\r\n // Browser environment\r\n if (typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n // Node.js or default\r\n return 'https://api.aicommerce.dev';\r\n }\r\n\r\n /**\r\n * Normalize URL (remove trailing slash)\r\n */\r\n private normalizeUrl(url: string): string {\r\n return url.replace(/\\/$/, '');\r\n }\r\n\r\n /**\r\n * Make an API request\r\n */\r\n private async request<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${endpoint}`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: controller.signal,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n ...(this.sessionToken && { 'X-Session-Token': this.sessionToken }),\r\n ...options.headers,\r\n },\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const error: APIError = {\r\n code: errorData.code || 'UNKNOWN_ERROR',\r\n message: errorData.message || errorData.error || `HTTP ${response.status}`,\r\n status: response.status,\r\n };\r\n throw new AICommerceError(error.message, error.code, error.status);\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof AICommerceError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new AICommerceError('Request timeout', 'TIMEOUT', 408);\r\n }\r\n\r\n throw new AICommerceError(\r\n error instanceof Error ? error.message : 'Unknown error',\r\n 'NETWORK_ERROR',\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Send a chat message and get product recommendations\r\n * \r\n * @param message - The user's message or full ChatRequest object\r\n * @param context - Optional context for better recommendations\r\n * @returns Chat response with AI reply and products\r\n * \r\n * @example\r\n * ```typescript\r\n * // Simple usage\r\n * const response = await client.chat('I need running shoes');\r\n * \r\n * // With context\r\n * const response = await client.chat('I need running shoes', {\r\n * budget: { max: 150 },\r\n * preferences: ['comfortable', 'lightweight']\r\n * });\r\n * ```\r\n */\r\n async chat(\r\n message: string | ChatRequest,\r\n context?: ChatContext\r\n ): Promise<ChatResponse> {\r\n const request: ChatRequest = typeof message === 'string'\r\n ? { message, context, sessionToken: this.sessionToken || undefined }\r\n : { ...message, sessionToken: message.sessionToken || this.sessionToken || undefined };\r\n\r\n const response = await this.request<ChatResponse>('/api/v1/chat', {\r\n method: 'POST',\r\n body: JSON.stringify(request),\r\n });\r\n\r\n // Store session token for follow-up messages\r\n if (response.sessionToken) {\r\n this.sessionToken = response.sessionToken;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Create a new chat session\r\n * \r\n * @returns Session information with token\r\n */\r\n async createSession(): Promise<Session> {\r\n const response = await this.request<{ session: Session }>('/api/v1/chat/session', {\r\n method: 'POST',\r\n });\r\n\r\n this.sessionToken = response.session.token;\r\n return response.session;\r\n }\r\n\r\n /**\r\n * Clear the current session\r\n */\r\n clearSession(): void {\r\n this.sessionToken = null;\r\n }\r\n\r\n /**\r\n * Get the current session token\r\n */\r\n getSessionToken(): string | null {\r\n return this.sessionToken;\r\n }\r\n\r\n /**\r\n * Set a session token (for restoring sessions)\r\n */\r\n setSessionToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Static method for one-off chat requests\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await AICommerce.quickChat({\r\n * apiKey: 'your-api-key',\r\n * message: 'I need a laptop'\r\n * });\r\n * ```\r\n */\r\n static async quickChat(options: {\r\n apiKey: string;\r\n message: string;\r\n baseUrl?: string;\r\n context?: ChatContext;\r\n }): Promise<ChatResponse> {\r\n const client = new AICommerce({\r\n apiKey: options.apiKey,\r\n baseUrl: options.baseUrl,\r\n });\r\n return client.chat(options.message, options.context);\r\n }\r\n}\r\n\r\n/**\r\n * Custom error class for AI Commerce SDK\r\n */\r\nexport class AICommerceError extends Error {\r\n readonly code: string;\r\n readonly status: number;\r\n\r\n constructor(message: string, code: string, status: number) {\r\n super(message);\r\n this.name = 'AICommerceError';\r\n this.code = code;\r\n this.status = status;\r\n\r\n // Maintain proper prototype chain\r\n Object.setPrototypeOf(this, AICommerceError.prototype);\r\n }\r\n}\r\n","/**\r\n * AI Commerce SDK\r\n * \r\n * AI-powered product recommendations for e-commerce\r\n * \r\n * @packageDocumentation\r\n * @module @ai-commerce/sdk\r\n * \r\n * @example\r\n * ```typescript\r\n * // npm usage\r\n * import { AICommerce } from '@ai-commerce/sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop');\r\n * console.log(response.products);\r\n * ```\r\n * \r\n * @example\r\n * ```html\r\n * <!-- Script tag usage -->\r\n * <script src=\"https://cdn.aicommerce.dev/sdk.min.js\"></script>\r\n * <script>\r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * client.chat('I need a laptop').then(response => {\r\n * console.log(response.products);\r\n * });\r\n * </script>\r\n * ```\r\n */\r\n\r\n// Export main client\r\nexport { AICommerce, AICommerceError } from './client';\r\n\r\n// Export all types\r\nexport type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Product,\r\n Session,\r\n APIError,\r\n EventType,\r\n EventCallback,\r\n} from './types';\r\n\r\n// Version\r\nexport const VERSION = '1.0.0';\r\n\r\n// For UMD builds, attach to window\r\nif (typeof window !== 'undefined') {\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerce = require('./client').AICommerce;\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerceError = require('./client').AICommerceError;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/index.ts"],"names":["AICommerce","AICommerceError"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Session,\r\n APIError,\r\n} from './types';\r\n\r\n/**\r\n * AI Commerce SDK Client\r\n * \r\n * @example\r\n * ```typescript\r\n * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop under $1000');\r\n * console.log(response.products);\r\n * ```\r\n */\r\nexport class AICommerce {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly timeout: number;\r\n private sessionToken: string | null = null;\r\n\r\n constructor(config: AICommerceConfig) {\r\n if (!config.apiKey) {\r\n throw new Error('AICommerce: apiKey is required');\r\n }\r\n\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = this.normalizeUrl(config.baseUrl || this.detectBaseUrl());\r\n this.timeout = config.timeout || 30000;\r\n }\r\n\r\n /**\r\n * Detect the base URL based on environment\r\n */\r\n private detectBaseUrl(): string {\r\n // Browser environment\r\n if (typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n // Node.js or default\r\n return 'https://api.aicommerce.dev';\r\n }\r\n\r\n /**\r\n * Normalize URL (remove trailing slash)\r\n */\r\n private normalizeUrl(url: string): string {\r\n return url.replace(/\\/$/, '');\r\n }\r\n\r\n /**\r\n * Make an API request\r\n */\r\n private async request<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${endpoint}`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: controller.signal,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n ...(this.sessionToken && { 'X-Session-Token': this.sessionToken }),\r\n ...options.headers,\r\n },\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const error: APIError = {\r\n code: errorData.code || 'UNKNOWN_ERROR',\r\n message: errorData.message || errorData.error || `HTTP ${response.status}`,\r\n status: response.status,\r\n };\r\n throw new AICommerceError(error.message, error.code, error.status);\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof AICommerceError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new AICommerceError('Request timeout', 'TIMEOUT', 408);\r\n }\r\n\r\n throw new AICommerceError(\r\n error instanceof Error ? error.message : 'Unknown error',\r\n 'NETWORK_ERROR',\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Send a chat message and get product recommendations\r\n * \r\n * @param message - The user's message or full ChatRequest object\r\n * @param context - Optional context for better recommendations\r\n * @returns Chat response with AI reply and products\r\n * \r\n * @example\r\n * ```typescript\r\n * // Simple usage\r\n * const response = await client.chat('I need running shoes');\r\n * \r\n * // With context\r\n * const response = await client.chat('I need running shoes', {\r\n * budget: { max: 150 },\r\n * preferences: ['comfortable', 'lightweight']\r\n * });\r\n * ```\r\n */\r\n async chat(\r\n message: string | ChatRequest,\r\n context?: ChatContext\r\n ): Promise<ChatResponse> {\r\n const request: ChatRequest = typeof message === 'string'\r\n ? { message, context, sessionToken: this.sessionToken || undefined }\r\n : { ...message, sessionToken: message.sessionToken || this.sessionToken || undefined };\r\n\r\n const response = await this.request<ChatResponse>('/api/v1/chat', {\r\n method: 'POST',\r\n body: JSON.stringify(request),\r\n });\r\n\r\n // Store session token for follow-up messages\r\n if (response.sessionToken) {\r\n this.sessionToken = response.sessionToken;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Create a new chat session\r\n * \r\n * @returns Session information with token\r\n */\r\n async createSession(): Promise<Session> {\r\n const response = await this.request<{ session: Session }>('/api/v1/chat/session', {\r\n method: 'POST',\r\n });\r\n\r\n this.sessionToken = response.session.token;\r\n return response.session;\r\n }\r\n\r\n /**\r\n * Clear the current session\r\n */\r\n clearSession(): void {\r\n this.sessionToken = null;\r\n }\r\n\r\n /**\r\n * Get the current session token\r\n */\r\n getSessionToken(): string | null {\r\n return this.sessionToken;\r\n }\r\n\r\n /**\r\n * Set a session token (for restoring sessions)\r\n */\r\n setSessionToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Static method for one-off chat requests\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await AICommerce.quickChat({\r\n * apiKey: 'your-api-key',\r\n * message: 'I need a laptop'\r\n * });\r\n * ```\r\n */\r\n static async quickChat(options: {\r\n apiKey: string;\r\n message: string;\r\n baseUrl?: string;\r\n context?: ChatContext;\r\n }): Promise<ChatResponse> {\r\n const client = new AICommerce({\r\n apiKey: options.apiKey,\r\n baseUrl: options.baseUrl,\r\n });\r\n return client.chat(options.message, options.context);\r\n }\r\n}\r\n\r\n/**\r\n * Custom error class for AI Commerce SDK\r\n */\r\nexport class AICommerceError extends Error {\r\n readonly code: string;\r\n readonly status: number;\r\n\r\n constructor(message: string, code: string, status: number) {\r\n super(message);\r\n this.name = 'AICommerceError';\r\n this.code = code;\r\n this.status = status;\r\n\r\n // Maintain proper prototype chain\r\n Object.setPrototypeOf(this, AICommerceError.prototype);\r\n }\r\n}\r\n","/**\r\n * AI Commerce SDK\r\n * \r\n * AI-powered product recommendations for e-commerce\r\n * \r\n * @packageDocumentation\r\n * @module @yassirbenmoussa/aicommerce-sdk\r\n * \r\n * @example\r\n * ```typescript\r\n * // npm usage\r\n * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop');\r\n * console.log(response.products);\r\n * ```\r\n * \r\n * @example\r\n * ```html\r\n * <!-- Script tag usage -->\r\n * <script src=\"https://cdn.aicommerce.dev/sdk.min.js\"></script>\r\n * <script>\r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * client.chat('I need a laptop').then(response => {\r\n * console.log(response.products);\r\n * });\r\n * </script>\r\n * ```\r\n */\r\n\r\n// Export main client\r\nexport { AICommerce, AICommerceError } from './client';\r\n\r\n// Export all types\r\nexport type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Product,\r\n Session,\r\n APIError,\r\n EventType,\r\n EventCallback,\r\n} from './types';\r\n\r\n// Version\r\nexport const VERSION = '1.0.0';\r\n\r\n// For UMD builds, attach to window\r\nif (typeof window !== 'undefined') {\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerce = require('./client').AICommerce;\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerceError = require('./client').AICommerceError;\r\n}\r\n"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -98,7 +98,7 @@ type EventCallback<T = unknown> = (data: T) => void;
|
|
|
98
98
|
*
|
|
99
99
|
* @example
|
|
100
100
|
* ```typescript
|
|
101
|
-
* import { AICommerce } from '@
|
|
101
|
+
* import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';
|
|
102
102
|
*
|
|
103
103
|
* const client = new AICommerce({ apiKey: 'your-api-key' });
|
|
104
104
|
* const response = await client.chat('I need a laptop under $1000');
|
|
@@ -194,12 +194,12 @@ declare class AICommerceError extends Error {
|
|
|
194
194
|
* AI-powered product recommendations for e-commerce
|
|
195
195
|
*
|
|
196
196
|
* @packageDocumentation
|
|
197
|
-
* @module @
|
|
197
|
+
* @module @yassirbenmoussa/aicommerce-sdk
|
|
198
198
|
*
|
|
199
199
|
* @example
|
|
200
200
|
* ```typescript
|
|
201
201
|
* // npm usage
|
|
202
|
-
* import { AICommerce } from '@
|
|
202
|
+
* import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';
|
|
203
203
|
*
|
|
204
204
|
* const client = new AICommerce({ apiKey: 'your-api-key' });
|
|
205
205
|
* const response = await client.chat('I need a laptop');
|
package/dist/index.d.ts
CHANGED
|
@@ -98,7 +98,7 @@ type EventCallback<T = unknown> = (data: T) => void;
|
|
|
98
98
|
*
|
|
99
99
|
* @example
|
|
100
100
|
* ```typescript
|
|
101
|
-
* import { AICommerce } from '@
|
|
101
|
+
* import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';
|
|
102
102
|
*
|
|
103
103
|
* const client = new AICommerce({ apiKey: 'your-api-key' });
|
|
104
104
|
* const response = await client.chat('I need a laptop under $1000');
|
|
@@ -194,12 +194,12 @@ declare class AICommerceError extends Error {
|
|
|
194
194
|
* AI-powered product recommendations for e-commerce
|
|
195
195
|
*
|
|
196
196
|
* @packageDocumentation
|
|
197
|
-
* @module @
|
|
197
|
+
* @module @yassirbenmoussa/aicommerce-sdk
|
|
198
198
|
*
|
|
199
199
|
* @example
|
|
200
200
|
* ```typescript
|
|
201
201
|
* // npm usage
|
|
202
|
-
* import { AICommerce } from '@
|
|
202
|
+
* import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';
|
|
203
203
|
*
|
|
204
204
|
* const client = new AICommerce({ apiKey: 'your-api-key' });
|
|
205
205
|
* const response = await client.chat('I need a laptop');
|
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/index.ts"],"names":["client_exports","__export","AICommerce","AICommerceError","init_client","__esmMin","_AICommerce","config","url","endpoint","options","controller","timeoutId","response","errorData","error","message","context","request","token","_AICommerceError","code","status","VERSION"],"mappings":"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","file":"index.min.js","sourcesContent":["import type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Session,\r\n APIError,\r\n} from './types';\r\n\r\n/**\r\n * AI Commerce SDK Client\r\n * \r\n * @example\r\n * ```typescript\r\n * import { AICommerce } from '@ai-commerce/sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop under $1000');\r\n * console.log(response.products);\r\n * ```\r\n */\r\nexport class AICommerce {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly timeout: number;\r\n private sessionToken: string | null = null;\r\n\r\n constructor(config: AICommerceConfig) {\r\n if (!config.apiKey) {\r\n throw new Error('AICommerce: apiKey is required');\r\n }\r\n\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = this.normalizeUrl(config.baseUrl || this.detectBaseUrl());\r\n this.timeout = config.timeout || 30000;\r\n }\r\n\r\n /**\r\n * Detect the base URL based on environment\r\n */\r\n private detectBaseUrl(): string {\r\n // Browser environment\r\n if (typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n // Node.js or default\r\n return 'https://api.aicommerce.dev';\r\n }\r\n\r\n /**\r\n * Normalize URL (remove trailing slash)\r\n */\r\n private normalizeUrl(url: string): string {\r\n return url.replace(/\\/$/, '');\r\n }\r\n\r\n /**\r\n * Make an API request\r\n */\r\n private async request<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${endpoint}`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: controller.signal,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n ...(this.sessionToken && { 'X-Session-Token': this.sessionToken }),\r\n ...options.headers,\r\n },\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const error: APIError = {\r\n code: errorData.code || 'UNKNOWN_ERROR',\r\n message: errorData.message || errorData.error || `HTTP ${response.status}`,\r\n status: response.status,\r\n };\r\n throw new AICommerceError(error.message, error.code, error.status);\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof AICommerceError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new AICommerceError('Request timeout', 'TIMEOUT', 408);\r\n }\r\n\r\n throw new AICommerceError(\r\n error instanceof Error ? error.message : 'Unknown error',\r\n 'NETWORK_ERROR',\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Send a chat message and get product recommendations\r\n * \r\n * @param message - The user's message or full ChatRequest object\r\n * @param context - Optional context for better recommendations\r\n * @returns Chat response with AI reply and products\r\n * \r\n * @example\r\n * ```typescript\r\n * // Simple usage\r\n * const response = await client.chat('I need running shoes');\r\n * \r\n * // With context\r\n * const response = await client.chat('I need running shoes', {\r\n * budget: { max: 150 },\r\n * preferences: ['comfortable', 'lightweight']\r\n * });\r\n * ```\r\n */\r\n async chat(\r\n message: string | ChatRequest,\r\n context?: ChatContext\r\n ): Promise<ChatResponse> {\r\n const request: ChatRequest = typeof message === 'string'\r\n ? { message, context, sessionToken: this.sessionToken || undefined }\r\n : { ...message, sessionToken: message.sessionToken || this.sessionToken || undefined };\r\n\r\n const response = await this.request<ChatResponse>('/api/v1/chat', {\r\n method: 'POST',\r\n body: JSON.stringify(request),\r\n });\r\n\r\n // Store session token for follow-up messages\r\n if (response.sessionToken) {\r\n this.sessionToken = response.sessionToken;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Create a new chat session\r\n * \r\n * @returns Session information with token\r\n */\r\n async createSession(): Promise<Session> {\r\n const response = await this.request<{ session: Session }>('/api/v1/chat/session', {\r\n method: 'POST',\r\n });\r\n\r\n this.sessionToken = response.session.token;\r\n return response.session;\r\n }\r\n\r\n /**\r\n * Clear the current session\r\n */\r\n clearSession(): void {\r\n this.sessionToken = null;\r\n }\r\n\r\n /**\r\n * Get the current session token\r\n */\r\n getSessionToken(): string | null {\r\n return this.sessionToken;\r\n }\r\n\r\n /**\r\n * Set a session token (for restoring sessions)\r\n */\r\n setSessionToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Static method for one-off chat requests\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await AICommerce.quickChat({\r\n * apiKey: 'your-api-key',\r\n * message: 'I need a laptop'\r\n * });\r\n * ```\r\n */\r\n static async quickChat(options: {\r\n apiKey: string;\r\n message: string;\r\n baseUrl?: string;\r\n context?: ChatContext;\r\n }): Promise<ChatResponse> {\r\n const client = new AICommerce({\r\n apiKey: options.apiKey,\r\n baseUrl: options.baseUrl,\r\n });\r\n return client.chat(options.message, options.context);\r\n }\r\n}\r\n\r\n/**\r\n * Custom error class for AI Commerce SDK\r\n */\r\nexport class AICommerceError extends Error {\r\n readonly code: string;\r\n readonly status: number;\r\n\r\n constructor(message: string, code: string, status: number) {\r\n super(message);\r\n this.name = 'AICommerceError';\r\n this.code = code;\r\n this.status = status;\r\n\r\n // Maintain proper prototype chain\r\n Object.setPrototypeOf(this, AICommerceError.prototype);\r\n }\r\n}\r\n","/**\r\n * AI Commerce SDK\r\n * \r\n * AI-powered product recommendations for e-commerce\r\n * \r\n * @packageDocumentation\r\n * @module @ai-commerce/sdk\r\n * \r\n * @example\r\n * ```typescript\r\n * // npm usage\r\n * import { AICommerce } from '@ai-commerce/sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop');\r\n * console.log(response.products);\r\n * ```\r\n * \r\n * @example\r\n * ```html\r\n * <!-- Script tag usage -->\r\n * <script src=\"https://cdn.aicommerce.dev/sdk.min.js\"></script>\r\n * <script>\r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * client.chat('I need a laptop').then(response => {\r\n * console.log(response.products);\r\n * });\r\n * </script>\r\n * ```\r\n */\r\n\r\n// Export main client\r\nexport { AICommerce, AICommerceError } from './client';\r\n\r\n// Export all types\r\nexport type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Product,\r\n Session,\r\n APIError,\r\n EventType,\r\n EventCallback,\r\n} from './types';\r\n\r\n// Version\r\nexport const VERSION = '1.0.0';\r\n\r\n// For UMD builds, attach to window\r\nif (typeof window !== 'undefined') {\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerce = require('./client').AICommerce;\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerceError = require('./client').AICommerceError;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/index.ts"],"names":["client_exports","__export","AICommerce","AICommerceError","init_client","__esmMin","_AICommerce","config","url","endpoint","options","controller","timeoutId","response","errorData","error","message","context","request","token","_AICommerceError","code","status","VERSION"],"mappings":"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","file":"index.min.js","sourcesContent":["import type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Session,\r\n APIError,\r\n} from './types';\r\n\r\n/**\r\n * AI Commerce SDK Client\r\n * \r\n * @example\r\n * ```typescript\r\n * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop under $1000');\r\n * console.log(response.products);\r\n * ```\r\n */\r\nexport class AICommerce {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly timeout: number;\r\n private sessionToken: string | null = null;\r\n\r\n constructor(config: AICommerceConfig) {\r\n if (!config.apiKey) {\r\n throw new Error('AICommerce: apiKey is required');\r\n }\r\n\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = this.normalizeUrl(config.baseUrl || this.detectBaseUrl());\r\n this.timeout = config.timeout || 30000;\r\n }\r\n\r\n /**\r\n * Detect the base URL based on environment\r\n */\r\n private detectBaseUrl(): string {\r\n // Browser environment\r\n if (typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n // Node.js or default\r\n return 'https://api.aicommerce.dev';\r\n }\r\n\r\n /**\r\n * Normalize URL (remove trailing slash)\r\n */\r\n private normalizeUrl(url: string): string {\r\n return url.replace(/\\/$/, '');\r\n }\r\n\r\n /**\r\n * Make an API request\r\n */\r\n private async request<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${endpoint}`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: controller.signal,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n ...(this.sessionToken && { 'X-Session-Token': this.sessionToken }),\r\n ...options.headers,\r\n },\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const error: APIError = {\r\n code: errorData.code || 'UNKNOWN_ERROR',\r\n message: errorData.message || errorData.error || `HTTP ${response.status}`,\r\n status: response.status,\r\n };\r\n throw new AICommerceError(error.message, error.code, error.status);\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof AICommerceError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new AICommerceError('Request timeout', 'TIMEOUT', 408);\r\n }\r\n\r\n throw new AICommerceError(\r\n error instanceof Error ? error.message : 'Unknown error',\r\n 'NETWORK_ERROR',\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Send a chat message and get product recommendations\r\n * \r\n * @param message - The user's message or full ChatRequest object\r\n * @param context - Optional context for better recommendations\r\n * @returns Chat response with AI reply and products\r\n * \r\n * @example\r\n * ```typescript\r\n * // Simple usage\r\n * const response = await client.chat('I need running shoes');\r\n * \r\n * // With context\r\n * const response = await client.chat('I need running shoes', {\r\n * budget: { max: 150 },\r\n * preferences: ['comfortable', 'lightweight']\r\n * });\r\n * ```\r\n */\r\n async chat(\r\n message: string | ChatRequest,\r\n context?: ChatContext\r\n ): Promise<ChatResponse> {\r\n const request: ChatRequest = typeof message === 'string'\r\n ? { message, context, sessionToken: this.sessionToken || undefined }\r\n : { ...message, sessionToken: message.sessionToken || this.sessionToken || undefined };\r\n\r\n const response = await this.request<ChatResponse>('/api/v1/chat', {\r\n method: 'POST',\r\n body: JSON.stringify(request),\r\n });\r\n\r\n // Store session token for follow-up messages\r\n if (response.sessionToken) {\r\n this.sessionToken = response.sessionToken;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Create a new chat session\r\n * \r\n * @returns Session information with token\r\n */\r\n async createSession(): Promise<Session> {\r\n const response = await this.request<{ session: Session }>('/api/v1/chat/session', {\r\n method: 'POST',\r\n });\r\n\r\n this.sessionToken = response.session.token;\r\n return response.session;\r\n }\r\n\r\n /**\r\n * Clear the current session\r\n */\r\n clearSession(): void {\r\n this.sessionToken = null;\r\n }\r\n\r\n /**\r\n * Get the current session token\r\n */\r\n getSessionToken(): string | null {\r\n return this.sessionToken;\r\n }\r\n\r\n /**\r\n * Set a session token (for restoring sessions)\r\n */\r\n setSessionToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Static method for one-off chat requests\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await AICommerce.quickChat({\r\n * apiKey: 'your-api-key',\r\n * message: 'I need a laptop'\r\n * });\r\n * ```\r\n */\r\n static async quickChat(options: {\r\n apiKey: string;\r\n message: string;\r\n baseUrl?: string;\r\n context?: ChatContext;\r\n }): Promise<ChatResponse> {\r\n const client = new AICommerce({\r\n apiKey: options.apiKey,\r\n baseUrl: options.baseUrl,\r\n });\r\n return client.chat(options.message, options.context);\r\n }\r\n}\r\n\r\n/**\r\n * Custom error class for AI Commerce SDK\r\n */\r\nexport class AICommerceError extends Error {\r\n readonly code: string;\r\n readonly status: number;\r\n\r\n constructor(message: string, code: string, status: number) {\r\n super(message);\r\n this.name = 'AICommerceError';\r\n this.code = code;\r\n this.status = status;\r\n\r\n // Maintain proper prototype chain\r\n Object.setPrototypeOf(this, AICommerceError.prototype);\r\n }\r\n}\r\n","/**\r\n * AI Commerce SDK\r\n * \r\n * AI-powered product recommendations for e-commerce\r\n * \r\n * @packageDocumentation\r\n * @module @yassirbenmoussa/aicommerce-sdk\r\n * \r\n * @example\r\n * ```typescript\r\n * // npm usage\r\n * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop');\r\n * console.log(response.products);\r\n * ```\r\n * \r\n * @example\r\n * ```html\r\n * <!-- Script tag usage -->\r\n * <script src=\"https://cdn.aicommerce.dev/sdk.min.js\"></script>\r\n * <script>\r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * client.chat('I need a laptop').then(response => {\r\n * console.log(response.products);\r\n * });\r\n * </script>\r\n * ```\r\n */\r\n\r\n// Export main client\r\nexport { AICommerce, AICommerceError } from './client';\r\n\r\n// Export all types\r\nexport type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Product,\r\n Session,\r\n APIError,\r\n EventType,\r\n EventCallback,\r\n} from './types';\r\n\r\n// Version\r\nexport const VERSION = '1.0.0';\r\n\r\n// For UMD builds, attach to window\r\nif (typeof window !== 'undefined') {\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerce = require('./client').AICommerce;\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerceError = require('./client').AICommerceError;\r\n}\r\n"]}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Session,\r\n APIError,\r\n} from './types';\r\n\r\n/**\r\n * AI Commerce SDK Client\r\n * \r\n * @example\r\n * ```typescript\r\n * import { AICommerce } from '@ai-commerce/sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop under $1000');\r\n * console.log(response.products);\r\n * ```\r\n */\r\nexport class AICommerce {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly timeout: number;\r\n private sessionToken: string | null = null;\r\n\r\n constructor(config: AICommerceConfig) {\r\n if (!config.apiKey) {\r\n throw new Error('AICommerce: apiKey is required');\r\n }\r\n\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = this.normalizeUrl(config.baseUrl || this.detectBaseUrl());\r\n this.timeout = config.timeout || 30000;\r\n }\r\n\r\n /**\r\n * Detect the base URL based on environment\r\n */\r\n private detectBaseUrl(): string {\r\n // Browser environment\r\n if (typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n // Node.js or default\r\n return 'https://api.aicommerce.dev';\r\n }\r\n\r\n /**\r\n * Normalize URL (remove trailing slash)\r\n */\r\n private normalizeUrl(url: string): string {\r\n return url.replace(/\\/$/, '');\r\n }\r\n\r\n /**\r\n * Make an API request\r\n */\r\n private async request<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${endpoint}`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: controller.signal,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n ...(this.sessionToken && { 'X-Session-Token': this.sessionToken }),\r\n ...options.headers,\r\n },\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const error: APIError = {\r\n code: errorData.code || 'UNKNOWN_ERROR',\r\n message: errorData.message || errorData.error || `HTTP ${response.status}`,\r\n status: response.status,\r\n };\r\n throw new AICommerceError(error.message, error.code, error.status);\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof AICommerceError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new AICommerceError('Request timeout', 'TIMEOUT', 408);\r\n }\r\n\r\n throw new AICommerceError(\r\n error instanceof Error ? error.message : 'Unknown error',\r\n 'NETWORK_ERROR',\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Send a chat message and get product recommendations\r\n * \r\n * @param message - The user's message or full ChatRequest object\r\n * @param context - Optional context for better recommendations\r\n * @returns Chat response with AI reply and products\r\n * \r\n * @example\r\n * ```typescript\r\n * // Simple usage\r\n * const response = await client.chat('I need running shoes');\r\n * \r\n * // With context\r\n * const response = await client.chat('I need running shoes', {\r\n * budget: { max: 150 },\r\n * preferences: ['comfortable', 'lightweight']\r\n * });\r\n * ```\r\n */\r\n async chat(\r\n message: string | ChatRequest,\r\n context?: ChatContext\r\n ): Promise<ChatResponse> {\r\n const request: ChatRequest = typeof message === 'string'\r\n ? { message, context, sessionToken: this.sessionToken || undefined }\r\n : { ...message, sessionToken: message.sessionToken || this.sessionToken || undefined };\r\n\r\n const response = await this.request<ChatResponse>('/api/v1/chat', {\r\n method: 'POST',\r\n body: JSON.stringify(request),\r\n });\r\n\r\n // Store session token for follow-up messages\r\n if (response.sessionToken) {\r\n this.sessionToken = response.sessionToken;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Create a new chat session\r\n * \r\n * @returns Session information with token\r\n */\r\n async createSession(): Promise<Session> {\r\n const response = await this.request<{ session: Session }>('/api/v1/chat/session', {\r\n method: 'POST',\r\n });\r\n\r\n this.sessionToken = response.session.token;\r\n return response.session;\r\n }\r\n\r\n /**\r\n * Clear the current session\r\n */\r\n clearSession(): void {\r\n this.sessionToken = null;\r\n }\r\n\r\n /**\r\n * Get the current session token\r\n */\r\n getSessionToken(): string | null {\r\n return this.sessionToken;\r\n }\r\n\r\n /**\r\n * Set a session token (for restoring sessions)\r\n */\r\n setSessionToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Static method for one-off chat requests\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await AICommerce.quickChat({\r\n * apiKey: 'your-api-key',\r\n * message: 'I need a laptop'\r\n * });\r\n * ```\r\n */\r\n static async quickChat(options: {\r\n apiKey: string;\r\n message: string;\r\n baseUrl?: string;\r\n context?: ChatContext;\r\n }): Promise<ChatResponse> {\r\n const client = new AICommerce({\r\n apiKey: options.apiKey,\r\n baseUrl: options.baseUrl,\r\n });\r\n return client.chat(options.message, options.context);\r\n }\r\n}\r\n\r\n/**\r\n * Custom error class for AI Commerce SDK\r\n */\r\nexport class AICommerceError extends Error {\r\n readonly code: string;\r\n readonly status: number;\r\n\r\n constructor(message: string, code: string, status: number) {\r\n super(message);\r\n this.name = 'AICommerceError';\r\n this.code = code;\r\n this.status = status;\r\n\r\n // Maintain proper prototype chain\r\n Object.setPrototypeOf(this, AICommerceError.prototype);\r\n }\r\n}\r\n","/**\r\n * AI Commerce SDK\r\n * \r\n * AI-powered product recommendations for e-commerce\r\n * \r\n * @packageDocumentation\r\n * @module @ai-commerce/sdk\r\n * \r\n * @example\r\n * ```typescript\r\n * // npm usage\r\n * import { AICommerce } from '@ai-commerce/sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop');\r\n * console.log(response.products);\r\n * ```\r\n * \r\n * @example\r\n * ```html\r\n * <!-- Script tag usage -->\r\n * <script src=\"https://cdn.aicommerce.dev/sdk.min.js\"></script>\r\n * <script>\r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * client.chat('I need a laptop').then(response => {\r\n * console.log(response.products);\r\n * });\r\n * </script>\r\n * ```\r\n */\r\n\r\n// Export main client\r\nexport { AICommerce, AICommerceError } from './client';\r\n\r\n// Export all types\r\nexport type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Product,\r\n Session,\r\n APIError,\r\n EventType,\r\n EventCallback,\r\n} from './types';\r\n\r\n// Version\r\nexport const VERSION = '1.0.0';\r\n\r\n// For UMD builds, attach to window\r\nif (typeof window !== 'undefined') {\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerce = require('./client').AICommerce;\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerceError = require('./client').AICommerceError;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Session,\r\n APIError,\r\n} from './types';\r\n\r\n/**\r\n * AI Commerce SDK Client\r\n * \r\n * @example\r\n * ```typescript\r\n * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop under $1000');\r\n * console.log(response.products);\r\n * ```\r\n */\r\nexport class AICommerce {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly timeout: number;\r\n private sessionToken: string | null = null;\r\n\r\n constructor(config: AICommerceConfig) {\r\n if (!config.apiKey) {\r\n throw new Error('AICommerce: apiKey is required');\r\n }\r\n\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = this.normalizeUrl(config.baseUrl || this.detectBaseUrl());\r\n this.timeout = config.timeout || 30000;\r\n }\r\n\r\n /**\r\n * Detect the base URL based on environment\r\n */\r\n private detectBaseUrl(): string {\r\n // Browser environment\r\n if (typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n // Node.js or default\r\n return 'https://api.aicommerce.dev';\r\n }\r\n\r\n /**\r\n * Normalize URL (remove trailing slash)\r\n */\r\n private normalizeUrl(url: string): string {\r\n return url.replace(/\\/$/, '');\r\n }\r\n\r\n /**\r\n * Make an API request\r\n */\r\n private async request<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${endpoint}`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: controller.signal,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n ...(this.sessionToken && { 'X-Session-Token': this.sessionToken }),\r\n ...options.headers,\r\n },\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const error: APIError = {\r\n code: errorData.code || 'UNKNOWN_ERROR',\r\n message: errorData.message || errorData.error || `HTTP ${response.status}`,\r\n status: response.status,\r\n };\r\n throw new AICommerceError(error.message, error.code, error.status);\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof AICommerceError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new AICommerceError('Request timeout', 'TIMEOUT', 408);\r\n }\r\n\r\n throw new AICommerceError(\r\n error instanceof Error ? error.message : 'Unknown error',\r\n 'NETWORK_ERROR',\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Send a chat message and get product recommendations\r\n * \r\n * @param message - The user's message or full ChatRequest object\r\n * @param context - Optional context for better recommendations\r\n * @returns Chat response with AI reply and products\r\n * \r\n * @example\r\n * ```typescript\r\n * // Simple usage\r\n * const response = await client.chat('I need running shoes');\r\n * \r\n * // With context\r\n * const response = await client.chat('I need running shoes', {\r\n * budget: { max: 150 },\r\n * preferences: ['comfortable', 'lightweight']\r\n * });\r\n * ```\r\n */\r\n async chat(\r\n message: string | ChatRequest,\r\n context?: ChatContext\r\n ): Promise<ChatResponse> {\r\n const request: ChatRequest = typeof message === 'string'\r\n ? { message, context, sessionToken: this.sessionToken || undefined }\r\n : { ...message, sessionToken: message.sessionToken || this.sessionToken || undefined };\r\n\r\n const response = await this.request<ChatResponse>('/api/v1/chat', {\r\n method: 'POST',\r\n body: JSON.stringify(request),\r\n });\r\n\r\n // Store session token for follow-up messages\r\n if (response.sessionToken) {\r\n this.sessionToken = response.sessionToken;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Create a new chat session\r\n * \r\n * @returns Session information with token\r\n */\r\n async createSession(): Promise<Session> {\r\n const response = await this.request<{ session: Session }>('/api/v1/chat/session', {\r\n method: 'POST',\r\n });\r\n\r\n this.sessionToken = response.session.token;\r\n return response.session;\r\n }\r\n\r\n /**\r\n * Clear the current session\r\n */\r\n clearSession(): void {\r\n this.sessionToken = null;\r\n }\r\n\r\n /**\r\n * Get the current session token\r\n */\r\n getSessionToken(): string | null {\r\n return this.sessionToken;\r\n }\r\n\r\n /**\r\n * Set a session token (for restoring sessions)\r\n */\r\n setSessionToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Static method for one-off chat requests\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await AICommerce.quickChat({\r\n * apiKey: 'your-api-key',\r\n * message: 'I need a laptop'\r\n * });\r\n * ```\r\n */\r\n static async quickChat(options: {\r\n apiKey: string;\r\n message: string;\r\n baseUrl?: string;\r\n context?: ChatContext;\r\n }): Promise<ChatResponse> {\r\n const client = new AICommerce({\r\n apiKey: options.apiKey,\r\n baseUrl: options.baseUrl,\r\n });\r\n return client.chat(options.message, options.context);\r\n }\r\n}\r\n\r\n/**\r\n * Custom error class for AI Commerce SDK\r\n */\r\nexport class AICommerceError extends Error {\r\n readonly code: string;\r\n readonly status: number;\r\n\r\n constructor(message: string, code: string, status: number) {\r\n super(message);\r\n this.name = 'AICommerceError';\r\n this.code = code;\r\n this.status = status;\r\n\r\n // Maintain proper prototype chain\r\n Object.setPrototypeOf(this, AICommerceError.prototype);\r\n }\r\n}\r\n","/**\r\n * AI Commerce SDK\r\n * \r\n * AI-powered product recommendations for e-commerce\r\n * \r\n * @packageDocumentation\r\n * @module @yassirbenmoussa/aicommerce-sdk\r\n * \r\n * @example\r\n * ```typescript\r\n * // npm usage\r\n * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop');\r\n * console.log(response.products);\r\n * ```\r\n * \r\n * @example\r\n * ```html\r\n * <!-- Script tag usage -->\r\n * <script src=\"https://cdn.aicommerce.dev/sdk.min.js\"></script>\r\n * <script>\r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * client.chat('I need a laptop').then(response => {\r\n * console.log(response.products);\r\n * });\r\n * </script>\r\n * ```\r\n */\r\n\r\n// Export main client\r\nexport { AICommerce, AICommerceError } from './client';\r\n\r\n// Export all types\r\nexport type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Product,\r\n Session,\r\n APIError,\r\n EventType,\r\n EventCallback,\r\n} from './types';\r\n\r\n// Version\r\nexport const VERSION = '1.0.0';\r\n\r\n// For UMD builds, attach to window\r\nif (typeof window !== 'undefined') {\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerce = require('./client').AICommerce;\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerceError = require('./client').AICommerceError;\r\n}\r\n"]}
|