@molecule/api-ai-tools 1.9.13 → 1.9.14
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/trace-artifacts.d.ts.map +1 -1
- package/dist/trace-artifacts.js +101 -13
- package/dist/utilities.d.ts.map +1 -1
- package/dist/utilities.js +43 -9
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-artifacts.d.ts","sourceRoot":"","sources":["../src/trace-artifacts.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"trace-artifacts.d.ts","sourceRoot":"","sources":["../src/trace-artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAMH,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,iGAAiG;IACjG,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oFAAoF;IACpF,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,yFAAyF;IACzF,GAAG,EAAE,MAAM,CAAA;IACX,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAA;IACb,kEAAkE;IAClE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB;;;;OAIG;IACH,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,gFAAgF;AAChF,MAAM,WAAW,WAAW;IAC1B,yFAAyF;IACzF,GAAG,EAAE,MAAM,CAAA;IACX,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAA;IACb,kEAAkE;IAClE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CACnB;AAED,gGAAgG;AAChG,MAAM,WAAW,aAAa;IAC5B,0FAA0F;IAC1F,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAA;IACZ,6FAA6F;IAC7F,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB;;;;OAIG;IACH,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B;;;;OAIG;IACH,OAAO,EAAE,WAAW,EAAE,CAAA;CACvB;AAED,sDAAsD;AACtD,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC,sDAAsD;AACtD,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAEpC;;;GAGG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAA;AAEnC,sFAAsF;AACtF,eAAO,MAAM,kBAAkB,KAAK,CAAA;AAEpC,yFAAyF;AACzF,eAAO,MAAM,qBAAqB,MAAM,CAAA;AAExC,uDAAuD;AACvD,eAAO,MAAM,oBAAoB,IAAI,CAAA;AAErC,iDAAiD;AACjD,eAAO,MAAM,uBAAuB,IAAI,CAAA;AAExC,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAEtC,wFAAwF;AACxF,eAAO,MAAM,qBAAqB,MAAM,CAAA;AAExC,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,MAAM,CAAA;AAEvC;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAK5C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,oBAAoB,QAAO,MAigBvC,CAAA;AAoDD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,CAkCnE;AA2KD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAKnE;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAG5D;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAGhE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAMzE;AAkDD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAA;IACZ,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ,4FAA4F;IAC5F,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,4FAA4F;IAC5F,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,2DAA2D;AAC3D,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;IACrC;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;CACjC;AA+dD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,MAAM,EAAE,MAAM,EACd,eAAe,GAAE,SAAS,MAAM,EAAO,EACvC,WAAW,GAAE,SAAS,MAAM,EAAO,EACnC,MAAM,GAAE,cAAmB,GAC1B,MAAM,GAAG,IAAI,CAsTf;AAaD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,8BAA8B,CAAA;AAwG/D,oGAAoG;AACpG,MAAM,WAAW,qBAAqB;IACpC,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,4EAA4E;IAC5E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAC5C,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA2BjC"}
|
package/dist/trace-artifacts.js
CHANGED
|
@@ -1178,19 +1178,36 @@ function sameOriginPath(request) {
|
|
|
1178
1178
|
* the request carried no `Authorization` header at all and the app's hand-rolled session store
|
|
1179
1179
|
* never handed its token to the shared client.
|
|
1180
1180
|
*
|
|
1181
|
+
* xr-molecule-flash-m156 (+16:15): the same 401 shape after a reload, and the page's own console
|
|
1182
|
+
* named the cause — `@molecule/app-http` logged `no client is bonded`. The auth setup ran before
|
|
1183
|
+
* the HTTP setup and kept the fallback client, so the restored token landed on a client nothing
|
|
1184
|
+
* sent through. When the trace carries that line, the no-header sentence names the ordering fix
|
|
1185
|
+
* instead of leaving the run to re-derive it.
|
|
1186
|
+
*
|
|
1181
1187
|
* The trace cannot name the file that made the call: a real HAR entry carries the request, response,
|
|
1182
1188
|
* `_resourceType`, `_monotonicTime` and a frame ref, but no initiator stack. So the sentence names
|
|
1183
1189
|
* the shared client and the auth bond instead of guessing a file.
|
|
1184
1190
|
*
|
|
1185
1191
|
* @param request - The refused request, a 401 or 403 on the app's own origin.
|
|
1192
|
+
* @param unbondedClient - Whether the traced page logged `no client is bonded`, which explains a
|
|
1193
|
+
* request that carried no `Authorization` header.
|
|
1186
1194
|
* @returns The sentence the note appends.
|
|
1187
1195
|
*/
|
|
1188
|
-
function authRefusalSentence(request) {
|
|
1196
|
+
function authRefusalSentence(request, unbondedClient = false) {
|
|
1189
1197
|
const label = requestLabel(request);
|
|
1190
1198
|
// The header's scheme, when it parsed; presence alone is still the server's half of the wire.
|
|
1191
1199
|
const carried = request.authorization !== undefined
|
|
1192
1200
|
? `with \`Authorization: ${request.authorization} …\``
|
|
1193
1201
|
: 'with an `Authorization` header';
|
|
1202
|
+
// The console line names the mechanism the no-header branch otherwise has to guess at:
|
|
1203
|
+
// `getClient()` ran before `setupHttpDefault()` and the token was mirrored into the
|
|
1204
|
+
// client that later setup replaced (xr-molecule-flash-m156).
|
|
1205
|
+
const unbonded = unbondedClient
|
|
1206
|
+
? ' The page logged `no client is bonded` — something called `getClient()` from ' +
|
|
1207
|
+
'`@molecule/app-http` before `setupHttpDefault()` ran and kept that fallback client; ' +
|
|
1208
|
+
'in `app/src/bonds/index.ts` call `setupHttpDefault()` before `setupAuthDefault()`, ' +
|
|
1209
|
+
'and read the client per request instead of capturing it at setup.'
|
|
1210
|
+
: '';
|
|
1194
1211
|
if (request.status === 403) {
|
|
1195
1212
|
return request.sentAuthorization === true
|
|
1196
1213
|
? `The browser sent \`${label}\` ${carried} and the API answered 403 — the token was ` +
|
|
@@ -1200,7 +1217,8 @@ function authRefusalSentence(request) {
|
|
|
1200
1217
|
'`Authorization` header, so either the client did not attach the token (check that the ' +
|
|
1201
1218
|
'request goes through the app’s HTTP client that the auth bond configures, and that the ' +
|
|
1202
1219
|
'token is stored where the client reads it) or the route refuses this user: read the ' +
|
|
1203
|
-
'route’s role/permission check in your own source.'
|
|
1220
|
+
'route’s role/permission check in your own source.' +
|
|
1221
|
+
unbonded;
|
|
1204
1222
|
}
|
|
1205
1223
|
if (request.sentAuthorization === true) {
|
|
1206
1224
|
return (`The browser sent \`${label}\` ${carried} and the API refused it: the token was sent and ` +
|
|
@@ -1218,7 +1236,8 @@ function authRefusalSentence(request) {
|
|
|
1218
1236
|
? 'The request did carry a `Cookie` header, so if this app signs in with a session cookie ' +
|
|
1219
1237
|
'that is the credential the server did not accept. '
|
|
1220
1238
|
: '') +
|
|
1221
|
-
'The API handler is not the problem.'
|
|
1239
|
+
'The API handler is not the problem.' +
|
|
1240
|
+
unbonded);
|
|
1222
1241
|
}
|
|
1223
1242
|
/**
|
|
1224
1243
|
* The note's credential-refusal advice, one sentence per distinct shape — at most two.
|
|
@@ -1234,23 +1253,67 @@ function authRefusalSentence(request) {
|
|
|
1234
1253
|
function authRefusalAdvice(items) {
|
|
1235
1254
|
const sentences = [];
|
|
1236
1255
|
const seen = new Set();
|
|
1256
|
+
// A page that logged `no client is bonded` explains every request it sent without a
|
|
1257
|
+
// token, so the advice names that mechanism once for the run
|
|
1258
|
+
// (xr-molecule-flash-m156).
|
|
1259
|
+
const unbondedClient = items.some((item) => item.console.some((line) => line.includes('no client is bonded')));
|
|
1237
1260
|
for (const item of items) {
|
|
1238
1261
|
for (const request of item.requests) {
|
|
1239
1262
|
if (request.status !== 401 && request.status !== 403)
|
|
1240
1263
|
continue;
|
|
1241
1264
|
if (sameOriginPath(request) === null)
|
|
1242
1265
|
continue;
|
|
1266
|
+
// A 4xx on the logout endpoint is the shape the row itself answers: the auth client
|
|
1267
|
+
// ignores it and clears the session, and the page owes the navigation (m156).
|
|
1268
|
+
if (isLogoutRequest(request))
|
|
1269
|
+
continue;
|
|
1243
1270
|
const key = `${request.status} ${request.sentAuthorization ? (request.authorization ?? 'header') : 'none'} ${request.sentCookie ? 'cookie' : ''}`;
|
|
1244
1271
|
if (seen.has(key))
|
|
1245
1272
|
continue;
|
|
1246
1273
|
seen.add(key);
|
|
1247
|
-
sentences.push(authRefusalSentence(request));
|
|
1274
|
+
sentences.push(authRefusalSentence(request, unbondedClient));
|
|
1248
1275
|
if (sentences.length === 2)
|
|
1249
1276
|
return ` ${sentences.join(' ')}`;
|
|
1250
1277
|
}
|
|
1251
1278
|
}
|
|
1252
1279
|
return sentences.length === 0 ? '' : ` ${sentences.join(' ')}`;
|
|
1253
1280
|
}
|
|
1281
|
+
/**
|
|
1282
|
+
* Whether a request went to an auth client's logout endpoint. The client's default
|
|
1283
|
+
* `logoutEndpoint` is `/users/logout` (`@molecule/app-auth`), and a project may name its own
|
|
1284
|
+
* (`/auth/logout`), so the last segment is what identifies it — never a literal path.
|
|
1285
|
+
*
|
|
1286
|
+
* @param request - One request a trace recorded.
|
|
1287
|
+
* @returns True for a POST to a path ending in `/logout`.
|
|
1288
|
+
*/
|
|
1289
|
+
function isLogoutRequest(request) {
|
|
1290
|
+
if (request.method !== 'POST')
|
|
1291
|
+
return false;
|
|
1292
|
+
return /\/(?:users\/)?logout$/i.test(requestPath(request));
|
|
1293
|
+
}
|
|
1294
|
+
/**
|
|
1295
|
+
* The sentence a 4xx on the auth client's logout endpoint owes when the page then stayed put.
|
|
1296
|
+
*
|
|
1297
|
+
* `@molecule/app-auth`'s `logout()` calls the endpoint inside a `.catch` and clears the session in
|
|
1298
|
+
* `finally` (`packages/app/core/auth/src/client.ts`): a 401 there is EXPECTED on a sign-out and is
|
|
1299
|
+
* not the failure. What the test waits for is the URL moving, which the page has to do itself.
|
|
1300
|
+
* xr-molecule-flash-m156 (+24:02 → +33:52) read `POST /api/users/logout → 401` as a broken
|
|
1301
|
+
* endpoint, added a backend logout route, and paid a re-run and a redeploy — while the real cause
|
|
1302
|
+
* was the `navigate('/')` the refactor had dropped.
|
|
1303
|
+
*
|
|
1304
|
+
* @param request - The 4xx logout request.
|
|
1305
|
+
* @param pageUrl - The URL the page stayed at, when the trace recorded one.
|
|
1306
|
+
* @returns The sentence the note appends to the row.
|
|
1307
|
+
*/
|
|
1308
|
+
function logoutIgnoredSentence(request, pageUrl) {
|
|
1309
|
+
const where = pageUrl === undefined ? 'The page' : `\`${pageUrl}\``;
|
|
1310
|
+
return (`The ${request.status} on \`${requestLabel(request)}\` is ignored by the auth client — ` +
|
|
1311
|
+
'`logout()` catches that call and clears the session in `finally` (`@molecule/app-auth`), so ' +
|
|
1312
|
+
'the request is not what broke the test and the API is not the fix; do not add or change a ' +
|
|
1313
|
+
`logout route. ${where} stayed on the same URL: the page has to navigate itself after ` +
|
|
1314
|
+
"`logout()` (call `navigate('/')`, or the route the suite waits for) in the handler that " +
|
|
1315
|
+
'signs out.');
|
|
1316
|
+
}
|
|
1254
1317
|
/**
|
|
1255
1318
|
* The API path prefixes the traced requests themselves show.
|
|
1256
1319
|
*
|
|
@@ -1452,8 +1515,15 @@ export function failureTraceNote(items, target, earlierFailures = [], apiPrefixe
|
|
|
1452
1515
|
: '';
|
|
1453
1516
|
// A credential refusal (401/403 on the app's own API) is not the handler's answer: the trace's
|
|
1454
1517
|
// own `Authorization` record says whether the CLIENT attached the token at all (m148 +29:18).
|
|
1455
|
-
const authRefusals = failedRequests.filter((request) => sameOriginPath(request) !== null &&
|
|
1518
|
+
const authRefusals = failedRequests.filter((request) => sameOriginPath(request) !== null &&
|
|
1519
|
+
(request.status === 401 || request.status === 403) &&
|
|
1520
|
+
// A 4xx on the logout endpoint is not a credential refusal to diagnose: the auth client
|
|
1521
|
+
// ignores it and clears the session anyway, and the row says so itself (m156).
|
|
1522
|
+
!isLogoutRequest(request));
|
|
1456
1523
|
const everyFailureAuth = failedRequests.length > 0 && authRefusals.length === failedRequests.length;
|
|
1524
|
+
// Every recorded failure is the logout endpoint answering 4xx: the row's own sentence explains
|
|
1525
|
+
// it, and neither the handler lead nor the credential reading applies (m156 +24:02).
|
|
1526
|
+
const onlyLogoutFailures = failedRequests.length > 0 && failedRequests.every((request) => isLogoutRequest(request));
|
|
1457
1527
|
const authAdvice = authRefusalAdvice(traced);
|
|
1458
1528
|
// The stalled-navigation reading, per traced test: non-null only when the RUNNER says this
|
|
1459
1529
|
// test's failing operation is a navigation and a document subresource still pending at the end
|
|
@@ -1524,6 +1594,19 @@ export function failureTraceNote(items, target, earlierFailures = [], apiPrefixe
|
|
|
1524
1594
|
? `the page then navigated to ${step.pageAfter}`
|
|
1525
1595
|
: `the page stayed at ${step.pageAfter}`);
|
|
1526
1596
|
}
|
|
1597
|
+
// A 4xx on the logout endpoint with the page unmoved is not a backend failure: the auth
|
|
1598
|
+
// client swallows the call and clears the session, and the URL can only move if the page
|
|
1599
|
+
// navigates itself (xr-molecule-flash-m156 +24:02: the refactor dropped `navigate('/')` and
|
|
1600
|
+
// the run went and added a logout route instead).
|
|
1601
|
+
const stepLast = stepRequests.length > 0 ? stepRequests[stepRequests.length - 1] : undefined;
|
|
1602
|
+
if (stepLast !== undefined &&
|
|
1603
|
+
stepLast.status >= 400 &&
|
|
1604
|
+
stepLast.status < 500 &&
|
|
1605
|
+
isLogoutRequest(stepLast) &&
|
|
1606
|
+
step.pageBefore !== undefined &&
|
|
1607
|
+
step.pageAfter !== undefined &&
|
|
1608
|
+
step.pageBefore === step.pageAfter)
|
|
1609
|
+
parts.push(logoutIgnoredSentence(stepLast, step.pageAfter));
|
|
1527
1610
|
}
|
|
1528
1611
|
else if (lead !== undefined) {
|
|
1529
1612
|
parts.push(leadRequestLine(lead));
|
|
@@ -1626,14 +1709,19 @@ export function failureTraceNote(items, target, earlierFailures = [], apiPrefixe
|
|
|
1626
1709
|
(anyFailed
|
|
1627
1710
|
? everyFailureLacksPrefix
|
|
1628
1711
|
? ''
|
|
1629
|
-
:
|
|
1630
|
-
? //
|
|
1631
|
-
//
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1712
|
+
: onlyLogoutFailures
|
|
1713
|
+
? // The rows already say it: a 4xx on the logout endpoint is ignored by the auth client
|
|
1714
|
+
// and the page's own navigation is the missing step. The handler lead would send the
|
|
1715
|
+
// run at the backend (m156 +33:52 added a logout route).
|
|
1716
|
+
''
|
|
1717
|
+
: everyFailureAuth
|
|
1718
|
+
? // Every failure was a credential refusal: the handler is not the problem, and the
|
|
1719
|
+
// auth advice already names what is (m148 was sent to the handler six walks running).
|
|
1720
|
+
authAdvice
|
|
1721
|
+
: 'A click that changed nothing is usually one of these requests failing, not the selector: ' +
|
|
1722
|
+
'read the handler this route reaches in your own source, and stop `catch`-ing the request of a ' +
|
|
1723
|
+
'user action silently — log it.' +
|
|
1724
|
+
authAdvice
|
|
1637
1725
|
: anyStalled
|
|
1638
1726
|
? report.productionBuildAdvised
|
|
1639
1727
|
? 'No listed request failed — none got a 4xx/5xx or a network error — but a navigation ' +
|
package/dist/utilities.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAW3E;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAS5C;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAI,GAAG,MAAM,KAAG,MAEE,CAAA;AAuGhD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAErD;AAKD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAsCzD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,MAAM,CAUpF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQnE;AAuDD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,8BAA8B,0CAA0C,CAAA;AAErF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG;IAC3D,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB,
|
|
1
|
+
{"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"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"}
|
package/dist/utilities.js
CHANGED
|
@@ -478,12 +478,18 @@ export function streamingBackgroundCommand(command) {
|
|
|
478
478
|
};
|
|
479
479
|
// A diagnosis or a re-run (capped, last-failed, grepped, or named files) walks each failure
|
|
480
480
|
// once: the suite's own `retries` doubled every failure of X1 flash-m71's first whole run,
|
|
481
|
-
// which had dropped the `--retries=0` it used one command earlier.
|
|
482
|
-
//
|
|
483
|
-
//
|
|
484
|
-
//
|
|
485
|
-
//
|
|
481
|
+
// which had dropped the `--retries=0` it used one command earlier. A whole run whose TARGET is
|
|
482
|
+
// local — its env names `localhost`/`127.0.0.1`/`0.0.0.0`, or names no URL at all, as the
|
|
483
|
+
// wrapper config's default does — is not the proof run either and walks them once too:
|
|
484
|
+
// xr-molecule-flash-m155 (+11:34) spent 10 minutes on its first local whole run, and the
|
|
485
|
+
// suite's `retries: 1` walked each of its 68 failures a second time (0 flaky) for nothing.
|
|
486
|
+
// The suite's retries are kept only for a run that names a non-local URL — the deployed proof
|
|
487
|
+
// (xr-molecule-flash-m89), where they absorb a network blip. Which runs are diagnoses is
|
|
488
|
+
// {@link isDiagnosisRun}'s answer and nobody else's: the platform's notes ask the same
|
|
489
|
+
// function, so a run cannot be a diagnosis to one of them and the whole suite to the other.
|
|
490
|
+
// Which targets are local is {@link suiteCommandTarget}'s answer.
|
|
486
491
|
const diagnosis = isDiagnosisRun(lastStep);
|
|
492
|
+
const localTarget = suiteCommandTarget(lastStep) === 'local';
|
|
487
493
|
// The last step's reporters: one printer, and it is `list`. Every branch below only ever moves
|
|
488
494
|
// the command TO that shape — a reporter set is never left with two printers in it.
|
|
489
495
|
const reporters = finalPlaywrightRun ? lastReporterFlag(lastStep) : null;
|
|
@@ -549,9 +555,9 @@ export function streamingBackgroundCommand(command) {
|
|
|
549
555
|
'summary at the end — so a run that is still walking already says what its failures are, ' +
|
|
550
556
|
'and you need not wait for it to end to start on them.');
|
|
551
557
|
}
|
|
552
|
-
if (finalPlaywrightRun && diagnosis && !/--retries\b/.test(lastStep)) {
|
|
558
|
+
if (finalPlaywrightRun && (diagnosis || localTarget) && !/--retries\b/.test(lastStep)) {
|
|
553
559
|
if (addToRun('--retries=0'))
|
|
554
|
-
changes.push('Added `--retries=0`: a
|
|
560
|
+
changes.push('Added `--retries=0`: a local run walks each failure once; the suite’s retries apply on the deployed proof run.');
|
|
555
561
|
}
|
|
556
562
|
return { command: out, changes };
|
|
557
563
|
}
|
|
@@ -1953,6 +1959,23 @@ function largestGroup(groups) {
|
|
|
1953
1959
|
function testKey(t) {
|
|
1954
1960
|
return `${t.where}|${t.title}`;
|
|
1955
1961
|
}
|
|
1962
|
+
/**
|
|
1963
|
+
* One test's identity with the runner's retry marker taken off: `… a.spec.ts:32 › does x
|
|
1964
|
+
* (retry #1)` is the same test as `… a.spec.ts:32 › does x`.
|
|
1965
|
+
*
|
|
1966
|
+
* A retried failure prints twice in a `list` log — its first attempt, then the same test with
|
|
1967
|
+
* `(retry #1)` after the title — while its failure block names it without the marker. Keyed
|
|
1968
|
+
* literally, the retry row is a test no cause claims, so it fell through to the duration arm and
|
|
1969
|
+
* was listed as a "shared duration" cause beside the proven cause it repeated: on
|
|
1970
|
+
* xr-molecule-flash-m155 (+21:50) every retry row of the run became one of six extra causes
|
|
1971
|
+
* duplicating the causes above them.
|
|
1972
|
+
*
|
|
1973
|
+
* @param t - A failed test, as a result line or a failure block spelled it.
|
|
1974
|
+
* @returns The key a test's retry row shares with its failure block.
|
|
1975
|
+
*/
|
|
1976
|
+
function retrylessTestKey(t) {
|
|
1977
|
+
return `${t.where}|${t.title.replace(/\s*\(retry #\d+\)$/, '')}`;
|
|
1978
|
+
}
|
|
1956
1979
|
/**
|
|
1957
1980
|
* The same tests with each one kept once, in first-seen order.
|
|
1958
1981
|
*
|
|
@@ -2600,6 +2623,10 @@ function groupFailures(log, excluded, pageErrors = []) {
|
|
|
2600
2623
|
const listed = failedTests(text);
|
|
2601
2624
|
named.push(...listed);
|
|
2602
2625
|
const claimed = new Set(causes.flatMap((c) => c.tests.map(testKey)));
|
|
2626
|
+
// The causes above as a test can recognise itself: a retried failure's second row carries the
|
|
2627
|
+
// runner's `(retry #1)` marker, its failure block does not, and comparing the literal keys
|
|
2628
|
+
// read the same test as an unclaimed one (xr-molecule-flash-m155 +21:50).
|
|
2629
|
+
const proven = new Set(causes.flatMap((c) => c.tests.map(retrylessTestKey)));
|
|
2603
2630
|
const unclaimed = distinctTests(listed).filter((t) => t.seconds !== null &&
|
|
2604
2631
|
!claimed.has(testKey(t)) &&
|
|
2605
2632
|
// A flaky test's `✘` row is its first attempt; its `✓` retry follows it in the same log,
|
|
@@ -2615,14 +2642,21 @@ function groupFailures(log, excluded, pageErrors = []) {
|
|
|
2615
2642
|
else
|
|
2616
2643
|
byDuration.push({ seconds: t.seconds, tests: [t] });
|
|
2617
2644
|
}
|
|
2618
|
-
for (const g of byDuration)
|
|
2645
|
+
for (const g of byDuration) {
|
|
2646
|
+
// A duration band is a LEAD, not a cause: a test already carrying a proven cause above is
|
|
2647
|
+
// not named a second time here, and a band whose every member is one is not a cause at all —
|
|
2648
|
+
// it reads as one more thing to fix. m155's retry rows made six such bands.
|
|
2649
|
+
const tests = g.tests.filter((t) => !proven.has(retrylessTestKey(t)));
|
|
2650
|
+
if (tests.length === 0)
|
|
2651
|
+
continue;
|
|
2619
2652
|
causes.push({
|
|
2620
2653
|
message: null,
|
|
2621
2654
|
seconds: g.seconds,
|
|
2622
|
-
tests
|
|
2655
|
+
tests,
|
|
2623
2656
|
evidence: [],
|
|
2624
2657
|
kind: 'assertion',
|
|
2625
2658
|
});
|
|
2659
|
+
}
|
|
2626
2660
|
const ignored = distinctTests(named).filter((t) => matchingExcludedTitles(t.title, excluded).length > 0);
|
|
2627
2661
|
return {
|
|
2628
2662
|
causes: causes.sort((a, b) => b.tests.length - a.tests.length),
|