@mnemopay/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.
Files changed (78) hide show
  1. package/LICENSE +190 -21
  2. package/README.md +91 -15
  3. package/dist/adaptive.js +1 -1
  4. package/dist/adaptive.js.map +1 -1
  5. package/dist/anomaly.d.ts.map +1 -1
  6. package/dist/anomaly.js +11 -10
  7. package/dist/anomaly.js.map +1 -1
  8. package/dist/behavioral.js +1 -1
  9. package/dist/behavioral.js.map +1 -1
  10. package/dist/commerce/checkout/executor.d.ts +88 -0
  11. package/dist/commerce/checkout/executor.d.ts.map +1 -0
  12. package/dist/commerce/checkout/executor.js +168 -0
  13. package/dist/commerce/checkout/executor.js.map +1 -0
  14. package/dist/commerce/checkout/index.d.ts +10 -0
  15. package/dist/commerce/checkout/index.d.ts.map +1 -0
  16. package/dist/commerce/checkout/index.js +16 -0
  17. package/dist/commerce/checkout/index.js.map +1 -0
  18. package/dist/commerce/checkout/profile.d.ts +55 -0
  19. package/dist/commerce/checkout/profile.d.ts.map +1 -0
  20. package/dist/commerce/checkout/profile.js +69 -0
  21. package/dist/commerce/checkout/profile.js.map +1 -0
  22. package/dist/commerce/checkout/strategies/generic.d.ts +26 -0
  23. package/dist/commerce/checkout/strategies/generic.d.ts.map +1 -0
  24. package/dist/commerce/checkout/strategies/generic.js +279 -0
  25. package/dist/commerce/checkout/strategies/generic.js.map +1 -0
  26. package/dist/commerce/checkout/strategies/shopify.d.ts +39 -0
  27. package/dist/commerce/checkout/strategies/shopify.d.ts.map +1 -0
  28. package/dist/commerce/checkout/strategies/shopify.js +419 -0
  29. package/dist/commerce/checkout/strategies/shopify.js.map +1 -0
  30. package/dist/commerce/providers/firecrawl.d.ts +42 -0
  31. package/dist/commerce/providers/firecrawl.d.ts.map +1 -0
  32. package/dist/commerce/providers/firecrawl.js +233 -0
  33. package/dist/commerce/providers/firecrawl.js.map +1 -0
  34. package/dist/commerce/providers/index.d.ts +8 -0
  35. package/dist/commerce/providers/index.d.ts.map +1 -0
  36. package/dist/commerce/providers/index.js +11 -0
  37. package/dist/commerce/providers/index.js.map +1 -0
  38. package/dist/commerce/providers/shopify.d.ts +47 -0
  39. package/dist/commerce/providers/shopify.d.ts.map +1 -0
  40. package/dist/commerce/providers/shopify.js +242 -0
  41. package/dist/commerce/providers/shopify.js.map +1 -0
  42. package/dist/commerce.d.ts +3 -0
  43. package/dist/commerce.d.ts.map +1 -1
  44. package/dist/commerce.js +74 -42
  45. package/dist/commerce.js.map +1 -1
  46. package/dist/fico.d.ts +15 -9
  47. package/dist/fico.d.ts.map +1 -1
  48. package/dist/fico.js +30 -15
  49. package/dist/fico.js.map +1 -1
  50. package/dist/fraud.d.ts.map +1 -1
  51. package/dist/fraud.js +20 -3
  52. package/dist/fraud.js.map +1 -1
  53. package/dist/identity.d.ts.map +1 -1
  54. package/dist/identity.js +39 -34
  55. package/dist/identity.js.map +1 -1
  56. package/dist/index.d.ts +9 -4
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +27 -8
  59. package/dist/index.js.map +1 -1
  60. package/dist/mcp/server.d.ts.map +1 -1
  61. package/dist/mcp/server.js +444 -1
  62. package/dist/mcp/server.js.map +1 -1
  63. package/dist/rails/index.d.ts +59 -4
  64. package/dist/rails/index.d.ts.map +1 -1
  65. package/dist/rails/index.js +128 -19
  66. package/dist/rails/index.js.map +1 -1
  67. package/dist/rails/paystack.d.ts +5 -6
  68. package/dist/rails/paystack.d.ts.map +1 -1
  69. package/dist/rails/paystack.js +18 -3
  70. package/dist/rails/paystack.js.map +1 -1
  71. package/dist/recall/engine.d.ts.map +1 -1
  72. package/dist/recall/engine.js +11 -2
  73. package/dist/recall/engine.js.map +1 -1
  74. package/dist/storage/sqlite.d.ts +26 -1
  75. package/dist/storage/sqlite.d.ts.map +1 -1
  76. package/dist/storage/sqlite.js +48 -4
  77. package/dist/storage/sqlite.js.map +1 -1
  78. package/package.json +29 -6
