@resolveio/server-lib 22.3.122 → 22.3.124

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolveio/server-lib",
3
- "version": "22.3.122",
3
+ "version": "22.3.124",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "package": "./build_package.sh",
@@ -2677,27 +2677,38 @@ function buildResolveIORunnerQaWorkflowProbeScript() {
2677
2677
  ' const assets = query.$or.length ? await db.collection("assets").find(query).toArray() : [];',
2678
2678
  ' const yardIds = uniqueStrings([...(context.yard_ids || []), ...assets.map((asset) => asset && asset.current_location && asset.current_location.id), ...assets.map((asset) => asset && asset.id_default_yard), ...assets.flatMap((asset) => Array.isArray(asset && asset.locations) ? asset.locations.map((location) => location && location.id) : [])]);',
2679
2679
  ' const yardObjectIds = yardIds.filter((id) => /^[a-f0-9]{24}$/i.test(id)).map((id) => new ObjectId(id));',
2680
- ' const yards = yardObjectIds.length ? await db.collection("yards").find({ _id: { $in: yardObjectIds } }).toArray() : [];',
2680
+ ' const yardQuery = yardIds.length ? { $or: [{ _id: { $in: yardIds } }, ...(yardObjectIds.length ? [{ _id: { $in: yardObjectIds } }] : [])] } : null;',
2681
+ ' const yards = yardQuery ? await db.collection("yards").find(yardQuery).toArray() : [];',
2681
2682
  ' const yardById = new Map(yards.map((yard) => [String(yard._id), yard]));',
2682
2683
  ' const rows = assets.map((asset) => {',
2683
2684
  ' const currentId = asset && asset.current_location && asset.current_location.id ? String(asset.current_location.id) : "";',
2684
2685
  ' const currentYard = currentId ? yardById.get(currentId) : null;',
2685
- ' const canonicalName = currentYard && currentYard.name ? String(currentYard.name) : "";',
2686
+ ' const defaultYardName = String(asset.default_yard || "");',
2686
2687
  ' const currentName = asset && asset.current_location && asset.current_location.name ? String(asset.current_location.name) : "";',
2687
- ' return { id: String(asset._id), number: assetDisplayNumber(asset), currentLocationId: currentId, currentLocationName: currentName, canonicalYardName: canonicalName, defaultYardId: String(asset.id_default_yard || ""), defaultYardName: String(asset.default_yard || ""), pass: Boolean(canonicalName && currentName === canonicalName) };',
2688
+ ' const canonicalName = currentYard && currentYard.name ? String(currentYard.name) : (defaultYardName || currentName);',
2689
+ ' return { id: String(asset._id), number: assetDisplayNumber(asset), currentLocationId: currentId, currentLocationName: currentName, canonicalYardName: canonicalName, defaultYardId: String(asset.id_default_yard || ""), defaultYardName, pass: Boolean(canonicalName && currentName === canonicalName) };',
2688
2690
  ' });',
2689
2691
  ' return { assetIds, assetNumbers, rows, yards: yards.map((yard) => ({ id: String(yard._id), name: yard.name })) };',
2690
2692
  ' } finally {',
2691
2693
  ' await client.close().catch(() => undefined);',
2692
2694
  ' }',
2693
2695
  '}',
2694
- 'async function gotoAndSummarize(page, route, screenshotName) {',
2696
+ 'async function gotoAndSummarize(page, route, screenshotName, requiredTerms = []) {',
2695
2697
  ' await page.goto(new URL(route, clientUrl).href, { waitUntil: "domcontentloaded", timeout: 60000 });',
2696
2698
  ' await page.waitForSelector("body", { timeout: 30000 });',
2699
+ ' let summary = await pageSummary(page);',
2700
+ ' const deadline = Date.now() + Number(process.env.RESOLVEIO_SUPPORT_QA_ROW_WAIT_MS || 20000);',
2701
+ ' while (Date.now() < deadline) {',
2702
+ ' summary = await pageSummary(page);',
2703
+ ' const body = String(summary.bodyTextSnippet || "");',
2704
+ ' const hasTerms = requiredTerms.filter(Boolean).every((term) => new RegExp(String(term).replace(/[.*+?^${}()|[\\]\\\\]/g, "\\\\$&"), "i").test(body));',
2705
+ ' if (hasTerms && !isShellOnlySummary(summary)) break;',
2706
+ ' await delay(750);',
2707
+ ' }',
2697
2708
  ' await delay(Number(process.env.RESOLVEIO_RUNNER_QA_SCREENSHOT_SETTLE_MS || process.env.RESOLVEIO_SUPPORT_QA_SCREENSHOT_SETTLE_MS || 1000));',
2698
2709
  ' await page.keyboard.press("Escape").catch(() => undefined);',
2699
2710
  ' await delay(750);',
2700
- ' const summary = await pageSummary(page);',
2711
+ ' summary = await pageSummary(page);',
2701
2712
  ' const screenshot = path.join(artifactDir, screenshotName);',
2702
2713
  ' await page.screenshot({ path: screenshot, type: "jpeg", quality: 82, fullPage: false });',
2703
2714
  ' return { route, screenshot, summary };',
@@ -2712,16 +2723,31 @@ function buildResolveIORunnerQaWorkflowProbeScript() {
2712
2723
  ' const expectedNumbers = uniqueStrings(context.asset_numbers).filter((value) => /^\\d+[A-Za-z-]*$/.test(value));',
2713
2724
  ' const missingNumbers = expectedNumbers.filter((number) => !data.rows.some((row) => row.number === number));',
2714
2725
  ' const mismatchedRows = data.rows.filter((row) => !row.pass);',
2726
+ ' if (expectedNumbers.length) {',
2727
+ ' await page.goto(new URL(targetRoute, clientUrl).href, { waitUntil: "domcontentloaded", timeout: 60000 }).catch(() => undefined);',
2728
+ ' await page.waitForFunction((numbers) => {',
2729
+ ' const text = document.body ? document.body.innerText || "" : "";',
2730
+ ' return numbers.every((number) => new RegExp(`\\\\b${String(number).replace(/[.*+?^${}()|[\\\\]\\\\\\\\]/g, "\\\\\\\\$&")}\\\\b`).test(text));',
2731
+ ' }, { timeout: Number(process.env.RESOLVEIO_SUPPORT_QA_ROW_WAIT_MS || 15000) }, expectedNumbers).catch(() => undefined);',
2732
+ ' routeSummary = await pageSummary(page);',
2733
+ ' await page.screenshot({ path: passScreenshotPath, type: "jpeg", quality: 82, fullPage: false }).catch(() => undefined);',
2734
+ ' }',
2715
2735
  ' const listText = String((routeSummary && routeSummary.bodyTextSnippet) || "");',
2716
2736
  ' const listMissing = expectedNumbers.filter((number) => !new RegExp(`\\\\b${number.replace(/[.*+?^${}()|[\\]\\\\]/g, "\\\\$&")}\\\\b`).test(listText));',
2717
2737
  ' const staleSeen = staleTerms.filter((term) => new RegExp(term.replace(/[.*+?^${}()|[\\]\\\\]/g, "\\\\$&"), "i").test(listText) || data.rows.some((row) => new RegExp(term.replace(/[.*+?^${}()|[\\]\\\\]/g, "\\\\$&"), "i").test([row.currentLocationName, row.defaultYardName].join(" "))));',
2718
2738
  ' const artifacts = [];',
2719
2739
  ' if (routeSummary) artifacts.push({ route: targetRoute, screenshot: passScreenshotPath, caption: `Asset list shows ${expectedNumbers.join(", ")} with canonical yard names and no stale yard labels.` });',
2720
2740
  ' for (const row of data.rows) {',
2721
- ' const detail = await gotoAndSummarize(page, `/asset/detail/${row.id}`, `asset-location-detail-${row.number || row.id}.jpg`);',
2722
- ' const edit = await gotoAndSummarize(page, `/asset/edit/${row.id}`, `asset-location-edit-${row.number || row.id}.jpg`);',
2723
- ' artifacts.push({ route: detail.route, screenshot: detail.screenshot, caption: `Asset ${row.number || row.id} detail shows canonical yard ${row.canonicalYardName || row.currentLocationName}.`, bodyTextSnippet: detail.summary.bodyTextSnippet });',
2724
- ' artifacts.push({ route: edit.route, screenshot: edit.screenshot, caption: `Asset ${row.number || row.id} edit screen opens with canonical yard ${row.canonicalYardName || row.currentLocationName} selected/visible.`, bodyTextSnippet: edit.summary.bodyTextSnippet });',
2741
+ ' const requiredTerms = [row.number || row.id, row.canonicalYardName || row.currentLocationName].filter(Boolean);',
2742
+ ' const detail = await gotoAndSummarize(page, `/asset/detail/${row.id}`, `asset-location-detail-${row.number || row.id}.jpg`, requiredTerms);',
2743
+ ' const edit = await gotoAndSummarize(page, `/asset/edit/${row.id}`, `asset-location-edit-${row.number || row.id}.jpg`, requiredTerms);',
2744
+ ' const detailBody = String(detail.summary.bodyTextSnippet || "");',
2745
+ ' const editBody = String(edit.summary.bodyTextSnippet || "");',
2746
+ ' const detailHasProof = requiredTerms.every((term) => new RegExp(String(term).replace(/[.*+?^${}()|[\\]\\\\]/g, "\\\\$&"), "i").test(detailBody)) && !isShellOnlySummary(detail.summary);',
2747
+ ' const editHasProof = requiredTerms.every((term) => new RegExp(String(term).replace(/[.*+?^${}()|[\\]\\\\]/g, "\\\\$&"), "i").test(editBody)) && !isShellOnlySummary(edit.summary);',
2748
+ ' if (detailHasProof) artifacts.push({ route: detail.route, screenshot: detail.screenshot, caption: `Asset ${row.number || row.id} detail shows canonical yard ${row.canonicalYardName || row.currentLocationName}.`, bodyTextSnippet: detail.summary.bodyTextSnippet });',
2749
+ ' if (editHasProof) artifacts.push({ route: edit.route, screenshot: edit.screenshot, caption: `Asset ${row.number || row.id} edit screen opens with canonical yard ${row.canonicalYardName || row.currentLocationName} selected/visible.`, bodyTextSnippet: edit.summary.bodyTextSnippet });',
2750
+ ' if (!detailHasProof || !editHasProof) mismatchedRows.push({ ...row, proofMissing: `${!detailHasProof ? "detail" : ""}${!detailHasProof && !editHasProof ? "," : ""}${!editHasProof ? "edit" : ""}` });',
2725
2751
  ' }',
2726
2752
  ' const pass = !missingNumbers.length && !mismatchedRows.length && !listMissing.length && !staleSeen.length && data.rows.length >= Math.max(expectedNumbers.length, 1);',
2727
2753
  ' const payload = { status: pass ? "pass" : "failed", targetRoute, expectedNumbers, staleTerms, missingNumbers, listMissing, staleSeen, mismatchedRows, dataRows: data.rows, artifacts, updated_at: new Date().toISOString() };',