{
  "version": 3,
  "sources": ["../../javascript/boot_check.js"],
  "sourcesContent": ["// Reports a page whose main bundle never started. A bundle that fails to\n// parse on an old browser takes controllers/error_reporter.js down with it:\n// every button is dead and the JS error log stays empty (docs/js-errors.md,\n// \"boot_check.js reports a bundle that never started\"). Every layout loads\n// this file before its main bundle. It sticks to ES2019 syntax at most on\n// purpose (no `?.`, `??`, class fields: Safari 13 to 16) so that it parses where\n// the bundle doesn't; eslint.config.mjs parses it at ecmaVersion 2019 to hold that.\n(function () {\n  const HOST_BUNDLE =\n    /\\/assets\\/(application|admin|booking|kiosk|pages|guides|public_share)(-[0-9a-f]{64})?\\.js$/;\n  const START_GRACE_MS = 3000;\n  let reported = false;\n  let loadFailed = false;\n\n  function pathOf(url) {\n    const link = document.createElement(\"a\");\n    link.href = url || \"\";\n    return link.pathname;\n  }\n\n  function hostBundle() {\n    const scripts = document.getElementsByTagName(\"script\");\n    for (let i = 0; i < scripts.length; i++) {\n      const path = scripts[i].src ? pathOf(scripts[i].src) : \"\";\n      if (HOST_BUNDLE.test(path)) return path;\n    }\n    return null;\n  }\n\n  function report(message, source, line, column) {\n    if (reported || window.gamerBooted || !source) return;\n    reported = true;\n\n    const request = new XMLHttpRequest();\n    request.open(\"POST\", \"/js_errors\");\n    request.setRequestHeader(\"Content-Type\", \"application/json\");\n    request.send(\n      JSON.stringify({\n        message: String(message || \"unknown\").slice(0, 500),\n        source: source,\n        line: line || null,\n        column: column || null,\n        stack: \"\",\n        page: window.location.pathname,\n      }),\n    );\n  }\n\n  window.addEventListener(\n    \"error\",\n    function (event) {\n      const target = event.target;\n      // A script that failed to download (network, blocker) is no bug of ours.\n      if (target && target.tagName === \"SCRIPT\") {\n        if (HOST_BUNDLE.test(pathOf(target.src))) loadFailed = true;\n        return;\n      }\n      // The parse error itself, with the browser's message, when the bundle's\n      // own reporter never got to run.\n      const source = pathOf(event.filename);\n      if (HOST_BUNDLE.test(source)) {\n        report(event.message, source, event.lineno, event.colno);\n      }\n    },\n    true,\n  );\n\n  window.addEventListener(\"load\", function () {\n    setTimeout(function () {\n      if (!loadFailed) report(\"Bundle did not start\", hostBundle(), 0, 0);\n    }, START_GRACE_MS);\n  });\n})();\n"],
  "mappings": "OAOC,UAAY,CACX,IAAMA,EACJ,6FAEEC,EAAW,GACXC,EAAa,GAEjB,SAASC,EAAOC,EAAK,CACnB,IAAMC,EAAO,SAAS,cAAc,GAAG,EACvC,OAAAA,EAAK,KAAOD,GAAO,GACZC,EAAK,QACd,CAEA,SAASC,GAAa,CACpB,IAAMC,EAAU,SAAS,qBAAqB,QAAQ,EACtD,QAASC,EAAI,EAAGA,EAAID,EAAQ,OAAQC,IAAK,CACvC,IAAMC,EAAOF,EAAQC,CAAC,EAAE,IAAML,EAAOI,EAAQC,CAAC,EAAE,GAAG,EAAI,GACvD,GAAIR,EAAY,KAAKS,CAAI,EAAG,OAAOA,CACrC,CACA,OAAO,IACT,CAEA,SAASC,EAAOC,EAASC,EAAQC,EAAMC,EAAQ,CAC7C,GAAIb,GAAY,OAAO,aAAe,CAACW,EAAQ,OAC/CX,EAAW,GAEX,IAAMc,EAAU,IAAI,eACpBA,EAAQ,KAAK,OAAQ,YAAY,EACjCA,EAAQ,iBAAiB,eAAgB,kBAAkB,EAC3DA,EAAQ,KACN,KAAK,UAAU,CACb,QAAS,OAAOJ,GAAW,SAAS,EAAE,MAAM,EAAG,GAAG,EAClD,OAAQC,EACR,KAAMC,GAAQ,KACd,OAAQC,GAAU,KAClB,MAAO,GACP,KAAM,OAAO,SAAS,QACxB,CAAC,CACH,CACF,CAEA,OAAO,iBACL,QACA,SAAUE,EAAO,CACf,IAAMC,EAASD,EAAM,OAErB,GAAIC,GAAUA,EAAO,UAAY,SAAU,CACrCjB,EAAY,KAAKG,EAAOc,EAAO,GAAG,CAAC,IAAGf,EAAa,IACvD,MACF,CAGA,IAAMU,EAAST,EAAOa,EAAM,QAAQ,EAChChB,EAAY,KAAKY,CAAM,GACzBF,EAAOM,EAAM,QAASJ,EAAQI,EAAM,OAAQA,EAAM,KAAK,CAE3D,EACA,EACF,EAEA,OAAO,iBAAiB,OAAQ,UAAY,CAC1C,WAAW,UAAY,CAChBd,GAAYQ,EAAO,uBAAwBJ,EAAW,EAAG,EAAG,CAAC,CACpE,EAAG,GAAc,CACnB,CAAC,CACH,GAAG",
  "names": ["HOST_BUNDLE", "reported", "loadFailed", "pathOf", "url", "link", "hostBundle", "scripts", "i", "path", "report", "message", "source", "line", "column", "request", "event", "target"]
}
