@chrryai/waffles 1.7.33 → 1.7.38

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/dist/index.d.mts CHANGED
@@ -12,7 +12,10 @@ declare const VEX_TEST_PASSWORD_2: string;
12
12
  declare const VEX_TEST_FINGERPRINT_2: string | undefined;
13
13
  declare const VEX_TEST_EMAIL_3: string;
14
14
  declare const VEX_TEST_PASSWORD_3: string;
15
+ declare const VEX_TEST_PASSWORD_4: string;
16
+ declare const VEX_TEST_EMAIL_4: string;
15
17
  declare const VEX_TEST_FINGERPRINT_3: string | undefined;
18
+ declare const VEX_TEST_FINGERPRINT_4: string | undefined;
16
19
  declare const VEX_LIVE_FINGERPRINT: string;
17
20
  declare const TEST_URL: string;
18
21
  declare const wait: (ms: number) => Promise<unknown>;
@@ -30,4 +33,4 @@ declare const log: ({ page }: {
30
33
  page: Page;
31
34
  }) => void;
32
35
 
33
- export { TEST_GUEST_FINGERPRINTS, TEST_MEMBER_EMAILS, TEST_MEMBER_FINGERPRINTS, TEST_URL, VEX_LIVE_FINGERPRINT, VEX_TEST_EMAIL, VEX_TEST_EMAIL_2, VEX_TEST_EMAIL_3, VEX_TEST_FINGERPRINT, VEX_TEST_FINGERPRINT_2, VEX_TEST_FINGERPRINT_3, VEX_TEST_PASSWORD, VEX_TEST_PASSWORD_2, VEX_TEST_PASSWORD_3, capitalizeFirstLetter, getURL, isCI, log, type modelName, simulateInputPaste, simulatePaste, wait };
36
+ export { TEST_GUEST_FINGERPRINTS, TEST_MEMBER_EMAILS, TEST_MEMBER_FINGERPRINTS, TEST_URL, VEX_LIVE_FINGERPRINT, VEX_TEST_EMAIL, VEX_TEST_EMAIL_2, VEX_TEST_EMAIL_3, VEX_TEST_EMAIL_4, VEX_TEST_FINGERPRINT, VEX_TEST_FINGERPRINT_2, VEX_TEST_FINGERPRINT_3, VEX_TEST_FINGERPRINT_4, VEX_TEST_PASSWORD, VEX_TEST_PASSWORD_2, VEX_TEST_PASSWORD_3, VEX_TEST_PASSWORD_4, capitalizeFirstLetter, getURL, isCI, log, type modelName, simulateInputPaste, simulatePaste, wait };
package/dist/index.d.ts CHANGED
@@ -12,7 +12,10 @@ declare const VEX_TEST_PASSWORD_2: string;
12
12
  declare const VEX_TEST_FINGERPRINT_2: string | undefined;
13
13
  declare const VEX_TEST_EMAIL_3: string;
14
14
  declare const VEX_TEST_PASSWORD_3: string;
15
+ declare const VEX_TEST_PASSWORD_4: string;
16
+ declare const VEX_TEST_EMAIL_4: string;
15
17
  declare const VEX_TEST_FINGERPRINT_3: string | undefined;
18
+ declare const VEX_TEST_FINGERPRINT_4: string | undefined;
16
19
  declare const VEX_LIVE_FINGERPRINT: string;
17
20
  declare const TEST_URL: string;
18
21
  declare const wait: (ms: number) => Promise<unknown>;
@@ -30,4 +33,4 @@ declare const log: ({ page }: {
30
33
  page: Page;
31
34
  }) => void;
32
35
 
