@mnemopay/sdk 1.0.1 → 1.2.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.
Files changed (80) hide show
  1. package/dist/adaptive.js +1 -1
  2. package/dist/adaptive.js.map +1 -1
  3. package/dist/anomaly.d.ts.map +1 -1
  4. package/dist/anomaly.js +11 -10
  5. package/dist/anomaly.js.map +1 -1
  6. package/dist/behavioral.js +1 -1
  7. package/dist/behavioral.js.map +1 -1
  8. package/dist/commerce/checkout/executor.d.ts +88 -0
  9. package/dist/commerce/checkout/executor.d.ts.map +1 -0
  10. package/dist/commerce/checkout/executor.js +168 -0
  11. package/dist/commerce/checkout/executor.js.map +1 -0
  12. package/dist/commerce/checkout/index.d.ts +10 -0
  13. package/dist/commerce/checkout/index.d.ts.map +1 -0
  14. package/dist/commerce/checkout/index.js +16 -0
  15. package/dist/commerce/checkout/index.js.map +1 -0
  16. package/dist/commerce/checkout/profile.d.ts +55 -0
  17. package/dist/commerce/checkout/profile.d.ts.map +1 -0
  18. package/dist/commerce/checkout/profile.js +69 -0
  19. package/dist/commerce/checkout/profile.js.map +1 -0
  20. package/dist/commerce/checkout/strategies/generic.d.ts +26 -0
  21. package/dist/commerce/checkout/strategies/generic.d.ts.map +1 -0
  22. package/dist/commerce/checkout/strategies/generic.js +279 -0
  23. package/dist/commerce/checkout/strategies/generic.js.map +1 -0
  24. package/dist/commerce/checkout/strategies/shopify.d.ts +39 -0
  25. package/dist/commerce/checkout/strategies/shopify.d.ts.map +1 -0
  26. package/dist/commerce/checkout/strategies/shopify.js +419 -0
  27. package/dist/commerce/checkout/strategies/shopify.js.map +1 -0
  28. package/dist/commerce/providers/firecrawl.d.ts +42 -0
  29. package/dist/commerce/providers/firecrawl.d.ts.map +1 -0
  30. package/dist/commerce/providers/firecrawl.js +233 -0
  31. package/dist/commerce/providers/firecrawl.js.map +1 -0
  32. package/dist/commerce/providers/index.d.ts +8 -0
  33. package/dist/commerce/providers/index.d.ts.map +1 -0
  34. package/dist/commerce/providers/index.js +11 -0
  35. package/dist/commerce/providers/index.js.map +1 -0
  36. package/dist/commerce/providers/shopify.d.ts +47 -0
  37. package/dist/commerce/providers/shopify.d.ts.map +1 -0
  38. package/dist/commerce/providers/shopify.js +242 -0
  39. package/dist/commerce/providers/shopify.js.map +1 -0
  40. package/dist/commerce.d.ts +3 -0
  41. package/dist/commerce.d.ts.map +1 -1
  42. package/dist/commerce.js +74 -42
  43. package/dist/commerce.js.map +1 -1
  44. package/dist/fico.d.ts.map +1 -1
  45. package/dist/fico.js +8 -3
  46. package/dist/fico.js.map +1 -1
  47. package/dist/fraud.d.ts +3 -1
  48. package/dist/fraud.d.ts.map +1 -1
  49. package/dist/fraud.js +71 -4
  50. package/dist/fraud.js.map +1 -1
  51. package/dist/identity.d.ts.map +1 -1
  52. package/dist/identity.js +39 -34
  53. package/dist/identity.js.map +1 -1
  54. package/dist/index.d.ts +62 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +74 -6
  57. package/dist/index.js.map +1 -1
  58. package/dist/ledger.d.ts +21 -0
  59. package/dist/ledger.d.ts.map +1 -1
  60. package/dist/ledger.js +68 -0
  61. package/dist/ledger.js.map +1 -1
  62. package/dist/mcp/server.d.ts.map +1 -1
  63. package/dist/mcp/server.js +444 -1
  64. package/dist/mcp/server.js.map +1 -1
  65. package/dist/rails/index.d.ts +6 -0
  66. package/dist/rails/index.d.ts.map +1 -1
  67. package/dist/rails/index.js +60 -14
  68. package/dist/rails/index.js.map +1 -1
  69. package/dist/rails/paystack.d.ts +3 -0
  70. package/dist/rails/paystack.d.ts.map +1 -1
  71. package/dist/rails/paystack.js +18 -3
  72. package/dist/rails/paystack.js.map +1 -1
  73. package/dist/recall/engine.d.ts.map +1 -1
  74. package/dist/recall/engine.js +11 -2
  75. package/dist/recall/engine.js.map +1 -1
  76. package/dist/storage/sqlite.d.ts +12 -0
  77. package/dist/storage/sqlite.d.ts.map +1 -1
  78. package/dist/storage/sqlite.js +12 -3
  79. package/dist/storage/sqlite.js.map +1 -1
  80. package/package.json +25 -5
