@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.
- package/LICENSE +190 -21
- package/README.md +91 -15
- package/dist/adaptive.js +1 -1
- package/dist/adaptive.js.map +1 -1
- package/dist/anomaly.d.ts.map +1 -1
- package/dist/anomaly.js +11 -10
- package/dist/anomaly.js.map +1 -1
- package/dist/behavioral.js +1 -1
- package/dist/behavioral.js.map +1 -1
- package/dist/commerce/checkout/executor.d.ts +88 -0
- package/dist/commerce/checkout/executor.d.ts.map +1 -0
- package/dist/commerce/checkout/executor.js +168 -0
- package/dist/commerce/checkout/executor.js.map +1 -0
- package/dist/commerce/checkout/index.d.ts +10 -0
- package/dist/commerce/checkout/index.d.ts.map +1 -0
- package/dist/commerce/checkout/index.js +16 -0
- package/dist/commerce/checkout/index.js.map +1 -0
- package/dist/commerce/checkout/profile.d.ts +55 -0
- package/dist/commerce/checkout/profile.d.ts.map +1 -0
- package/dist/commerce/checkout/profile.js +69 -0
- package/dist/commerce/checkout/profile.js.map +1 -0
- package/dist/commerce/checkout/strategies/generic.d.ts +26 -0
- package/dist/commerce/checkout/strategies/generic.d.ts.map +1 -0
- package/dist/commerce/checkout/strategies/generic.js +279 -0
- package/dist/commerce/checkout/strategies/generic.js.map +1 -0
- package/dist/commerce/checkout/strategies/shopify.d.ts +39 -0
- package/dist/commerce/checkout/strategies/shopify.d.ts.map +1 -0
- package/dist/commerce/checkout/strategies/shopify.js +419 -0
- package/dist/commerce/checkout/strategies/shopify.js.map +1 -0
- package/dist/commerce/providers/firecrawl.d.ts +42 -0
- package/dist/commerce/providers/firecrawl.d.ts.map +1 -0
- package/dist/commerce/providers/firecrawl.js +233 -0
- package/dist/commerce/providers/firecrawl.js.map +1 -0
- package/dist/commerce/providers/index.d.ts +8 -0
- package/dist/commerce/providers/index.d.ts.map +1 -0
- package/dist/commerce/providers/index.js +11 -0
- package/dist/commerce/providers/index.js.map +1 -0
- package/dist/commerce/providers/shopify.d.ts +47 -0
- package/dist/commerce/providers/shopify.d.ts.map +1 -0
- package/dist/commerce/providers/shopify.js +242 -0
- package/dist/commerce/providers/shopify.js.map +1 -0
- package/dist/commerce.d.ts +3 -0
- package/dist/commerce.d.ts.map +1 -1
- package/dist/commerce.js +74 -42
- package/dist/commerce.js.map +1 -1
- package/dist/fico.d.ts +15 -9
- package/dist/fico.d.ts.map +1 -1
- package/dist/fico.js +30 -15
- package/dist/fico.js.map +1 -1
- package/dist/fraud.d.ts.map +1 -1
- package/dist/fraud.js +20 -3
- package/dist/fraud.js.map +1 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +39 -34
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +9 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -8
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +444 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/rails/index.d.ts +59 -4
- package/dist/rails/index.d.ts.map +1 -1
- package/dist/rails/index.js +128 -19
- package/dist/rails/index.js.map +1 -1
- package/dist/rails/paystack.d.ts +5 -6
- package/dist/rails/paystack.d.ts.map +1 -1
- package/dist/rails/paystack.js +18 -3
- package/dist/rails/paystack.js.map +1 -1
- package/dist/recall/engine.d.ts.map +1 -1
- package/dist/recall/engine.js +11 -2
- package/dist/recall/engine.js.map +1 -1
- package/dist/storage/sqlite.d.ts +26 -1
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +48 -4
- package/dist/storage/sqlite.js.map +1 -1
- 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"}
|