33
- export { TEST_GUEST_FINGERPRINTS, TEST_MEMBER_EMAILS, TEST_MEMBER_FINGERPRINTS, TEST_URL, VEX_LIVE_FINGERPRINT, VEX_TEST_EMAIL, VEX_TEST_EMAIL_2, VEX_TEST_EMAIL_3, VEX_TEST_FINGERPRINT, VEX_TEST_FINGERPRINT_2, VEX_TEST_FINGERPRINT_3, VEX_TEST_PASSWORD, VEX_TEST_PASSWORD_2, VEX_TEST_PASSWORD_3, capitalizeFirstLetter, getURL, isCI, log, type modelName, simulateInputPaste, simulatePaste, wait };
36
+ export { TEST_GUEST_FINGERPRINTS, TEST_MEMBER_EMAILS, TEST_MEMBER_FINGERPRINTS, TEST_URL, VEX_LIVE_FINGERPRINT, VEX_TEST_EMAIL, VEX_TEST_EMAIL_2, VEX_TEST_EMAIL_3, VEX_TEST_EMAIL_4, VEX_TEST_FINGERPRINT, VEX_TEST_FINGERPRINT_2, VEX_TEST_FINGERPRINT_3, VEX_TEST_FINGERPRINT_4, VEX_TEST_PASSWORD, VEX_TEST_PASSWORD_2, VEX_TEST_PASSWORD_3, VEX_TEST_PASSWORD_4, capitalizeFirstLetter, getURL, isCI, log, type modelName, simulateInputPaste, simulatePaste, wait };
package/dist/index.js CHANGED
@@ -34,7 +34,10 @@ var VEX_TEST_PASSWORD_2 = process.env.VEX_TEST_PASSWORD_2;
34
34
  var VEX_TEST_FINGERPRINT_2 = TEST_MEMBER_FINGERPRINTS[1];
35
35
  var VEX_TEST_EMAIL_3 = process.env.VEX_TEST_EMAIL_3;
36
36
  var VEX_TEST_PASSWORD_3 = process.env.VEX_TEST_PASSWORD_3;
37
+ var VEX_TEST_PASSWORD_4 = process.env.VEX_TEST_PASSWORD_4;
38
+ var VEX_TEST_EMAIL_4 = process.env.VEX_TEST_EMAIL_4;
37
39
  var VEX_TEST_FINGERPRINT_3 = TEST_MEMBER_FINGERPRINTS[2];
40
+ var VEX_TEST_FINGERPRINT_4 = TEST_MEMBER_FINGERPRINTS[3];
38
41
  var VEX_LIVE_FINGERPRINT = process.env.VEX_LIVE_FINGERPRINT;
39
42
  dotenv__namespace.config();
40
43
  var TEST_URL = process.env.PLAYWRIGHT_BASE_URL || process.env.TEST_URL;
@@ -52,7 +55,7 @@ var getURL = ({
52
55
  fingerprint: ""
53
56
  }) => {
54
57
  const base = TEST_URL;
55
- const url = isMember ? `${base}${path}?fp=${isLive ? VEX_LIVE_FINGERPRINT : fingerprint || TEST_MEMBER_FINGERPRINTS[0]}` : `${base}${path}?fp=${isLive ? VEX_LIVE_FINGERPRINT : fingerprint || TEST_GUEST_FINGERPRINTS[0]}`;
58
+ const url = isMember ? `${base}${path}?fp=${TEST_MEMBER_FINGERPRINTS[0]}` : `${base}${path}?fp=${isLive ? VEX_LIVE_FINGERPRINT : fingerprint || TEST_GUEST_FINGERPRINTS[0]}`;
56
59
  return url;
57
60
  };
