@pasosdejesus/m 0.24.0 → 0.25.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/dist/CHANGELOG.md +16 -1
- package/dist/i18n/locales/cli.d.ts.map +1 -1
- package/dist/i18n/locales/cli.js +2 -0
- package/dist/i18n/locales/cli.js.map +1 -1
- package/dist/m.js +7 -1
- package/dist/m.js.map +1 -1
- package/dist/tasks/e2e-summary.d.ts +13 -0
- package/dist/tasks/e2e-summary.d.ts.map +1 -0
- package/dist/tasks/e2e-summary.js +117 -0
- package/dist/tasks/e2e-summary.js.map +1 -0
- package/dist/tasks/e2e.d.ts +29 -0
- package/dist/tasks/e2e.d.ts.map +1 -1
- package/dist/tasks/e2e.js +130 -36
- package/dist/tasks/e2e.js.map +1 -1
- package/dist/tasks/e2e.test.d.ts +2 -0
- package/dist/tasks/e2e.test.d.ts.map +1 -0
- package/dist/tasks/e2e.test.js +108 -0
- package/dist/tasks/e2e.test.js.map +1 -0
- package/dist/wallet/next/components/InAppWalletSetup.d.ts +11 -0
- package/dist/wallet/next/components/InAppWalletSetup.d.ts.map +1 -0
- package/dist/wallet/next/components/InAppWalletSetup.js +55 -0
- package/dist/wallet/next/components/InAppWalletSetup.js.map +1 -0
- package/dist/wallet/next/components/InAppWalletUnlock.d.ts +9 -0
- package/dist/wallet/next/components/InAppWalletUnlock.d.ts.map +1 -0
- package/dist/wallet/next/components/InAppWalletUnlock.js +29 -0
- package/dist/wallet/next/components/InAppWalletUnlock.js.map +1 -0
- package/dist/wallet/next/components.test.d.ts +2 -0
- package/dist/wallet/next/components.test.d.ts.map +1 -0
- package/dist/wallet/next/components.test.js +122 -0
- package/dist/wallet/next/components.test.js.map +1 -0
- package/dist/wallet/next/i18n.d.ts +63 -0
- package/dist/wallet/next/i18n.d.ts.map +1 -0
- package/dist/wallet/next/i18n.js +64 -0
- package/dist/wallet/next/i18n.js.map +1 -0
- package/dist/wallet/next/index.d.ts +7 -0
- package/dist/wallet/next/index.d.ts.map +1 -0
- package/dist/wallet/next/index.js +12 -0
- package/dist/wallet/next/index.js.map +1 -0
- package/dist/wallet/next/namespaces.d.ts +17 -0
- package/dist/wallet/next/namespaces.d.ts.map +1 -0
- package/dist/wallet/next/namespaces.js +17 -0
- package/dist/wallet/next/namespaces.js.map +1 -0
- package/dist/wallet/next/useInAppWallet.d.ts +55 -0
- package/dist/wallet/next/useInAppWallet.d.ts.map +1 -0
- package/dist/wallet/next/useInAppWallet.js +261 -0
- package/dist/wallet/next/useInAppWallet.js.map +1 -0
- package/dist/wallet/next/useInAppWallet.test.d.ts +2 -0
- package/dist/wallet/next/useInAppWallet.test.d.ts.map +1 -0
- package/dist/wallet/next/useInAppWallet.test.js +261 -0
- package/dist/wallet/next/useInAppWallet.test.js.map +1 -0
- package/package.json +5 -1
- package/src/e2e/README.md +16 -0
- package/src/wallet/README.md +25 -2
package/dist/tasks/e2e.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
// test:e2e — Run E2E tests with Puppeteer + SIWE on OpenBSD/adJ
|
|
2
|
-
|
|
2
|
+
//
|
|
3
|
+
// P3 (m/REQ/49): `--retry <N>` re-runs each failed spec on its own, and every
|
|
4
|
+
// spec/attempt emits one stable machine-readable line (`[e2e-result] <file> <r>`)
|
|
5
|
+
// that `test:e2e:summary` (P4) consumes. The full stream is also saved to
|
|
6
|
+
// `E2E_LOG_DIR` (default /tmp).
|
|
7
|
+
import { spawn } from 'child_process';
|
|
3
8
|
import * as fs from 'fs';
|
|
4
9
|
import * as path from 'path';
|
|
5
10
|
import { globSync } from 'glob';
|
|
@@ -16,9 +21,13 @@ const t = createTranslator(detectLocale(), {
|
|
|
16
21
|
'e2e.no_specs': 'No spec files found in {{0}} matching: {{1}}',
|
|
17
22
|
'e2e.found': 'Found {{0}} spec(s)',
|
|
18
23
|
'e2e.running': '▶ {{0}}',
|
|
24
|
+
'e2e.retry_attempt': '▶ {{0}} (attempt {{1}})',
|
|
25
|
+
'e2e.retry_start': 'Retrying {{0}} spec(s) — attempt {{1}}/{{2}}',
|
|
19
26
|
'e2e.failed': ' ✗ {{0}} failed (exit {{1}})',
|
|
20
27
|
'e2e.all_passed': 'All {{0}} spec(s) passed.',
|
|
21
28
|
'e2e.partial': '{{0}}/{{1}} spec(s) failed.',
|
|
29
|
+
'e2e.still_failing': 'Still failing after {{0}} retry(ies): {{1}}',
|
|
30
|
+
'e2e.log_saved': 'Log saved to {{0}}',
|
|
22
31
|
},
|
|
23
32
|
es: {
|
|
24
33
|
'e2e.no_dir': 'No se encontró directorio e2e/. Esperado: e2e/specs/ o e2e/smoke/',
|
|
@@ -27,11 +36,34 @@ const t = createTranslator(detectLocale(), {
|
|
|
27
36
|
'e2e.no_specs': 'No se encontraron archivos spec en {{0}} coincidiendo con: {{1}}',
|
|
28
37
|
'e2e.found': '{{0}} spec(s) encontrado(s)',
|
|
29
38
|
'e2e.running': '▶ {{0}}',
|
|
39
|
+
'e2e.retry_attempt': '▶ {{0}} (intento {{1}})',
|
|
40
|
+
'e2e.retry_start': 'Reintentando {{0}} spec(s) — intento {{1}}/{{2}}',
|
|
30
41
|
'e2e.failed': ' ✗ {{0}} falló (exit {{1}})',
|
|
31
42
|
'e2e.all_passed': 'Todos los {{0}} spec(s) pasaron.',
|
|
32
43
|
'e2e.partial': '{{0}}/{{1}} spec(s) fallaron.',
|
|
44
|
+
'e2e.still_failing': 'Siguen fallando tras {{0}} reintento(s): {{1}}',
|
|
45
|
+
'e2e.log_saved': 'Log guardado en {{0}}',
|
|
33
46
|
},
|
|
34
47
|
}, commonCli);
|
|
48
|
+
/** Stable, machine-readable prefix consumed by `test:e2e:summary` (P4). */
|
|
49
|
+
export const RESULT_PREFIX = '[e2e-result] ';
|
|
50
|
+
/** One spec result line; `<file>` is the spec file name (e.g. `donate.spec.mjs`). */
|
|
51
|
+
export function resultLine(file, result) {
|
|
52
|
+
return `${RESULT_PREFIX}${file} ${result}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Classifies a spec by exit code, and marks a successful spec that printed `[SKIP]`
|
|
56
|
+
* as skipped. A non-zero exit always wins (a spec that failed is not a skip).
|
|
57
|
+
*/
|
|
58
|
+
export function classifyResult(status, output) {
|
|
59
|
+
if (status !== 0)
|
|
60
|
+
return 'fail';
|
|
61
|
+
return /\[SKIP\]/.test(output) ? 'skip' : 'ok';
|
|
62
|
+
}
|
|
63
|
+
function getFlag(args, name) {
|
|
64
|
+
const idx = args.indexOf(name);
|
|
65
|
+
return idx >= 0 && idx + 1 < args.length ? args[idx + 1] : null;
|
|
66
|
+
}
|
|
35
67
|
function findSpecs(subDir, pattern, e2eDir) {
|
|
36
68
|
const specDir = path.join(e2eDir, subDir);
|
|
37
69
|
if (!fs.existsSync(specDir))
|
|
@@ -39,6 +71,57 @@ function findSpecs(subDir, pattern, e2eDir) {
|
|
|
39
71
|
const files = globSync(pattern, { cwd: specDir });
|
|
40
72
|
return files.map(f => ({ file: f, dir: specDir }));
|
|
41
73
|
}
|
|
74
|
+
/** Runs one spec, streaming and capturing its output. */
|
|
75
|
+
function runSpec(specPath, env) {
|
|
76
|
+
return new Promise((resolve, reject) => {
|
|
77
|
+
const child = spawn(process.execPath, [specPath], { cwd: process.cwd(), env });
|
|
78
|
+
let output = '';
|
|
79
|
+
const onData = (chunk) => {
|
|
80
|
+
const text = chunk.toString();
|
|
81
|
+
output += text;
|
|
82
|
+
process.stdout.write(text);
|
|
83
|
+
};
|
|
84
|
+
child.stdout.on('data', onData);
|
|
85
|
+
child.stderr.on('data', onData);
|
|
86
|
+
child.on('error', reject);
|
|
87
|
+
child.on('close', (code) => resolve({ status: code ?? 1, output }));
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Runs every spec once, then re-runs each failed spec on its own up to `retries`
|
|
92
|
+
* times. Returns the final per-spec result and the attempt count. Extracted from
|
|
93
|
+
* `runE2e` so the retry policy is unit-testable without spawning processes.
|
|
94
|
+
*/
|
|
95
|
+
export async function runSpecsWithRetry(specs, runOne, plan) {
|
|
96
|
+
const sleep = plan.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
97
|
+
const results = new Map();
|
|
98
|
+
const attempts = new Map();
|
|
99
|
+
for (let i = 0; i < specs.length; i++) {
|
|
100
|
+
const spec = specs[i];
|
|
101
|
+
results.set(spec.file, await runOne(spec, 1));
|
|
102
|
+
attempts.set(spec.file, 1);
|
|
103
|
+
if (plan.specDelayMs > 0 && i < specs.length - 1)
|
|
104
|
+
await sleep(plan.specDelayMs);
|
|
105
|
+
}
|
|
106
|
+
let failed = specs.filter((s) => results.get(s.file) === 'fail');
|
|
107
|
+
for (let attempt = 1; attempt <= plan.retries && failed.length > 0; attempt++) {
|
|
108
|
+
plan.onRetry?.(attempt, failed.map((s) => s.file));
|
|
109
|
+
if (plan.retryDelayMs > 0)
|
|
110
|
+
await sleep(plan.retryDelayMs);
|
|
111
|
+
const still = [];
|
|
112
|
+
for (const spec of failed) {
|
|
113
|
+
const result = await runOne(spec, attempt + 1);
|
|
114
|
+
results.set(spec.file, result);
|
|
115
|
+
attempts.set(spec.file, attempt + 1);
|
|
116
|
+
if (result === 'fail')
|
|
117
|
+
still.push(spec);
|
|
118
|
+
if (plan.specDelayMs > 0)
|
|
119
|
+
await sleep(plan.specDelayMs);
|
|
120
|
+
}
|
|
121
|
+
failed = still;
|
|
122
|
+
}
|
|
123
|
+
return { results, attempts };
|
|
124
|
+
}
|
|
42
125
|
export async function runE2e(testPattern, args = []) {
|
|
43
126
|
const cwd = process.cwd();
|
|
44
127
|
// If testPattern looks like a flag, move it to args
|
|
@@ -48,6 +131,9 @@ export async function runE2e(testPattern, args = []) {
|
|
|
48
131
|
}
|
|
49
132
|
const smokeOnly = args.includes('--smoke');
|
|
50
133
|
const grepFilter = args.includes('--grep') ? args[args.indexOf('--grep') + 1] : null;
|
|
134
|
+
const retries = Math.max(0, parseInt(getFlag(args, '--retry') ?? process.env.E2E_RETRIES ?? '0', 10) || 0);
|
|
135
|
+
const retryDelay = Math.max(0, parseInt(getFlag(args, '--retry-delay') ?? '15000', 10) || 0);
|
|
136
|
+
const logDir = process.env.E2E_LOG_DIR || '/tmp';
|
|
51
137
|
// 1. Detect e2e directory
|
|
52
138
|
const e2eDir = path.join(cwd, 'e2e');
|
|
53
139
|
if (!fs.existsSync(e2eDir)) {
|
|
@@ -66,7 +152,6 @@ export async function runE2e(testPattern, args = []) {
|
|
|
66
152
|
}
|
|
67
153
|
// 3. Find specs — search in both specs/ and smoke/ when no flag specified
|
|
68
154
|
let specFiles = [];
|
|
69
|
-
// If pattern doesn't contain glob chars and isn't a full filename, wrap with *...*
|
|
70
155
|
let pattern = testPattern || '**/*.spec.mjs';
|
|
71
156
|
if (testPattern && !testPattern.includes('*') && !testPattern.endsWith('.spec.mjs')) {
|
|
72
157
|
pattern = `*${testPattern}*.spec.mjs`;
|
|
@@ -75,7 +160,6 @@ export async function runE2e(testPattern, args = []) {
|
|
|
75
160
|
specFiles = findSpecs('smoke', pattern, e2eDir);
|
|
76
161
|
}
|
|
77
162
|
else {
|
|
78
|
-
// Try specs/ first, then smoke/
|
|
79
163
|
specFiles = findSpecs('specs', pattern, e2eDir);
|
|
80
164
|
if (specFiles.length === 0) {
|
|
81
165
|
specFiles = findSpecs('smoke', pattern, e2eDir);
|
|
@@ -84,7 +168,6 @@ export async function runE2e(testPattern, args = []) {
|
|
|
84
168
|
}
|
|
85
169
|
}
|
|
86
170
|
}
|
|
87
|
-
// Apply grep filter
|
|
88
171
|
if (grepFilter && specFiles.length > 0) {
|
|
89
172
|
specFiles = specFiles.filter(s => s.file.includes(grepFilter));
|
|
90
173
|
}
|
|
@@ -94,43 +177,54 @@ export async function runE2e(testPattern, args = []) {
|
|
|
94
177
|
process.exit(0);
|
|
95
178
|
}
|
|
96
179
|
info(t("e2e.found", String(specFiles.length)));
|
|
97
|
-
// 4.
|
|
98
|
-
|
|
180
|
+
// 4. Log file (best effort) for `test:e2e:summary`.
|
|
181
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
182
|
+
const logFile = path.join(logDir, `e2e-${stamp}.log`);
|
|
183
|
+
let log = null;
|
|
184
|
+
try {
|
|
185
|
+
log = fs.createWriteStream(logFile);
|
|
186
|
+
info(t("e2e.log_saved", logFile));
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
log = null;
|
|
190
|
+
}
|
|
99
191
|
const specDelay = parseInt(process.env.E2E_SPEC_DELAY_MS || '1500', 10);
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const
|
|
192
|
+
// Every spec RUN (including retries) gets a fresh WALLET_INDEX so a retry does
|
|
193
|
+
// not hammer the site's per-wallet rate limit.
|
|
194
|
+
let walletRun = 0;
|
|
195
|
+
const runOne = async (spec, attempt) => {
|
|
196
|
+
const specPath = path.join(spec.dir, spec.file);
|
|
197
|
+
const rel = path.relative(e2eDir, specPath);
|
|
198
|
+
const env = { ...process.env, WALLET_INDEX: String(walletRun++) };
|
|
105
199
|
if (chromePath)
|
|
106
200
|
env.CHROME_PATH = chromePath;
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if (failures === 0) {
|
|
128
|
-
success(
|
|
201
|
+
info('\n' + (attempt > 1 ? t("e2e.retry_attempt", rel, String(attempt)) : t("e2e.running", rel)));
|
|
202
|
+
const { status, output } = await runSpec(specPath, env);
|
|
203
|
+
const result = classifyResult(status, output);
|
|
204
|
+
const line = resultLine(spec.file, result);
|
|
205
|
+
console.log(line);
|
|
206
|
+
if (result === 'fail')
|
|
207
|
+
problem(t("e2e.failed", spec.file, String(status)));
|
|
208
|
+
log?.write(`▶ ${rel}\n${output}\n${line}\n`);
|
|
209
|
+
return result;
|
|
210
|
+
};
|
|
211
|
+
// 5. Run pass 1 and the retries.
|
|
212
|
+
const { results } = await runSpecsWithRetry(specFiles, runOne, {
|
|
213
|
+
retries,
|
|
214
|
+
retryDelayMs: retryDelay,
|
|
215
|
+
specDelayMs: specDelay,
|
|
216
|
+
onRetry: (attempt, files) => info('\n' + t("e2e.retry_start", String(files.length), String(attempt), String(retries))),
|
|
217
|
+
});
|
|
218
|
+
log?.end();
|
|
219
|
+
// 7. Summary. A spec is green only by exit code.
|
|
220
|
+
const failures = specFiles.filter((s) => results.get(s.file) === 'fail');
|
|
221
|
+
if (failures.length === 0) {
|
|
222
|
+
success('\n' + t("e2e.all_passed", String(specFiles.length)));
|
|
129
223
|
}
|
|
130
224
|
else {
|
|
131
|
-
problem(
|
|
225
|
+
problem('\n' + t("e2e.partial", String(failures.length), String(specFiles.length)));
|
|
226
|
+
problem(t("e2e.still_failing", String(retries), failures.map((s) => s.file).join(', ')));
|
|
132
227
|
}
|
|
133
|
-
|
|
134
|
-
process.exit(failures > 0 ? 1 : 0);
|
|
228
|
+
process.exit(failures.length > 0 ? 1 : 0);
|
|
135
229
|
}
|
|
136
230
|
//# sourceMappingURL=e2e.js.map
|
package/dist/tasks/e2e.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"e2e.js","sourceRoot":"","sources":["../../src/tasks/e2e.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"e2e.js","sourceRoot":"","sources":["../../src/tasks/e2e.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e.test.d.ts","sourceRoot":"","sources":["../../src/tasks/e2e.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { classifyResult, resultLine, runSpecsWithRetry } from './e2e.js';
|
|
3
|
+
import { parseE2eLog, renderE2eSummary } from './e2e-summary.js';
|
|
4
|
+
// P3/P4 (m/REQ/49): the runner emits a stable `[e2e-result] <file> <r>` line and
|
|
5
|
+
// `test:e2e:summary` consumes it (last attempt wins).
|
|
6
|
+
describe('classifyResult / resultLine', () => {
|
|
7
|
+
it('reports fail by exit code (even if it also printed [SKIP])', () => {
|
|
8
|
+
expect(classifyResult(1, 'anything')).toBe('fail');
|
|
9
|
+
expect(classifyResult(2, '[SKIP] x')).toBe('fail');
|
|
10
|
+
});
|
|
11
|
+
it('reports skip for a green spec that printed [SKIP]', () => {
|
|
12
|
+
expect(classifyResult(0, 'ran\n[SKIP] needs Chrome')).toBe('skip');
|
|
13
|
+
});
|
|
14
|
+
it('reports ok for a plain green spec', () => {
|
|
15
|
+
expect(classifyResult(0, '[OK] fine')).toBe('ok');
|
|
16
|
+
});
|
|
17
|
+
it('formats the machine-readable line', () => {
|
|
18
|
+
expect(resultLine('donate.spec.mjs', 'ok')).toBe('[e2e-result] donate.spec.mjs ok');
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe('parseE2eLog', () => {
|
|
22
|
+
it('reads the machine format and keeps the last result per spec', () => {
|
|
23
|
+
const log = [
|
|
24
|
+
'▶ specs/a.spec.mjs',
|
|
25
|
+
'[e2e-result] a.spec.mjs fail',
|
|
26
|
+
'▶ specs/b.spec.mjs',
|
|
27
|
+
'[e2e-result] b.spec.mjs ok',
|
|
28
|
+
'[e2e-retry] ▶ specs/a.spec.mjs (intento 1)',
|
|
29
|
+
'[e2e-result] a.spec.mjs ok',
|
|
30
|
+
].join('\n');
|
|
31
|
+
const status = parseE2eLog(log);
|
|
32
|
+
expect(status.get('a.spec.mjs')).toBe('ok');
|
|
33
|
+
expect(status.get('b.spec.mjs')).toBe('ok');
|
|
34
|
+
});
|
|
35
|
+
it('falls back to the human format when there are no [e2e-result] lines', () => {
|
|
36
|
+
const log = [
|
|
37
|
+
'▶ specs/a.spec.mjs',
|
|
38
|
+
'[OK] fine',
|
|
39
|
+
'✅ 0 failures',
|
|
40
|
+
'▶ specs/b.spec.mjs',
|
|
41
|
+
'❌ 1 failures',
|
|
42
|
+
'▶ specs/c.spec.mjs',
|
|
43
|
+
'started and never finished',
|
|
44
|
+
].join('\n');
|
|
45
|
+
const status = parseE2eLog(log);
|
|
46
|
+
expect(status.get('a.spec.mjs')).toBe('ok');
|
|
47
|
+
expect(status.get('b.spec.mjs')).toBe('fail');
|
|
48
|
+
expect(status.get('c.spec.mjs')).toBe('?');
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('renderE2eSummary', () => {
|
|
52
|
+
it('marks the specs whose state differs between runs', () => {
|
|
53
|
+
const site = parseE2eLog('[e2e-result] a.spec.mjs fail\n[e2e-result] b.spec.mjs ok');
|
|
54
|
+
const local = parseE2eLog('[e2e-result] a.spec.mjs ok\n[e2e-result] b.spec.mjs ok');
|
|
55
|
+
const out = renderE2eSummary([
|
|
56
|
+
{ file: '/tmp/site.log', status: site },
|
|
57
|
+
{ file: '/tmp/local.log', status: local },
|
|
58
|
+
]);
|
|
59
|
+
expect(out).toContain('a.spec.mjs');
|
|
60
|
+
expect(out).toContain('<-- difiere');
|
|
61
|
+
expect(out).toContain('1 con estado distinto');
|
|
62
|
+
// b didn't differ, so its row must not carry the marker.
|
|
63
|
+
const bLine = out.split('\n').find((l) => l.startsWith('b.spec.mjs')) ?? '';
|
|
64
|
+
expect(bLine).not.toContain('<-- difiere');
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('runSpecsWithRetry (P3)', () => {
|
|
68
|
+
it('retries a failing spec until it passes', async () => {
|
|
69
|
+
const calls = [];
|
|
70
|
+
const runOne = async (spec, attempt) => {
|
|
71
|
+
calls.push(`${spec.file}#${attempt}`);
|
|
72
|
+
return attempt >= 2 ? 'ok' : 'fail';
|
|
73
|
+
};
|
|
74
|
+
const { results, attempts } = await runSpecsWithRetry([{ file: 'a.spec.mjs' }], runOne, {
|
|
75
|
+
retries: 2, retryDelayMs: 0, specDelayMs: 0,
|
|
76
|
+
});
|
|
77
|
+
expect(results.get('a.spec.mjs')).toBe('ok');
|
|
78
|
+
expect(attempts.get('a.spec.mjs')).toBe(2);
|
|
79
|
+
expect(calls).toEqual(['a.spec.mjs#1', 'a.spec.mjs#2']);
|
|
80
|
+
});
|
|
81
|
+
it('stops after N retries and reports fail', async () => {
|
|
82
|
+
let n = 0;
|
|
83
|
+
const runOne = async () => { n += 1; return 'fail'; };
|
|
84
|
+
const { results, attempts } = await runSpecsWithRetry([{ file: 'a.spec.mjs' }], runOne, {
|
|
85
|
+
retries: 2, retryDelayMs: 0, specDelayMs: 0,
|
|
86
|
+
});
|
|
87
|
+
expect(results.get('a.spec.mjs')).toBe('fail');
|
|
88
|
+
expect(attempts.get('a.spec.mjs')).toBe(3); // 1 + 2 retries
|
|
89
|
+
expect(n).toBe(3);
|
|
90
|
+
});
|
|
91
|
+
it('does not retry when retries=0', async () => {
|
|
92
|
+
let n = 0;
|
|
93
|
+
const runOne = async () => { n += 1; return 'fail'; };
|
|
94
|
+
const { attempts } = await runSpecsWithRetry([{ file: 'a.spec.mjs' }], runOne, {
|
|
95
|
+
retries: 0, retryDelayMs: 0, specDelayMs: 0,
|
|
96
|
+
});
|
|
97
|
+
expect(attempts.get('a.spec.mjs')).toBe(1);
|
|
98
|
+
expect(n).toBe(1);
|
|
99
|
+
});
|
|
100
|
+
it('leaves a green spec untouched', async () => {
|
|
101
|
+
const runOne = async () => 'ok';
|
|
102
|
+
const { attempts } = await runSpecsWithRetry([{ file: 'a.spec.mjs' }], runOne, {
|
|
103
|
+
retries: 3, retryDelayMs: 0, specDelayMs: 0,
|
|
104
|
+
});
|
|
105
|
+
expect(attempts.get('a.spec.mjs')).toBe(1);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e.test.js","sourceRoot":"","sources":["../../src/tasks/e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Lang, type WalletReactMessages } from '../i18n.js';
|
|
2
|
+
export interface InAppWalletSetupProps {
|
|
3
|
+
lang?: Lang;
|
|
4
|
+
onDone?: (address: `0x${string}`) => void;
|
|
5
|
+
/** La aplicación decide a qué guía de migración apuntar; el paquete no fija rutas. */
|
|
6
|
+
migrationHref?: string;
|
|
7
|
+
/** Textos del host (sobreescriben los por defecto). */
|
|
8
|
+
messages?: Partial<WalletReactMessages>;
|
|
9
|
+
}
|
|
10
|
+
export declare function InAppWalletSetup({ lang, onDone, migrationHref, messages }: InAppWalletSetupProps): import("react").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=InAppWalletSetup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InAppWalletSetup.d.ts","sourceRoot":"","sources":["../../../../src/wallet/next/components/InAppWalletSetup.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAmB,KAAK,IAAI,EAAmB,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAGlG,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI,CAAA;IACzC,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;CACxC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,IAAW,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,qBAAqB,+BA4IvG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { isValidPassword } from '../../index.js';
|
|
5
|
+
import { resolveMessages } from '../i18n.js';
|
|
6
|
+
import { useInAppWallet } from '../useInAppWallet.js';
|
|
7
|
+
export function InAppWalletSetup({ lang = 'en', onDone, migrationHref, messages }) {
|
|
8
|
+
const msg = (key) => resolveMessages(lang, messages)[key];
|
|
9
|
+
const { create, importExisting, error } = useInAppWallet();
|
|
10
|
+
const [mode, setMode] = useState('create');
|
|
11
|
+
const [password, setPassword] = useState('');
|
|
12
|
+
const [confirm, setConfirm] = useState('');
|
|
13
|
+
const [mnemonic, setMnemonic] = useState('');
|
|
14
|
+
const [privateKey, setPrivateKey] = useState('');
|
|
15
|
+
const [recoveryPhrase, setRecoveryPhrase] = useState(null);
|
|
16
|
+
const [localError, setLocalError] = useState(null);
|
|
17
|
+
const [busy, setBusy] = useState(false);
|
|
18
|
+
async function handleSubmit(event) {
|
|
19
|
+
event.preventDefault();
|
|
20
|
+
setLocalError(null);
|
|
21
|
+
if (!isValidPassword(password)) {
|
|
22
|
+
setLocalError(msg('passwordTooShort'));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (password !== confirm) {
|
|
26
|
+
setLocalError(msg('passwordMismatch'));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
setBusy(true);
|
|
30
|
+
try {
|
|
31
|
+
if (mode === 'create') {
|
|
32
|
+
const result = await create(password);
|
|
33
|
+
setRecoveryPhrase(result.mnemonic);
|
|
34
|
+
onDone?.(result.walletInfo.address);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const info = await importExisting({
|
|
38
|
+
password,
|
|
39
|
+
mnemonic: mnemonic.trim() ? mnemonic : undefined,
|
|
40
|
+
privateKey: privateKey.trim() ? privateKey.trim() : undefined,
|
|
41
|
+
});
|
|
42
|
+
onDone?.(info.address);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
setLocalError(e instanceof Error ? e.message : String(e));
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
setBusy(false);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const message = localError ?? error;
|
|
53
|
+
return (_jsxs("form", { onSubmit: handleSubmit, "data-testid": "in-app-wallet-setup", children: [_jsx("h2", { children: mode === 'create' ? msg('createTitle') : msg('importTitle') }), _jsxs("div", { role: "group", children: [_jsx("button", { type: "button", "data-testid": "mode-create", onClick: () => setMode('create'), "aria-pressed": mode === 'create', children: msg('create') }), _jsx("button", { type: "button", "data-testid": "mode-import", onClick: () => setMode('import'), "aria-pressed": mode === 'import', children: msg('import') })] }), mode === 'create' && (_jsxs("p", { "data-testid": "import-hint", children: [msg('alreadyHave'), ' ', _jsx("button", { type: "button", "data-testid": "switch-to-import", onClick: () => setMode('import'), children: msg('import') })] })), mode === 'import' && (_jsxs(_Fragment, { children: [_jsxs("p", { "data-testid": "import-security", children: [msg('importSecurity'), migrationHref && (_jsxs(_Fragment, { children: [' ', _jsx("a", { href: migrationHref, "data-testid": "migration-guide", children: msg('migrationGuide') })] }))] }), _jsxs("label", { children: [msg('mnemonic'), _jsx("textarea", { "aria-label": msg('mnemonic'), value: mnemonic, onChange: (e) => setMnemonic(e.target.value) })] }), _jsxs("label", { children: [msg('privateKey'), _jsx("input", { "aria-label": msg('privateKey'), value: privateKey, onChange: (e) => setPrivateKey(e.target.value) })] })] })), _jsxs("label", { children: [msg('password'), _jsx("input", { type: "password", inputMode: "text", "aria-label": msg('password'), value: password, onChange: (e) => setPassword(e.target.value) })] }), _jsxs("label", { children: [msg('passwordConfirm'), _jsx("input", { type: "password", inputMode: "text", "aria-label": msg('passwordConfirm'), value: confirm, onChange: (e) => setConfirm(e.target.value) })] }), _jsx("p", { "data-testid": "recovery-warning", children: msg('warning') }), recoveryPhrase && (_jsxs("div", { "data-testid": "recovery-phrase", children: [_jsx("p", { children: recoveryPhrase }), _jsx("button", { type: "button", onClick: () => navigator.clipboard?.writeText(recoveryPhrase), children: msg('copy') })] })), message && _jsx("p", { role: "alert", children: message }), _jsx("button", { type: "submit", "data-testid": "submit", disabled: busy, children: mode === 'create' ? msg('create') : msg('import') })] }));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=InAppWalletSetup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InAppWalletSetup.js","sourceRoot":"","sources":["../../../../src/wallet/next/components/InAppWalletSetup.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Lang, type WalletReactMessages } from '../i18n.js';
|
|
2
|
+
export interface InAppWalletUnlockProps {
|
|
3
|
+
lang?: Lang;
|
|
4
|
+
onUnlocked?: (address: `0x${string}`) => void;
|
|
5
|
+
/** Textos del host (sobreescriben los por defecto). */
|
|
6
|
+
messages?: Partial<WalletReactMessages>;
|
|
7
|
+
}
|
|
8
|
+
export declare function InAppWalletUnlock({ lang, onUnlocked, messages }: InAppWalletUnlockProps): import("react").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=InAppWalletUnlock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InAppWalletUnlock.d.ts","sourceRoot":"","sources":["../../../../src/wallet/next/components/InAppWalletUnlock.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,IAAI,EAAmB,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAGlG,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI,CAAA;IAC7C,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;CACxC;AAED,wBAAgB,iBAAiB,CAAC,EAAE,IAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,sBAAsB,+BAwC9F"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { resolveMessages } from '../i18n.js';
|
|
5
|
+
import { useInAppWallet } from '../useInAppWallet.js';
|
|
6
|
+
export function InAppWalletUnlock({ lang = 'en', onUnlocked, messages }) {
|
|
7
|
+
const msg = (key) => resolveMessages(lang, messages)[key];
|
|
8
|
+
const { unlock } = useInAppWallet();
|
|
9
|
+
const [password, setPassword] = useState('');
|
|
10
|
+
const [error, setError] = useState(null);
|
|
11
|
+
const [busy, setBusy] = useState(false);
|
|
12
|
+
async function handleSubmit(event) {
|
|
13
|
+
event.preventDefault();
|
|
14
|
+
setError(null);
|
|
15
|
+
setBusy(true);
|
|
16
|
+
try {
|
|
17
|
+
const info = await unlock(password);
|
|
18
|
+
onUnlocked?.(info.address);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
setError(msg('wrongPassword'));
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
setBusy(false);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return (_jsxs("form", { onSubmit: handleSubmit, "data-testid": "in-app-wallet-unlock", children: [_jsx("h2", { children: msg('unlockTitle') }), _jsxs("label", { children: [msg('password'), _jsx("input", { type: "password", inputMode: "text", "aria-label": msg('password'), value: password, onChange: (e) => setPassword(e.target.value) })] }), error && _jsx("p", { role: "alert", children: error }), _jsx("button", { type: "submit", disabled: busy, children: msg('unlock') })] }));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=InAppWalletUnlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InAppWalletUnlock.js","sourceRoot":"","sources":["../../../../src/wallet/next/components/InAppWalletUnlock.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,eAAe,EAAwD,MAAM,YAAY,CAAA;AAClG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AASrD,MAAM,UAAU,iBAAiB,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,UAAU,EAAE,QAAQ,EAA0B;IAC7F,MAAM,GAAG,GAAG,CAAC,GAAe,EAAU,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAA;IAC7E,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAA;IACnC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEvC,KAAK,UAAU,YAAY,CAAC,KAAsB;QAChD,KAAK,CAAC,cAAc,EAAE,CAAA;QACtB,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,OAAO,CAAC,IAAI,CAAC,CAAA;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAA;YACnC,UAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAA;QAChC,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IAED,OAAO,CACL,gBAAM,QAAQ,EAAE,YAAY,iBAAc,sBAAsB,aAC9D,uBAAK,GAAG,CAAC,aAAa,CAAC,GAAM,EAC7B,4BACG,GAAG,CAAC,UAAU,CAAC,EAChB,gBACE,IAAI,EAAC,UAAU,EACf,SAAS,EAAC,MAAM,gBACJ,GAAG,CAAC,UAAU,CAAC,EAC3B,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAC5C,IACI,EACP,KAAK,IAAI,YAAG,IAAI,EAAC,OAAO,YAAE,KAAK,GAAK,EACrC,iBAAQ,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,IAAI,YACjC,GAAG,CAAC,QAAQ,CAAC,GACP,IACJ,CACR,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.test.d.ts","sourceRoot":"","sources":["../../../src/wallet/next/components.test.tsx"],"names":[],"mappings":""}
|