@marigoldlabs/web3-tester 0.4.1 → 0.4.2

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 (59) hide show
  1. package/README.md +317 -11
  2. package/dist/anvil.d.ts.map +1 -1
  3. package/dist/anvil.js.map +1 -1
  4. package/dist/benchmark.d.ts +55 -0
  5. package/dist/benchmark.d.ts.map +1 -0
  6. package/dist/benchmark.js +168 -0
  7. package/dist/benchmark.js.map +1 -0
  8. package/dist/fixtures.js +2 -2
  9. package/dist/fixtures.js.map +1 -1
  10. package/dist/index.d.ts +13 -4
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +5 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/injected-provider.d.ts.map +1 -1
  15. package/dist/injected-provider.js +748 -25
  16. package/dist/injected-provider.js.map +1 -1
  17. package/dist/mock-wallet-controller.d.ts +150 -2
  18. package/dist/mock-wallet-controller.d.ts.map +1 -1
  19. package/dist/mock-wallet-controller.js +613 -24
  20. package/dist/mock-wallet-controller.js.map +1 -1
  21. package/dist/private-key-rpc-client.d.ts +144 -132
  22. package/dist/private-key-rpc-client.d.ts.map +1 -1
  23. package/dist/private-key-rpc-client.js +142 -20
  24. package/dist/private-key-rpc-client.js.map +1 -1
  25. package/dist/real-wallet-cache.d.ts +38 -0
  26. package/dist/real-wallet-cache.d.ts.map +1 -1
  27. package/dist/real-wallet-cache.js +143 -57
  28. package/dist/real-wallet-cache.js.map +1 -1
  29. package/dist/real-wallet-extension-fixtures.d.ts +35 -0
  30. package/dist/real-wallet-extension-fixtures.d.ts.map +1 -0
  31. package/dist/real-wallet-extension-fixtures.js +96 -0
  32. package/dist/real-wallet-extension-fixtures.js.map +1 -0
  33. package/dist/real-wallet-extension.d.ts +86 -0
  34. package/dist/real-wallet-extension.d.ts.map +1 -0
  35. package/dist/real-wallet-extension.js +245 -0
  36. package/dist/real-wallet-extension.js.map +1 -0
  37. package/dist/real-wallet-fixtures.d.ts.map +1 -1
  38. package/dist/real-wallet-fixtures.js +46 -31
  39. package/dist/real-wallet-fixtures.js.map +1 -1
  40. package/dist/real-wallet.d.ts +5 -14
  41. package/dist/real-wallet.d.ts.map +1 -1
  42. package/dist/real-wallet.js +668 -435
  43. package/dist/real-wallet.js.map +1 -1
  44. package/dist/safe.d.ts +311 -0
  45. package/dist/safe.d.ts.map +1 -0
  46. package/dist/safe.js +743 -0
  47. package/dist/safe.js.map +1 -0
  48. package/dist/types.d.ts +35 -1
  49. package/dist/types.d.ts.map +1 -1
  50. package/dist/wallet-personas.d.ts +99 -0
  51. package/dist/wallet-personas.d.ts.map +1 -0
  52. package/dist/wallet-personas.js +666 -0
  53. package/dist/wallet-personas.js.map +1 -0
  54. package/dist/walletconnect.d.ts +176 -9
  55. package/dist/walletconnect.d.ts.map +1 -1
  56. package/dist/walletconnect.js +514 -74
  57. package/dist/walletconnect.js.map +1 -1
  58. package/examples/playwright.config.ts +8 -0
  59. package/package.json +29 -3