58
61
  var simulateInputPaste = async (page, text) => {
@@ -119,12 +122,15 @@ exports.VEX_LIVE_FINGERPRINT = VEX_LIVE_FINGERPRINT;
119
122
  exports.VEX_TEST_EMAIL = VEX_TEST_EMAIL;
120
123
  exports.VEX_TEST_EMAIL_2 = VEX_TEST_EMAIL_2;
121
124
  exports.VEX_TEST_EMAIL_3 = VEX_TEST_EMAIL_3;
125
+ exports.VEX_TEST_EMAIL_4 = VEX_TEST_EMAIL_4;
122
126
  exports.VEX_TEST_FINGERPRINT = VEX_TEST_FINGERPRINT;
123
127
  exports.VEX_TEST_FINGERPRINT_2 = VEX_TEST_FINGERPRINT_2;
124
128
  exports.VEX_TEST_FINGERPRINT_3 = VEX_TEST_FINGERPRINT_3;
129
+ exports.VEX_TEST_FINGERPRINT_4 = VEX_TEST_FINGERPRINT_4;
125
130
  exports.VEX_TEST_PASSWORD = VEX_TEST_PASSWORD;
126
131
  exports.VEX_TEST_PASSWORD_2 = VEX_TEST_PASSWORD_2;
127
132
  exports.VEX_TEST_PASSWORD_3 = VEX_TEST_PASSWORD_3;
133
+ exports.VEX_TEST_PASSWORD_4 = VEX_TEST_PASSWORD_4;
128
134
  exports.capitalizeFirstLetter = capitalizeFirstLetter;
129
135
  exports.getURL = getURL;
130
136
  exports.isCI = isCI;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["dotenv"],"mappings":"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","file":"index.js","sourcesContent":["import * as dotenv from \"dotenv\"\nimport { Page } from \"@playwright/test\"\n\nexport type modelName = \"chatGPT\" | \"claude\" | \"gemini\" | \"sushi\" | \"perplexity\"\n\nexport const TEST_GUEST_FINGERPRINTS =\n process.env.TEST_GUEST_FINGERPRINTS?.split(\",\") || []\nexport const TEST_MEMBER_FINGERPRINTS =\n process.env.TEST_MEMBER_FINGERPRINTS?.split(\",\") || []\nexport const TEST_MEMBER_EMAILS =\n process.env.TEST_MEMBER_EMAILS?.split(\",\") || []\n\nexport const VEX_TEST_EMAIL = process.env.VEX_TEST_EMAIL!\n\nexport const VEX_TEST_PASSWORD = process.env.VEX_TEST_PASSWORD!\nexport const VEX_TEST_FINGERPRINT = TEST_MEMBER_FINGERPRINTS[0]\nexport const VEX_TEST_EMAIL_2 = process.env.VEX_TEST_EMAIL_2!\nexport const VEX_TEST_PASSWORD_2 = process.env.VEX_TEST_PASSWORD_2!\nexport const VEX_TEST_FINGERPRINT_2 = TEST_MEMBER_FINGERPRINTS[1]\nexport const VEX_TEST_EMAIL_3 = process.env.VEX_TEST_EMAIL_3!\nexport const VEX_TEST_PASSWORD_3 = process.env.VEX_TEST_PASSWORD_3!\nexport const VEX_TEST_FINGERPRINT_3 = TEST_MEMBER_FINGERPRINTS[2]\n\nexport const VEX_LIVE_FINGERPRINT = process.env.VEX_LIVE_FINGERPRINT!\n\ndotenv.config()\n\nexport const TEST_URL = process.env.PLAYWRIGHT_BASE_URL || process.env.TEST_URL!\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\nexport const isCI = process.env.VITE_CI || process.env.CI\n\nconst getURL = (\n {\n isLive = false,\n isMember = false,\n path = \"\",\n fingerprint = \"\",\n }: {\n isLive?: boolean\n isMember?: boolean\n path?: string\n fingerprint?: string\n } = {\n isLive: false,\n isMember: false,\n path: \"\",\n fingerprint: \"\",\n },\n) => {\n const base = TEST_URL\n const url = isMember\n ? `${base}${path}?fp=${isLive ? VEX_LIVE_FINGERPRINT : fingerprint || TEST_MEMBER_FINGERPRINTS[0]}`\n : `${base}${path}?fp=${isLive ? VEX_LIVE_FINGERPRINT : fingerprint || TEST_GUEST_FINGERPRINTS[0]}`\n\n return url\n}\n\nconst simulateInputPaste = async (page: Page, text: string) => {\n await page.evaluate((content) => {\n const textarea = document.querySelector(\n 'textarea[data-testid=\"chat-textarea\"]',\n ) as HTMLTextAreaElement\n if (!textarea) return\n\n // Create a basic event\n const pasteEvent = new Event(\"paste\", {\n bubbles: true,\n cancelable: true,\n })\n\n // Add clipboardData getter\n Object.defineProperty(pasteEvent, \"clipboardData\", {\n value: {\n getData: () => content,\n types: [\"text/plain\"],\n files: [],\n items: [\n {\n kind: \"string\",\n type: \"text/plain\",\n getAsString: (callback: (text: string) => void) =>\n callback(content),\n },\n ],\n },\n writable: false,\n })\n\n // Dispatch the event\n textarea.dispatchEvent(pasteEvent)\n\n // Set the value directly after the paste event\n textarea.value = content\n\n // Trigger input event to simulate actual typing\n const inputEvent = new Event(\"input\", { bubbles: true })\n textarea.dispatchEvent(inputEvent)\n }, text)\n}\n\nconst simulatePaste = async (page: Page, text: string) => {\n // Use Playwright's built-in clipboard API\n await page.evaluate(async (content) => {\n // Write to clipboard\n await navigator.clipboard.writeText(content)\n\n // Find the paste button and click it\n const pasteButton = document.querySelector(\n '[data-testid*=\"artifacts-paste-button\"]',\n ) as HTMLButtonElement\n if (pasteButton) {\n pasteButton.click()\n }\n }, text)\n}\n\nfunction capitalizeFirstLetter(val: string) {\n return String(val).charAt(0).toUpperCase() + String(val).slice(1)\n}\n\nconst logs = new Map<string, number>() // msg → timestamp\nexport const log = ({ page }: { page: Page }) => {\n page.on(\"console\", (msg) => {\n const now = Date.now()\n const lastSeen = logs.get(msg.text())\n\n // Only skip if seen within last 5 seconds\n if (lastSeen && now - lastSeen < 5000) return\n\n console.log(`[browser][${msg.type()}] ${msg.text()}`)\n logs.set(msg.text(), now)\n })\n}\n\nexport {\n wait,\n getURL,\n simulateInputPaste,\n simulatePaste,\n capitalizeFirstLetter,\n}\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["dotenv"],"mappings":"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","file":"index.js","sourcesContent":["import * as dotenv from \"dotenv\"\nimport { Page } from \"@playwright/test\"\nimport { v4 as uuidv4 } from \"uuid\"\n\nexport type modelName = \"chatGPT\" | \"claude\" | \"gemini\" | \"sushi\" | \"perplexity\"\n\nexport const TEST_GUEST_FINGERPRINTS =\n process.env.TEST_GUEST_FINGERPRINTS?.split(\",\") || []\nexport const TEST_MEMBER_FINGERPRINTS =\n process.env.TEST_MEMBER_FINGERPRINTS?.split(\",\") || []\nexport const TEST_MEMBER_EMAILS =\n process.env.TEST_MEMBER_EMAILS?.split(\",\") || []\n\nexport const VEX_TEST_EMAIL = process.env.VEX_TEST_EMAIL!\n\nexport const VEX_TEST_PASSWORD = process.env.VEX_TEST_PASSWORD!\nexport const VEX_TEST_FINGERPRINT = TEST_MEMBER_FINGERPRINTS[0]\nexport const VEX_TEST_EMAIL_2 = process.env.VEX_TEST_EMAIL_2!\nexport const VEX_TEST_PASSWORD_2 = process.env.VEX_TEST_PASSWORD_2!\nexport const VEX_TEST_FINGERPRINT_2 = TEST_MEMBER_FINGERPRINTS[1]\nexport const VEX_TEST_EMAIL_3 = process.env.VEX_TEST_EMAIL_3!\nexport const VEX_TEST_PASSWORD_3 = process.env.VEX_TEST_PASSWORD_3!\nexport const VEX_TEST_PASSWORD_4 = process.env.VEX_TEST_PASSWORD_4!\n\nexport const VEX_TEST_EMAIL_4 = process.env.VEX_TEST_EMAIL_4!\n\nexport const VEX_TEST_FINGERPRINT_3 = TEST_MEMBER_FINGERPRINTS[2]\nexport const VEX_TEST_FINGERPRINT_4 = TEST_MEMBER_FINGERPRINTS[3]\n\nexport const VEX_LIVE_FINGERPRINT = process.env.VEX_LIVE_FINGERPRINT!\n\ndotenv.config()\n\nexport const TEST_URL = process.env.PLAYWRIGHT_BASE_URL || process.env.TEST_URL!\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\nexport const isCI = process.env.VITE_CI || process.env.CI\n\nconst getURL = (\n {\n isLive = false,\n isMember = false,\n path = \"\",\n fingerprint = \"\",\n }: {\n isLive?: boolean\n isMember?: boolean\n path?: string\n fingerprint?: string\n } = {\n isLive: false,\n isMember: false,\n path: \"\",\n fingerprint: \"\",\n },\n) => {\n const base = TEST_URL\n const url = isMember\n ? `${base}${path}?fp=${TEST_MEMBER_FINGERPRINTS[0]}`\n : `${base}${path}?fp=${isLive ? VEX_LIVE_FINGERPRINT : fingerprint || TEST_GUEST_FINGERPRINTS[0]}`\n\n return url\n}\n\nconst simulateInputPaste = async (page: Page, text: string) => {\n await page.evaluate((content) => {\n const textarea = document.querySelector(\n 'textarea[data-testid=\"chat-textarea\"]',\n ) as HTMLTextAreaElement\n if (!textarea) return\n\n // Create a basic event\n const pasteEvent = new Event(\"paste\", {\n bubbles: true,\n cancelable: true,\n })\n\n // Add clipboardData getter\n Object.defineProperty(pasteEvent, \"clipboardData\", {\n value: {\n getData: () => content,\n types: [\"text/plain\"],\n files: [],\n items: [\n {\n kind: \"string\",\n type: \"text/plain\",\n getAsString: (callback: (text: string) => void) =>\n callback(content),\n },\n ],\n },\n writable: false,\n })\n\n // Dispatch the event\n textarea.dispatchEvent(pasteEvent)\n\n // Set the value directly after the paste event\n textarea.value = content\n\n // Trigger input event to simulate actual typing\n const inputEvent = new Event(\"input\", { bubbles: true })\n textarea.dispatchEvent(inputEvent)\n }, text)\n}\n\nconst simulatePaste = async (page: Page, text: string) => {\n // Use Playwright's built-in clipboard API\n await page.evaluate(async (content) => {\n // Write to clipboard\n await navigator.clipboard.writeText(content)\n\n // Find the paste button and click it\n const pasteButton = document.querySelector(\n '[data-testid*=\"artifacts-paste-button\"]',\n ) as HTMLButtonElement\n if (pasteButton) {\n pasteButton.click()\n }\n }, text)\n}\n\nfunction capitalizeFirstLetter(val: string) {\n return String(val).charAt(0).toUpperCase() + String(val).slice(1)\n}\n\nconst logs = new Map<string, number>() // msg → timestamp\nexport const log = ({ page }: { page: Page }) => {\n page.on(\"console\", (msg) => {\n const now = Date.now()\n const lastSeen = logs.get(msg.text())\n\n // Only skip if seen within last 5 seconds\n if (lastSeen && now - lastSeen < 5000) return\n\n console.log(`[browser][${msg.type()}] ${msg.text()}`)\n logs.set(msg.text(), now)\n })\n}\n\nexport {\n wait,\n getURL,\n simulateInputPaste,\n simulatePaste,\n capitalizeFirstLetter,\n}\n"]}
