openstack-uicore-foundation 5.0.56 → 5.0.57-beta.1

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.
@@ -0,0 +1,23 @@
1
+ # Claude Code — resume checkpoint
2
+
3
+ Session: d2237004-7a96-4289-9c09-adda5e493f8d
4
+ Written: 2026-08-24T15:07:04.027Z
5
+ Trigger: near-limit
6
+ Ref with your in-progress files: refs/claude/checkpoint-d2237004
7
+
8
+ ## To resume
9
+
10
+ claude --resume d2237004-7a96-4289-9c09-adda5e493f8d
11
+
12
+ (or open Claude Code in this directory and run /resume)
13
+
14
+ ## Plan (from TodoWrite state)
15
+
16
+ No task list was active; see transcript via the resume command above.
17
+
18
+ ---
19
+
20
+ Don't want these changes? Resume this session (above), then run
21
+ `/rewind` to roll back the turn's tool edits (bash-made changes
22
+ excluded). refs/claude/checkpoint-d2237004 holds a full snapshot until this session's
23
+ next checkpoint, or for up to ~2 weeks.
@@ -0,0 +1,2 @@
1
+ !function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define("openstack-uicore-foundation",[],r):"object"==typeof exports?exports["openstack-uicore-foundation"]=r():e["openstack-uicore-foundation"]=r()}(this,(()=>(()=>{"use strict";var e={9558:(e,r,o)=>{o.d(r,{isSentryInitialized:()=>t});o(5812),o(8041);const t=()=>"undefined"!=typeof window&&!!window.SENTRY_DSN},5812:e=>{e.exports=require("moment-timezone")},8041:e=>{e.exports=require("urijs")}},r={};function o(t){var n=r[t];if(void 0!==n)return n.exports;var i=r[t]={exports:{}};return e[t](i,i.exports,o),i.exports}(()=>{o.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return o.d(r,{a:r}),r}})(),(()=>{o.d=(e,r)=>{for(var t in r)o.o(r,t)&&!o.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})}})(),(()=>{o.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r)})(),(()=>{o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}})();var t={};o.r(t),o.d(t,{chunkErrorSentryBeforeSend:()=>h,initChunkErrorRecovery:()=>w,isChunkLoadError:()=>c,isChunkReloadPending:()=>p,lazyWithReload:()=>g,reloadOnChunkError:()=>y});const n=require("react");var i=o.n(n);const a=require("@sentry/react");var s=o(9558);const d="uicore.chunk-load-error-reload-state",u="uicore.chunk-load-error-pending-confirmation",l=/[._-][0-9a-f]{8,}\.js(\?.*)?$/i,c=(e,r,o)=>(e=>Boolean(e)&&"ChunkLoadError"===e.name)(e)||((e,r,o=l)=>{const t=e&&e.message||("string"==typeof e?e:"");return!!(e&&"SyntaxError"===e.name||/SyntaxError/i.test(t))&&Boolean(r)&&o.test(r)})(e,r,o),f="undefined"!=typeof document?Array.from(document.scripts).map((e=>e.src)).filter(Boolean).sort().join(","):"",m=(e,r)=>{const o={level:"error",tags:{chunkErrorRecovery:"failed"},extra:{originalMessage:null==e?void 0:e.message,filename:r}};(0,s.isSentryInitialized)()?a.captureMessage("Chunk load error persisted after auto-reload",o):console.error("Chunk load error persisted after auto-reload",o)};let v=!1;const p=()=>v,y=(e,r,o)=>{if(!c(e,r,o))return!1;if(v)return!1;const t=(()=>f)(),n=(()=>{try{const e=window.sessionStorage.getItem(d);return e?JSON.parse(e):null}catch{return null}})();if(n&&n.build===t)return m(e,r),!1;if(!(e=>{try{return window.sessionStorage.setItem(d,JSON.stringify(e)),!0}catch{return!1}})({build:t}))return m(e,r),!1;v=!0;try{window.sessionStorage.setItem(u,"1")}catch{}return window.location.reload(),!0},g=e=>i().lazy((()=>e().catch((e=>{if(y(e,void 0)||p())return new Promise((()=>{}));throw e})))),w=e=>{(()=>{try{"1"===window.sessionStorage.getItem(u)&&(window.sessionStorage.removeItem(u),console.log("[lazy-with-reload] Recovered from a chunk load error via automatic reload"))}catch{}})();const r=r=>{y(r.reason,void 0,e)&&r.preventDefault()},o=r=>{const o=r.error||{message:r.message};y(o,r.filename,e)&&r.preventDefault()};return window.addEventListener("unhandledrejection",r),window.addEventListener("error",o),()=>{window.removeEventListener("unhandledrejection",r),window.removeEventListener("error",o)}},h=e=>{var r;return((null===(r=e.exception)||void 0===r?void 0:r.values)||[]).some((e=>c({name:e.type,message:e.value},(e=>{var r,o;const t=null===(r=e.stacktrace)||void 0===r?void 0:r.frames;return null!=t&&t.length?null===(o=t[t.length-1])||void 0===o?void 0:o.filename:void 0})(e))))&&p()?null:e};return t})()));
2
+ //# sourceMappingURL=lazy-with-reload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils/lazy-with-reload.js","mappings":"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","sources":["webpack://openstack-uicore-foundation/webpack/universalModuleDefinition","webpack://openstack-uicore-foundation/./src/utils/methods.js","webpack://openstack-uicore-foundation/external commonjs \"moment-timezone\"","webpack://openstack-uicore-foundation/external commonjs \"urijs\"","webpack://openstack-uicore-foundation/webpack/bootstrap","webpack://openstack-uicore-foundation/webpack/runtime/compat get default export","webpack://openstack-uicore-foundation/webpack/runtime/define property getters","webpack://openstack-uicore-foundation/webpack/runtime/hasOwnProperty shorthand","webpack://openstack-uicore-foundation/webpack/runtime/make namespace object","webpack://openstack-uicore-foundation/external commonjs \"react\"","webpack://openstack-uicore-foundation/external commonjs \"@sentry/react\"","webpack://openstack-uicore-foundation/./src/utils/lazy-with-reload.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"openstack-uicore-foundation\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"openstack-uicore-foundation\"] = factory();\n\telse\n\t\troot[\"openstack-uicore-foundation\"] = factory();\n})(this, () => {\nreturn ","/**\n * Copyright 2018 OpenStack Foundation\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n **/\n\nimport moment from 'moment-timezone';\nimport URI from \"urijs\";\n\nexport const findElementPos = (obj) => {\n var curtop = -70;\n if (obj.offsetParent) {\n do {\n curtop += obj.offsetTop;\n } while (obj = obj.offsetParent);\n return [curtop];\n }\n};\n\nexport const epochToMoment = (atime) => {\n if(!atime) return atime;\n atime = atime * 1000;\n return moment(atime);\n};\n\nexport const epochToMomentTimeZone = (atime, time_zone) => {\n if(!atime) return atime;\n atime = atime * 1000;\n return moment(atime).tz(time_zone);\n};\n\nexport const formatEpoch = (atime, format = 'M/D/YYYY h:mm a') => {\n if(!atime) return atime;\n return epochToMoment(atime).format(format);\n};\n\nexport const parseLocationHour = (hour) => {\n let parsedHour = hour.toString();\n if(parsedHour.length < 4) parsedHour = `0${parsedHour}`;\n parsedHour = parsedHour.match(/.{2}/g);\n parsedHour = parsedHour.join(':');\n return parsedHour;\n}\n\nexport const objectToQueryString = (obj) => {\n var str = \"\";\n for (var key in obj) {\n if (str != \"\") {\n str += \"&\";\n }\n str += key + \"=\" + encodeURIComponent(obj[key]);\n }\n\n return str;\n};\n\nexport const getBackURL = () => {\n let url = URI(window.location.href);\n let query = url.search(true);\n let fragment = url.fragment();\n let backUrl = query.hasOwnProperty('BackUrl') ? query['BackUrl'] : null;\n if(backUrl != null && fragment != null && fragment != ''){\n backUrl += `#${fragment}`;\n }\n return backUrl;\n};\n\nexport const toSlug = (text) =>{\n text = text.toLowerCase();\n return text.replace(/[^a-zA-Z0-9]+/g,'_');\n}\n\nexport const getAuthCallback = () => {\n if(typeof window !== 'undefined') {\n return `${window.location.origin}/auth/callback`;\n }\n return null;\n};\n\nexport const getCurrentLocation = () => {\n let location = '';\n if(typeof window !== 'undefined') {\n location = window.location;\n // check if we are on iframe\n if (window.top)\n location = window.top.location;\n }\n return location;\n};\n\nexport const getOrigin = () => {\n if(typeof window !== 'undefined') {\n return window.location.origin;\n }\n return null;\n};\n\nexport const getCurrentPathName = () => {\n if(typeof window !== 'undefined') {\n return window.location.pathname;\n }\n return null;\n};\n\nexport const getCurrentHref = () => {\n if(typeof window !== 'undefined') {\n return window.location.href;\n }\n return null;\n};\n\nexport const getAllowedUserGroups = () => {\n if(typeof window !== 'undefined') {\n return window.ALLOWED_USER_GROUPS || '';\n }\n return null;\n};\n\nexport const buildAPIBaseUrl = (relativeUrl) => {\n if(typeof window !== 'undefined'){\n return `${window.API_BASE_URL}${relativeUrl}`;\n }\n return null``;\n};\n\nexport const putOnLocalStorage = (key, value) => {\n if(typeof window !== 'undefined') {\n window.localStorage.setItem(key, value);\n }\n};\n\nexport const getFromLocalStorage = (key, removeIt) => {\n if(typeof window !== 'undefined') {\n let val = window.localStorage.getItem(key);\n if(removeIt){\n console.log(`getFromLocalStorage removing key ${key}`);\n removeFromLocalStorage(key);\n }\n return val;\n }\n return null;\n};\n\nexport const removeFromLocalStorage = (key) => {\n if(typeof window !== 'undefined') {\n window.localStorage.removeItem(key);\n }\n}\n\nexport const isClearingSessionState = () => {\n if(typeof window !== 'undefined') {\n return window.clearing_session_state;\n }\n return false;\n};\n\nexport const setSessionClearingState = (val) => {\n if(typeof window !== 'undefined') {\n window.clearing_session_state = val;\n }\n};\n\nexport const getCurrentUserLanguage = () => {\n let language = 'en';\n if(typeof navigator !== 'undefined') {\n language = (navigator.languages && navigator.languages[0]) || navigator.language || navigator.userLanguage;\n }\n return language;\n};\n\nexport const scrollToError = (errors) => {\n if(Object.keys(errors).length > 0) {\n const firstError = Object.keys(errors)[0];\n const firstNode = document.getElementById(firstError);\n if (firstNode) window.scrollTo(0, findElementPos(firstNode));\n }\n};\n\nexport const hasErrors = (field, errors) => {\n if(field in errors) {\n return errors[field];\n }\n return '';\n};\n\nexport const shallowEqual = (object1, object2) => {\n const keys1 = Object.keys(object1);\n const keys2 = Object.keys(object2);\n\n if (keys1.length !== keys2.length) {\n return false;\n }\n\n for (let key of keys1) {\n if (object1[key] !== object2[key]) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const arraysEqual = (a1, a2) =>\n a1.length === a2.length && a1.every((o, idx) => shallowEqual(o, a2[idx]));\n\nexport const isEmpty = (obj) => {\n return Object.keys(obj).length === 0;\n};\n\n\nexport const base64URLEncode = (str) => {\n return str\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '')\n}\n\nexport const retryPromise = async (\n cb,\n maxNumberOfRetries = 3\n) => {\n for (let i = 0; i < maxNumberOfRetries; i++) {\n if (await cb()) {\n return true;\n }\n }\n\n return false;\n}\n\nexport const getTimeServiceUrl = () => {\n if(typeof window !== 'undefined') {\n return window.TIMEINTERVALSINCE1970_API_URL || process.env.TIMEINTERVALSINCE1970_API_URL;\n }\n return null;\n};\n\nexport const getEventLocation = (event, summitVenueCount, summitShowLocDate = null, nowUtc = null) => {\n const shouldShowVenues = (summitShowLocDate && nowUtc) ? summitShowLocDate * 1000 < nowUtc : true;\n const locationName = [];\n const { location } = event;\n\n if (!shouldShowVenues) return 'TBA';\n\n if (!location) return 'TBA';\n\n if (summitVenueCount > 1 && location.venue?.name) locationName.push(location.venue.name);\n if (location.floor?.name) locationName.push(location.floor.name);\n if (location.name) locationName.push(location.name);\n\n return locationName.length > 0 ? locationName.join(' - ') : 'TBA';\n};\n\nexport const getEventHosts = (event) => {\n let hosts = [];\n if (event.speakers?.length > 0) {\n hosts = [...event.speakers];\n }\n if (event.moderator) hosts.push(event.moderator);\n\n return hosts;\n};\n\nconst loadImage = async url => {\n const img = document.createElement('img')\n img.src = url\n img.crossOrigin = 'anonymous'\n\n return new Promise((resolve, reject) => {\n img.onload = () => resolve(img)\n img.onerror = reject\n })\n}\n\nexport const convertSVGtoImg = async (svgUrl) => {\n const img = await loadImage(svgUrl)\n const newWidth = 100\n const newHeight = Math.floor(img.naturalHeight * 100 / img.naturalWidth)\n\n const canvas = document.createElement('canvas')\n canvas.width = newWidth\n canvas.height = newHeight\n canvas.getContext('2d').drawImage(img, 0, 0, newWidth, newHeight)\n\n const url = await canvas.toDataURL(`image/png`, 1.0)\n console.log(url, newWidth, newHeight);\n return {url, width: newWidth, height: newHeight}\n}\n\nexport const isRateEnabled = (value) =>\n value !== null && value !== undefined && value !== \"\";\n\n/**\n * Returns true if value is null, undefined, empty/whitespace string,\n * empty array, or empty object.\n */\nexport const empty = (value) => {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.trim().length === 0;\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") return Object.keys(value).length === 0;\n return false;\n};\n\nexport const isSentryInitialized = () => typeof window !== \"undefined\" && !!window.SENTRY_DSN;\n\nexport const normalizeHtmlString = (textInput) => {\n if (!textInput) return \"\";\n const doc = new DOMParser().parseFromString(textInput, \"text/html\");\n return doc.body.textContent.trim().length === 0 ? \"\" : textInput;\n};","module.exports = require(\"moment-timezone\");","module.exports = require(\"urijs\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@sentry/react\");","/**\n * Copyright 2026 OpenStack Foundation\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n **/\n\nimport React from \"react\";\nimport * as Sentry from \"@sentry/react\";\nimport { isSentryInitialized } from \"./methods\";\n\nconst RELOAD_STATE_KEY = \"uicore.chunk-load-error-reload-state\";\nconst PENDING_CONFIRMATION_KEY = \"uicore.chunk-load-error-pending-confirmation\";\n\n// webpack's own JSONP chunk-loading runtime hardcodes error.name = \"ChunkLoadError\"\n// on every chunk-load failure it detects through the import() promise - both a\n// genuine network 404 AND the \"script tag loaded (200 OK) but the expected chunk\n// never registered\" case, e.g. a stale content-hashed chunk URL falling through to\n// an SPA's index.html fallback. This is webpack's own intentional, stable\n// convention (see webpack/lib/web/JsonpChunkLoadingRuntimeModule.js), not a guess.\nconst isWebpackChunkLoadError = (error) =>\n Boolean(error) && error.name === \"ChunkLoadError\";\n\n// A stale chunk URL can 200 with the SPA's index.html instead of real JS,\n// which the browser throws as a SyntaxError parsing it as a script. We match\n// on error TYPE (stable across engines) plus a chunk-shaped filename, not\n// the message wording (e.g. \"Unexpected token '<'\" is V8-specific).\nconst DEFAULT_CHUNK_FILENAME_PATTERN = /[._-][0-9a-f]{8,}\\.js(\\?.*)?$/i;\n\nconst isHtmlParsedAsScriptError = (\n error,\n filename,\n chunkFilenamePattern = DEFAULT_CHUNK_FILENAME_PATTERN\n) => {\n const message = (error && error.message) || (typeof error === \"string\" ? error : \"\");\n // error.name is set when available; otherwise fall back to the word\n // \"SyntaxError\" in the flat message string (window.onerror without event.error).\n const looksLikeSyntaxError =\n (error && error.name === \"SyntaxError\") || /SyntaxError/i.test(message);\n if (!looksLikeSyntaxError) return false;\n return Boolean(filename) && chunkFilenamePattern.test(filename);\n};\n\nexport const isChunkLoadError = (error, filename, chunkFilenamePattern) =>\n isWebpackChunkLoadError(error) ||\n isHtmlParsedAsScriptError(error, filename, chunkFilenamePattern);\n\n// Fingerprints the statically-loaded <script> tags present the first time\n// this module runs on a given page load - i.e. before any lazy chunk has\n// been requested. This identifies \"which build is currently running\"\n// without requiring the consuming app to expose a dedicated build-version\n// global. Computed once and cached: document.scripts grows over time as\n// webpack's runtime appends a <script> tag for every lazy chunk that loads,\n// so reading it lazily-but-uncached would make the fingerprint drift within\n// a single build, not just across a real deploy.\nconst cachedBuildFingerprint =\n typeof document !== \"undefined\"\n ? Array.from(document.scripts)\n .map((s) => s.src)\n .filter(Boolean)\n .sort()\n .join(\",\")\n : \"\";\nconst getBuildFingerprint = () => cachedBuildFingerprint;\n\nconst readReloadState = () => {\n try {\n const raw = window.sessionStorage.getItem(RELOAD_STATE_KEY);\n return raw ? JSON.parse(raw) : null;\n } catch {\n return null;\n }\n};\n\nconst writeReloadState = (state) => {\n try {\n window.sessionStorage.setItem(RELOAD_STATE_KEY, JSON.stringify(state));\n return true;\n } catch {\n // sessionStorage can throw in some privacy modes - false tells the\n // caller the throttle couldn't persist, so it must not reload\n return false;\n }\n};\n\nconst reportRecoveryFailed = (error, filename) => {\n const context = {\n level: \"error\",\n tags: { chunkErrorRecovery: \"failed\" },\n extra: { originalMessage: error?.message, filename }\n };\n if (isSentryInitialized()) {\n Sentry.captureMessage(\"Chunk load error persisted after auto-reload\", context);\n } else {\n console.error(\"Chunk load error persisted after auto-reload\", context);\n }\n};\n\n// Reloads the page once per *build* when a lazy chunk fails to load\n// (typically a stale content-hashed filename after a deploy). Returns true\n// only when it actually triggers a *new* reload; false if this isn't a chunk\n// error, if a reload was already triggered earlier in this same page\n// lifecycle (see reloadTriggeredThisPage below - concurrent lazy chunks can\n// each reject in the same microtask drain, and window.location.reload()\n// doesn't halt JS, so a later same-tick failure must not re-run the\n// persisted-state check or file a false \"recovery failed\" report while the\n// first reload is still in flight), or if we already tried reloading once\n// for this same build on a *prior* page load - in the latter case a\n// distinct Sentry report is filed (see reportRecoveryFailed) and the caller\n// should let the error propagate normally instead of looping. Scoping the\n// persisted guard to the build (not just \"once this session\") means that if\n// a second deploy lands later in the same long-lived tab, a fresh failure\n// on that new build still gets its own reload attempt instead of being\n// silently blocked by an unrelated earlier recovery.\nlet reloadTriggeredThisPage = false;\nexport const isChunkReloadPending = () => reloadTriggeredThisPage;\nexport const reloadOnChunkError = (error, filename, chunkFilenamePattern) => {\n if (!isChunkLoadError(error, filename, chunkFilenamePattern)) return false;\n\n if (reloadTriggeredThisPage) return false;\n\n const currentBuild = getBuildFingerprint();\n const state = readReloadState();\n\n if (state && state.build === currentBuild) {\n reportRecoveryFailed(error, filename);\n return false;\n }\n\n if (!writeReloadState({ build: currentBuild })) {\n reportRecoveryFailed(error, filename);\n return false;\n }\n reloadTriggeredThisPage = true;\n try {\n window.sessionStorage.setItem(PENDING_CONFIRMATION_KEY, \"1\");\n } catch {\n // ignore - see readReloadState/writeReloadState\n }\n window.location.reload();\n return true;\n};\n\n// Logs (once) that a prior chunk-load-error reload actually took effect, so\n// it's easy to confirm in the console that this recovery path fired.\nconst confirmReloadIfPending = () => {\n try {\n if (window.sessionStorage.getItem(PENDING_CONFIRMATION_KEY) === \"1\") {\n window.sessionStorage.removeItem(PENDING_CONFIRMATION_KEY);\n // eslint-disable-next-line no-console\n console.log(\n \"[lazy-with-reload] Recovered from a chunk load error via automatic reload\"\n );\n }\n } catch {\n // ignore\n }\n};\n\n// Drop-in replacement for React.lazy(() => import(...)) that auto-recovers\n// from a stale-chunk failure by reloading the page once. On any other error,\n// or a repeat chunk failure after the reload already happened once for this\n// build, the error is rethrown so it still reaches the app's own error\n// boundary/fallback UI.\nexport const lazyWithReload = (importer) =>\n React.lazy(() =>\n importer().catch((error) => {\n if (\n reloadOnChunkError(error, undefined) ||\n isChunkReloadPending()\n ) {\n // reload is in flight - never resolve so nothing renders (e.g. an\n // error boundary flash) before it takes effect\n return new Promise(() => {});\n }\n throw error;\n })\n );\n\n// Fallback safety net for the raw SyntaxError case (see\n// isHtmlParsedAsScriptError above). Does NOT cover a bare React.lazy() inside\n// an error boundary; migrate those to lazyWithReload. Call once at app\n// bootstrap. Also\n// confirms (via console.log) whether a prior chunk-load-error reload\n// actually took effect, since this is the app's one designated bootstrap\n// entry point for this recovery mechanism.\nexport const initChunkErrorRecovery = (chunkFilenamePattern) => {\n confirmReloadIfPending();\n\n const onUnhandledRejection = (event) => {\n if (reloadOnChunkError(event.reason, undefined, chunkFilenamePattern)) {\n event.preventDefault();\n }\n };\n\n const onError = (event) => {\n const error = event.error || { message: event.message };\n if (reloadOnChunkError(error, event.filename, chunkFilenamePattern)) {\n event.preventDefault();\n }\n };\n\n window.addEventListener(\"unhandledrejection\", onUnhandledRejection);\n window.addEventListener(\"error\", onError);\n\n return () => {\n window.removeEventListener(\"unhandledrejection\", onUnhandledRejection);\n window.removeEventListener(\"error\", onError);\n };\n};\n\n// Sentry beforeSend hook: drops chunk-load-error events from being reported,\n// since a first-time occurrence is expected to self-heal via the reload\n// above. A repeat failure (reload didn't help) is reported separately and\n// explicitly via reportRecoveryFailed's Sentry.captureMessage call, which is\n// a message-type event (no .exception), so it is unaffected by this filter.\n// Sentry stack frames are ordered oldest-first; the last one is where the\n// exception was actually thrown - the only frame worth checking against\n// chunkFilenamePattern.\nconst getExceptionFilename = (exceptionValue) => {\n const frames = exceptionValue.stacktrace?.frames;\n return frames?.length ? frames[frames.length - 1]?.filename : undefined;\n};\n\nexport const chunkErrorSentryBeforeSend = (event) => {\n const exceptionValues = event.exception?.values || [];\n const matchesChunkError = exceptionValues.some((exceptionValue) =>\n isChunkLoadError(\n { name: exceptionValue.type, message: exceptionValue.value },\n getExceptionFilename(exceptionValue)\n )\n );\n return matchesChunkError && isChunkReloadPending() ? null : event;\n};\n"],"names":["root","factory","exports","module","define","amd","this","isSentryInitialized","window","SENTRY_DSN","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","RELOAD_STATE_KEY","PENDING_CONFIRMATION_KEY","DEFAULT_CHUNK_FILENAME_PATTERN","isChunkLoadError","error","filename","chunkFilenamePattern","Boolean","name","isWebpackChunkLoadError","isHtmlParsedAsScriptError","message","test","cachedBuildFingerprint","document","Array","from","scripts","map","s","src","filter","sort","join","reportRecoveryFailed","context","level","tags","chunkErrorRecovery","extra","originalMessage","Sentry","console","reloadTriggeredThisPage","isChunkReloadPending","reloadOnChunkError","currentBuild","getBuildFingerprint","state","readReloadState","raw","sessionStorage","getItem","JSON","parse","build","setItem","stringify","writeReloadState","location","reload","lazyWithReload","importer","React","catch","Promise","initChunkErrorRecovery","confirmReloadIfPending","removeItem","log","onUnhandledRejection","event","reason","preventDefault","onError","addEventListener","removeEventListener","chunkErrorSentryBeforeSend","_event$exception","exception","values","some","exceptionValue","type","_exceptionValue$stack","_frames","frames","stacktrace","length","getExceptionFilename"],"sourceRoot":""}