{"version":3,"file":"utils/url.mjs","sources":["../../src/utils/url.ts"],"sourcesContent":["import parse from 'url-parse';\nimport { Constants, Client } from '@rsdoctor/types';\n\nfunction setDefaultUrl(url: parse<Record<string, string | undefined>>) {\n  if (process.env.NODE_ENV !== 'development') {\n    const uri = parse(Constants.RsdoctorClientUrl, true);\n    url.set('origin', uri.origin);\n    url.set('protocol', uri.protocol);\n    url.set('host', uri.host);\n    url.set('pathname', uri.pathname);\n  }\n}\n\nfunction setUploaderHash(url: parse<Record<string, string | undefined>>) {\n  if (url.hash.endsWith(Client.RsdoctorClientRoutes.Uploader)) {\n    url.set('hash', Client.RsdoctorClientRoutes.Overall);\n  }\n}\n\nexport function isJsDataUrl(path: string) {\n  return path.startsWith('data:text/javascript;');\n}\n\nexport function getManifestUrlFromUrlQuery(): string | void {\n  const { query } = parse(location.href, true);\n  const url = query[Client.RsdoctorClientUrlQuery.ManifestFile];\n  if (url) {\n    return decodeURIComponent(url);\n  }\n}\n\nexport function getEnableRoutesFromUrlQuery(): string[] | void {\n  const { query } = parse(location.href, true);\n  let enableRoutesStr = query[Client.RsdoctorClientUrlQuery.EnableRoutes];\n\n  if (!enableRoutesStr && location.hash) {\n    const hashUrl = parse(location.hash, true);\n    enableRoutesStr = hashUrl.query[Client.RsdoctorClientUrlQuery.EnableRoutes];\n  }\n\n  // If still not found, try manual parsing of hash fragment\n  if (!enableRoutesStr && location.hash) {\n    const hashFragment = location.hash;\n    const queryIndex = hashFragment.indexOf('?');\n    if (queryIndex !== -1) {\n      const queryString = hashFragment.substring(queryIndex + 1);\n      const urlParams = new URLSearchParams(queryString);\n      enableRoutesStr =\n        urlParams.get(Client.RsdoctorClientUrlQuery.EnableRoutes) || undefined;\n    }\n  }\n\n  if (enableRoutesStr) {\n    try {\n      const result = JSON.parse(decodeURIComponent(enableRoutesStr));\n      return result;\n    } catch (err) {\n      console.warn('Failed to parse enableRoutes from URL query:', err);\n      return undefined;\n    }\n  }\n  return undefined;\n}\n\nexport function getSafeReportOrigin(origin: string) {\n  try {\n    const url = new URL(origin);\n\n    return ['http:', 'https:'].includes(url.protocol) ? url.origin : undefined;\n  } catch {\n    return undefined;\n  }\n}\n\nexport function changeOrigin(origin: string) {\n  const safeOrigin = getSafeReportOrigin(origin);\n  if (!safeOrigin) return undefined;\n\n  const url = parse(location.href, true);\n  const newUrl = parse(safeOrigin, true);\n\n  setUploaderHash(url);\n\n  url.set('origin', safeOrigin);\n  url.set('protocol', newUrl.protocol);\n  url.set('host', newUrl.host);\n  url.set('port', newUrl.port);\n\n  return url.toString();\n}\n\nexport function getSafeReportUrl(path: string, baseUrl: string) {\n  try {\n    const url = new URL(path, baseUrl);\n    const base = new URL(baseUrl);\n\n    if (base.protocol === 'file:') {\n      const hasControlCharacter = [...path].some((char) => {\n        const code = char.charCodeAt(0);\n        return code < 0x20 || code === 0x7f;\n      });\n      const isRelativePath =\n        path.trimStart() === path &&\n        !path.startsWith('/') &&\n        !path.includes('\\\\') &&\n        !/^[a-z][a-z\\d+.-]*:/i.test(path) &&\n        !hasControlCharacter;\n\n      return url.protocol === 'file:' &&\n        url.host === base.host &&\n        isRelativePath\n        ? url.href\n        : undefined;\n    }\n\n    if (\n      !['http:', 'https:'].includes(url.protocol) ||\n      url.origin !== base.origin\n    ) {\n      return undefined;\n    }\n\n    return url.href;\n  } catch {\n    return undefined;\n  }\n}\n\nexport function getSharingUrl(\n  manifestCloudUrl: string,\n  enableRoutes?: string[],\n) {\n  const url = parse(location.href, true);\n\n  setDefaultUrl(url);\n  setUploaderHash(url);\n\n  const query: Record<string, string> = {\n    ...url.query,\n    [Client.RsdoctorClientUrlQuery.ManifestFile]: manifestCloudUrl,\n  };\n\n  // Add enableRoutes to query if provided\n  if (enableRoutes && enableRoutes.length > 0) {\n    query[Client.RsdoctorClientUrlQuery.EnableRoutes] =\n      JSON.stringify(enableRoutes);\n  }\n\n  url.set('query', query);\n\n  return url.toString();\n}\n\nexport function getDemoUrl() {\n  if (process.env.OFFICIAL_DEMO_MANIFEST_PATH) {\n    return getSharingUrl(process.env.OFFICIAL_DEMO_MANIFEST_PATH);\n  }\n  return null;\n}\n\nexport const getShortPath = (path: string) => {\n  if (path?.indexOf('node_modules') >= 0) {\n    const pathArr = path.split('node_modules');\n    return `node_modules${pathArr[pathArr.length - 1]}`;\n  }\n  if (path?.length) {\n    return `${path?.split('/').slice(-4).join('/')}`;\n  }\n  return path;\n};\n\nexport function isDef<E = unknown>(data: E): data is NonNullable<E> {\n  return data !== undefined && data !== null;\n}\n"],"names":["setDefaultUrl","url","process","uri","parse","Constants","setUploaderHash","Client","isJsDataUrl","path","getManifestUrlFromUrlQuery","query","location","decodeURIComponent","getEnableRoutesFromUrlQuery","enableRoutesStr","hashUrl","hashFragment","queryIndex","queryString","urlParams","URLSearchParams","undefined","result","JSON","err","console","getSafeReportOrigin","origin","URL","changeOrigin","safeOrigin","newUrl","getSafeReportUrl","baseUrl","base","hasControlCharacter","char","code","isRelativePath","getSharingUrl","manifestCloudUrl","enableRoutes","getDemoUrl","getShortPath","pathArr","isDef","data"],"mappings":";;AAGA,SAASA,cAAcC,GAA8C;IACnE,IAAIC,AAAyB,kBAAzBA,QAAQ,GAAG,CAAC,QAAQ,EAAoB;QAC1C,MAAMC,MAAMC,UAAMC,UAAU,iBAAiB,EAAE;QAC/CJ,IAAI,GAAG,CAAC,UAAUE,IAAI,MAAM;QAC5BF,IAAI,GAAG,CAAC,YAAYE,IAAI,QAAQ;QAChCF,IAAI,GAAG,CAAC,QAAQE,IAAI,IAAI;QACxBF,IAAI,GAAG,CAAC,YAAYE,IAAI,QAAQ;IAClC;AACF;AAEA,SAASG,gBAAgBL,GAA8C;IACrE,IAAIA,IAAI,IAAI,CAAC,QAAQ,CAACM,OAAO,oBAAoB,CAAC,QAAQ,GACxDN,IAAI,GAAG,CAAC,QAAQM,OAAO,oBAAoB,CAAC,OAAO;AAEvD;AAEO,SAASC,YAAYC,IAAY;IACtC,OAAOA,KAAK,UAAU,CAAC;AACzB;AAEO,SAASC;IACd,MAAM,EAAEC,KAAK,EAAE,GAAGP,UAAMQ,SAAS,IAAI,EAAE;IACvC,MAAMX,MAAMU,KAAK,CAACJ,OAAO,sBAAsB,CAAC,YAAY,CAAC;IAC7D,IAAIN,KACF,OAAOY,mBAAmBZ;AAE9B;AAEO,SAASa;IACd,MAAM,EAAEH,KAAK,EAAE,GAAGP,UAAMQ,SAAS,IAAI,EAAE;IACvC,IAAIG,kBAAkBJ,KAAK,CAACJ,OAAO,sBAAsB,CAAC,YAAY,CAAC;IAEvE,IAAI,CAACQ,mBAAmBH,SAAS,IAAI,EAAE;QACrC,MAAMI,UAAUZ,UAAMQ,SAAS,IAAI,EAAE;QACrCG,kBAAkBC,QAAQ,KAAK,CAACT,OAAO,sBAAsB,CAAC,YAAY,CAAC;IAC7E;IAGA,IAAI,CAACQ,mBAAmBH,SAAS,IAAI,EAAE;QACrC,MAAMK,eAAeL,SAAS,IAAI;QAClC,MAAMM,aAAaD,aAAa,OAAO,CAAC;QACxC,IAAIC,AAAe,OAAfA,YAAmB;YACrB,MAAMC,cAAcF,aAAa,SAAS,CAACC,aAAa;YACxD,MAAME,YAAY,IAAIC,gBAAgBF;YACtCJ,kBACEK,UAAU,GAAG,CAACb,OAAO,sBAAsB,CAAC,YAAY,KAAKe;QACjE;IACF;IAEA,IAAIP,iBACF,IAAI;QACF,MAAMQ,SAASC,KAAK,KAAK,CAACX,mBAAmBE;QAC7C,OAAOQ;IACT,EAAE,OAAOE,KAAK;QACZC,QAAQ,IAAI,CAAC,gDAAgDD;IAE/D;AAGJ;AAEO,SAASE,oBAAoBC,MAAc;IAChD,IAAI;QACF,MAAM3B,MAAM,IAAI4B,IAAID;QAEpB,OAAO;YAAC;YAAS;SAAS,CAAC,QAAQ,CAAC3B,IAAI,QAAQ,IAAIA,IAAI,MAAM,GAAGqB;IACnE,EAAE,OAAM;QACN;IACF;AACF;AAEO,SAASQ,aAAaF,MAAc;IACzC,MAAMG,aAAaJ,oBAAoBC;IACvC,IAAI,CAACG,YAAY;IAEjB,MAAM9B,MAAMG,UAAMQ,SAAS,IAAI,EAAE;IACjC,MAAMoB,SAAS5B,UAAM2B,YAAY;IAEjCzB,gBAAgBL;IAEhBA,IAAI,GAAG,CAAC,UAAU8B;IAClB9B,IAAI,GAAG,CAAC,YAAY+B,OAAO,QAAQ;IACnC/B,IAAI,GAAG,CAAC,QAAQ+B,OAAO,IAAI;IAC3B/B,IAAI,GAAG,CAAC,QAAQ+B,OAAO,IAAI;IAE3B,OAAO/B,IAAI,QAAQ;AACrB;AAEO,SAASgC,iBAAiBxB,IAAY,EAAEyB,OAAe;IAC5D,IAAI;QACF,MAAMjC,MAAM,IAAI4B,IAAIpB,MAAMyB;QAC1B,MAAMC,OAAO,IAAIN,IAAIK;QAErB,IAAIC,AAAkB,YAAlBA,KAAK,QAAQ,EAAc;YAC7B,MAAMC,sBAAsB;mBAAI3B;aAAK,CAAC,IAAI,CAAC,CAAC4B;gBAC1C,MAAMC,OAAOD,KAAK,UAAU,CAAC;gBAC7B,OAAOC,OAAO,QAAQA,AAAS,SAATA;YACxB;YACA,MAAMC,iBACJ9B,KAAK,SAAS,OAAOA,QACrB,CAACA,KAAK,UAAU,CAAC,QACjB,CAACA,KAAK,QAAQ,CAAC,SACf,CAAC,sBAAsB,IAAI,CAACA,SAC5B,CAAC2B;YAEH,OAAOnC,AAAiB,YAAjBA,IAAI,QAAQ,IACjBA,IAAI,IAAI,KAAKkC,KAAK,IAAI,IACtBI,iBACEtC,IAAI,IAAI,GACRqB;QACN;QAEA,IACE,CAAC;YAAC;YAAS;SAAS,CAAC,QAAQ,CAACrB,IAAI,QAAQ,KAC1CA,IAAI,MAAM,KAAKkC,KAAK,MAAM,EAE1B;QAGF,OAAOlC,IAAI,IAAI;IACjB,EAAE,OAAM;QACN;IACF;AACF;AAEO,SAASuC,cACdC,gBAAwB,EACxBC,YAAuB;IAEvB,MAAMzC,MAAMG,UAAMQ,SAAS,IAAI,EAAE;IAEjCZ,cAAcC;IACdK,gBAAgBL;IAEhB,MAAMU,QAAgC;QACpC,GAAGV,IAAI,KAAK;QACZ,CAACM,OAAO,sBAAsB,CAAC,YAAY,CAAC,EAAEkC;IAChD;IAGA,IAAIC,gBAAgBA,aAAa,MAAM,GAAG,GACxC/B,KAAK,CAACJ,OAAO,sBAAsB,CAAC,YAAY,CAAC,GAC/CiB,KAAK,SAAS,CAACkB;IAGnBzC,IAAI,GAAG,CAAC,SAASU;IAEjB,OAAOV,IAAI,QAAQ;AACrB;AAEO,SAAS0C;IACd,IAAIzC,QAAQ,GAAG,CAAC,2BAA2B,EACzC,OAAOsC,cAActC,QAAQ,GAAG,CAAC,2BAA2B;IAE9D,OAAO;AACT;AAEO,MAAM0C,eAAe,CAACnC;IAC3B,IAAIA,MAAM,QAAQ,mBAAmB,GAAG;QACtC,MAAMoC,UAAUpC,KAAK,KAAK,CAAC;QAC3B,OAAO,CAAC,YAAY,EAAEoC,OAAO,CAACA,QAAQ,MAAM,GAAG,EAAE,EAAE;IACrD;IACA,IAAIpC,MAAM,QACR,OAAO,GAAGA,MAAM,MAAM,KAAK,MAAM,IAAI,KAAK,MAAM;IAElD,OAAOA;AACT;AAEO,SAASqC,MAAmBC,IAAO;IACxC,OAAOA,QAAAA;AACT"}