package/dist/index.mjs CHANGED
@@ -12,7 +12,10 @@ var VEX_TEST_PASSWORD_2 = process.env.VEX_TEST_PASSWORD_2;
12
12
  var VEX_TEST_FINGERPRINT_2 = TEST_MEMBER_FINGERPRINTS[1];
13
13
  var VEX_TEST_EMAIL_3 = process.env.VEX_TEST_EMAIL_3;
14
14
  var VEX_TEST_PASSWORD_3 = process.env.VEX_TEST_PASSWORD_3;
15
+ var VEX_TEST_PASSWORD_4 = process.env.VEX_TEST_PASSWORD_4;
16
+ var VEX_TEST_EMAIL_4 = process.env.VEX_TEST_EMAIL_4;
15
17
  var VEX_TEST_FINGERPRINT_3 = TEST_MEMBER_FINGERPRINTS[2];
18
+ var VEX_TEST_FINGERPRINT_4 = TEST_MEMBER_FINGERPRINTS[3];
16
19
  var VEX_LIVE_FINGERPRINT = process.env.VEX_LIVE_FINGERPRINT;
17
20
  dotenv.config();
18
21
  var TEST_URL = process.env.PLAYWRIGHT_BASE_URL || process.env.TEST_URL;
@@ -30,7 +33,7 @@ var getURL = ({
30
33
  fingerprint: ""
31
34
  }) => {
32
35
  const base = TEST_URL;
33
- const url = isMember ? `${base}${path}?fp=${isLive ? VEX_LIVE_FINGERPRINT : fingerprint || TEST_MEMBER_FINGERPRINTS[0]}` : `${base}${path}?fp=${isLive ? VEX_LIVE_FINGERPRINT : fingerprint || TEST_GUEST_FINGERPRINTS[0]}`;
36
+ const url = isMember ? `${base}${path}?fp=${TEST_MEMBER_FINGERPRINTS[0]}` : `${base}${path}?fp=${isLive ? VEX_LIVE_FINGERPRINT : fingerprint || TEST_GUEST_FINGERPRINTS[0]}`;
34
37
  return url;
35
38
  };
