{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-eslint/src/client/utils.js"],"names":["executeAllTestRunners","document","querySelectorAll","forEach","runner","onRunButton","promisedEvent","eventTarget","type","Error","Promise","resolve","addEventListener","fileName","replace","fileEnding","replaceFileEndingWith","newEnding","PausableLoop","constructor","func","cancelID","running","ensureRunning","loopBody","requestAnimationFrame","pause","cancelAnimationFrame","hintForLabel","label","asDragImageFor","evt","offsetX","offsetY","clone","cloneNode","body","appendChild","style","top","Math","max","clientY","left","clientX","position","pointerEvents","setTimeout","remove","dataTransfer","setDragImage","listAsDragImage","labels","hints","map","textualRepresentation","hintLength","length","maxLength","push","dragInfo","TEMP_OBJECT_STORAGE","Map","getTempKeyFor","obj","tempKey","uuid","set","removeTempKey","getObjectFor","get","delete","c","r","crypto","getRandomValues","Uint8Array","v","toString","copyTextToClipboard","text","textArea","createElement","Object","assign","width","height","padding","border","outline","boxShadow","background","value","select","supported","queryCommandSupported","err","lively","warn","enabled","queryCommandEnabled","execCommand","removeChild","functionMetaInfo","functionToCheck","undefined","isFunction","isAsync","isGenerator","description","call","match","isFunc","isAsyncFunc","cancelEvent","stopPropagation","preventDefault","thing","prototype","name","getDeepProperty","pathString","path","split","next","result","shift","nextResult","waitForDeepProperty","timeout","step","wait","parseQuery","queryString","query","pairs","substr","i","pair","decodeURIComponent","ms","CallableObject","using","contextManagerIterable","callback","error","contextManagers","Array","from","cm","__enter__","e","reverse","__exit__","onStyleChange","target","styleObserver","MutationObserver","mutations","mutation","attributeName","observe","attributes","shake","animate","transform","duration","iterations","updateEditors","url","excludedEditors","editors","findAllElements","ea","localName","editorsToUpdate","filter","getURLString","textChanged","includes","codeMirror","scrollInfo","editor","getScrollInfo","loadFile","scrollTo","babelToCM","babelPosition","line","ch","column","cmToBabel","cmPosition","Location","isLocation","l","_cmLine","_cmCharacter","isEqual","other","loc","isBefore","isStrictBefore","asBabel","asCM","innerToString","Range","isRange","start","end","setRange","contains","location","containsRange","ll","strictlyContains","strictlyContainsRange","range","containsPartsOfRange","isBehind","selectInCM","setSelection","isArray","first","second","anchor","head"],"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\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 (location.isRange) {\n      return containsRange(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\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"]}