From 0b49fdbde11ec03c0347019b42d4b0d6127ab6c6 Mon Sep 17 00:00:00 2001 From: Sartxi Date: Wed, 5 Jun 2024 14:09:12 -0600 Subject: [PATCH 1/4] try catch in fetch to validate hostnames --- libs/blocks/locui/loc/index.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libs/blocks/locui/loc/index.js b/libs/blocks/locui/loc/index.js index 4c7c8a0fd7..ee69db7017 100644 --- a/libs/blocks/locui/loc/index.js +++ b/libs/blocks/locui/loc/index.js @@ -23,11 +23,20 @@ const urlParams = new URLSearchParams(window.location.search); let resourcePath; let previewPath; +async function validateUrl(url) { + try { + const request = await fetch(url.href); + return request; + } catch (error) { + return { ok: false, url: url.href }; + } +} + async function validatedUrls(projectUrls) { const validateUrls = [...projectUrls]; while (validateUrls.length) { try { - const reqs = await Promise.all(validateUrls.splice(0, 49).map((url) => fetch(url.href))); + const reqs = await Promise.all(validateUrls.splice(0, 49).map(validateUrl)); setStatus('details', 'info', 'Validating Project URLs'); for (const res of reqs) { const projectUrl = projectUrls.find((url) => url.href === res.url); From 018588ff67ced4de1221fd3df7b9d13f09b905c4 Mon Sep 17 00:00:00 2001 From: Sartxi Date: Thu, 6 Jun 2024 12:53:20 -0600 Subject: [PATCH 2/4] validate fragment paths --- libs/blocks/locui/actions/index.js | 9 +++++-- libs/blocks/locui/actions/modal.js | 38 ++++++++++++++++++++++-------- libs/blocks/locui/locui.css | 19 +++++++++++++++ libs/blocks/locui/status/view.js | 8 ++++--- 4 files changed, 59 insertions(+), 15 deletions(-) diff --git a/libs/blocks/locui/actions/index.js b/libs/blocks/locui/actions/index.js index 5fad6f1ac9..61fb3c8bdf 100644 --- a/libs/blocks/locui/actions/index.js +++ b/libs/blocks/locui/actions/index.js @@ -66,7 +66,7 @@ async function findPageFragments(path) { const isIndex = path.lastIndexOf('index'); const hlxPath = isIndex > 0 ? path.substring(0, isIndex) : path; const doc = await fetchDocument(hlxPath); - if (!doc) return []; + if (!doc) return undefined; // Decorate the doc, but don't load any blocks (i.e. do not use loadArea) decorateSections(doc, true); await decorateFooterPromo(doc); @@ -103,6 +103,11 @@ async function findDeepFragments(path) { const needsSearch = fragments.filter((fragment) => !searched.includes(fragment.pathname)); for (const search of needsSearch) { const nestedFragments = await findPageFragments(search.pathname); + if (nestedFragments === undefined) { + search.valid = false; + searched.push(search.pathname); + break; + } const newFragments = nestedFragments.filter((nested) => !searched.includes(nested.pathname) && !fragments.find((fragment) => fragment.pathname === nested.pathname)); if (newFragments?.length) fragments.push(...newFragments); @@ -121,7 +126,7 @@ export async function findFragments() { fragments.forEach((fragment) => { // De-dupe across pages that share fragments const dupe = acc.some((url) => url[0] === fragment.href); - if (!dupe) acc.push([fragment.href]); + if (!dupe) acc.push([fragment]); }); } return acc; diff --git a/libs/blocks/locui/actions/modal.js b/libs/blocks/locui/actions/modal.js index 7f4c48675c..6a5da7fe3e 100644 --- a/libs/blocks/locui/actions/modal.js +++ b/libs/blocks/locui/actions/modal.js @@ -5,12 +5,17 @@ import { closeActionModal, findFragments, syncFragsLangstore } from './index.js' function SyncFragments() { const [fragments, setFragments] = useState(undefined); + const [errors, setErrors] = useState(undefined); useEffect(() => { let cancelled = false; (async () => { - const find = await findFragments(); - if (!cancelled) setFragments(find); + const found = await findFragments(); + if (!cancelled) { + setFragments(found); + const invalid = found.filter((frag) => frag[0].valid !== undefined && !frag[0].valid); + setErrors(invalid.flat(1).map((err) => err.href)); + } })(); return () => { cancelled = true; }; }, []); @@ -26,9 +31,16 @@ function SyncFragments() { }; const locFragment = (fragment) => { - const disabled = !!urls.value.find((url) => url.href === fragment[0]); - const checked = syncFragments.value?.find((url) => url[0] === fragment[0]); - const url = new URL(fragment[0]); + const disabled = !!urls.value.find((url) => url.href === fragment[0].href); + const checked = syncFragments.value?.find((url) => url[0] === fragment[0].href); + const url = fragment[0]; + if (errors.includes(url.href)) { + return html` +
+ ${url.pathname} +
+ `; + } return html`
{ if (!fragments?.length) return ''; - const selected = syncFragments.value?.length === fragments?.length; - const toggle = () => { syncFragments.value = selected ? [] : fragments; }; + const validFragments = fragments?.filter((url) => !errors.includes(url[0].href)); + const selected = syncFragments.value?.length === validFragments?.length; + const toggle = () => { + syncFragments.value = selected ? [] : validFragments.map((fragment) => [fragment[0].href]); + }; return html`
`; }; const syncing = html`
Scanning project for un-synced fragments
`; - const allFound = html`
✓ All Fragments have been added to this project.
`; + const allFound = html`
✓ All valid fragments have been added to this project.
`; const fragmentStatus = fragments === undefined ? syncing : allFound; return html`
-
+
Un-synced fragments found in docs:
@@ -68,6 +83,9 @@ function SyncFragments() { ${selectAllButton()}
+ ${errors?.length ? html`
+ Some fragments returned errors during validation. To sync these fragments, please fix errors and try again. +
` : ''} `; } diff --git a/libs/blocks/locui/locui.css b/libs/blocks/locui/locui.css index 7a6c8be746..ddc0598944 100644 --- a/libs/blocks/locui/locui.css +++ b/libs/blocks/locui/locui.css @@ -649,6 +649,25 @@ button.locui-url-action-view { overflow-y: auto; } +.locui-fragment-errors { + color: red; + font-size: 16px; + font-style: italic; +} + +.error-label { + display: flex; + align-items: center; + gap: 4px; +} + +.error-label label { + color: red; + font-size: 12px; + font-weight: bold; + text-transform: uppercase; +} + .locui-fragment { cursor: pointer; display: flex; diff --git a/libs/blocks/locui/status/view.js b/libs/blocks/locui/status/view.js index 545b100a9b..5ce68efc01 100644 --- a/libs/blocks/locui/status/view.js +++ b/libs/blocks/locui/status/view.js @@ -23,9 +23,11 @@ export function renderLinks(str) { function renderDescription(description) { let message = description; - if (Array.isArray(description) && description.length > 1) { - message = html`
    ${description.map((desc) => html`
  1. ${renderLinks(desc)}
  2. `)}
`; - } else return renderLinks(message[0]); + if (Array.isArray(description)) { + if (description.length > 1) { + message = html`
    ${description.map((desc) => html`
  1. ${renderLinks(desc)}
  2. `)}
`; + } else return renderLinks(message[0]); + } return message; } From c350592096725fcd439472639712c8376938bbed Mon Sep 17 00:00:00 2001 From: Sartxi Date: Thu, 6 Jun 2024 13:51:53 -0600 Subject: [PATCH 3/4] select all logic --- libs/blocks/locui/actions/modal.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/blocks/locui/actions/modal.js b/libs/blocks/locui/actions/modal.js index 6a5da7fe3e..4bdc3e900f 100644 --- a/libs/blocks/locui/actions/modal.js +++ b/libs/blocks/locui/actions/modal.js @@ -55,10 +55,12 @@ function SyncFragments() { const selectAllButton = () => { if (!fragments?.length) return ''; const validFragments = fragments?.filter((url) => !errors.includes(url[0].href)); - const selected = syncFragments.value?.length === validFragments?.length; + const selected = syncFragments.value?.length + && syncFragments.value?.length === validFragments?.length; const toggle = () => { syncFragments.value = selected ? [] : validFragments.map((fragment) => [fragment[0].href]); }; + if (!validFragments?.length) return ''; return html`
Date: Fri, 7 Jun 2024 09:18:26 -0600 Subject: [PATCH 4/4] adjust url errors messaging --- libs/blocks/locui/actions/view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/blocks/locui/actions/view.js b/libs/blocks/locui/actions/view.js index f3550cb98b..47afb054c9 100644 --- a/libs/blocks/locui/actions/view.js +++ b/libs/blocks/locui/actions/view.js @@ -34,7 +34,7 @@ export default function Actions() {
- Please fix errors in project to proceed. + Some URLs returned errors during validation. To create this project, please fix errors and try again.