36
39
  var simulateInputPaste = async (page, text) => {
@@ -89,6 +92,6 @@ var log = ({ page }) => {
89
92
  });
90
93
  };
91
94
 
92
- export { TEST_GUEST_FINGERPRINTS, TEST_MEMBER_EMAILS, TEST_MEMBER_FINGERPRINTS, TEST_URL, VEX_LIVE_FINGERPRINT, VEX_TEST_EMAIL, VEX_TEST_EMAIL_2, VEX_TEST_EMAIL_3, VEX_TEST_FINGERPRINT, VEX_TEST_FINGERPRINT_2, VEX_TEST_FINGERPRINT_3, VEX_TEST_PASSWORD, VEX_TEST_PASSWORD_2, VEX_TEST_PASSWORD_3, capitalizeFirstLetter, getURL, isCI, log, simulateInputPaste, simulatePaste, wait };
95
+ export { TEST_GUEST_FINGERPRINTS, TEST_MEMBER_EMAILS, TEST_MEMBER_FINGERPRINTS, TEST_URL, VEX_LIVE_FINGERPRINT, VEX_TEST_EMAIL, VEX_TEST_EMAIL_2, VEX_TEST_EMAIL_3, VEX_TEST_EMAIL_4, VEX_TEST_FINGERPRINT, VEX_TEST_FINGERPRINT_2, VEX_TEST_FINGERPRINT_3, VEX_TEST_FINGERPRINT_4, VEX_TEST_PASSWORD, VEX_TEST_PASSWORD_2, VEX_TEST_PASSWORD_3, VEX_TEST_PASSWORD_4, capitalizeFirstLetter, getURL, isCI, log, simulateInputPaste, simulatePaste, wait };
93
96
  //# sourceMappingURL=index.mjs.map