@@ -0,0 +1,279 @@
1
+ "use strict";
2
+ /**
3
+ * Generic E-Commerce Checkout Strategy
4
+ *
5
+ * Handles checkout on non-Shopify sites using common DOM patterns.
6
+ * Works with WooCommerce, Magento, custom stores, and most e-commerce platforms.
7
+ *
8
+ * Strategy: progressive form detection — find visible input fields by common
9
+ * names/labels/placeholders, fill them, then find the next action button.
10
+ *
11
+ * This is inherently less reliable than platform-specific strategies because
12
+ * every store has different DOM structure. Expected success rate: 40-60%.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.GenericCheckoutStrategy = void 0;
16
+ class GenericCheckoutStrategy {
17
+ name = "generic";
18
+ canHandle(_url) {
19
+ // Generic strategy is the fallback — handles anything
20
+ return true;
21
+ }
22
+ async execute(ctx, profile) {
23
+ const { page, log, screenshot } = ctx;
24
+ const startTime = Date.now();
25
+ const steps = [];
26
+ try {
27
+ // Step 1: Navigate
28
+ log("Navigating to product page...");
29
+ await page.goto(ctx.productUrl, { waitUntil: "domcontentloaded", timeout: 30_000 });
30
+ steps.push("navigated");
31
+ await screenshot("01-product-page");
32
+ // Step 2: Add to cart
33
+ log("Adding to cart...");
34
+ const added = await this.addToCart(page);
35
+ if (!added)
36
+ return this.fail("Could not find Add to Cart button", steps, startTime);
37
+ steps.push("added_to_cart");
38
+ await page.waitForTimeout(2000);
39
+ await screenshot("02-cart");
40
+ // Step 3: Go to checkout
41
+ log("Going to checkout...");
42
+ const atCheckout = await this.goToCheckout(page);
43
+ if (!atCheckout)
44
+ return this.fail("Could not reach checkout", steps, startTime);
45
+ steps.push("at_checkout");
46
+ await screenshot("03-checkout");
47
+ // Step 4: Fill all visible form fields
48
+ log("Filling checkout form...");
49
+ const filled = await this.fillCheckoutForm(page, profile);
50
+ steps.push(`filled_${filled}_fields`);
51
+ await screenshot("04-form-filled");
52
+ if (filled < 3) {
53
+ return this.fail(`Only filled ${filled} fields — checkout form not recognized`, steps, startTime);
54
+ }
55
+ // Step 5: Find and click place order / submit
56
+ log("Submitting order...");
57
+ const submitted = await this.submitOrder(page);
58
+ if (!submitted)
59
+ return this.fail("Could not find submit/place order button", steps, startTime);
60
+ steps.push("submitted");
61
+ await page.waitForTimeout(5000);
62
+ await screenshot("05-submitted");
63
+ // Step 6: Check for confirmation
64
+ const confirmation = await this.checkConfirmation(page);
65
+ steps.push(confirmation.success ? "confirmed" : "unconfirmed");
66
+ await screenshot("06-result");
67
+ return {
68
+ success: confirmation.success,
69
+ orderId: confirmation.orderId,
70
+ confirmationUrl: page.url(),
71
+ totalCharged: confirmation.total,
72
+ failureReason: confirmation.success ? undefined : "Could not confirm order completion",
73
+ steps,
74
+ elapsedMs: Date.now() - startTime,
75
+ };
76
+ }
77
+ catch (err) {
78
+ await screenshot("error-state");
79
+ return this.fail(err.message, steps, startTime);
80
+ }
81
+ }
82
+ // ── Helpers ──────────────────────────────────────────────────────────
83
+ async addToCart(page) {
84
+ const selectors = [
85
+ 'button:has-text("Add to Cart")',
86
+ 'button:has-text("Add to cart")',
87
+ 'button:has-text("Add to Bag")',
88
+ 'button:has-text("Buy Now")',
89
+ 'button:has-text("Buy now")',
90
+ 'input[type="submit"][value*="Add to Cart" i]',
91
+ 'input[type="submit"][value*="Buy" i]',
92
+ '#add-to-cart',
93
+ '.add-to-cart',
94
+ '[data-action="add-to-cart"]',
95
+ 'button.single_add_to_cart_button', // WooCommerce
96
+ '#product-addtocart-button', // Magento
97
+ ];
98
+ for (const sel of selectors) {
99
+ try {
100
+ const btn = await page.$(sel);
101
+ if (btn && await btn.isVisible()) {
102
+ await btn.click();
103
+ return true;
104
+ }
105
+ }
106
+ catch { /* try next */ }
107
+ }
108
+ return false;
109
+ }
110
+ async goToCheckout(page) {
111
+ // Try checkout links/buttons
112
+ const selectors = [
113
+ 'a:has-text("Checkout")',
114
+ 'a:has-text("Check out")',
115
+ 'a:has-text("Proceed to checkout")',
116
+ 'button:has-text("Checkout")',
117
+ 'button:has-text("Check out")',
118
+ 'button:has-text("Proceed to checkout")',
119
+ 'a[href*="/checkout"]',
120
+ '.checkout-button',
121
+ '.wc-proceed-to-checkout a', // WooCommerce
122
+ '#top-cart-btn-checkout', // Magento
123
+ ];
124
+ for (const sel of selectors) {
125
+ try {
126
+ const btn = await page.$(sel);
127
+ if (btn && await btn.isVisible()) {
128
+ await btn.click();
129
+ await page.waitForTimeout(3000);
130
+ return true;
131
+ }
132
+ }
133
+ catch { /* try next */ }
134
+ }
135
+ // Try navigating to /checkout directly
136
+ try {
137
+ const base = page.url().split("/").slice(0, 3).join("/");
138
+ await page.goto(`${base}/checkout`, { waitUntil: "domcontentloaded", timeout: 15_000 });
139
+ return true;
140
+ }
141
+ catch { /* continue */ }
142
+ return false;
143
+ }
144
+ async fillCheckoutForm(page, profile) {
145
+ let filled = 0;
146
+ const nameParts = profile.fullName.split(" ");
147
+ const firstName = nameParts[0] || "";
148
+ const lastName = nameParts.slice(1).join(" ") || "";
149
+ // Field mapping: [possible selectors, value]
150
+ const fields = [
151
+ // Email
152
+ [['input[name*="email" i]', 'input[type="email"]', '#email', '#billing_email'], profile.email],
153
+ // First name
154
+ [['input[name*="first" i][name*="name" i]', '#billing_first_name', 'input[placeholder*="First" i]'], firstName],
155
+ // Last name
156
+ [['input[name*="last" i][name*="name" i]', '#billing_last_name', 'input[placeholder*="Last" i]'], lastName],
157
+ // Full name (if no first/last split)
158
+ [['input[name="name"]', 'input[placeholder*="Full name" i]'], profile.fullName],
159
+ // Phone
160
+ [['input[type="tel"]', 'input[name*="phone" i]', '#billing_phone'], profile.phone || ""],
161
+ // Address line 1
162
+ [['input[name*="address" i][name*="1" i]', '#billing_address_1', 'input[placeholder*="Address" i]', 'input[name="street"]'], profile.shipping.line1],
163
+ // Address line 2
164
+ [['input[name*="address" i][name*="2" i]', '#billing_address_2'], profile.shipping.line2 || ""],
165
+ // City
166
+ [['input[name*="city" i]', '#billing_city', 'input[placeholder*="City" i]'], profile.shipping.city],
167
+ // State/Province
168
+ [['input[name*="state" i]', 'input[name*="province" i]', '#billing_state'], profile.shipping.state],
169
+ // ZIP/Postal
170
+ [['input[name*="zip" i]', 'input[name*="postal" i]', '#billing_postcode', 'input[placeholder*="ZIP" i]'], profile.shipping.zip],
171
+ ];
172
+ for (const [selectors, value] of fields) {
173
+ if (!value)
174
+ continue;
175
+ for (const sel of selectors) {
176
+ try {
177
+ const field = await page.$(sel);
178
+ if (field && await field.isVisible()) {
179
+ await field.fill(value);
180
+ filled++;
181
+ break;
182
+ }
183
+ }
184
+ catch { /* try next selector */ }
185
+ }
186
+ }
187
+ // Country select
188
+ try {
189
+ const countrySelectors = ['select[name*="country" i]', '#billing_country'];
190
+ for (const sel of countrySelectors) {
191
+ const select = await page.$(sel);
192
+ if (select && await select.isVisible()) {
193
+ await select.selectOption(profile.shipping.country);
194
+ filled++;
195
+ break;
196
+ }
197
+ }
198
+ }
199
+ catch { /* continue */ }
200
+ // State select (if it's a dropdown instead of text input)
201
+ try {
202
+ const stateSelectors = ['select[name*="state" i]', 'select[name*="province" i]', '#billing_state'];
203
+ for (const sel of stateSelectors) {
204
+ const select = await page.$(sel);
205
+ if (select && await select.isVisible()) {
206
+ const tag = await select.evaluate((e) => e.tagName.toLowerCase());
207
+ if (tag === "select") {
208
+ await select.selectOption(profile.shipping.state);
209
+ filled++;
210
+ break;
211
+ }
212
+ }
213
+ }
214
+ }
215
+ catch { /* continue */ }
216
+ return filled;
217
+ }
218
+ async submitOrder(page) {
219
+ const selectors = [
220
+ 'button:has-text("Place order")',
221
+ 'button:has-text("Place Order")',
222
+ 'button:has-text("Complete order")',
223
+ 'button:has-text("Submit order")',
224
+ 'button:has-text("Pay now")',
225
+ 'button:has-text("Confirm order")',
226
+ 'button:has-text("Buy now")',
227
+ 'input[type="submit"][value*="Place" i]',
228
+ 'input[type="submit"][value*="order" i]',
229
+ '#place_order', // WooCommerce
230
+ 'button.checkout-submit', // Various
231
+ ];
232
+ for (const sel of selectors) {
233
+ try {
234
+ const btn = await page.$(sel);
235
+ if (btn && await btn.isVisible()) {
236
+ await btn.click();
237
+ return true;
238
+ }
239
+ }
240
+ catch { /* try next */ }
241
+ }
242
+ return false;
243
+ }
244
+ async checkConfirmation(page) {
245
+ const url = page.url().toLowerCase();
246
+ const text = await page.textContent("body").catch(() => "");
247
+ const lowerText = text.toLowerCase();
248
+ // Check URL patterns
249
+ const confirmUrls = ["thank", "confirmation", "success", "complete", "order-received"];
250
+ const urlMatch = confirmUrls.some(p => url.includes(p));
251
+ // Check page text patterns
252
+ const confirmTexts = ["thank you", "order confirmed", "order received", "order number", "confirmation number", "your order"];
253
+ const textMatch = confirmTexts.some(p => lowerText.includes(p));
254
+ // Check for error patterns
255
+ const errorTexts = ["error", "failed", "declined", "invalid", "please correct"];
256
+ const hasError = errorTexts.some(p => lowerText.includes(p));
257
+ if (hasError && !textMatch) {
258
+ return { success: false };
259
+ }
260
+ let orderId;
261
+ const orderMatch = text.match(/(?:order|confirmation)\s*(?:#|number|num|:)\s*(\w+)/i);
262
+ if (orderMatch)
263
+ orderId = orderMatch[1];
264
+ return {
265
+ success: urlMatch || textMatch,
266
+ orderId,
267
+ };
268
+ }
269
+ fail(reason, steps, startTime) {
270
+ return {
271
+ success: false,
272
+ failureReason: reason,
273
+ steps,
274
+ elapsedMs: Date.now() - startTime,
275
+ };
276
+ }
277
+ }
278
+ exports.GenericCheckoutStrategy = GenericCheckoutStrategy;
279
+ //# sourceMappingURL=generic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic.js","sourceRoot":"","sources":["../../../../src/commerce/checkout/strategies/generic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Shopify Checkout Strategy
3
+ *
4
+ * Handles the Shopify checkout flow (used by millions of stores):
5
+ * 1. Navigate to product URL or checkout URL
6
+ * 2. Fill contact info (email, phone)
7
+ * 3. Fill shipping address
8
+ * 4. Select shipping method
9
+ * 5. Fill payment (card number in Stripe iframe)
10
+ * 6. Complete order
11
+ *
12
+ * Shopify checkouts follow a predictable DOM structure:
13
+ * - /cart → /checkouts/{token}/information → shipping → payment → thank_you
14
+ * - Or newer: /checkouts/cn/{token} (one-page checkout)
15
+ *
16
+ * Detection: URL contains "myshopify.com" or "checkouts" in Shopify format
17
+ */
18
+ import type { BuyerProfile } from "../profile.js";
19
+ import type { CheckoutResult, CheckoutStrategy, CheckoutContext } from "../executor.js";
20
+ export declare class ShopifyCheckoutStrategy implements CheckoutStrategy {
21
+ readonly name = "shopify";
22
+ canHandle(url: string): boolean;
23
+ execute(ctx: CheckoutContext, profile: BuyerProfile): Promise<CheckoutResult>;
24
+ private findAddToCartButton;
25
+ private navigateToCheckout;
26
+ private fillContactInfo;
27
+ private fillShippingAddress;
28
+ private continueToShipping;
29
+ private selectCheapestShipping;
30
+ private continueToPayment;
31
+ private fillPayment;
32
+ private completeOrder;
33
+ private extractConfirmation;
34
+ private fillFirstMatch;
35
+ private selectFirstMatch;
36
+ private selectOrFill;
37
+ private fail;
38
+ }
39
+ //# sourceMappingURL=shopify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shopify.d.ts","sourceRoot":"","sources":["../../../../src/commerce/checkout/strategies/shopify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAExF,qBAAa,uBAAwB,YAAW,gBAAgB;IAC9D,QAAQ,CAAC,IAAI,aAAa;IAE1B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAkBzB,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;YAqGrE,mBAAmB;YAuBnB,kBAAkB;YA0BlB,eAAe;YA4Bf,mBAAmB;YAqCnB,kBAAkB;YAoBlB,sBAAsB;YAUtB,iBAAiB;YAmBjB,WAAW;YAoCX,aAAa;YAoBb,mBAAmB;YAkCnB,cAAc;YAad,gBAAgB;YAahB,YAAY;IAiB1B,OAAO,CAAC,IAAI;CAQb"}