{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tabs/src/client/utils.js"],"names":["range","isRange","loc","cmToBabel","babelToCM","updateEditors","shake","onStyleChange","using","wait","parseQuery","waitForDeepProperty","getDeepProperty","textualRepresentation","cancelEvent","isFunction","functionMetaInfo","copyTextToClipboard","uuid","removeTempKey","getObjectFor","getTempKeyFor","listAsDragImage","asDragImageFor","hintForLabel","pluralize","replaceFileEndingWith","fileEnding","fileName","promisedEvent","executeAllTestRunners","document","querySelectorAll","forEach","runner","onRunButton","eventTarget","type","Error","Promise","resolve","addEventListener","replace","newEnding","count","name","pluralForm","undefined","PausableLoop","constructor","func","cancelID","running","ensureRunning","loopBody","requestAnimationFrame","pause","cancelAnimationFrame","label","evt","offsetX","offsetY","clone","cloneNode","body","appendChild","style","top","Math","max","clientY","left","clientX","position","pointerEvents","setTimeout","remove","dataTransfer","setDragImage","labels","hints","map","hintLength","length","maxLength","push","dragInfo","TEMP_OBJECT_STORAGE","Map","obj","tempKey","set","get","delete","c","r","crypto","getRandomValues","Uint8Array","v","toString","text","textArea","createElement","Object","assign","width","height","padding","border","outline","boxShadow","background","value","select","supported","queryCommandSupported","err","lively","warn","enabled","queryCommandEnabled","execCommand","removeChild","functionToCheck","isAsync","isGenerator","description","call","match","isFunc","isAsyncFunc","stopPropagation","preventDefault","thing","prototype","pathString","path","split","next","result","shift","nextResult","timeout","step","queryString","query","pairs","substr","i","pair","decodeURIComponent","ms","CallableObject","contextManagerIterable","callback","error","contextManagers","Array","from","cm","__enter__","e","reverse","__exit__","target","styleObserver","MutationObserver","mutations","mutation","attributeName","observe","attributes","animate","transform","duration","iterations","url","excludedEditors","editors","findAllElements","ea","localName","editorsToUpdate","filter","getURLString","textChanged","includes","codeMirror","scrollInfo","editor","getScrollInfo","loadFile","scrollTo","babelPosition","line","ch","column","cmPosition","Location","isLocation","l","_cmLine","_cmCharacter","isEqual","other","isBefore","isStrictBefore","asBabel","asCM","innerToString","Range","start","end","setRange","contains","location","containsRange","ll","strictlyContains","strictlyContainsRange","containsPartsOfRange","isBehind","selectInCM","setSelection","isArray","anchor","head","first","second"],"mappings":"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","file":"utils.js","sourcesContent":["/**\n * All lodash utility functions with this reference bound as first parameter\n * @example <caption>Example using lodash bound.</caption>\n * import {through, last}from \"utils\"\n * \n * document.body.querySelectorAll('lively-window')::last(); // return last selected window\n */\nexport * from './lodash-bound.js';\n\nexport function executeAllTestRunners() {\n  document.querySelectorAll('lively-testrunner').forEach(runner => runner.onRunButton());\n}\n\nexport function promisedEvent(eventTarget, type) {\n  if (!type || !eventTarget) throw new Error(\"arguments missing\");\n  return new Promise(resolve => eventTarget.addEventListener(type, resolve));\n}\n\n// #TODO: make this more robust to urlStrings that do not contain a filename, e.g.\n// \"https://goole.com\"::fileName() should not \"goole.com\"\nexport function fileName() {\n  return this.replace(/.*\\//, \"\");\n}\n\n// Example usage: \"path/to/a.json\"::fileEnding() returns \"json\"\n// #TODO: make this more robust to strings that do not contain a file ending\nexport function fileEnding() {\n  return this.replace(/.*\\./, \"\");\n}\n\n// Example usage: \"path/to/a.json\"::replaceFileEndingWith(\"xml\") returns \"path/to/a.xml\"\n// #TODO: make this more robust to strings that do not contain a file ending\nexport function replaceFileEndingWith(newEnding) {\n  return this.replace(/[^\\.]+$/, newEnding);\n}\n\n// 2, \"egg\" -> \"2 eggs\" | 1, \"egg\" -> \"1 egg\" | 2, \"life\", \"lives\" -> \"2 lives\"\nexport function pluralize(count, name, pluralForm = undefined) {\n  if(count == 1) return count + \" \" + name;\n  return count + \" \" + (pluralForm || (name + \"s\"));\n}\n\nexport class PausableLoop {\n  constructor(func) {\n    this.func = func;\n    this.cancelID;\n    this.running = false;\n  }\n\n  ensureRunning() {\n    if (!this.running) {\n      this.running = true;\n\n      const loopBody = () => {\n        this.func();\n        if (this.running) {\n          this.cancelID = requestAnimationFrame(loopBody);\n        }\n      };\n\n      this.cancelID = requestAnimationFrame(loopBody);\n    }\n  }\n\n  pause() {\n    cancelAnimationFrame(this.cancelID);\n    this.running = false;\n  }\n}\n\nexport function hintForLabel(label) {\n  return <div style=\"\\n    margin: 0.5px 0px;\\n    font-size: x-small;\\n    background-color: lightgray;\\n    border: 1px solid gray;\\n    border-radius: 2px;\\n    max-width: fit-content;\\n    white-space: nowrap;\\n    overflow: hidden;\\n    text-overflow: ellipsis;\\n  \">\n    {label}\n  </div>;\n}\n\n// #TODO: chrome does not support dataTransfer.addElement :(\n// e.g. dt.addElement(<h1>drop me</h1>);\n// Therefore, we have to perform this hack stolen from:\n// https://stackoverflow.com/questions/12766103/html5-drag-and-drop-events-and-setdragimage-browser-support\nexport function asDragImageFor(evt, offsetX = 0, offsetY = 0) {\n  const clone = this.cloneNode(true);\n  document.body.appendChild(clone);\n  clone.style[\"z-index\"] = \"10000000\";\n  clone.style.top = Math.max(0, evt.clientY - offsetY) + \"px\";\n  clone.style.left = Math.max(0, evt.clientX - offsetX) + \"px\";\n  clone.style.position = \"absolute\";\n  clone.style.pointerEvents = \"none\";\n\n  setTimeout(::clone.remove);\n  evt.dataTransfer.setDragImage(clone, offsetX, offsetY);\n}\n\nexport function listAsDragImage(labels, evt, offsetX, offsetY) {\n  const hints = labels.map(textualRepresentation).map(hintForLabel);\n  const hintLength = hints.length;\n  const maxLength = 5;\n  if (hints.length > maxLength) {\n    hints.length = maxLength;\n    hints.push(hintForLabel(`+ ${hintLength - maxLength} more.`));\n  }\n  const dragInfo = <div style=\"width: 151px;\">\n    {...hints}\n  </div>;\n  dragInfo::asDragImageFor(evt, offsetX, offsetY);\n}\n\nconst TEMP_OBJECT_STORAGE = new Map();\nexport function getTempKeyFor(obj) {\n  const tempKey = uuid();\n  TEMP_OBJECT_STORAGE.set(tempKey, obj);\n\n  // safety net: remove the key in 10 minutes\n  setTimeout(() => removeTempKey(tempKey), 10 * 60 * 1000);\n\n  return tempKey;\n}\nexport function getObjectFor(tempKey) {\n  return TEMP_OBJECT_STORAGE.get(tempKey);\n}\nexport function removeTempKey(tempKey) {\n  TEMP_OBJECT_STORAGE.delete(tempKey);\n}\n\nexport function uuid() {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n    var r = crypto.getRandomValues(new Uint8Array(1))[0] % 16 | 0,\n        v = c == 'x' ? r : r & 0x3 | 0x8;\n    return v.toString(16);\n  });\n}\n\n/**\n * Taken from and modified using:\n * https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript\n */\nexport function copyTextToClipboard(text) {\n  const textArea = document.createElement(\"textarea\");\n\n  //\n  // *** This styling is an extra step which is likely not required. ***\n  //\n  // Why is it here? To ensure:\n  // 1. the element is able to have focus and selection.\n  // 2. if element was to flash render it has minimal visual impact.\n  // 3. less flakyness with selection and copying which **might** occur if\n  //    the textarea element is not visible.\n  //\n  // The likelihood is the element won't even render, not even a flash,\n  // so some of these are just precautions. However in IE the element\n  // is visible whilst the popup box asking the user for permission for\n  // the web page to copy to the clipboard.\n  //\n\n  Object.assign(textArea.style, {\n    // Place in top-left corner of screen regardless of scroll position.\n    position: 'fixed',\n    top: 0,\n    left: 0,\n\n    // Ensure it has a small width and height. Setting to 1px / 1em\n    // doesn't work as this gives a negative w/h on some browsers.\n    width: '2em',\n    height: '2em',\n\n    // We don't need padding, reducing the size if it does flash render.\n    padding: 0,\n\n    // Clean up any borders.\n    border: 'none',\n    outline: 'none',\n    boxShadow: 'none',\n\n    // Avoid flash of white box if rendered for any reason.\n    background: 'transparent'\n  });\n\n  textArea.value = text;\n\n  document.body.appendChild(textArea);\n\n  textArea.select();\n\n  let supported;\n  try {\n    supported = document.queryCommandSupported('copy');\n  } catch (err) {\n    lively.warn('Copy to clipboard not supported.', err);\n    supported = false;\n  }\n  if (supported) {\n    let enabled;\n    try {\n      enabled = document.queryCommandEnabled('copy');\n    } catch (err) {\n      lively.warn('Copy to clipboard not enabled.', err);\n      enabled = false;\n    }\n    if (enabled) {\n      try {\n        if (!document.execCommand('copy')) {\n          lively.warn('Copying not successful.');\n        }\n      } catch (err) {\n        lively.warn('Unable to execute copy.');\n      }\n    }\n  }\n\n  document.body.removeChild(textArea);\n}\n\nexport function functionMetaInfo(functionToCheck) {\n  if (functionToCheck === undefined) {\n    return {\n      isFunction: false,\n      isAsync: false,\n      isGenerator: false\n    };\n  }\n\n  const description = {}.toString.call(functionToCheck);\n  return {\n    isFunction: !!description.match(/\\[object (Async)?(Generator)?Function\\]/),\n    isAsync: !!description.match(/\\[object Async(Generator)?Function\\]/),\n    isGenerator: !!description.match(/\\[object (Async)?GeneratorFunction\\]/)\n  };\n}\n// taken from https://stackoverflow.com/questions/5999998/how-can-i-check-if-a-javascript-variable-is-function-type\nexport function isFunction(functionToCheck) {\n  if (functionToCheck === undefined) {\n    return false;\n  }\n  let isFunc = {}.toString.call(functionToCheck) === '[object Function]';\n  let isAsyncFunc = {}.toString.call(functionToCheck) === '[object AsyncFunction]';\n  return isFunc || isAsyncFunc;\n}\n\nexport function cancelEvent(evt) {\n  evt.stopPropagation();\n  evt.preventDefault();\n}\n\nexport function textualRepresentation(thing) {\n  // primitive falsy value?\n  if (!thing) {\n    return '' + thing;\n  }\n\n  // toString method different from Object?\n  if (thing.toString && thing.toString !== Object.prototype.toString) {\n    return thing.toString();\n  }\n\n  // instance of a named class?\n  if (thing.constructor && thing.constructor.name) {\n    return 'a ' + thing.constructor.name;\n  }\n\n  return 'unprintable object';\n}\n\nexport function getDeepProperty(obj, pathString) {\n  var path = pathString.split(\".\");\n  var next;\n  var result = obj;\n  while (next = path.shift()) {\n    var nextResult = result[next];\n    if (!nextResult) return; // could not resolve path\n    result = nextResult;\n  }\n  return result;\n}\n\n/*\n * waits for the deep construction of a data structure // object\n * \n */\nexport async function waitForDeepProperty(obj, pathString, timeout = 60000 /* one minuete */, step = 10) {\n  var path = pathString.split(\".\");\n  var next;\n  var result = obj;\n  var nextResult;\n  while (next = path.shift()) {\n    nextResult = result[next];\n    while (!nextResult) {\n      await wait(step // busy waiting...\n      );nextResult = result[next];\n    }\n    // if (!nextResult) return // could not resolve path\n    result = nextResult;\n    // console.log(\"next result \" + next + \" = \" + result )\n  }\n  return result;\n}\n\n// https://stackoverflow.com/questions/2090551/parse-query-string-in-javascript\nexport function parseQuery(queryString) {\n  var query = {};\n  var pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');\n  for (var i = 0; i < pairs.length; i++) {\n    var pair = pairs[i].split('=');\n    query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');\n  }\n  return query;\n}\n\nexport function wait(ms) {\n  return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport class CallableObject {}\n// #TODO: implement this\n\n\n/**\n * Executes the given function considering the given context objects.\n * @param {Array<ContextManager>} contexts\n * @param {function} callback\n * @return {Object} result - The callback's evaluation result.\n *\n * @class ContextManager\n * @classdesc Used to specify the setup and teardown of the function call.\n * @method {__enter__} enter callback - called before the function call. Put setup code here.\n * @method {__exit__} exit callback - called after the funciton call. Put teardown code here.\n\n * @example <caption>Poor mans COP.</caption>\n * import { using }from \"utils\";\n * \n * const silentFetch = {\n *   __enter__() {\n *     this.originalFetch = window.fetch;\n *     window.fetch = () => {};\n *   }\n *   __exit__() {\n *     window.fetch = this.originalFetch; // restore the original fetch \n *   }\n * }\n *\n * using([silentFetch], () => {\n *   lively.notify(fetch('https://lively-kernel.org/lively4/')) // logs nothing\n * });\n */\nexport function using(contextManagerIterable, callback) {\n  let result;\n  let error;\n  const contextManagers = Array.from(contextManagerIterable);\n\n  contextManagers.forEach(cm => cm.__enter__());\n  try {\n    result = callback();\n  } catch (e) {\n    error = e;\n  } finally {\n    contextManagers.reverse().forEach(cm => cm.__exit__(error));\n  }\n  if (error !== undefined) {\n    throw error;\n  }\n  return result;\n}\n\n/**\n * Get notified, whenever the style attribute of given target changes\n */\nexport function onStyleChange(target, callback) {\n  const styleObserver = new MutationObserver(mutations => {\n    mutations.forEach(mutation => {\n      if (mutation.type == \"attributes\" && mutation.attributeName == \"style\") {\n        callback();\n      }\n    });\n  });\n  styleObserver.observe(target, { attributes: true });\n\n  return styleObserver;\n}\n\n/**\n * shakes given element using css transformations\n */\nexport function shake(target) {\n  target.animate([{ transform: 'translate(1px, 1px) rotate(0deg)' }, { transform: 'translate(-1px, -2px) rotate(-1deg)' }, { transform: 'translate(-3px, 0px) rotate(1deg)' }, { transform: 'translate(3px, 2px) rotate(0deg)' }, { transform: 'translate(1px, -1px) rotate(1deg)' }, { transform: 'translate(-1px, 2px) rotate(-1deg)' }, { transform: 'translate(-3px, 1px) rotate(0deg)' }, { transform: 'translate(3px, 1px) rotate(-1deg)' }, { transform: 'translate(-1px, -1px) rotate(1deg)' }, { transform: 'translate(1px, 2px) rotate(0deg)' }, { transform: 'translate(1px, -2px) rotate(-1deg)' }], {\n    // timing options\n    duration: 100,\n    iterations: 1\n    // easing: 'cubic-bezier(0.42, 0, 0.58, 1)'\n  });\n}\n\nexport function updateEditors(url, excludedEditors = []) {\n\n  url = url.toString().replace(/[#?].*/,\"\")\n  \n  const editors = lively.findAllElements(ea => ea.localName == \"lively-editor\", true)\n  const editorsToUpdate = editors.filter(ea => ea.getURLString().replace(/[#?].*/,\"\") === url && !ea.textChanged && !excludedEditors.includes(ea))\n\n  editorsToUpdate.forEach(ea => {\n    var codeMirror = ea.get(\"lively-code-mirror\")\n    var scrollInfo = codeMirror.editor.getScrollInfo()\n    ea.loadFile()\n    // preserve scroll position during updating\n    codeMirror.editor.scrollTo(null, scrollInfo.top)\n  })\n}\n\n/*MD Source Code Locations and Ranges MD*/\nfunction babelToCM(babelPosition) {\n  return {\n    line: babelPosition.line - 1,\n    ch: babelPosition.column\n  };\n}\n\nfunction cmToBabel(cmPosition) {\n  return {\n    line: cmPosition.line + 1,\n    column: cmPosition.ch\n  };\n}\n\nclass Location {\n  get isLocation() {\n    return true;\n  }\n\n  constructor(l) {\n    this._cmLine = l.line;\n    this._cmCharacter = l.ch;\n  }\n\n  isEqual(l) {\n    const other = loc(l);\n    return this._cmLine === other._cmLine && this._cmCharacter === other._cmCharacter;\n  }\n  isBefore(l) {\n    const other = loc(l);\n    return this._cmLine < other._cmLine || this._cmLine === other._cmLine && this._cmCharacter <= other._cmCharacter;\n  }\n  isStrictBefore(l) {\n    const other = loc(l);\n    return this._cmLine < other._cmLine || this._cmLine === other._cmLine && this._cmCharacter < other._cmCharacter;\n  }\n\n  asBabel() {\n    return cmToBabel(this.asCM());\n  }\n  asCM() {\n    return {\n      line: this._cmLine,\n      ch: this._cmCharacter\n    };\n  }\n\n  innerToString() {\n    return `${this._cmLine}:${this._cmCharacter}`;\n  }\n  toString() {\n    return `loc(${this.innerToString()})`;\n  }\n}\n\nexport function loc(l) {\n  if (l.isLocation) {\n    return l;\n  }\n  // cm style\n  if (l.ch !== undefined) {\n    return new Location(l);\n  }\n  // babel style\n  if (l.column !== undefined) {\n    return new Location(babelToCM(l));\n  }\n  throw new Error(`Location value ${l} not recognized.`);\n}\n\nclass Range {\n  get isRange() {\n    return true;\n  }\n\n  constructor(start, end) {\n    this.setRange(start, end);\n  }\n\n  setRange(start, end) {\n    if (loc(end).isStrictBefore(loc(start))) {\n      this.setRange(end, start);\n      return;\n    }\n    this.start = loc(start);\n    this.end = loc(end);\n  }\n\n  asBabel() {\n    throw new Error('asBabel not yet implemented.');\n  }\n\n  asCM() {\n    // from, to\n    return [this.start.asCM(), this.end.asCM()];\n  }\n\n  contains(location) {\n    if (isRange(location)) {\n      return this.containsRange(range(location));\n    }\n    const ll = loc(location);\n    return this.start.isBefore(ll) && ll.isBefore(this.end);\n  }\n\n  strictlyContains(location) {\n    if (location.isRange) {\n      return strictlyContainsRange(location);\n    }\n    const ll = loc(location);\n    return this.start.isStrictBefore(ll) && ll.isStrictBefore(this.end);\n  }\n\n  containsRange(range) {\n    return this.contains(range.start) && this.contains(range.end);\n  }\n\n  strictlyContainsRange(range) {\n    if(range.start.isEqual(range.end)) return this.containsRange(range);\n    return this.strictlyContains(range.start) || this.strictlyContains(range.end);\n  }\n\n  containsPartsOfRange(range) {\n    return this.contains(range.start) || this.contains(range.end);\n  }\n\n  isEqual(range) {\n    return this.start.isEqual(range.start) && this.end.isEqual(range.end);\n  }\n\n  isBehind(l) {\n    return loc(l).isBefore(this.start);\n  }\n\n  isBefore(l) {\n    return this.end.isBefore(loc(l));\n  }\n\n  selectInCM(cm) {\n    cm.setSelection(...this.asCM());\n  }\n\n  toString() {\n    return `range(${this.start.innerToString()}, ${this.end.innerToString()})`;\n  }\n}\n\nfunction isRange(r) {\n  if (r.isRange) {\n    return true;\n  }\n  // cm style\n  if (Array.isArray(r)) {\n    return true;\n  }\n  if (r.anchor && r.head) {\n    return true;\n  }\n  // babel style\n  if (r.start && r.end) {\n    return true;\n  }\n  return false;\n}\n\nexport function range(r) {\n  if (r.isRange) {\n    return r;\n  }\n  // cm style\n  if (Array.isArray(r)) {\n    return new Range(r.first, r.second);\n  }\n  if (r.anchor && r.head) {\n    return new Range(r.anchor, r.head);\n  }\n  // babel style\n  if (r.start && r.end) {\n    return new Range(r.start, r.end);\n  }\n  throw new Error(`Range value ${r} not recognized.`);\n}\n\n"]}