view x/static/js/7911.764ec401.chunk.js.map @ 127:fbabf7498471 draft

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit 116b1a4bbd62251ad552306df2dc8aa8f46c6721
author fubar
date Mon, 07 Oct 2024 02:11:55 +0000
parents 49f3d3878413
children
line wrap: on
line source

{"version":3,"file":"static/js/7911.764ec401.chunk.js","mappings":"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","sources":["../../../plugins/legacy-jbrowse/src/JBrowse1Connection/util.ts","../../../plugins/legacy-jbrowse/src/JBrowse1Connection/jb1ConfigParse.ts","../../../plugins/legacy-jbrowse/src/JBrowse1Connection/jb1ConfigLoad.ts","../../../node_modules/get-value/index.js","../../../node_modules/is-primitive/index.js","../../../node_modules/isobject/index.js","../../../node_modules/set-value/index.js","../../../node_modules/set-value/node_modules/is-plain-object/index.js"],"sourcesContent":["import getValue from 'get-value'\nimport { Track, Source } from './types'\n\nexport function isTrack(arg: any): arg is Track {\n  return arg?.label && typeof arg.label === 'string'\n}\n\nexport function isSource(arg: any): arg is Source {\n  return arg?.url && typeof arg.url === 'string'\n}\n\n/**\n * updates a with values from b, recursively\n */\n\ntype Obj = Record<string, any>\nexport function deepUpdate(a: Obj, b: Obj): Obj {\n  for (const prop of Object.keys(b)) {\n    if (\n      prop in a &&\n      typeof b[prop] === 'object' &&\n      typeof a[prop] === 'object'\n    ) {\n      deepUpdate(a[prop], b[prop])\n    } else if (a[prop] === undefined || b[prop] !== undefined) {\n      a[prop] = b[prop]\n    }\n  }\n  return a\n}\n\n/**\n * replace variables in a template string with values\n *\n * @param template - String with variable names in curly brackets\n * e.g., `http://foo/{bar}?arg={baz.foo}`\n * @param fillWith - object with attribute-value mappings\n * e.g., `{ 'bar': 'someurl', 'baz': { 'foo': 42 } }`\n * @returns the template string with variables in fillWith replaced\n * e.g., 'htp://foo/someurl?arg=valueforbaz'\n */\nexport function fillTemplate(template: string, fillWith: Obj): string {\n  return template.replaceAll(/{([\\s\\w.]+)}/g, (match, varName) => {\n    varName = varName.replaceAll(/\\s+/g, '')\n    const fill = getValue(fillWith, varName)\n    if (fill !== undefined) {\n      return typeof fill === 'function' ? fill(varName) : fill\n    }\n    if (fillWith.callback) {\n      // @ts-expect-error\n      const v = fillWith.callback.call(this, varName)\n      if (v !== undefined) {\n        return v\n      }\n    }\n    return match\n  })\n}\n\n/**\n * Clones objects (including DOM nodes) and all children.\n * Warning: do not clone cyclic structures\n * (Lifted from dojo https://github.com/dojo/dojo/blob/master/_base/lang.js)\n * @param src - The object to clone\n */\n\nexport function clone(src: any): any {\n  if (\n    !src ||\n    typeof src !== 'object' ||\n    Object.prototype.toString.call(src) === '[object Function]'\n  ) {\n    // null, undefined, any non-object, or function\n    return src // anything\n  }\n  if (src.nodeType && 'cloneNode' in src) {\n    // DOM Node\n    return src.cloneNode(true) // Node\n  }\n  if (src instanceof Date) {\n    // Date\n    return new Date(src.getTime()) // Date\n  }\n  if (src instanceof RegExp) {\n    // RegExp\n    return new RegExp(src) // RegExp\n  }\n  let r: unknown[]\n  if (Array.isArray(src)) {\n    // array\n    r = []\n    for (let i = 0, l = src.length; i < l; ++i) {\n      if (i in src) {\n        r[i] = clone(src[i])\n      }\n    }\n    // we don't clone functions for performance reasons\n    //    }else if(d.isFunction(src)){\n    //      // function\n    //      r = function(){ return src.apply(this, arguments); };\n  } else {\n    // generic objects\n    r = src.constructor ? new src.constructor() : {}\n  }\n  return mixin(r, src, clone)\n}\n\n/**\n * Copies/adds all properties of source to dest; returns dest.\n * (Lifted from dojo https://github.com/dojo/dojo/blob/master/_base/lang.js)\n *\n * All properties, including functions (sometimes termed \"methods\"), excluding\n * any non-standard extensions found in Object.prototype, are copied/added to\n * dest. Copying/adding each particular property is delegated to copyFunc\n * (if any); copyFunc defaults to the Javascript assignment operator if not\n * provided. Notice that by default, mixin executes a so-called \"shallow copy\"\n * and aggregate types are copied/added by reference.\n * @param dest - The object to which to copy/add all properties contained in\n * source.\n * @param source - The object from which to draw all properties to copy into dest.\n * @param copyFunc - The process used to copy/add a property in source; defaults\n * to the Javascript assignment operator.\n * @returns dest, as modified\n */\nfunction mixin(\n  dest: Obj,\n  source: Obj,\n  copyFunc?: (arg: unknown) => unknown,\n): Obj {\n  const empty = {}\n  for (const name in source) {\n    // the (!(name in empty) || empty[name] !== s) condition avoids copying\n    // properties in \"source\" inherited from Object.prototype.\t For example,\n    // if dest has a custom toString() method, don't overwrite it with the\n    // toString() method that source inherited from Object.prototype\n    const s = source[name]\n    if (\n      !(name in dest) ||\n      // @ts-expect-error\n      (dest[name] !== s && (!(name in empty) || empty[name] !== s))\n    ) {\n      dest[name] = copyFunc ? copyFunc(s) : s\n    }\n  }\n\n  return dest // Object\n}\n","/* eslint no-cond-assign: [\"error\", \"except-parens\"] */\nimport getValue from 'get-value'\nimport setValue from 'set-value'\nimport { objectHash } from '@jbrowse/core/util'\nimport { isSource, isTrack } from './util'\nimport { Config, Track, Source, Store, Names } from './types'\n\nexport function parseJB1Json(config: Config | string, url: string): Config {\n  if (typeof config === 'string') {\n    let parsedConf: Config\n    try {\n      parsedConf = JSON.parse(config)\n    } catch (error) {\n      throw new Error(`${error} when parsing configuration.`)\n    }\n    return regularizeConf(parsedConf, url)\n  }\n  return regularizeConf(config, url)\n}\n\nexport function parseJB1Conf(config: string, url: string): Config {\n  let parsedConf: Config\n  try {\n    parsedConf = parse(config, url)\n  } catch (error) {\n    throw new Error(`${error} when parsing configuration.`)\n  }\n  return regularizeConf(parsedConf, url)\n}\n\nfunction isAlwaysArray(varName: string): boolean {\n  if (varName === 'include') {\n    return true\n  }\n  return false\n}\n\nfunction parse(text: string, url: string): Config {\n  let section: string[] = []\n  let keyPath: string[] | undefined\n  let operation: string\n  let value: string | undefined\n  const data: Config = { tracks: {} }\n  let lineNumber: number\n\n  function recordVal(): void {\n    if (value !== undefined) {\n      let parsedValue:\n        | string\n        | number\n        | boolean\n        | string[]\n        | number[]\n        | boolean[]\n      try {\n        // parse json\n        const match = /^json:(.+)/i.exec(value)\n        if (match) {\n          parsedValue = JSON.parse(match[1]!)\n        }\n        // parse numbers if it looks numeric\n        else if (/^[+-]?[\\d.,]+([eE][-+]?\\d+)?$/.test(value)) {\n          parsedValue = Number.parseFloat(value.replaceAll(',', ''))\n        } else {\n          parsedValue = value\n        }\n\n        if (!keyPath) {\n          throw new Error(`Error parsing in section ${section.join(' - ')}`)\n        }\n        const path = [...section, ...keyPath].join('.')\n        if (operation === '+=') {\n          let existing = getValue(data, path)\n          if (existing) {\n            if (!Array.isArray(existing)) {\n              existing = [existing]\n            }\n          } else {\n            existing = []\n          }\n\n          existing.push(parsedValue)\n          parsedValue = existing\n        }\n        if (parsedValue === 'true') {\n          parsedValue = true\n        }\n        if (parsedValue === 'false') {\n          parsedValue = false\n        }\n        setValue(data, path, parsedValue)\n      } catch (e) {\n        throw new Error(\n          `syntax error${url ? ` in ${url}` : ''}${\n            lineNumber ? ` at line ${lineNumber - 1}` : ''\n          }`,\n        )\n      }\n    }\n  }\n\n  text.split(/\\n|\\r\\n|\\r/).forEach((textLine, i): void => {\n    lineNumber = i + 1\n    const line = textLine.replace(/^\\s*#.+/, '')\n\n    // new section\n    let match: RegExpMatchArray | null\n    if ((match = /^\\s*\\[([^\\]]+)/.exec(line))) {\n      // new section\n      recordVal()\n      keyPath = undefined\n      value = undefined\n      section = match[1]!.trim().split(/\\s*\\.\\s*/)\n      if (section.length === 1 && section[0]!.toLowerCase() === 'general') {\n        section = []\n      }\n    }\n    // new value\n    else if (\n      (match = line.match(\n        value === undefined ? /^([^+=]+)(\\+?=)(.*)/ : /^(\\S[^+=]+)(\\+?=)(.*)/,\n      ))\n    ) {\n      recordVal()\n      keyPath = match[1]!.trim().split(/\\s*\\.\\s*/)\n      // @ts-expect-error\n      ;[, , operation] = match\n      if (isAlwaysArray([...section, ...keyPath].join('.'))) {\n        operation = '+='\n      }\n      value = match[3]!.trim()\n    }\n    // add to existing array value\n    else if (\n      keyPath !== undefined &&\n      (match = /^\\s{0,4}\\+\\s*(.+)/.exec(line))\n    ) {\n      recordVal()\n      operation = '+='\n      value = match[1]!.trim()\n    }\n    // add to existing value\n    else if (value !== undefined && (match = /^\\s+(\\S.*)/.exec(line))) {\n      const m = match[1]!\n      value += value.length ? ` ${m.trim()}` : m.trim()\n    }\n    // done with last value\n    else {\n      recordVal()\n      keyPath = undefined\n      value = undefined\n    }\n  })\n\n  recordVal()\n\n  return data\n}\n\n/**\n * Applies defaults and any other necessary tweaks to the loaded configuration.\n * @param conf - the object containing the configuration, which it modifies\n * in-place\n * @param url - URL of the config file\n * @returns the same object it was passed\n */\nexport function regularizeConf(conf: Config, url: string): Config {\n  // if tracks is not an array, convert it to one\n  if (conf.tracks && !Array.isArray(conf.tracks)) {\n    // if it's a single track config, wrap it in an arrayref\n    if (isTrack(conf.tracks)) {\n      conf.tracks = [conf.tracks]\n    }\n    // otherwise, coerce it to an array\n    else {\n      const tracks: Track[] = []\n      for (const label of Object.keys(conf.tracks)) {\n        const track = conf.tracks[label]\n        if (isTrack(track)) {\n          tracks.push(track)\n        } else {\n          tracks.push({ label, ...track })\n        }\n      }\n      conf.tracks = tracks\n    }\n  }\n\n  // regularize trackMetadata.sources\n  const meta = conf.trackMetadata\n  if (meta?.sources) {\n    // if it's a single source config, wrap it in an arrayref\n    if (typeof meta.sources === 'string') {\n      meta.sources = [meta.sources]\n    }\n    if (isSource(meta.sources)) {\n      meta.sources = [meta.sources]\n    }\n\n    if (!Array.isArray(meta.sources)) {\n      const sources: Source[] = []\n      for (const name of Object.keys(meta.sources)) {\n        const source = meta.sources[name]!\n        if (!('name' in source)) {\n          source.name = name\n        }\n        sources.push(source)\n      }\n      meta.sources = sources\n    }\n\n    // coerce any string source defs to be URLs, and try to detect their types\n    meta.sources = meta.sources.map((sourceDef: string | Source): Source => {\n      if (typeof sourceDef === 'string') {\n        const newSourceDef: Source = { url: sourceDef }\n        const typeMatch = /\\.(\\w+)$/.exec(sourceDef)\n        if (typeMatch) {\n          newSourceDef.type = typeMatch[1]!.toLowerCase()\n        }\n        return newSourceDef\n      }\n      return sourceDef\n    })\n  }\n\n  conf.sourceUrl = conf.sourceUrl || url\n  if (conf.sourceUrl.startsWith('/')) {\n    conf.sourceUrl = new URL(conf.sourceUrl, window.location.href).href\n  }\n  conf.baseUrl = conf.baseUrl || new URL('.', conf.sourceUrl).href\n  if (conf.baseUrl.length && !conf.baseUrl.endsWith('/')) {\n    conf.baseUrl += '/'\n  }\n\n  if (conf.sourceUrl) {\n    // set a default baseUrl in each of the track and store confs, and the names\n    // conf, if needed\n    const addBase: (Track | Store | Names)[] = []\n    if (conf.tracks) {\n      addBase.push(...conf.tracks)\n    }\n    if (conf.stores) {\n      addBase.push(...Object.values(conf.stores))\n    }\n    if (conf.names) {\n      addBase.push(conf.names)\n    }\n\n    addBase.forEach((t): void => {\n      if (!t.baseUrl) {\n        t.baseUrl = conf.baseUrl || '/'\n      }\n    })\n\n    // resolve the refSeqs and nameUrl if present\n    if (conf.refSeqs && typeof conf.refSeqs === 'string') {\n      conf.refSeqs = new URL(conf.refSeqs, conf.sourceUrl).href\n    }\n    if (conf.nameUrl) {\n      conf.nameUrl = new URL(conf.nameUrl, conf.sourceUrl).href\n    }\n  }\n\n  conf.stores = conf.stores || {}\n  ;(conf.tracks || []).forEach((trackConfig: Track): void => {\n    // if there is a `config` subpart, just copy its keys in to the top-level\n    // config\n    if (trackConfig.config) {\n      const c = trackConfig.config\n      trackConfig.config = undefined\n      trackConfig = { ...c, ...trackConfig }\n    }\n\n    // skip if it's a new-style track def\n    if (trackConfig.store) {\n      return\n    }\n\n    let trackClassName: string\n    if (trackConfig.type === 'FeatureTrack') {\n      trackClassName = 'JBrowse/View/Track/HTMLFeatures'\n    } else if (trackConfig.type === 'ImageTrack') {\n      trackClassName = 'JBrowse/View/Track/FixedImage'\n    } else if (trackConfig.type === 'ImageTrack.Wiggle') {\n      trackClassName = 'JBrowse/View/Track/FixedImage/Wiggle'\n    } else if (trackConfig.type === 'SequenceTrack') {\n      trackClassName = 'JBrowse/View/Track/Sequence'\n    } else {\n      trackClassName = regularizeClass('JBrowse/View/Track', trackConfig.type)\n    }\n\n    trackConfig.type = trackClassName\n\n    synthesizeTrackStoreConfig(conf, trackConfig)\n\n    if (trackConfig.histograms) {\n      if (!trackConfig.histograms.baseUrl) {\n        trackConfig.histograms.baseUrl = trackConfig.baseUrl\n      }\n      synthesizeTrackStoreConfig(conf, trackConfig.histograms)\n    }\n  })\n\n  return conf\n}\n\n/**\n * prefix class name with `root` if it contains no slashes\n * @param root - Prefix root\n * @param className - class name\n */\nfunction regularizeClass(root: string, className: string | undefined): string {\n  if (!className) {\n    return ''\n  }\n  if (!className.includes('/')) {\n    className = `${root}/${className}`\n  }\n  className = className.replace(/^\\//, '')\n  return className\n}\n\nfunction guessStoreClass(\n  trackConfig: Track | undefined,\n  urlTemplate: string,\n): string {\n  if (!trackConfig) {\n    return ''\n  }\n  if (trackConfig.type?.includes('/FixedImage')) {\n    return `JBrowse/Store/TiledImage/Fixed${\n      trackConfig.backendVersion === 0 ? '_v0' : ''\n    }`\n  }\n  if (/\\.jsonz?$/i.test(urlTemplate)) {\n    return `JBrowse/Store/SeqFeature/NCList${\n      trackConfig.backendVersion === 0 ? '_v0' : ''\n    }`\n  }\n  if (/\\.bam$/i.test(urlTemplate)) {\n    return 'JBrowse/Store/SeqFeature/BAM'\n  }\n  if (/\\.cram$/i.test(urlTemplate)) {\n    return 'JBrowse/Store/SeqFeature/CRAM'\n  }\n  if (/\\.gff3?$/i.test(urlTemplate)) {\n    return 'JBrowse/Store/SeqFeature/GFF3'\n  }\n  if (/\\.bed$/i.test(urlTemplate)) {\n    return 'JBrowse/Store/SeqFeature/BED'\n  }\n  if (/\\.vcf.b?gz$/i.test(urlTemplate)) {\n    return 'JBrowse/Store/SeqFeature/VCFTabix'\n  }\n  if (/\\.gff3?.b?gz$/i.test(urlTemplate)) {\n    return 'JBrowse/Store/SeqFeature/GFF3Tabix'\n  }\n  if (/\\.bed.b?gz$/i.test(urlTemplate)) {\n    return 'JBrowse/Store/SeqFeature/BEDTabix'\n  }\n  if (/\\.(bw|bigwig)$/i.test(urlTemplate)) {\n    return 'JBrowse/Store/SeqFeature/BigWig'\n  }\n  if (/\\.(bb|bigbed)$/i.test(urlTemplate)) {\n    return 'JBrowse/Store/SeqFeature/BigBed'\n  }\n  if (/\\.(fa|fasta)$/i.test(urlTemplate)) {\n    return 'JBrowse/Store/SeqFeature/IndexedFasta'\n  }\n  if (/\\.(fa|fasta)\\.b?gz$/i.test(urlTemplate)) {\n    return 'JBrowse/Store/SeqFeature/BgzipIndexedFasta'\n  }\n  if (/\\.2bit$/i.test(urlTemplate)) {\n    return 'JBrowse/Store/SeqFeature/TwoBit'\n  }\n  if (trackConfig.type?.endsWith('/Sequence')) {\n    return 'JBrowse/Store/Sequence/StaticChunked'\n  }\n  return ''\n}\n\nfunction synthesizeTrackStoreConfig(\n  mainConf: Config,\n  trackConfig: Track,\n): void {\n  // figure out what data store class to use with the track, applying some\n  // defaults if it is not explicit in the configuration\n  const { urlTemplate = '' } = trackConfig\n\n  const storeClass = trackConfig.storeClass\n    ? regularizeClass('JBrowse/Store', trackConfig.storeClass)\n    : guessStoreClass(trackConfig, urlTemplate)\n\n  if (!storeClass) {\n    console.warn(\n      `Unable to determine an appropriate data store to use with track '${trackConfig.label}', please explicitly specify a storeClass in the configuration.`,\n    )\n    return\n  }\n\n  // synthesize a separate store conf\n  const storeConf: Store = { ...trackConfig, type: storeClass }\n\n  // if this is the first sequence store we see, and we have no refseqs store\n  // defined explicitly, make this the refseqs store.\n  storeConf.name =\n    (storeClass === 'JBrowse/Store/Sequence/StaticChunked' ||\n      storeClass === 'JBrowse/Store/Sequence/IndexedFasta' ||\n      storeClass === 'JBrowse/Store/SeqFeature/IndexedFasta' ||\n      storeClass === 'JBrowse/Store/SeqFeature/BgzipIndexedFasta' ||\n      storeClass === 'JBrowse/Store/SeqFeature/TwoBit' ||\n      storeClass === 'JBrowse/Store/Sequence/TwoBit' ||\n      trackConfig.useAsRefSeqStore) &&\n    !mainConf.stores?.refseqs\n      ? 'refseqs'\n      : `store${objectHash(storeConf)}`\n  // record it\n  if (!mainConf.stores) {\n    mainConf.stores = {}\n  }\n  mainConf.stores[storeConf.name] = storeConf\n\n  // connect it to the track conf\n  trackConfig.store = storeConf.name\n}\n","import { openLocation } from '@jbrowse/core/util/io'\nimport { parseJB1Json, parseJB1Conf, regularizeConf } from './jb1ConfigParse'\nimport { clone, deepUpdate, fillTemplate } from './util'\nimport {\n  JBLocation,\n  UriLocation,\n  LocalPathLocation,\n  Config,\n  Track,\n  Include,\n} from './types'\n\nfunction isUriLocation(location: JBLocation): location is UriLocation {\n  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n  return (location as UriLocation).uri !== undefined\n}\n\nfunction isLocalPathLocation(\n  location: JBLocation,\n): location is LocalPathLocation {\n  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n  return (location as LocalPathLocation).localPath !== undefined\n}\n\nexport async function fetchJb1(\n  // eslint-disable-next-line unicorn/no-object-as-default-parameter\n  dataRoot: JBLocation = { uri: '', locationType: 'UriLocation' },\n  // eslint-disable-next-line unicorn/no-object-as-default-parameter\n  baseConfig: Config = {\n    include: ['{dataRoot}/trackList.json', '{dataRoot}/tracks.conf'],\n  },\n  // eslint-disable-next-line unicorn/no-object-as-default-parameter\n  baseConfigRoot: JBLocation = { uri: '', locationType: 'UriLocation' },\n): Promise<Config> {\n  const protocol = 'uri' in dataRoot ? 'uri' : 'localPath'\n  const dataRootReg = JSON.parse(JSON.stringify(dataRoot))\n  let dataRootLocation = ''\n  if (isUriLocation(dataRoot)) {\n    dataRootLocation = dataRoot.uri\n  }\n  if (isLocalPathLocation(dataRoot)) {\n    dataRootLocation = dataRoot.localPath\n  }\n  if (dataRootLocation.endsWith('/')) {\n    dataRootReg[protocol] = dataRootLocation.slice(0, -1)\n  }\n  if (\n    (isUriLocation(baseConfigRoot) && baseConfigRoot.uri) ||\n    (isLocalPathLocation(baseConfigRoot) && baseConfigRoot.localPath)\n  ) {\n    const baseProtocol = 'uri' in baseConfigRoot ? 'uri' : 'localPath'\n    let baseConfigLocation = ''\n    if (isUriLocation(baseConfigRoot)) {\n      baseConfigLocation = baseConfigRoot.uri\n    }\n    if (isLocalPathLocation(baseConfigRoot)) {\n      baseConfigLocation = baseConfigRoot.localPath\n    }\n    if (baseConfigLocation.endsWith('/')) {\n      baseConfigLocation = baseConfigLocation.slice(0, -1)\n    }\n    let newConfig: Config = {}\n    for (const conf of ['jbrowse.conf', 'jbrowse_conf.json']) {\n      let fetchedConfig = null\n      try {\n        // @ts-expect-error\n        fetchedConfig = await fetchConfigFile({\n          [baseProtocol]: `${baseConfigLocation}/${conf}`,\n        })\n      } catch (error) {\n        console.error(\n          `tried to access ${baseConfigLocation}/${conf}, but failed`,\n        )\n      }\n      newConfig = mergeConfigs(newConfig, fetchedConfig) || {}\n    }\n    if (dataRootReg[protocol]) {\n      newConfig.dataRoot = dataRootReg[protocol]\n    }\n    return createFinalConfig(newConfig)\n  }\n  const newConfig = regularizeConf(baseConfig, window.location.href)\n  if (dataRootReg[protocol]) {\n    newConfig.dataRoot = dataRootReg[protocol]\n  }\n  return createFinalConfig(newConfig)\n}\n\nexport async function createFinalConfig(\n  baseConfig: Config,\n  defaults = configDefaults,\n): Promise<Config> {\n  const configWithDefaults = deepUpdate(clone(defaults), baseConfig)\n  let finalConfig = await loadIncludes(configWithDefaults)\n  finalConfig = mergeConfigs(finalConfig, baseConfig) || finalConfig\n  fillTemplates(finalConfig, finalConfig)\n  validateConfig(finalConfig)\n  return finalConfig\n}\n\nexport async function fetchConfigFile(location: JBLocation): Promise<Config> {\n  const result = await openLocation(location).readFile('utf8')\n  if (isUriLocation(location)) {\n    return parseJb1(result, location.uri)\n  }\n  if (isLocalPathLocation(location)) {\n    return parseJb1(result, location.localPath)\n  }\n  return parseJb1(result)\n}\n\nexport function parseJb1(config: string, url = ''): Config {\n  if (config.trim().startsWith('{')) {\n    return parseJB1Json(config, url)\n  }\n  return parseJB1Conf(config, url)\n}\n\n/**\n * Merges config object b into a. Properties in b override those in a.\n */\nfunction mergeConfigs(a: Config | null, b: Config | null): Config | null {\n  if (b === null) {\n    return null\n  }\n\n  if (a === null) {\n    a = {}\n  }\n\n  for (const prop of Object.keys(b)) {\n    if (prop === 'tracks' && prop in a) {\n      const aTracks = a[prop] || []\n      const bTracks = b[prop] || []\n\n      if (Array.isArray(aTracks) && Array.isArray(bTracks)) {\n        a[prop] = mergeTrackConfigs(aTracks, bTracks)\n      } else {\n        throw new Error(\n          `Track config has not been properly regularized: ${aTracks} ${bTracks}`,\n        )\n      }\n    } else if (\n      !noRecursiveMerge(prop) &&\n      prop in a &&\n      // @ts-expect-error\n      typeof b[prop] === 'object' &&\n      // @ts-expect-error\n      typeof a[prop] === 'object'\n    ) {\n      // @ts-expect-error\n      a[prop] = deepUpdate(a[prop], b[prop])\n    } else if (prop === 'dataRoot') {\n      if (\n        a[prop] === undefined ||\n        (a[prop] === 'data' && b[prop] !== undefined)\n      ) {\n        a[prop] = b[prop]\n      }\n      // @ts-expect-error\n    } else if (a[prop] === undefined || b[prop] !== undefined) {\n      // @ts-expect-error\n      a[prop] = b[prop]\n    }\n  }\n  return a\n}\n\n/**\n * Special-case merging of two `tracks` configuration arrays.\n */\nfunction mergeTrackConfigs(a: Track[], b: Track[]): Track[] {\n  if (!b.length) {\n    return a\n  }\n\n  // index the tracks in `a` by track label\n  const aTracks: Record<string, Track> = {}\n  a.forEach((t, i): void => {\n    t.index = i\n    aTracks[t.label] = t\n  })\n\n  b.forEach((bT): void => {\n    const aT = aTracks[bT.label]\n    if (aT) {\n      mergeConfigs(aT, bT)\n    } else {\n      a.push(bT)\n    }\n  })\n\n  return a\n}\n\n/**\n * Recursively fetch, parse, and merge all the includes in the given config\n * object.  Calls the callback with the resulting configuration when finished.\n * @param inputConfig - Config to load includes into\n */\nasync function loadIncludes(inputConfig: Config): Promise<Config> {\n  inputConfig = clone(inputConfig)\n\n  async function loadRecur(\n    config: Config,\n    upstreamConf: Config,\n  ): Promise<Config> {\n    const sourceUrl = config.sourceUrl || config.baseUrl\n    if (!sourceUrl) {\n      throw new Error(\n        `Could not determine source URL: ${JSON.stringify(config)}`,\n      )\n    }\n    const newUpstreamConf = mergeConfigs(clone(upstreamConf), config)\n    if (!newUpstreamConf) {\n      throw new Error('Problem merging configs')\n    }\n    const includes = fillTemplates(\n      regularizeIncludes(config.include || []),\n      newUpstreamConf,\n    )\n    config.include = undefined\n\n    const loads = includes.map(async (include): Promise<Config> => {\n      include.cacheBuster = inputConfig.cacheBuster\n      const includedData = await fetchConfigFile({\n        uri: new URL(include.url, sourceUrl).href,\n        locationType: 'UriLocation',\n      })\n      return loadRecur(includedData, newUpstreamConf)\n    })\n    const includedDataObjects = await Promise.all(loads)\n    includedDataObjects.forEach((includedData): void => {\n      config = mergeConfigs(config, includedData) || config\n    })\n    return config\n  }\n\n  return loadRecur(inputConfig, {})\n}\n\nfunction regularizeIncludes(\n  includes: Include | string | (Include | string)[] | null,\n): Include[] {\n  if (!includes) {\n    return []\n  }\n\n  // coerce include to an array\n  if (!Array.isArray(includes)) {\n    includes = [includes]\n  }\n\n  return includes.map((include): Include => {\n    // coerce bare strings in the includes to URLs\n    if (typeof include === 'string') {\n      include = { url: include }\n    }\n\n    // set defaults for format and version\n    if (!('format' in include)) {\n      include.format = include.url.endsWith('.conf') ? 'conf' : 'JB_json'\n    }\n    if (include.format === 'JB_json' && !('version' in include)) {\n      include.version = 1\n    }\n    return include\n  })\n}\n\nfunction fillTemplates<T>(subconfig: T, config: Config): T {\n  if (!subconfig) {\n    return subconfig\n  }\n  if (Array.isArray(subconfig)) {\n    for (let i = 0; i < subconfig.length; i += 1) {\n      subconfig[i] = fillTemplates(subconfig[i], config)\n    }\n  } else if (typeof subconfig === 'object') {\n    const sub = subconfig as Record<string, any>\n    for (const name of Object.keys(sub)) {\n      sub[name] = fillTemplates(sub[name], config)\n    }\n  } else if (typeof subconfig === 'string') {\n    // @ts-expect-error\n    return fillTemplate(subconfig, config)\n  }\n\n  return subconfig\n}\n\n/**\n * list of config properties that should not be recursively merged\n * @param propName - name of config property\n */\nfunction noRecursiveMerge(propName: string): boolean {\n  return propName === 'datasets'\n}\n\nconst configDefaults = {\n  tracks: [],\n\n  containerID: 'GenomeBrowser',\n  dataRoot: 'data',\n  show_tracklist: true,\n  show_nav: true,\n  show_menu: true,\n  show_overview: true,\n  show_fullviewlink: true,\n  update_browser_title: true,\n  updateBrowserURL: true,\n\n  refSeqs: '{dataRoot}/seq/refSeqs.json',\n  include: ['jbrowse.conf', 'jbrowse_conf.json'],\n  nameUrl: '{dataRoot}/names/root.json',\n\n  datasets: {\n    _DEFAULT_EXAMPLES: true,\n    volvox: { url: '?data=sample_data/json/volvox', name: 'Volvox Example' },\n    modencode: {\n      url: '?data=sample_data/json/modencode',\n      name: 'MODEncode Example',\n    },\n    yeast: { url: '?data=sample_data/json/yeast', name: 'Yeast Example' },\n  },\n\n  highlightSearchedRegions: false,\n  highResolutionMode: 'auto',\n}\n\n/**\n * Examine the loaded and merged configuration for errors.  Throws\n * exceptions if it finds anything amiss.\n * @returns nothing meaningful\n */\nfunction validateConfig(config: Config): void {\n  if (!config.tracks) {\n    config.tracks = []\n  }\n  if (!config.baseUrl) {\n    throw new Error('Must provide a `baseUrl` in configuration')\n  }\n}\n","/*!\n * get-value <https://github.com/jonschlinkert/get-value>\n *\n * Copyright (c) 2014-2018, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nconst isObject = require('isobject');\n\nmodule.exports = function(target, path, options) {\n  if (!isObject(options)) {\n    options = { default: options };\n  }\n\n  if (!isValidObject(target)) {\n    return typeof options.default !== 'undefined' ? options.default : target;\n  }\n\n  if (typeof path === 'number') {\n    path = String(path);\n  }\n\n  const isArray = Array.isArray(path);\n  const isString = typeof path === 'string';\n  const splitChar = options.separator || '.';\n  const joinChar = options.joinChar || (typeof splitChar === 'string' ? splitChar : '.');\n\n  if (!isString && !isArray) {\n    return target;\n  }\n\n  if (isString && path in target) {\n    return isValid(path, target, options) ? target[path] : options.default;\n  }\n\n  let segs = isArray ? path : split(path, splitChar, options);\n  let len = segs.length;\n  let idx = 0;\n\n  do {\n    let prop = segs[idx];\n    if (typeof prop === 'number') {\n      prop = String(prop);\n    }\n\n    while (prop && prop.slice(-1) === '\\\\') {\n      prop = join([prop.slice(0, -1), segs[++idx] || ''], joinChar, options);\n    }\n\n    if (prop in target) {\n      if (!isValid(prop, target, options)) {\n        return options.default;\n      }\n\n      target = target[prop];\n    } else {\n      let hasProp = false;\n      let n = idx + 1;\n\n      while (n < len) {\n        prop = join([prop, segs[n++]], joinChar, options);\n\n        if ((hasProp = prop in target)) {\n          if (!isValid(prop, target, options)) {\n            return options.default;\n          }\n\n          target = target[prop];\n          idx = n - 1;\n          break;\n        }\n      }\n\n      if (!hasProp) {\n        return options.default;\n      }\n    }\n  } while (++idx < len && isValidObject(target));\n\n  if (idx === len) {\n    return target;\n  }\n\n  return options.default;\n};\n\nfunction join(segs, joinChar, options) {\n  if (typeof options.join === 'function') {\n    return options.join(segs);\n  }\n  return segs[0] + joinChar + segs[1];\n}\n\nfunction split(path, splitChar, options) {\n  if (typeof options.split === 'function') {\n    return options.split(path);\n  }\n  return path.split(splitChar);\n}\n\nfunction isValid(key, target, options) {\n  if (typeof options.isValid === 'function') {\n    return options.isValid(key, target);\n  }\n  return true;\n}\n\nfunction isValidObject(val) {\n  return isObject(val) || Array.isArray(val) || typeof val === 'function';\n}\n","/*!\n * is-primitive <https://github.com/jonschlinkert/is-primitive>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function isPrimitive(val) {\n  if (typeof val === 'object') {\n    return val === null;\n  }\n  return typeof val !== 'function';\n};\n","/*!\n * isobject <https://github.com/jonschlinkert/isobject>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function isObject(val) {\n  return val != null && typeof val === 'object' && Array.isArray(val) === false;\n};\n","/*!\n * set-value <https://github.com/jonschlinkert/set-value>\n *\n * Copyright (c) Jon Schlinkert (https://github.com/jonschlinkert).\n * Released under the MIT License.\n */\n\n'use strict';\n\nconst { deleteProperty } = Reflect;\nconst isPrimitive = require('is-primitive');\nconst isPlainObject = require('is-plain-object');\n\nconst isObject = value => {\n  return (typeof value === 'object' && value !== null) || typeof value === 'function';\n};\n\nconst isUnsafeKey = key => {\n  return key === '__proto__' || key === 'constructor' || key === 'prototype';\n};\n\nconst validateKey = key => {\n  if (!isPrimitive(key)) {\n    throw new TypeError('Object keys must be strings or symbols');\n  }\n\n  if (isUnsafeKey(key)) {\n    throw new Error(`Cannot set unsafe key: \"${key}\"`);\n  }\n};\n\nconst toStringKey = input => {\n  return Array.isArray(input) ? input.flat().map(String).join(',') : input;\n};\n\nconst createMemoKey = (input, options) => {\n  if (typeof input !== 'string' || !options) return input;\n  let key = input + ';';\n  if (options.arrays !== undefined) key += `arrays=${options.arrays};`;\n  if (options.separator !== undefined) key += `separator=${options.separator};`;\n  if (options.split !== undefined) key += `split=${options.split};`;\n  if (options.merge !== undefined) key += `merge=${options.merge};`;\n  if (options.preservePaths !== undefined) key += `preservePaths=${options.preservePaths};`;\n  return key;\n};\n\nconst memoize = (input, options, fn) => {\n  const key = toStringKey(options ? createMemoKey(input, options) : input);\n  validateKey(key);\n\n  const value = setValue.cache.get(key) || fn();\n  setValue.cache.set(key, value);\n  return value;\n};\n\nconst splitString = (input, options = {}) => {\n  const sep = options.separator || '.';\n  const preserve = sep === '/' ? false : options.preservePaths;\n\n  if (typeof input === 'string' && preserve !== false && /\\//.test(input)) {\n    return [input];\n  }\n\n  const parts = [];\n  let part = '';\n\n  const push = part => {\n    let number;\n    if (part.trim() !== '' && Number.isInteger((number = Number(part)))) {\n      parts.push(number);\n    } else {\n      parts.push(part);\n    }\n  };\n\n  for (let i = 0; i < input.length; i++) {\n    const value = input[i];\n\n    if (value === '\\\\') {\n      part += input[++i];\n      continue;\n    }\n\n    if (value === sep) {\n      push(part);\n      part = '';\n      continue;\n    }\n\n    part += value;\n  }\n\n  if (part) {\n    push(part);\n  }\n\n  return parts;\n};\n\nconst split = (input, options) => {\n  if (options && typeof options.split === 'function') return options.split(input);\n  if (typeof input === 'symbol') return [input];\n  if (Array.isArray(input)) return input;\n  return memoize(input, options, () => splitString(input, options));\n};\n\nconst assignProp = (obj, prop, value, options) => {\n  validateKey(prop);\n\n  // Delete property when \"value\" is undefined\n  if (value === undefined) {\n    deleteProperty(obj, prop);\n\n  } else if (options && options.merge) {\n    const merge = options.merge === 'function' ? options.merge : Object.assign;\n\n    // Only merge plain objects\n    if (merge && isPlainObject(obj[prop]) && isPlainObject(value)) {\n      obj[prop] = merge(obj[prop], value);\n    } else {\n      obj[prop] = value;\n    }\n\n  } else {\n    obj[prop] = value;\n  }\n\n  return obj;\n};\n\nconst setValue = (target, path, value, options) => {\n  if (!path || !isObject(target)) return target;\n\n  const keys = split(path, options);\n  let obj = target;\n\n  for (let i = 0; i < keys.length; i++) {\n    const key = keys[i];\n    const next = keys[i + 1];\n\n    validateKey(key);\n\n    if (next === undefined) {\n      assignProp(obj, key, value, options);\n      break;\n    }\n\n    if (typeof next === 'number' && !Array.isArray(obj[key])) {\n      obj = obj[key] = [];\n      continue;\n    }\n\n    if (!isObject(obj[key])) {\n      obj[key] = {};\n    }\n\n    obj = obj[key];\n  }\n\n  return target;\n};\n\nsetValue.split = split;\nsetValue.cache = new Map();\nsetValue.clear = () => {\n  setValue.cache = new Map();\n};\n\nmodule.exports = setValue;\n","/*!\n * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isObject = require('isobject');\n\nfunction isObjectObject(o) {\n  return isObject(o) === true\n    && Object.prototype.toString.call(o) === '[object Object]';\n}\n\nmodule.exports = function isPlainObject(o) {\n  var ctor,prot;\n\n  if (isObjectObject(o) === false) return false;\n\n  // If has modified constructor\n  ctor = o.constructor;\n  if (typeof ctor !== 'function') return false;\n\n  // If has modified prototype\n  prot = ctor.prototype;\n  if (isObjectObject(prot) === false) return false;\n\n  // If constructor does not have an Object-specific method\n  if (prot.hasOwnProperty('isPrototypeOf') === false) {\n    return false;\n  }\n\n  // Most likely a plain Object\n  return true;\n};\n"],"names":["isTrack","arg","label","deepUpdate","a","b","prop","Object","keys","undefined","clone","src","prototype","toString","call","nodeType","cloneNode","Date","getTime","RegExp","r","Array","isArray","i","l","length","constructor","dest","source","copyFunc","empty","name","s","mixin","regularizeConf","conf","url","tracks","track","push","meta","trackMetadata","sources","map","sourceDef","newSourceDef","typeMatch","exec","type","toLowerCase","sourceUrl","startsWith","URL","window","location","href","baseUrl","endsWith","addBase","stores","values","names","forEach","t","refSeqs","nameUrl","trackConfig","config","c","store","trackClassName","regularizeClass","synthesizeTrackStoreConfig","histograms","root","className","includes","replace","mainConf","urlTemplate","storeClass","backendVersion","test","guessStoreClass","console","warn","storeConf","useAsRefSeqStore","refseqs","objectHash","isUriLocation","uri","isLocalPathLocation","localPath","async","fetchJb1","dataRoot","locationType","baseConfig","include","baseConfigRoot","protocol","dataRootReg","JSON","parse","stringify","dataRootLocation","slice","baseProtocol","baseConfigLocation","newConfig","fetchedConfig","fetchConfigFile","error","mergeConfigs","createFinalConfig","defaults","configDefaults","configWithDefaults","finalConfig","inputConfig","loadRecur","upstreamConf","Error","newUpstreamConf","fillTemplates","format","version","regularizeIncludes","loads","cacheBuster","Promise","all","includedData","loadIncludes","validateConfig","result","openLocation","readFile","parseJb1","trim","parsedConf","parseJB1Json","text","keyPath","operation","value","section","data","lineNumber","recordVal","parsedValue","match","Number","parseFloat","replaceAll","join","path","existing","getValue","setValue","e","split","textLine","line","m","parseJB1Conf","aTracks","bTracks","mergeTrackConfigs","index","bT","aT","subconfig","sub","template","fillWith","varName","fill","callback","v","this","fillTemplate","containerID","show_tracklist","show_nav","show_menu","show_overview","show_fullviewlink","update_browser_title","updateBrowserURL","datasets","_DEFAULT_EXAMPLES","volvox","modencode","yeast","highlightSearchedRegions","highResolutionMode","isObject","segs","joinChar","options","isValid","key","target","isValidObject","val","module","exports","default","String","isString","splitChar","separator","len","idx","hasProp","n","deleteProperty","Reflect","isPrimitive","isPlainObject","validateKey","TypeError","isUnsafeKey","input","fn","flat","toStringKey","arrays","merge","preservePaths","createMemoKey","cache","get","set","memoize","sep","preserve","parts","part","number","isInteger","splitString","assignProp","obj","assign","next","Map","clear","isObjectObject","o","ctor","prot","hasOwnProperty"],"sourceRoot":""}