@@ -0,0 +1,35 @@
1
+ import { type BuildWalletExtensionProfileOptions } from './real-wallet-cache.js';
2
+ import { type RealWalletExtensionLaunchOptions, type RealWalletExtensionSession } from './real-wallet-extension.js';
3
+ export type RealWalletExtensionFixtureOptions = Omit<RealWalletExtensionLaunchOptions, 'extensionPath' | 'profileDir'> & {
4
+ /** Unpacked Chromium extension directory. Defaults to WEB3_TESTER_REAL_WALLET_EXTENSION_PATH. */
5
+ extensionPath?: string;
6
+ /**
7
+ * Explicit persistent profile directory. Disables the profile cache; the
8
+ * test reuses (and mutates) this profile directly, so parallel tests must
9
+ * not share it.
10
+ */
11
+ profileDir?: string;
12
+ /** Cache identity for non-MetaMask setup. Required when profileDir is absent. */
13
+ profileCacheKey?: string;
14
+ /** Directory cached profiles live in. Defaults to ~/.cache/web3-tester/profiles. */
15
+ cacheDir?: string;
16
+ /** Rebuild the cached profile even if it already exists. */
17
+ forceProfile?: boolean;
18
+ /** One-time extension setup baked into the cached profile. */
19
+ profileSetup?: BuildWalletExtensionProfileOptions['setup'];
20
+ /** Wait policy after profileSetup. Defaults to buildWalletExtensionProfile's behavior. */
21
+ waitForState?: BuildWalletExtensionProfileOptions['waitForState'];
22
+ };
23
+ export type RealWalletExtensionFixtures = {
24
+ realWalletExtensionOptions: RealWalletExtensionFixtureOptions;
25
+ realWalletExtension: RealWalletExtensionSession;
26
+ };
27
+ /**
28
+ * Playwright fixtures for arbitrary Chromium wallet extensions. Each test
29
+ * gets either the explicit profileDir or a disposable clone of a cached
30
+ * profile prepared by profileSetup. `context` and `page` are rebound to the
31
+ * persistent extension context.
32
+ */
33
+ export declare const test: import("@playwright/test").TestType<import("@playwright/test").PlaywrightTestArgs & import("@playwright/test").PlaywrightTestOptions & RealWalletExtensionFixtures, import("@playwright/test").PlaywrightWorkerArgs & import("@playwright/test").PlaywrightWorkerOptions>;
34
+ export { expect } from './matchers.js';
35
+ //# sourceMappingURL=real-wallet-extension-fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"real-wallet-extension-fixtures.d.ts","sourceRoot":"","sources":["../src/real-wallet-extension-fixtures.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,kCAAkC,EACxC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAEL,KAAK,gCAAgC,EACrC,KAAK,0BAA0B,EAChC,MAAM,4BAA4B,CAAC;AAEpC,MAAM,MAAM,iCAAiC,GAAG,IAAI,CAClD,gCAAgC,EAChC,eAAe,GAAG,YAAY,CAC/B,GAAG;IACF,iGAAiG;IACjG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,kCAAkC,CAAC,OAAO,CAAC,CAAC;IAC3D,0FAA0F;IAC1F,YAAY,CAAC,EAAE,kCAAkC,CAAC,cAAc,CAAC,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,0BAA0B,EAAE,iCAAiC,CAAC;IAC9D,mBAAmB,EAAE,0BAA0B,CAAC;CACjD,CAAC;AAkBF;;;;;GAKG;AACH,eAAO,MAAM,IAAI,2QA+Ff,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,96 @@
1
+ import path from 'node:path';
2
+ import { test as base } from '@playwright/test';
3
+ import { buildWalletExtensionProfile, cloneWalletProfile, } from './real-wallet-cache.js';
4
+ import { benchmarkForTest, benchmarkObjectMethods } from './benchmark.js';
5
+ import { launchRealWalletExtension, } from './real-wallet-extension.js';
6
+ const extensionPathFromEnv = () => process.env.WEB3_TESTER_REAL_WALLET_EXTENSION_PATH || undefined;
7
+ const profileDirFromEnv = () => process.env.WEB3_TESTER_REAL_WALLET_PROFILE_DIR || undefined;
8
+ const assertChromiumProject = (browserName) => {
9
+ if (browserName !== 'chromium') {
10
+ throw new Error('@marigoldlabs/web3-tester/real-wallet-extension-fixtures launch a Chromium extension context. ' +
11
+ `The current Playwright project uses "${browserName}". Exclude real-extension tests from non-Chromium ` +
12
+ 'projects, or run them in a dedicated Chromium project.');
13
+ }
14
+ };
15
+ /**
16
+ * Playwright fixtures for arbitrary Chromium wallet extensions. Each test
17
+ * gets either the explicit profileDir or a disposable clone of a cached
18
+ * profile prepared by profileSetup. `context` and `page` are rebound to the
19
+ * persistent extension context.
20
+ */
21
+ export const test = base.extend({
22
+ realWalletExtensionOptions: [
23
+ async ({}, use) => {
24
+ await use({});
25
+ },
26
+ { option: true },
27
+ ],
28
+ realWalletExtension: async ({ realWalletExtensionOptions, browserName }, use, testInfo) => {
29
+ assertChromiumProject(browserName);
30
+ const benchmark = benchmarkForTest(testInfo, { suite: 'real-wallet-extension' });
31
+ let session;
32
+ try {
33
+ const options = realWalletExtensionOptions;
34
+ const extensionPath = options.extensionPath ?? extensionPathFromEnv();
35
+ if (!extensionPath) {
36
+ throw new Error('Real-wallet extension fixtures need extensionPath or ' +
37
+ 'WEB3_TESTER_REAL_WALLET_EXTENSION_PATH pointing at an unpacked Chromium wallet extension.');
38
+ }
39
+ let profileDir = options.profileDir ?? profileDirFromEnv();
40
+ if (!profileDir) {
41
+ if (!options.profileCacheKey) {
42
+ throw new Error('Real-wallet extension fixtures need profileCacheKey to build a cached profile, ' +
43
+ 'or an explicit profileDir pointing at a prepared wallet profile.');
44
+ }
45
+ const profileCacheKey = options.profileCacheKey;
46
+ const cachedProfile = await benchmark.measure('realWalletExtension.buildProfile', () => buildWalletExtensionProfile({
47
+ baseURL: options.baseURL,
48
+ cacheDir: options.cacheDir,
49
+ cacheKey: profileCacheKey,
50
+ extensionId: options.extensionId,
51
+ extensionName: options.extensionName,
52
+ extensionPath,
53
+ force: options.forceProfile,
54
+ headless: options.headless,
55
+ initialPage: options.initialPage,
56
+ launchArgs: options.launchArgs,
57
+ locale: options.locale,
58
+ setup: options.profileSetup,
59
+ slowMo: options.slowMo,
60
+ waitForState: options.waitForState,
61
+ }));
62
+ profileDir = await benchmark.measure('realWalletExtension.cloneProfile', () => cloneWalletProfile(cachedProfile, path.join(testInfo.outputDir, 'wallet-extension-profile')));
63
+ }
64
+ session = await benchmark.measure('realWalletExtension.launch', () => launchRealWalletExtension({
65
+ baseURL: options.baseURL,
66
+ extensionId: options.extensionId,
67
+ extensionName: options.extensionName,
68
+ extensionPath,
69
+ headless: options.headless,
70
+ initialPage: options.initialPage,
71
+ launchArgs: options.launchArgs,
72
+ locale: options.locale,
73
+ profileDir,
74
+ slowMo: options.slowMo,
75
+ }));
76
+ await use(benchmarkObjectMethods(session, benchmark, { prefix: 'realWalletExtension', exclude: ['close'] }));
77
+ }
78
+ finally {
79
+ if (session) {
80
+ const activeSession = session;
81
+ await benchmark.measure('realWalletExtension.close', () => activeSession.close().catch(() => undefined));
82
+ }
83
+ await benchmark.flush();
84
+ }
85
+ },
86
+ context: async ({ realWalletExtension }, use) => {
87
+ await use(realWalletExtension.context);
88
+ },
89
+ page: async ({ context }, use) => {
90
+ const page = await context.newPage();
91
+ await use(page);
92
+ await page.close().catch(() => undefined);
93
+ },
94
+ });
95
+ export { expect } from './matchers.js';
96
+ //# sourceMappingURL=real-wallet-extension-fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"real-wallet-extension-fixtures.js","sourceRoot":"","sources":["../src/real-wallet-extension-fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import { type BrowserContext, type Page } from '@playwright/test';
2
+ export type RealWalletProfile = {
3
+ profileDirectory?: string;
4
+ userDataDir: string;
5
+ };
6
+ export type BrowserExtensionManifest = {
7
+ manifest_version?: number;
8
+ name?: string;
9
+ version?: string;
10
+ action?: {
11
+ default_popup?: string;
12
+ };
13
+ browser_action?: {
14
+ default_popup?: string;
15
+ };
16
+ options_ui?: {
17
+ page?: string;
18
+ };
19
+ side_panel?: {
20
+ default_path?: string;
21
+ };
22
+ [key: string]: unknown;
23
+ };
24
+ export type RealWalletExtensionLaunchOptions = {
25
+ baseURL?: string;
26
+ /**
27
+ * Exact Chrome extension display name used when runtime/service-worker
28
+ * discovery is inconclusive. For localized manifests (`__MSG_*__`), pass
29
+ * this explicitly or pass `extensionId`.
30
+ */
31
+ extensionName?: string;
32
+ /**
33
+ * Known extension ID. Useful for persistent profiles that already have a
34
+ * wallet installed or for extensions without a service worker.
35
+ */
36
+ extensionId?: string;
37
+ /** Path to an unpacked Chrome extension directory. */
38
+ extensionPath: string;
39
+ /**
40
+ * Run the browser headless. There is deliberately no default — choose
41
+ * explicitly here or via WEB3_TESTER_REAL_WALLET_HEADLESS=true|false.
42
+ */
43
+ headless?: boolean;
44
+ /**
45
+ * Extension page to open after launch. Defaults to the manifest action
46
+ * popup/options/side-panel page when present; pass false to leave all
47
+ * extension pages untouched.
48
+ */
49
+ initialPage?: string | false;
50
+ /** Additional Chromium launch args appended after extension args. */
51
+ launchArgs?: readonly string[];
52
+ locale?: string;
53
+ profileDir: string;
54
+ slowMo?: number;
55
+ };
56
+ export type RealWalletExtensionSession = {
57
+ close(): Promise<void>;
58
+ context: BrowserContext;
59
+ extensionId: string;
60
+ extensionPath: string;
61
+ manifest: BrowserExtensionManifest;
62
+ /** Page opened from `initialPage`, when configured/resolved. */
63
+ page?: Page;
64
+ profile: RealWalletProfile;
65
+ extensionUrl(page?: string): string;
66
+ openPage(page?: string): Promise<Page>;
67
+ };
68
+ export declare function resolveRealWalletProfile(profileDir: string): RealWalletProfile;
69
+ /**
70
+ * Resolves the headed/headless choice for real-wallet extension launches.
71
+ * The explicit option wins over the environment.
72
+ */
73
+ export declare function resolveRealWalletHeadless(explicit?: boolean): boolean;
74
+ export declare function readExtensionManifest(extensionPath: string): BrowserExtensionManifest;
75
+ export declare function extensionManifestName(extensionPath: string): string | undefined;
76
+ export declare function extensionManifestDefaultPage(manifest: BrowserExtensionManifest): string | undefined;
77
+ export declare function extensionPageUrl(extensionId: string, page?: string): string;
78
+ export declare function resolveExtensionPageUrl(extensionId: string, page?: string): string;
79
+ export declare function extensionIdFromUrl(url: string): string | undefined;
80
+ export declare function discoverRealWalletExtensionId(context: BrowserContext, options?: {
81
+ extensionName?: string;
82
+ timeoutMs?: number;
83
+ }): Promise<string>;
84
+ export declare function openRealWalletExtensionPage(context: BrowserContext, extensionId: string, page?: string): Promise<Page>;
85
+ export declare function launchRealWalletExtension(options: RealWalletExtensionLaunchOptions): Promise<RealWalletExtensionSession>;
86
+ //# sourceMappingURL=real-wallet-extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"real-wallet-extension.d.ts","sourceRoot":"","sources":["../src/real-wallet-extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,245 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { chromium } from '@playwright/test';
4
+ export function resolveRealWalletProfile(profileDir) {
5
+ const resolved = path.resolve(profileDir);
6
+ const profileDirectory = path.basename(resolved);
7
+ const userDataDir = path.dirname(resolved);
8
+ const looksLikeChromeProfile = /^(?:Default|Profile \d+)$/.test(profileDirectory);
9
+ if (looksLikeChromeProfile && fs.existsSync(path.join(userDataDir, 'Local State'))) {
10
+ return { profileDirectory, userDataDir };
11
+ }
12
+ return { userDataDir: resolved };
13
+ }
14
+ /**
15
+ * Resolves the headed/headless choice for real-wallet extension launches.
16
+ * The explicit option wins over the environment.
17
+ */
18
+ export function resolveRealWalletHeadless(explicit) {
19
+ if (explicit !== undefined)
20
+ return explicit;
21
+ const env = process.env.WEB3_TESTER_REAL_WALLET_HEADLESS;
22
+ if (env === 'true')
23
+ return true;
24
+ if (env === 'false')
25
+ return false;
26
+ if (env) {
27
+ throw new Error(`WEB3_TESTER_REAL_WALLET_HEADLESS must be "true" or "false", got "${env}".`);
28
+ }
29
+ throw new Error('Real-wallet launches need an explicit headed/headless choice: pass headless: true|false ' +
30
+ '(launchRealWalletExtension / launchRealWallet / buildWalletProfile / realWalletOptions) or set ' +
31
+ 'WEB3_TESTER_REAL_WALLET_HEADLESS=true|false. Headed is the fully validated mode; ' +
32
+ 'headless needs the full Chromium build (npx playwright install chromium).');
33
+ }
34
+ export function readExtensionManifest(extensionPath) {
35
+ const manifestPath = path.join(extensionPath, 'manifest.json');
36
+ let raw;
37
+ try {
38
+ raw = fs.readFileSync(manifestPath, 'utf8');
39
+ }
40
+ catch (error) {
41
+ const message = error instanceof Error ? error.message : String(error);
42
+ throw new Error(`Unable to read extension manifest at ${manifestPath}: ${message}`);
43
+ }
44
+ try {
45
+ const parsed = JSON.parse(raw);
46
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
47
+ throw new Error('manifest is not an object');
48
+ }
49
+ return parsed;
50
+ }
51
+ catch (error) {
52
+ const message = error instanceof Error ? error.message : String(error);
53
+ throw new Error(`Unable to parse extension manifest at ${manifestPath}: ${message}`);
54
+ }
55
+ }
56
+ function usableManifestString(value) {
57
+ if (typeof value !== 'string')
58
+ return undefined;
59
+ const trimmed = value.trim();
60
+ if (!trimmed || /^__MSG_[^_]+__$/.test(trimmed))
61
+ return undefined;
62
+ return trimmed;
63
+ }
64
+ export function extensionManifestName(extensionPath) {
65
+ return usableManifestString(readExtensionManifest(extensionPath).name);
66
+ }
67
+ export function extensionManifestDefaultPage(manifest) {
68
+ return (usableManifestString(manifest.action?.default_popup) ??
69
+ usableManifestString(manifest.browser_action?.default_popup) ??
70
+ usableManifestString(manifest.options_ui?.page) ??
71
+ usableManifestString(manifest.side_panel?.default_path));
72
+ }
73
+ function normalizeExtensionPage(page = '') {
74
+ return page.replace(/^\/+/, '');
75
+ }
76
+ export function extensionPageUrl(extensionId, page = '') {
77
+ const normalized = normalizeExtensionPage(page);
78
+ return `chrome-extension://${extensionId}/${normalized}`;
79
+ }
80
+ export function resolveExtensionPageUrl(extensionId, page = '') {
81
+ if (/^chrome-extension:\/\//.test(page))
82
+ return page;
83
+ return extensionPageUrl(extensionId, page);
84
+ }
85
+ export function extensionIdFromUrl(url) {
86
+ return /^chrome-extension:\/\/([^/]+)\//.exec(url)?.[1];
87
+ }
88
+ function wait(ms) {
89
+ return new Promise((resolve) => {
90
+ setTimeout(resolve, ms);
91
+ });
92
+ }
93
+ function isRecoverableExtensionPageOpenError(error) {
94
+ const message = error instanceof Error ? error.message : String(error);
95
+ return /ERR_BLOCKED_BY_CLIENT|page crashed|target page, context or browser has been closed/i.test(message);
96
+ }
97
+ async function discoverExtensionIdFromRuntime(context, timeoutMs) {
98
+ const workerId = context.serviceWorkers().map((worker) => extensionIdFromUrl(worker.url())).find(Boolean);
99
+ if (workerId)
100
+ return workerId;
101
+ const pageId = context.pages().map((page) => extensionIdFromUrl(page.url())).find(Boolean);
102
+ if (pageId)
103
+ return pageId;
104
+ const worker = await context.waitForEvent('serviceworker', { timeout: timeoutMs }).catch(() => undefined);
105
+ if (worker) {
106
+ const extensionId = extensionIdFromUrl(worker.url());
107
+ if (extensionId)
108
+ return extensionId;
109
+ }
110
+ return undefined;
111
+ }
112
+ async function discoverExtensionIdFromManagementApi(context, extensionName) {
113
+ const page = await context.newPage();
114
+ try {
115
+ await page.goto('chrome://extensions', { waitUntil: 'domcontentloaded' });
116
+ const extensions = await page.evaluate(() => {
117
+ const chromeApi = globalThis;
118
+ return new Promise((resolve, reject) => {
119
+ if (!chromeApi.chrome?.management?.getAll) {
120
+ reject(new Error('chrome.management.getAll is not available on chrome://extensions.'));
121
+ return;
122
+ }
123
+ chromeApi.chrome.management.getAll((items) => {
124
+ const error = chromeApi.chrome?.runtime?.lastError;
125
+ if (error)
126
+ reject(new Error(error.message ?? 'Unable to enumerate Chrome extensions.'));
127
+ else
128
+ resolve(items);
129
+ });
130
+ });
131
+ });
132
+ const exact = extensions.find((extension) => extension.name.toLowerCase() === extensionName.toLowerCase());
133
+ if (exact)
134
+ return exact.id;
135
+ const available = extensions.map((extension) => extension.name).sort().join(', ');
136
+ throw new Error(`Unable to find extension "${extensionName}". Installed extensions: ${available || 'none'}.`);
137
+ }
138
+ finally {
139
+ await page.close().catch(() => undefined);
140
+ }
141
+ }
142
+ export async function discoverRealWalletExtensionId(context, options = {}) {
143
+ const timeoutMs = options.timeoutMs ?? 10_000;
144
+ const runtimeId = await discoverExtensionIdFromRuntime(context, timeoutMs);
145
+ if (runtimeId)
146
+ return runtimeId;
147
+ if (!options.extensionName) {
148
+ throw new Error('Unable to discover extension ID from runtime pages/service workers. Pass extensionName or extensionId.');
149
+ }
150
+ return discoverExtensionIdFromManagementApi(context, options.extensionName);
151
+ }
152
+ export async function openRealWalletExtensionPage(context, extensionId, page = '') {
153
+ const url = resolveExtensionPageUrl(extensionId, page);
154
+ const acceptsHashRoute = !url.includes('#');
155
+ let lastError;
156
+ for (let attempt = 0; attempt < 6; attempt += 1) {
157
+ const existing = context
158
+ .pages()
159
+ .find((candidate) => {
160
+ if (candidate.isClosed())
161
+ return false;
162
+ const candidateUrl = candidate.url();
163
+ return candidateUrl === url || (acceptsHashRoute && candidateUrl.startsWith(`${url}#`));
164
+ });
165
+ const target = existing ?? (await context.newPage());
166
+ try {
167
+ if (target.url() !== url)
168
+ await target.goto(url, { waitUntil: 'domcontentloaded' });
169
+ await target.waitForLoadState('domcontentloaded').catch(() => undefined);
170
+ return target;
171
+ }
172
+ catch (error) {
173
+ lastError = error;
174
+ if (attempt === 5 || !isRecoverableExtensionPageOpenError(error))
175
+ throw error;
176
+ await target.close().catch(() => undefined);
177
+ await wait(750 + attempt * 750);
178
+ }
179
+ }
180
+ throw lastError;
181
+ }
182
+ export async function launchRealWalletExtension(options) {
183
+ const extensionPath = path.resolve(options.extensionPath);
184
+ if (!fs.existsSync(extensionPath)) {
185
+ throw new Error(`Wallet extension path does not exist: ${extensionPath}`);
186
+ }
187
+ const manifest = readExtensionManifest(extensionPath);
188
+ const extensionName = options.extensionName ?? usableManifestString(manifest.name);
189
+ const headless = resolveRealWalletHeadless(options.headless);
190
+ const profile = resolveRealWalletProfile(options.profileDir);
191
+ const context = await chromium
192
+ .launchPersistentContext(profile.userDataDir, {
193
+ args: [
194
+ ...(profile.profileDirectory ? [`--profile-directory=${profile.profileDirectory}`] : []),
195
+ `--disable-extensions-except=${extensionPath}`,
196
+ `--load-extension=${extensionPath}`,
197
+ ...(options.launchArgs ?? []),
198
+ ],
199
+ baseURL: options.baseURL,
200
+ channel: 'chromium',
201
+ headless,
202
+ locale: options.locale ?? 'en-US',
203
+ slowMo: options.slowMo,
204
+ })
205
+ .catch((error) => {
206
+ const message = error instanceof Error ? error.message : String(error);
207
+ if (/executable doesn't exist/i.test(message)) {
208
+ throw new Error("Real-wallet extension mode needs the full Chromium build for channel 'chromium' — a " +
209
+ 'chromium_headless_shell-only install cannot load extensions. ' +
210
+ 'Run: npx playwright install chromium\n' +
211
+ message);
212
+ }
213
+ throw error;
214
+ });
215
+ let extensionId;
216
+ let page;
217
+ try {
218
+ extensionId =
219
+ options.extensionId ??
220
+ (await discoverRealWalletExtensionId(context, {
221
+ extensionName,
222
+ }));
223
+ const initialPage = options.initialPage === undefined ? extensionManifestDefaultPage(manifest) : options.initialPage;
224
+ page =
225
+ initialPage === false || initialPage === undefined
226
+ ? undefined
227
+ : await openRealWalletExtensionPage(context, extensionId, initialPage);
228
+ }
229
+ catch (error) {
230
+ await context.close().catch(() => undefined);
231
+ throw error;
232
+ }
233
+ return {
234
+ close: () => context.close(),
235
+ context,
236
+ extensionId,
237
+ extensionPath,
238
+ manifest,
239
+ page,
240
+ profile,
241
+ extensionUrl: (targetPage = '') => extensionPageUrl(extensionId, targetPage),
242
+ openPage: (targetPage = '') => openRealWalletExtensionPage(context, extensionId, targetPage),
243
+ };
244
+ }
245
+ //# sourceMappingURL=real-wallet-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"real-wallet-extension.js","sourceRoot":"","sources":["../src/real-wallet-extension.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"real-wallet-fixtures.d.ts","sourceRoot":"","sources":["../src/real-wallet-fixtures.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,wBAAwB,GAAG;IACrC,4FAA4F;IAC5F,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,yBAAyB,CAAC,WAAW,CAAC,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iBAAiB,EAAE,wBAAwB,CAAC;IAC5C,UAAU,EAAE,iBAAiB,CAAC;CAC/B,CAAC;AAOF;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,kQAmEf,CAAC;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"real-wallet-fixtures.d.ts","sourceRoot":"","sources":["../src/real-wallet-fixtures.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,wBAAwB,GAAG;IACrC,4FAA4F;IAC5F,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,yBAAyB,CAAC,WAAW,CAAC,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iBAAiB,EAAE,wBAAwB,CAAC;IAC5C,UAAU,EAAE,iBAAiB,CAAC;CAC/B,CAAC;AAiBF;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,kQAoFf,CAAC;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC"}
@@ -2,11 +2,19 @@ import path from 'node:path';
2
2
  import { test as base } from '@playwright/test';
3
3
  import { prepareMetaMaskExtension } from './metamask-extension.js';
4
4
  import { buildWalletProfile, cloneWalletProfile, } from './real-wallet-cache.js';
5
+ import { benchmarkForTest, benchmarkObjectMethods } from './benchmark.js';
5
6
  import { launchRealWallet, } from './real-wallet.js';
6
7
  const setupFromEnv = () => ({
7
8
  password: process.env.WEB3_TESTER_REAL_WALLET_PASSWORD || undefined,
8
9
  seedPhrase: process.env.WEB3_TESTER_REAL_WALLET_SECRET_RECOVERY_PHRASE || undefined,
9
10
  });
11
+ const assertChromiumProject = (browserName) => {
12
+ if (browserName !== 'chromium') {
13
+ throw new Error('@marigoldlabs/web3-tester/real-wallet-fixtures launch a Chromium extension context. ' +
14
+ `The current Playwright project uses "${browserName}". Exclude real-wallet tests from non-Chromium ` +
15
+ 'projects, or run them in a dedicated Chromium project.');
16
+ }
17
+ };
10
18
  /**
11
19
  * Playwright fixtures for real-MetaMask tests. Each test gets a disposable
12
20
  * clone of a cached, pre-onboarded profile (built once per seed phrase +
@@ -21,42 +29,49 @@ export const test = base.extend({
21
29
  },
22
30
  { option: true },
23
31
  ],
24
- realWallet: async ({ realWalletOptions }, use, testInfo) => {
25
- const options = realWalletOptions;
26
- const setup = options.setup ?? setupFromEnv();
27
- const extensionPath = options.extensionPath ??
28
- process.env.WEB3_TESTER_REAL_WALLET_EXTENSION_PATH ??
29
- (await prepareMetaMaskExtension({ version: options.metamaskVersion }));
30
- let profileDir = options.profileDir ?? process.env.WEB3_TESTER_REAL_WALLET_PROFILE_DIR;
31
- if (!profileDir) {
32
- if (!setup.seedPhrase) {
33
- throw new Error('Real-wallet fixtures need a seed phrase (realWalletOptions.setup.seedPhrase or ' +
34
- 'WEB3_TESTER_REAL_WALLET_SECRET_RECOVERY_PHRASE) to build a cached profile, ' +
35
- 'or an explicit profileDir pointing at a prepared MetaMask profile.');
32
+ realWallet: async ({ realWalletOptions, browserName }, use, testInfo) => {
33
+ assertChromiumProject(browserName);
34
+ const benchmark = benchmarkForTest(testInfo, { suite: 'real-wallet' });
35
+ let session;
36
+ try {
37
+ const options = realWalletOptions;
38
+ const setup = options.setup ?? setupFromEnv();
39
+ const extensionPath = options.extensionPath ??
40
+ process.env.WEB3_TESTER_REAL_WALLET_EXTENSION_PATH ??
41
+ (await benchmark.measure('realWallet.prepareMetaMaskExtension', () => prepareMetaMaskExtension({ version: options.metamaskVersion })));
42
+ let profileDir = options.profileDir ?? process.env.WEB3_TESTER_REAL_WALLET_PROFILE_DIR;
43
+ if (!profileDir) {
44
+ if (!setup.seedPhrase) {
45
+ throw new Error('Real-wallet fixtures need a seed phrase (realWalletOptions.setup.seedPhrase or ' +
46
+ 'WEB3_TESTER_REAL_WALLET_SECRET_RECOVERY_PHRASE) to build a cached profile, ' +
47
+ 'or an explicit profileDir pointing at a prepared MetaMask profile.');
48
+ }
49
+ const cachedProfile = await benchmark.measure('realWallet.buildWalletProfile', () => buildWalletProfile({
50
+ extensionPath,
51
+ setup,
52
+ headless: options.headless,
53
+ generation: options.generation,
54
+ customize: options.profileSetup,
55
+ }));
56
+ profileDir = await benchmark.measure('realWallet.cloneWalletProfile', () => cloneWalletProfile(cachedProfile, path.join(testInfo.outputDir, 'metamask-profile')));
36
57
  }
37
- const cachedProfile = await buildWalletProfile({
58
+ session = await benchmark.measure('realWallet.launchRealWallet', () => launchRealWallet({
59
+ baseURL: options.baseURL,
60
+ expectedAddress: options.expectedAddress,
38
61
  extensionPath,
39
- setup,
40
- headless: options.headless,
41
62
  generation: options.generation,
42
- customize: options.profileSetup,
43
- });
44
- profileDir = await cloneWalletProfile(cachedProfile, path.join(testInfo.outputDir, 'metamask-profile'));
45
- }
46
- const session = await launchRealWallet({
47
- baseURL: options.baseURL,
48
- expectedAddress: options.expectedAddress,
49
- extensionPath,
50
- generation: options.generation,
51
- headless: options.headless,
52
- profileDir,
53
- setup,
54
- });
55
- try {
56
- await use(session);
63
+ headless: options.headless,
64
+ profileDir,
65
+ setup,
66
+ }));
67
+ await use(benchmarkObjectMethods(session, benchmark, { prefix: 'realWallet', exclude: ['close'] }));
57
68
  }
58
69
  finally {
59
- await session.close().catch(() => undefined);
70
+ if (session) {
71
+ const activeSession = session;
72
+ await benchmark.measure('realWallet.close', () => activeSession.close().catch(() => undefined));
73
+ }
74
+ await benchmark.flush();
60
75
  }
61
76
  },
62
77
  context: async ({ realWallet }, use) => {
@@ -1 +1 @@
1
- {"version":3,"file":"real-wallet-fixtures.js","sourceRoot":"","sources":["../src/real-wallet-fixtures.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"real-wallet-fixtures.js","sourceRoot":"","sources":["../src/real-wallet-fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,IAAI,IAAI,EAAa,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,gBAAgB,GAIjB,MAAM,kBAAkB,CAAC;AA4C1B,MAAM,YAAY,GAAG,GAAoB,EAAE,CAAC,CAAC;IAC3C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,gCAAgC,IAAI,SAAS;IACnE,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,8CAA8C,IAAI,SAAS;CACpF,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,WAAmB,EAAQ,EAAE;IAC1D,IAAI,WAAW,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,sFAAsF;YACpF,wCAAwC,WAAW,iDAAiD;YACpG,wDAAwD,CAC3D,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAqB;IAClD,iBAAiB,EAAE;QACjB,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE;YAChB,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;QACD,EAAE,MAAM,EAAE,IAAI,EAAE;KACjB;IAED,UAAU,EAAE,KAAK,EAAE,EAAE,iBAAiB,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;QACtE,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAEnC,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QACvE,IAAI,OAAsC,CAAC;QAE3C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,iBAAiB,CAAC;YAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,EAAE,CAAC;YAC9C,MAAM,aAAa,GACjB,OAAO,CAAC,aAAa;gBACrB,OAAO,CAAC,GAAG,CAAC,sCAAsC;gBAClD,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,qCAAqC,EAAE,GAAG,EAAE,CACnE,wBAAwB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAC/D,CAAC,CAAC;YAEL,IAAI,UAAU,GACZ,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC;YAExE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CACb,iFAAiF;wBAC/E,6EAA6E;wBAC7E,oEAAoE,CACvE,CAAC;gBACJ,CAAC;gBAED,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,+BAA+B,EAAE,GAAG,EAAE,CAClF,kBAAkB,CAAC;oBACjB,aAAa;oBACb,KAAK;oBACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,SAAS,EAAE,OAAO,CAAC,YAAY;iBAChC,CAAC,CACH,CAAC;gBACF,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,+BAA+B,EAAE,GAAG,EAAE,CACzE,kBAAkB,CAChB,aAAa,EACb,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAClD,CACF,CAAC;YACJ,CAAC;YAED,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,6BAA6B,EAAE,GAAG,EAAE,CACpE,gBAAgB,CAAC;gBACf,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,aAAa;gBACb,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,UAAU;gBACV,KAAK;aACN,CAAC,CACH,CAAC;YAEF,MAAM,GAAG,CAAC,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACtG,CAAC;gBAAS,CAAC;YACT,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,aAAa,GAAG,OAAO,CAAC;gBAC9B,MAAM,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YAClG,CAAC;YACD,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE;QACrC,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAS,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;CACF,CAAC,CAAC;AAEH,8EAA8E;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC"}