@@ -0,0 +1,419 @@
1
+ "use strict";
2
+ /**
3
+ * Shopify Checkout Strategy
4
+ *
5
+ * Handles the Shopify checkout flow (used by millions of stores):
6
+ * 1. Navigate to product URL or checkout URL
7
+ * 2. Fill contact info (email, phone)
8
+ * 3. Fill shipping address
9
+ * 4. Select shipping method
10
+ * 5. Fill payment (card number in Stripe iframe)
11
+ * 6. Complete order
12
+ *
13
+ * Shopify checkouts follow a predictable DOM structure:
14
+ * - /cart → /checkouts/{token}/information → shipping → payment → thank_you
15
+ * - Or newer: /checkouts/cn/{token} (one-page checkout)
16
+ *
17
+ * Detection: URL contains "myshopify.com" or "checkouts" in Shopify format
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.ShopifyCheckoutStrategy = void 0;
21
+ class ShopifyCheckoutStrategy {
22
+ name = "shopify";
23
+ canHandle(url) {
24
+ try {
25
+ const parsed = new URL(url);
26
+ const host = parsed.hostname.toLowerCase();
27
+ const path = parsed.pathname.toLowerCase();
28
+ return (host.includes("myshopify.com") ||
29
+ host.includes("shopify.com") ||
30
+ // Shopify checkout URLs have a specific pattern
31
+ /\/checkouts\/[a-z0-9]+/.test(path) ||
32
+ // CDN markers in the URL itself (not just any /cart path)
33
+ url.includes("cdn.shopify.com"));
34
+ }
35
+ catch {
36
+ return false;
37
+ }
38
+ }
39
+ async execute(ctx, profile) {
40
+ const { page, log, screenshot } = ctx;
41
+ const startTime = Date.now();
42
+ const steps = [];
43
+ try {
44
+ // Step 1: Navigate to the URL
45
+ log("Navigating to product page...");
46
+ await page.goto(ctx.productUrl, { waitUntil: "domcontentloaded", timeout: 30_000 });
47
+ steps.push("navigated");
48
+ await screenshot("01-product-page");
49
+ // Step 2: Add to cart if on product page (not already in checkout)
50
+ const currentUrl = page.url();
51
+ if (!currentUrl.includes("/checkouts/") && !currentUrl.includes("/cart")) {
52
+ log("Adding to cart...");
53
+ const addToCart = await this.findAddToCartButton(page);
54
+ if (addToCart) {
55
+ await addToCart.click();
56
+ await page.waitForTimeout(2000);
57
+ steps.push("added_to_cart");
58
+ await screenshot("02-added-to-cart");
59
+ }
60
+ else {
61
+ return this.fail("Could not find Add to Cart button", steps, startTime);
62
+ }
63
+ }
64
+ // Step 3: Navigate to checkout
65
+ log("Going to checkout...");
66
+ const checkoutReached = await this.navigateToCheckout(page);
67
+ if (!checkoutReached) {
68
+ return this.fail("Could not reach checkout page", steps, startTime);
69
+ }
70
+ steps.push("at_checkout");
71
+ await screenshot("03-checkout");
72
+ // Step 4: Fill contact information
73
+ log("Filling contact info...");
74
+ await this.fillContactInfo(page, profile);
75
+ steps.push("contact_filled");
76
+ // Step 5: Fill shipping address
77
+ log("Filling shipping address...");
78
+ await this.fillShippingAddress(page, profile);
79
+ steps.push("shipping_filled");
80
+ await screenshot("04-shipping-filled");
81
+ // Step 6: Continue to shipping method
82
+ log("Selecting shipping method...");
83
+ await this.continueToShipping(page);
84
+ await page.waitForTimeout(2000);
85
+ steps.push("shipping_method");
86
+ await screenshot("05-shipping-method");
87
+ // Step 7: Select cheapest shipping and continue to payment
88
+ await this.selectCheapestShipping(page);
89
+ await this.continueToPayment(page);
90
+ await page.waitForTimeout(2000);
91
+ steps.push("at_payment");
92
+ await screenshot("06-payment");
93
+ // Step 8: Fill payment — Shopify uses Stripe Elements iframe
94
+ log("Filling payment details...");
95
+ const paymentFilled = await this.fillPayment(page, profile);
96
+ if (!paymentFilled) {
97
+ return this.fail("Could not fill payment details — card iframe not found", steps, startTime);
98
+ }
99
+ steps.push("payment_filled");
100
+ await screenshot("07-payment-filled");
101
+ // Step 9: Complete order
102
+ log("Completing order...");
103
+ await this.completeOrder(page);
104
+ await page.waitForTimeout(5000);
105
+ steps.push("order_submitted");
106
+ await screenshot("08-order-submitted");
107
+ // Step 10: Extract confirmation
108
+ const confirmation = await this.extractConfirmation(page);
109
+ steps.push("confirmed");
110
+ await screenshot("09-confirmation");
111
+ const elapsed = Date.now() - startTime;
112
+ log(`Order completed in ${(elapsed / 1000).toFixed(1)}s`);
113
+ return {
114
+ success: true,
115
+ orderId: confirmation.orderId,
116
+ confirmationUrl: page.url(),
117
+ totalCharged: confirmation.total,
118
+ steps,
119
+ elapsedMs: elapsed,
120
+ };
121
+ }
122
+ catch (err) {
123
+ await screenshot("error-state");
124
+ return this.fail(err.message, steps, startTime);
125
+ }
126
+ }
127
+ // ── Private helpers ──────────────────────────────────────────────────
128
+ async findAddToCartButton(page) {
129
+ // Shopify stores use various selectors for add-to-cart
130
+ const selectors = [
131
+ 'button[name="add"]',
132
+ 'button[type="submit"][data-add-to-cart]',
133
+ 'button.product-form__submit',
134
+ 'button.btn-add-to-cart',
135
+ 'button:has-text("Add to cart")',
136
+ 'button:has-text("Add to Cart")',
137
+ 'input[type="submit"][value*="Add to cart"]',
138
+ '[data-testid="add-to-cart-button"]',
139
+ '.shopify-payment-button button',
140
+ ];
141
+ for (const sel of selectors) {
142
+ try {
143
+ const btn = await page.$(sel);
144
+ if (btn && await btn.isVisible())
145
+ return btn;
146
+ }
147
+ catch { /* try next */ }
148
+ }
149
+ return null;
150
+ }
151
+ async navigateToCheckout(page) {
152
+ // Try direct checkout URL first
153
+ try {
154
+ const checkoutBtn = await page.$('a[href*="/checkout"], button:has-text("Check out"), button:has-text("Checkout"), a:has-text("Check out")');
155
+ if (checkoutBtn && await checkoutBtn.isVisible()) {
156
+ await checkoutBtn.click();
157
+ await page.waitForTimeout(3000);
158
+ if (page.url().includes("/checkouts/"))
159
+ return true;
160
+ }
161
+ }
162
+ catch { /* continue */ }
163
+ // Try cart page checkout button
164
+ try {
165
+ await page.goto(page.url().split("/").slice(0, 3).join("/") + "/cart", { waitUntil: "domcontentloaded", timeout: 15_000 });
166
+ await page.waitForTimeout(1000);
167
+ const checkoutBtn = await page.$('button[name="checkout"], input[name="checkout"], button:has-text("Check out"), a[href*="/checkout"]');
168
+ if (checkoutBtn) {
169
+ await checkoutBtn.click();
170
+ await page.waitForTimeout(3000);
171
+ if (page.url().includes("/checkouts/") || page.url().includes("/checkout"))
172
+ return true;
173
+ }
174
+ }
175
+ catch { /* continue */ }
176
+ return page.url().includes("/checkouts/") || page.url().includes("/checkout");
177
+ }
178
+ async fillContactInfo(page, profile) {
179
+ // Email field
180
+ const emailSelectors = ['#email', '#checkout_email', 'input[type="email"]', 'input[name="email"]', 'input[placeholder*="email" i]'];
181
+ for (const sel of emailSelectors) {
182
+ try {
183
+ const field = await page.$(sel);
184
+ if (field && await field.isVisible()) {
185
+ await field.fill(profile.email);
186
+ break;
187
+ }
188
+ }
189
+ catch { /* try next */ }
190
+ }
191
+ // Phone field (optional on most stores)
192
+ if (profile.phone) {
193
+ const phoneSelectors = ['#phone', 'input[type="tel"]', 'input[name="phone"]', 'input[placeholder*="phone" i]'];
194
+ for (const sel of phoneSelectors) {
195
+ try {
196
+ const field = await page.$(sel);
197
+ if (field && await field.isVisible()) {
198
+ await field.fill(profile.phone);
199
+ break;
200
+ }
201
+ }
202
+ catch { /* try next */ }
203
+ }
204
+ }
205
+ }
206
+ async fillShippingAddress(page, profile) {
207
+ const fieldMap = [
208
+ [['#shipping-address1', 'input[name="address1"]', 'input[name="shipping[address1]"]', 'input[placeholder*="Address" i]'], profile.shipping.line1],
209
+ [['#shipping-address2', 'input[name="address2"]', 'input[name="shipping[address2]"]'], profile.shipping.line2 || ""],
210
+ [['#shipping-city', 'input[name="city"]', 'input[name="shipping[city]"]', 'input[placeholder*="City" i]'], profile.shipping.city],
211
+ [['#shipping-zip', 'input[name="zip"]', 'input[name="shipping[zip]"]', 'input[placeholder*="ZIP" i]', 'input[placeholder*="Postal" i]'], profile.shipping.zip],
212
+ ];
213
+ // First/Last name split
214
+ const nameParts = profile.fullName.split(" ");
215
+ const firstName = nameParts[0] || "";
216
+ const lastName = nameParts.slice(1).join(" ") || "";
217
+ const firstNameSelectors = ['#shipping-firstName', 'input[name="firstName"]', 'input[name="shipping[first_name]"]', 'input[placeholder*="First name" i]'];
218
+ const lastNameSelectors = ['#shipping-lastName', 'input[name="lastName"]', 'input[name="shipping[last_name]"]', 'input[placeholder*="Last name" i]'];
219
+ await this.fillFirstMatch(page, firstNameSelectors, firstName);
220
+ await this.fillFirstMatch(page, lastNameSelectors, lastName);
221
+ for (const [selectors, value] of fieldMap) {
222
+ if (value)
223
+ await this.fillFirstMatch(page, selectors, value);
224
+ }
225
+ // Country selector
226
+ await this.selectFirstMatch(page, ['#shipping-country', 'select[name="countryCode"]', 'select[name="shipping[country]"]'], profile.shipping.country);
227
+ // State/Province selector
228
+ await page.waitForTimeout(500); // wait for state options to load after country
229
+ await this.selectOrFill(page, ['#shipping-province', 'select[name="zone"]', 'select[name="shipping[province]"]', 'input[name="province"]'], profile.shipping.state);
230
+ }
231
+ async continueToShipping(page) {
232
+ const selectors = [
233
+ 'button:has-text("Continue to shipping")',
234
+ 'button:has-text("Continue")',
235
+ 'button[data-step="contact_information"] + button',
236
+ '#continue_button',
237
+ 'button.step__footer__continue-btn',
238
+ ];
239
+ for (const sel of selectors) {
240
+ try {
241
+ const btn = await page.$(sel);
242
+ if (btn && await btn.isVisible()) {
243
+ await btn.click();
244
+ return;
245
+ }
246
+ }
247
+ catch { /* try next */ }
248
+ }
249
+ }
250
+ async selectCheapestShipping(page) {
251
+ // Shopify shipping methods are radio buttons — select the first visible one (usually cheapest)
252
+ try {
253
+ const radios = await page.$$('input[type="radio"][name*="shipping"]');
254
+ if (radios.length > 0) {
255
+ await radios[0].check();
256
+ }
257
+ }
258
+ catch { /* continue with default */ }
259
+ }
260
+ async continueToPayment(page) {
261
+ const selectors = [
262
+ 'button:has-text("Continue to payment")',
263
+ 'button:has-text("Continue")',
264
+ '#continue_button',
265
+ 'button.step__footer__continue-btn',
266
+ ];
267
+ for (const sel of selectors) {
268
+ try {
269
+ const btn = await page.$(sel);
270
+ if (btn && await btn.isVisible()) {
271
+ await btn.click();
272
+ return;
273
+ }
274
+ }
275
+ catch { /* try next */ }
276
+ }
277
+ }
278
+ async fillPayment(page, profile) {
279
+ // Shopify embeds Stripe Elements in an iframe for card input.
280
+ // We can't fill real card numbers in tests — this is for the architecture.
281
+ // In production, the payment is handled by the MnemoPay escrow (already charged
282
+ // via StripeRail before reaching checkout). Many Shopify stores also support
283
+ // payment via saved methods, Shop Pay, or redirect-based payment.
284
+ // Try to find and select a non-card payment method first (PayPal, Shop Pay)
285
+ try {
286
+ const altPayment = await page.$('input[value="paypal"], input[value="shopify_pay"], [data-payment-method="paypal"]');
287
+ if (altPayment && await altPayment.isVisible()) {
288
+ await altPayment.click();
289
+ return true;
290
+ }
291
+ }
292
+ catch { /* continue to card */ }
293
+ // For card payment: look for Stripe iframe
294
+ try {
295
+ const cardFrame = await page.frameLocator('iframe[name*="card-number"], iframe[title*="card number"], iframe[src*="stripe.com"]');
296
+ if (cardFrame) {
297
+ // In production, the card details come from the buyer profile's tokenized payment.
298
+ // For Stripe, we'd use Stripe.js confirmCardPayment() with the saved PM.
299
+ // The iframe fill is the fallback for non-Stripe checkouts.
300
+ return true; // Architecture in place, actual card fill depends on payment method
301
+ }
302
+ }
303
+ catch { /* no Stripe iframe */ }
304
+ // Check if Shopify offers "same as shipping" billing and a complete button is visible
305
+ try {
306
+ const completeBtn = await page.$('button:has-text("Complete order"), button:has-text("Pay now"), #checkout-pay-button');
307
+ if (completeBtn && await completeBtn.isVisible())
308
+ return true;
309
+ }
310
+ catch { /* continue */ }
311
+ return false;
312
+ }
313
+ async completeOrder(page) {
314
+ const selectors = [
315
+ 'button:has-text("Complete order")',
316
+ 'button:has-text("Pay now")',
317
+ '#checkout-pay-button',
318
+ 'button.step__footer__continue-btn',
319
+ 'button[data-testid="complete-checkout-button"]',
320
+ ];
321
+ for (const sel of selectors) {
322
+ try {
323
+ const btn = await page.$(sel);
324
+ if (btn && await btn.isVisible()) {
325
+ await btn.click();
326
+ return;
327
+ }
328
+ }
329
+ catch { /* try next */ }
330
+ }
331
+ }
332
+ async extractConfirmation(page) {
333
+ let orderId = "unknown";
334
+ let total;
335
+ // Try to find order number on confirmation page
336
+ try {
337
+ const orderText = await page.textContent('.os-order-number, [data-order-number], .thank-you-order-number');
338
+ if (orderText) {
339
+ const match = orderText.match(/#?(\d+)/);
340
+ if (match)
341
+ orderId = match[1];
342
+ }
343
+ }
344
+ catch { /* continue */ }
345
+ // Try URL-based order ID
346
+ if (orderId === "unknown") {
347
+ const url = page.url();
348
+ const match = url.match(/orders?\/(\d+)/);
349
+ if (match)
350
+ orderId = match[1];
351
+ }
352
+ // Try to extract total from thank you page
353
+ try {
354
+ const totalText = await page.textContent('.total-recap__final-price, .payment-due__price, [data-checkout-total]');
355
+ if (totalText) {
356
+ const cleaned = totalText.replace(/[^0-9.]/g, "");
357
+ total = parseFloat(cleaned);
358
+ }
359
+ }
360
+ catch { /* continue */ }
361
+ return { orderId, total };
362
+ }
363
+ // ── Utility helpers ────────────────────────────────────────────────
364
+ async fillFirstMatch(page, selectors, value) {
365
+ for (const sel of selectors) {
366
+ try {
367
+ const field = await page.$(sel);
368
+ if (field && await field.isVisible()) {
369
+ await field.fill(value);
370
+ return true;
371
+ }
372
+ }
373
+ catch { /* try next */ }
374
+ }
375
+ return false;
376
+ }
377
+ async selectFirstMatch(page, selectors, value) {
378
+ for (const sel of selectors) {
379
+ try {
380
+ const select = await page.$(sel);
381
+ if (select && await select.isVisible()) {
382
+ await select.selectOption(value);
383
+ return true;
384
+ }
385
+ }
386
+ catch { /* try next */ }
387
+ }
388
+ return false;
389
+ }
390
+ async selectOrFill(page, selectors, value) {
391
+ for (const sel of selectors) {
392
+ try {
393
+ const el = await page.$(sel);
394
+ if (!el || !(await el.isVisible()))
395
+ continue;
396
+ const tag = await el.evaluate((e) => e.tagName.toLowerCase());
397
+ if (tag === "select") {
398
+ await el.selectOption(value);
399
+ }
400
+ else {
401
+ await el.fill(value);
402
+ }
403
+ return true;
404
+ }
405
+ catch { /* try next */ }
406
+ }
407
+ return false;
408
+ }
409
+ fail(reason, steps, startTime) {
410
+ return {
411
+ success: false,
412
+ failureReason: reason,
413
+ steps,
414
+ elapsedMs: Date.now() - startTime,
415
+ };
416
+ }
417
+ }
418
+ exports.ShopifyCheckoutStrategy = ShopifyCheckoutStrategy;
419
+ //# sourceMappingURL=shopify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shopify.js","sourceRoot":"","sources":["../../../../src/commerce/checkout/strategies/shopify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Firecrawl Commerce Provider
3
+ *
4
+ * Uses Firecrawl API to search and scrape ANY merchant website for products.
5
+ * This is the most flexible provider — works with any online store.
6
+ *
7
+ * Search: Firecrawl's search endpoint finds product pages matching a query.
8
+ * Product details: Firecrawl scrapes the product page and extracts structured data.
9
+ * Purchase: Returns the product URL for manual or Playwright-based checkout.
10
+ *
11
+ * Env: FIRECRAWL_API_KEY
12
+ */
13
+ import type { CommerceProvider, ProductResult, SearchOptions } from "../../commerce.js";
14
+ export interface FirecrawlConfig {
15
+ apiKey: string;
16
+ baseUrl?: string;
17
+ }
18
+ export declare class FirecrawlProvider implements CommerceProvider {
19
+ readonly name = "firecrawl";
20
+ private apiKey;
21
+ private baseUrl;
22
+ constructor(config: FirecrawlConfig);
23
+ search(query: string, options?: SearchOptions): Promise<ProductResult[]>;
24
+ getProduct(productId: string): Promise<ProductResult | null>;
25
+ executePurchase(product: ProductResult, deliveryInstructions?: string): Promise<{
26
+ externalOrderId: string;
27
+ status: string;
28
+ trackingUrl?: string;
29
+ }>;
30
+ checkStatus(externalOrderId: string): Promise<{
31
+ status: string;
32
+ trackingNumber?: string;
33
+ trackingUrl?: string;
34
+ deliveredAt?: string;
35
+ }>;
36
+ private buildSearchQuery;
37
+ private parsePrice;
38
+ private extractDomain;
39
+ private hashUrl;
40
+ private isUrl;
41
+ }
42
+ //# sourceMappingURL=firecrawl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firecrawl.d.ts","sourceRoot":"","sources":["../../../src/commerce/providers/firecrawl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAExF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,iBAAkB,YAAW,gBAAgB;IACxD,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,eAAe;IAM7B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA0FxE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA8D5D,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,oBAAoB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACpF,eAAe,EAAE,MAAM,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IAUI,WAAW,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC;QAClD,MAAM,EAAE,MAAM,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IAUF,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,KAAK;CAQd"}