[object Object]

← back to Designer Wallcoverings

auto-save: 2026-07-10T12:38:21 (4 files) — _dw-login-record.mjs pending-approval/boost-filter-consolidation-2026-06-25 scripts/pr-contact-for-price vendor-scrapers/china-seas-refresh

0b3ab024c4a6c45449a7982d84117dd0132b2455 · 2026-07-10 12:38:26 -0700 · Steve Abrams

Files touched

Diff

commit 0b3ab024c4a6c45449a7982d84117dd0132b2455
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Fri Jul 10 12:38:26 2026 -0700

    auto-save: 2026-07-10T12:38:21 (4 files) — _dw-login-record.mjs pending-approval/boost-filter-consolidation-2026-06-25 scripts/pr-contact-for-price vendor-scrapers/china-seas-refresh
---
 _dw-login-record.mjs | 86 ----------------------------------------------------
 1 file changed, 86 deletions(-)

diff --git a/_dw-login-record.mjs b/_dw-login-record.mjs
deleted file mode 100644
index 908df2c5..00000000
--- a/_dw-login-record.mjs
+++ /dev/null
@@ -1,86 +0,0 @@
-import { chromium } from 'playwright';
-import fs from 'fs';
-
-const EXE = '/Users/macstudio3/Library/Caches/ms-playwright/chromium_headless_shell-1228/chrome-headless-shell-mac-arm64/chrome-headless-shell';
-const EMAIL = process.env.LOGIN_EMAIL || 'steve@designerwallcoverings.com';
-const OTP_FILE = '/tmp/dw-otp.txt';
-const LOG = m => { console.log(new Date().toISOString().slice(11,19), m); };
-try { fs.unlinkSync(OTP_FILE); } catch {}
-
-const browser = await chromium.launch({ headless: true, executablePath: EXE });
-const ctx = await browser.newContext({
-  viewport: { width: 1280, height: 800 },
-  recordVideo: { dir: '/tmp/dw-login-video', size: { width: 1280, height: 800 } },
-  userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120 Safari/537.36'
-});
-const page = await ctx.newPage();
-const out = { email: EMAIL, steps: [] };
-const step = (n, extra={}) => { out.steps.push({ n, url: page.url(), ...extra }); LOG(n + ' | ' + page.url().slice(0,80)); };
-
-try {
-  await page.goto('https://designerwallcoverings.com', { waitUntil: 'domcontentloaded', timeout: 45000 });
-  await page.waitForTimeout(2500); step('home');
-  const trig = await page.$('[data-dw-signin], a[href$="#dw-signin"]');
-  if (trig) { await trig.click().catch(()=>{}); }
-  await page.waitForTimeout(1000);
-  await page.screenshot({ path: '/tmp/dw-login-01-modal.png' }).catch(()=>{});
-  const loginBtn = await page.$('[data-dwsm-login]');
-  const loginUrl = loginBtn ? await loginBtn.getAttribute('data-dwsm-login') : 'https://designerwallcoverings.com/account';
-  await page.goto(loginUrl.startsWith('http') ? loginUrl : 'https://designerwallcoverings.com'+loginUrl, { waitUntil: 'domcontentloaded', timeout: 45000 }).catch(()=>{});
-  await page.waitForTimeout(4000); step('native-login');
-  await page.screenshot({ path: '/tmp/dw-login-02-emailpage.png' }).catch(()=>{});
-
-  const emailInput = await page.$('input[type="email"], input[name="account[email]"], input[autocomplete="email"]');
-  if (!emailInput) throw new Error('no email input found on login page');
-  await emailInput.fill(EMAIL);
-  await page.waitForTimeout(400);
-  await emailInput.press('Enter').catch(()=>{});
-  await page.waitForTimeout(4000); step('after-email');
-  const useEmail = await page.$('button:has-text("Use email instead"), a:has-text("Use email instead"), :text("Use email instead")');
-  if (useEmail) { await useEmail.click({ timeout: 3000 }).catch(()=>{}); out.usedEmailInstead = true; await page.waitForTimeout(4000); }
-  const sub = await page.$('button[type="submit"], button:has-text("Continue"), button:has-text("Submit")');
-  if (sub) await sub.click({ timeout: 3000 }).catch(()=>{});
-  await page.waitForTimeout(5000); step('code-requested');
-  await page.screenshot({ path: '/tmp/dw-login-03-codepage.png' }).catch(()=>{});
-
-  let code = null;
-  for (let i = 0; i < 60; i++) {
-    if (fs.existsSync(OTP_FILE)) {
-      const v = fs.readFileSync(OTP_FILE, 'utf8').trim();
-      if (/^\d{6}$/.test(v)) { code = v; break; }
-    }
-    await page.waitForTimeout(3000);
-  }
-  out.gotCode = !!code;
-  if (!code) { step('NO-CODE-TIMEOUT'); throw new Error('OTP not delivered to poll file in time'); }
-  LOG('got code ' + code);
-
-  const digitInputs = await page.$$('input[inputmode="numeric"], input[autocomplete="one-time-code"], input[maxlength="1"]');
-  if (digitInputs.length >= 6) {
-    for (let i = 0; i < 6; i++) { await digitInputs[i].fill(code[i]); await page.waitForTimeout(120); }
-  } else {
-    const one = await page.$('input[name="code"], input[inputmode="numeric"], input[type="text"], input[type="tel"]');
-    if (one) { await one.fill(code); } else { await page.keyboard.type(code, { delay: 120 }); }
-  }
-  // Shopify OTP auto-submits on the 6th digit; wait for the URL to leave /code.
-  try { await page.waitForURL(u => !/\/code(\?|$)/.test(String(u)), { timeout: 25000 }); } catch {}
-  await page.waitForTimeout(6000);
-  try { await page.waitForLoadState('networkidle', { timeout: 12000 }); } catch {}
-  await page.waitForTimeout(3000);
-  step('LANDING');
-  out.landingUrl = page.url();
-  out.landingTitle = await page.title().catch(()=> '');
-  out.landingText = ((await page.evaluate(()=> document.body?document.body.innerText:'').catch(()=> ''))||'').replace(/\s+/g,' ').slice(0,500);
-  await page.screenshot({ path: '/tmp/dw-login-04-landing.png', fullPage: false }).catch(()=>{});
-  out.ok = true;
-} catch (e) {
-  out.error = e.message;
-  await page.screenshot({ path: '/tmp/dw-login-ERR.png' }).catch(()=>{});
-} finally {
-  const vid = page.video();
-  await ctx.close();
-  try { out.videoPath = vid ? await vid.path() : null; } catch {}
-  await browser.close();
-  fs.writeFileSync('/tmp/dw-login-result.json', JSON.stringify(out, null, 2));
-  console.log('RESULT ' + JSON.stringify({ ok: out.ok, landingUrl: out.landingUrl, landingTitle: out.landingTitle, error: out.error }));
-}

← 45d52c93 auto-save: 2026-07-10T12:08:12 (6 files) — DW-Programming/sc  ·  back to Designer Wallcoverings  ·  auto-save: 2026-07-10T13:08:29 (4 files) — pending-approval/ a68ab1ce →