94
97
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import * as dotenv from \"dotenv\"\nimport { Page } from \"@playwright/test\"\n\nexport type modelName = \"chatGPT\" | \"claude\" | \"gemini\" | \"sushi\" | \"perplexity\"\n\nexport const TEST_GUEST_FINGERPRINTS =\n process.env.TEST_GUEST_FINGERPRINTS?.split(\",\") || []\nexport const TEST_MEMBER_FINGERPRINTS =\n process.env.TEST_MEMBER_FINGERPRINTS?.split(\",\") || []\nexport const TEST_MEMBER_EMAILS =\n process.env.TEST_MEMBER_EMAILS?.split(\",\") || []\n\nexport const VEX_TEST_EMAIL = process.env.VEX_TEST_EMAIL!\n\nexport const VEX_TEST_PASSWORD = process.env.VEX_TEST_PASSWORD!\nexport const VEX_TEST_FINGERPRINT = TEST_MEMBER_FINGERPRINTS[0]\nexport const VEX_TEST_EMAIL_2 = process.env.VEX_TEST_EMAIL_2!\nexport const VEX_TEST_PASSWORD_2 = process.env.VEX_TEST_PASSWORD_2!\nexport const VEX_TEST_FINGERPRINT_2 = TEST_MEMBER_FINGERPRINTS[1]\nexport const VEX_TEST_EMAIL_3 = process.env.VEX_TEST_EMAIL_3!\nexport const VEX_TEST_PASSWORD_3 = process.env.VEX_TEST_PASSWORD_3!\nexport const VEX_TEST_FINGERPRINT_3 = TEST_MEMBER_FINGERPRINTS[2]\n\nexport const VEX_LIVE_FINGERPRINT = process.env.VEX_LIVE_FINGERPRINT!\n\ndotenv.config()\n\nexport const TEST_URL = process.env.PLAYWRIGHT_BASE_URL || process.env.TEST_URL!\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\nexport const isCI = process.env.VITE_CI || process.env.CI\n\nconst getURL = (\n {\n isLive = false,\n isMember = false,\n path = \"\",\n fingerprint = \"\",\n }: {\n isLive?: boolean\n isMember?: boolean\n path?: string\n fingerprint?: string\n } = {\n isLive: false,\n isMember: false,\n path: \"\",\n fingerprint: \"\",\n },\n) => {\n const base = TEST_URL\n const url = isMember\n ? `${base}${path}?fp=${isLive ? VEX_LIVE_FINGERPRINT : fingerprint || TEST_MEMBER_FINGERPRINTS[0]}`\n : `${base}${path}?fp=${isLive ? VEX_LIVE_FINGERPRINT : fingerprint || TEST_GUEST_FINGERPRINTS[0]}`\n\n return url\n}\n\nconst simulateInputPaste = async (page: Page, text: string) => {\n await page.evaluate((content) => {\n const textarea = document.querySelector(\n 'textarea[data-testid=\"chat-textarea\"]',\n ) as HTMLTextAreaElement\n if (!textarea) return\n\n // Create a basic event\n const pasteEvent = new Event(\"paste\", {\n bubbles: true,\n cancelable: true,\n })\n\n // Add clipboardData getter\n Object.defineProperty(pasteEvent, \"clipboardData\", {\n value: {\n getData: () => content,\n types: [\"text/plain\"],\n files: [],\n items: [\n {\n kind: \"string\",\n type: \"text/plain\",\n getAsString: (callback: (text: string) => void) =>\n callback(content),\n },\n ],\n },\n writable: false,\n })\n\n // Dispatch the event\n textarea.dispatchEvent(pasteEvent)\n\n // Set the value directly after the paste event\n textarea.value = content\n\n // Trigger input event to simulate actual typing\n const inputEvent = new Event(\"input\", { bubbles: true })\n textarea.dispatchEvent(inputEvent)\n }, text)\n}\n\nconst simulatePaste = async (page: Page, text: string) => {\n // Use Playwright's built-in clipboard API\n await page.evaluate(async (content) => {\n // Write to clipboard\n await navigator.clipboard.writeText(content)\n\n // Find the paste button and click it\n const pasteButton = document.querySelector(\n '[data-testid*=\"artifacts-paste-button\"]',\n ) as HTMLButtonElement\n if (pasteButton) {\n pasteButton.click()\n }\n }, text)\n}\n\nfunction capitalizeFirstLetter(val: string) {\n return String(val).charAt(0).toUpperCase() + String(val).slice(1)\n}\n\nconst logs = new Map<string, number>() // msg → timestamp\nexport const log = ({ page }: { page: Page }) => {\n page.on(\"console\", (msg) => {\n const now = Date.now()\n const lastSeen = logs.get(msg.text())\n\n // Only skip if seen within last 5 seconds\n if (lastSeen && now - lastSeen < 5000) return\n\n console.log(`[browser][${msg.type()}] ${msg.text()}`)\n logs.set(msg.text(), now)\n })\n}\n\nexport {\n wait,\n getURL,\n simulateInputPaste,\n simulatePaste,\n capitalizeFirstLetter,\n}\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import * as dotenv from \"dotenv\"\nimport { Page } from \"@playwright/test\"\nimport { v4 as uuidv4 } from \"uuid\"\n\nexport type modelName = \"chatGPT\" | \"claude\" | \"gemini\" | \"sushi\" | \"perplexity\"\n\nexport const TEST_GUEST_FINGERPRINTS =\n process.env.TEST_GUEST_FINGERPRINTS?.split(\",\") || []\nexport const TEST_MEMBER_FINGERPRINTS =\n process.env.TEST_MEMBER_FINGERPRINTS?.split(\",\") || []\nexport const TEST_MEMBER_EMAILS =\n process.env.TEST_MEMBER_EMAILS?.split(\",\") || []\n\nexport const VEX_TEST_EMAIL = process.env.VEX_TEST_EMAIL!\n\nexport const VEX_TEST_PASSWORD = process.env.VEX_TEST_PASSWORD!\nexport const VEX_TEST_FINGERPRINT = TEST_MEMBER_FINGERPRINTS[0]\nexport const VEX_TEST_EMAIL_2 = process.env.VEX_TEST_EMAIL_2!\nexport const VEX_TEST_PASSWORD_2 = process.env.VEX_TEST_PASSWORD_2!\nexport const VEX_TEST_FINGERPRINT_2 = TEST_MEMBER_FINGERPRINTS[1]\nexport const VEX_TEST_EMAIL_3 = process.env.VEX_TEST_EMAIL_3!\nexport const VEX_TEST_PASSWORD_3 = process.env.VEX_TEST_PASSWORD_3!\nexport const VEX_TEST_PASSWORD_4 = process.env.VEX_TEST_PASSWORD_4!\n\nexport const VEX_TEST_EMAIL_4 = process.env.VEX_TEST_EMAIL_4!\n\nexport const VEX_TEST_FINGERPRINT_3 = TEST_MEMBER_FINGERPRINTS[2]\nexport const VEX_TEST_FINGERPRINT_4 = TEST_MEMBER_FINGERPRINTS[3]\n\nexport const VEX_LIVE_FINGERPRINT = process.env.VEX_LIVE_FINGERPRINT!\n\ndotenv.config()\n\nexport const TEST_URL = process.env.PLAYWRIGHT_BASE_URL || process.env.TEST_URL!\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\nexport const isCI = process.env.VITE_CI || process.env.CI\n\nconst getURL = (\n {\n isLive = false,\n isMember = false,\n path = \"\",\n fingerprint = \"\",\n }: {\n isLive?: boolean\n isMember?: boolean\n path?: string\n fingerprint?: string\n } = {\n isLive: false,\n isMember: false,\n path: \"\",\n fingerprint: \"\",\n },\n) => {\n const base = TEST_URL\n const url = isMember\n ? `${base}${path}?fp=${TEST_MEMBER_FINGERPRINTS[0]}`\n : `${base}${path}?fp=${isLive ? VEX_LIVE_FINGERPRINT : fingerprint || TEST_GUEST_FINGERPRINTS[0]}`\n\n return url\n}\n\nconst simulateInputPaste = async (page: Page, text: string) => {\n await page.evaluate((content) => {\n const textarea = document.querySelector(\n 'textarea[data-testid=\"chat-textarea\"]',\n ) as HTMLTextAreaElement\n if (!textarea) return\n\n // Create a basic event\n const pasteEvent = new Event(\"paste\", {\n bubbles: true,\n cancelable: true,\n })\n\n // Add clipboardData getter\n Object.defineProperty(pasteEvent, \"clipboardData\", {\n value: {\n getData: () => content,\n types: [\"text/plain\"],\n files: [],\n items: [\n {\n kind: \"string\",\n type: \"text/plain\",\n getAsString: (callback: (text: string) => void) =>\n callback(content),\n },\n ],\n },\n writable: false,\n })\n\n // Dispatch the event\n textarea.dispatchEvent(pasteEvent)\n\n // Set the value directly after the paste event\n textarea.value = content\n\n // Trigger input event to simulate actual typing\n const inputEvent = new Event(\"input\", { bubbles: true })\n textarea.dispatchEvent(inputEvent)\n }, text)\n}\n\nconst simulatePaste = async (page: Page, text: string) => {\n // Use Playwright's built-in clipboard API\n await page.evaluate(async (content) => {\n // Write to clipboard\n await navigator.clipboard.writeText(content)\n\n // Find the paste button and click it\n const pasteButton = document.querySelector(\n '[data-testid*=\"artifacts-paste-button\"]',\n ) as HTMLButtonElement\n if (pasteButton) {\n pasteButton.click()\n }\n }, text)\n}\n\nfunction capitalizeFirstLetter(val: string) {\n return String(val).charAt(0).toUpperCase() + String(val).slice(1)\n}\n\nconst logs = new Map<string, number>() // msg → timestamp\nexport const log = ({ page }: { page: Page }) => {\n page.on(\"console\", (msg) => {\n const now = Date.now()\n const lastSeen = logs.get(msg.text())\n\n // Only skip if seen within last 5 seconds\n if (lastSeen && now - lastSeen < 5000) return\n\n console.log(`[browser][${msg.type()}] ${msg.text()}`)\n logs.set(msg.text(), now)\n })\n}\n\nexport {\n wait,\n getURL,\n simulateInputPaste,\n simulatePaste,\n capitalizeFirstLetter,\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrryai/waffles",
3
- "version": "1.7.33",
3
+ "version": "1.7.38",
4
4
  "description": "Production-ready Playwright testing utilities and helpers for modern web apps",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",