@aics/vole-app 2.15.0 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/es/aics-image-viewer/components/App/ChannelUpdater.js +21 -3
  2. package/es/aics-image-viewer/components/App/index.js +156 -199
  3. package/es/aics-image-viewer/components/CellViewerCanvasWrapper/index.js +10 -9
  4. package/es/aics-image-viewer/components/ChannelsWidget.js +35 -22
  5. package/es/aics-image-viewer/components/ChannelsWidgetRow/index.js +27 -71
  6. package/es/aics-image-viewer/components/ChannelsWidgetRow/styles.css +0 -6
  7. package/es/aics-image-viewer/components/ColorPicker.js +1 -1
  8. package/es/aics-image-viewer/components/ControlPanel/index.js +5 -4
  9. package/es/aics-image-viewer/components/CustomizeWidget.js +12 -8
  10. package/es/aics-image-viewer/components/ErrorAlert/index.js +4 -4
  11. package/es/aics-image-viewer/components/GlobalVolumeControls.js +12 -10
  12. package/es/aics-image-viewer/components/StyleProvider/index.js +4 -2
  13. package/es/aics-image-viewer/components/TfEditor/index.js +304 -154
  14. package/es/aics-image-viewer/components/TfEditor/styles.css +53 -31
  15. package/es/aics-image-viewer/components/Toolbar/DownloadButton.js +1 -1
  16. package/es/aics-image-viewer/components/Toolbar/index.js +18 -16
  17. package/es/aics-image-viewer/components/shared/SharedCheckBox.js +1 -1
  18. package/es/aics-image-viewer/components/shared/SliderRow/styles.css +1 -0
  19. package/es/aics-image-viewer/components/shared/SmarterSlider.js +1 -1
  20. package/es/aics-image-viewer/components/shared/ViewerIcon.js +1 -1
  21. package/es/aics-image-viewer/components/useVolume.js +68 -59
  22. package/es/aics-image-viewer/shared/constants.js +2 -2
  23. package/es/aics-image-viewer/shared/utils/controlPointsToLut.js +57 -24
  24. package/es/aics-image-viewer/shared/utils/sceneStore.js +14 -4
  25. package/es/aics-image-viewer/shared/utils/storage.js +238 -0
  26. package/es/aics-image-viewer/shared/utils/test/storage.test.js +264 -0
  27. package/es/aics-image-viewer/shared/utils/test/urlParsing.test.js +249 -109
  28. package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +1 -1
  29. package/es/aics-image-viewer/shared/utils/urlParsing.js +287 -154
  30. package/es/aics-image-viewer/shared/utils/viewerState.js +4 -24
  31. package/es/aics-image-viewer/state/reset.js +111 -0
  32. package/es/aics-image-viewer/state/store.js +90 -0
  33. package/es/aics-image-viewer/state/subscribers.js +153 -0
  34. package/es/aics-image-viewer/state/test/reset.test.js +247 -0
  35. package/es/aics-image-viewer/state/util.js +71 -0
  36. package/es/index.js +3 -3
  37. package/package.json +18 -11
  38. package/type-declarations/aics-image-viewer/components/App/ChannelUpdater.d.ts +2 -4
  39. package/type-declarations/aics-image-viewer/components/App/types.d.ts +3 -3
  40. package/type-declarations/aics-image-viewer/components/AxisClipSliders/index.d.ts +6 -6
  41. package/type-declarations/aics-image-viewer/components/CellViewerCanvasWrapper/index.d.ts +5 -14
  42. package/type-declarations/aics-image-viewer/components/ChannelsWidget.d.ts +3 -6
  43. package/type-declarations/aics-image-viewer/components/ChannelsWidgetRow/index.d.ts +3 -6
  44. package/type-declarations/aics-image-viewer/components/ColorPicker.d.ts +1 -1
  45. package/type-declarations/aics-image-viewer/components/ControlPanel/index.d.ts +6 -7
  46. package/type-declarations/aics-image-viewer/components/CustomizeWidget.d.ts +2 -8
  47. package/type-declarations/aics-image-viewer/components/ErrorAlert/index.d.ts +4 -0
  48. package/type-declarations/aics-image-viewer/components/GlobalVolumeControls.d.ts +2 -9
  49. package/type-declarations/aics-image-viewer/components/MetadataViewer/index.d.ts +1 -1
  50. package/type-declarations/aics-image-viewer/components/StyleProvider/index.d.ts +1 -1
  51. package/type-declarations/aics-image-viewer/components/TfEditor/index.d.ts +10 -3
  52. package/type-declarations/aics-image-viewer/components/Toolbar/index.d.ts +3 -12
  53. package/type-declarations/aics-image-viewer/components/shared/SliderRow/index.d.ts +1 -1
  54. package/type-declarations/aics-image-viewer/components/shared/SmarterSlider.d.ts +1 -1
  55. package/type-declarations/aics-image-viewer/components/shared/ViewerIcon.d.ts +1 -1
  56. package/type-declarations/aics-image-viewer/components/useVolume.d.ts +7 -4
  57. package/type-declarations/aics-image-viewer/shared/constants.d.ts +5 -5
  58. package/type-declarations/aics-image-viewer/shared/types.d.ts +1 -1
  59. package/type-declarations/aics-image-viewer/shared/utils/controlPointsToLut.d.ts +9 -5
  60. package/type-declarations/aics-image-viewer/shared/utils/firebase/index.d.ts +1 -1
  61. package/type-declarations/aics-image-viewer/shared/utils/hooks.d.ts +1 -1
  62. package/type-declarations/aics-image-viewer/shared/utils/playControls.d.ts +1 -1
  63. package/type-declarations/aics-image-viewer/shared/utils/sceneStore.d.ts +8 -4
  64. package/type-declarations/aics-image-viewer/shared/utils/storage.d.ts +15 -0
  65. package/type-declarations/aics-image-viewer/shared/utils/urlParsing.d.ts +94 -31
  66. package/type-declarations/aics-image-viewer/shared/utils/viewerChannelSettings.d.ts +39 -1
  67. package/type-declarations/aics-image-viewer/shared/utils/viewerState.d.ts +3 -6
  68. package/type-declarations/aics-image-viewer/state/reset.d.ts +29 -0
  69. package/type-declarations/aics-image-viewer/state/store.d.ts +30 -0
  70. package/type-declarations/aics-image-viewer/state/subscribers.d.ts +4 -0
  71. package/type-declarations/aics-image-viewer/state/types.d.ts +46 -0
  72. package/type-declarations/aics-image-viewer/state/util.d.ts +8 -0
  73. package/type-declarations/index.d.ts +4 -4
  74. package/es/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.js +0 -163
  75. package/es/aics-image-viewer/components/ViewerStateProvider/index.js +0 -259
  76. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.d.ts +0 -34
  77. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/index.d.ts +0 -33
  78. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/types.d.ts +0 -107
  79. /package/es/aics-image-viewer/{components/ViewerStateProvider → state}/types.js +0 -0
@@ -1,5 +1,14 @@
1
1
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
- function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
2
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
3
+ function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
4
+ function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
5
+ function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
6
+ function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
7
+ function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
8
+ function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
9
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
10
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
11
+ function _OverloadYield(e, d) { this.v = e, this.k = d; }
3
12
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
4
13
  function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
5
14
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
@@ -230,7 +239,8 @@ describe("Channel state serialization", function () {
230
239
  }],
231
240
  ramp: [0, 255],
232
241
  plotMin: 0,
233
- plotMax: 255
242
+ plotMax: 255,
243
+ keepIntensityRange: false
234
244
  };
235
245
  var DEFAULT_SERIALIZED_CHANNEL_STATE = {
236
246
  col: "ff0000",
@@ -241,8 +251,9 @@ describe("Channel state serialization", function () {
241
251
  clz: "1",
242
252
  cza: "0.5",
243
253
  cpe: "0",
244
- cps: "0:0.5:1:255:1:1",
245
- rmp: "0:255"
254
+ cpt: "0:0.5:1:255:1:1",
255
+ ram: "0:255",
256
+ pin: "0"
246
257
  };
247
258
 
248
259
  // Note that the serialization + deserialization are NOT direct inverses.
@@ -291,13 +302,16 @@ describe("Channel state serialization", function () {
291
302
  surfaceOpacity: 0.75,
292
303
  colorizeEnabled: true,
293
304
  colorizeAlpha: 0.5,
294
- lut: ["0", "255"]
305
+ intensity: {
306
+ lut: ["0", "255"]
307
+ }
295
308
  });
296
309
  });
297
310
  it("handles expected lut formatting", function () {
298
311
  var luts = [["autoij:0", ["autoij", "0"]], ["0:autoij", ["0", "autoij"]], [":autoij", ["", "autoij"]], ["autoij:", ["autoij", ""]], ["0:255", ["0", "255"]], ["0.5:1.0", ["0.5", "1.0"]], ["0.50:1.00", ["0.50", "1.00"]], ["m99:m100", ["m99", "m100"]], ["p10:p90", ["p10", "p90"]], ["p10: p90", ["p10", "p90"]] // handle spaces
299
312
  ];
300
313
  for (var _i = 0, _luts = luts; _i < _luts.length; _i++) {
314
+ var _result$intensity;
301
315
  var _luts$_i = _slicedToArray(_luts[_i], 2),
302
316
  encodedLut = _luts$_i[0],
303
317
  decodedLut = _luts$_i[1];
@@ -305,7 +319,7 @@ describe("Channel state serialization", function () {
305
319
  lut: encodedLut
306
320
  };
307
321
  var result = deserializeViewerChannelSetting(0, data);
308
- expect(result.lut).toEqual(decodedLut);
322
+ expect((_result$intensity = result.intensity) === null || _result$intensity === void 0 ? void 0 : _result$intensity.lut).toEqual(decodedLut);
309
323
  }
310
324
  });
311
325
  it("ignores unexpected lut formats", function () {
@@ -373,7 +387,8 @@ describe("Channel state serialization", function () {
373
387
  ramp: [0, 255],
374
388
  // TODO: the settings below are not serialized. should they be? (see #384)
375
389
  plotMin: 0,
376
- plotMax: 255
390
+ plotMax: 255,
391
+ keepIntensityRange: false
377
392
  };
378
393
  var serializedCustomChannelState = {
379
394
  col: "03ff9d",
@@ -384,8 +399,9 @@ describe("Channel state serialization", function () {
384
399
  clz: "0",
385
400
  cza: "1",
386
401
  cpe: "0",
387
- cps: "",
388
- rmp: "0:255"
402
+ cpt: "",
403
+ ram: "0:255",
404
+ pin: "0"
389
405
  };
390
406
  expect(serializeViewerChannelSetting(customChannelState, false)).toEqual(serializedCustomChannelState);
391
407
  });
@@ -616,23 +632,54 @@ describe("Channel state deserialization", function () {
616
632
  opacity: 1,
617
633
  color: [0, 255, 180]
618
634
  }];
635
+ describe("legacy control points", function () {
636
+ it("parses comma-separated control points", function () {
637
+ var result = deserializeViewerChannelSetting(0, {
638
+ cps: "-10:0:000000,50:0:000000,100:0.3:0010ff,140:0.8:00ffff,260:1:00ffb4"
639
+ });
640
+ expect(result.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
641
+ });
642
+ it("parses colon-separated control points", function () {
643
+ var result = deserializeViewerChannelSetting(0, {
644
+ cps: "-10:0:000000:50:0:000000:100:0.3:0010ff:140:0.8:00ffff:260:1:00ffb4"
645
+ });
646
+ expect(result.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
647
+ });
648
+ it("replaces '1' color strings with default color #ffffff", function () {
649
+ var result = deserializeViewerChannelSetting(0, {
650
+ cps: "0:0:1:50:1:1"
651
+ });
652
+ expect(result.controlPoints).toEqual([{
653
+ x: 0,
654
+ opacity: 0,
655
+ color: [255, 255, 255]
656
+ }, {
657
+ x: 50,
658
+ opacity: 1,
659
+ color: [255, 255, 255]
660
+ }]);
661
+ });
662
+ });
619
663
  it("parses comma-separated control points", function () {
664
+ var _result$intensity2;
620
665
  var result = deserializeViewerChannelSetting(0, {
621
- cps: "-10:0:000000,50:0:000000,100:0.3:0010ff,140:0.8:00ffff,260:1:00ffb4"
666
+ cpt: "-10:0:000000,50:0:000000,100:0.3:0010ff,140:0.8:00ffff,260:1:00ffb4"
622
667
  });
623
- expect(result.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
668
+ expect((_result$intensity2 = result.intensity) === null || _result$intensity2 === void 0 ? void 0 : _result$intensity2.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
624
669
  });
625
670
  it("parses colon-separated control points", function () {
671
+ var _result$intensity3;
626
672
  var result = deserializeViewerChannelSetting(0, {
627
- cps: "-10:0:000000:50:0:000000:100:0.3:0010ff:140:0.8:00ffff:260:1:00ffb4"
673
+ cpt: "-10:0:000000:50:0:000000:100:0.3:0010ff:140:0.8:00ffff:260:1:00ffb4"
628
674
  });
629
- expect(result.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
675
+ expect((_result$intensity3 = result.intensity) === null || _result$intensity3 === void 0 ? void 0 : _result$intensity3.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
630
676
  });
631
677
  it("replaces '1' color strings with default color #ffffff", function () {
678
+ var _result$intensity4;
632
679
  var result = deserializeViewerChannelSetting(0, {
633
- cps: "0:0:1:50:1:1"
680
+ cpt: "0:0:1:50:1:1"
634
681
  });
635
- expect(result.controlPoints).toEqual([{
682
+ expect((_result$intensity4 = result.intensity) === null || _result$intensity4 === void 0 ? void 0 : _result$intensity4.controlPoints).toEqual([{
636
683
  x: 0,
637
684
  opacity: 0,
638
685
  color: [255, 255, 255]
@@ -658,7 +705,9 @@ describe("parseViewerUrlParams", function () {
658
705
  colorizeEnabled: false,
659
706
  colorizeAlpha: 0.9,
660
707
  isovalue: 129,
661
- lut: ["p50", "p99"]
708
+ intensity: {
709
+ lut: ["p50", "p99"]
710
+ }
662
711
  }], ["c1=ven:0,col:ff0000,clz:1,cza:0.5,isa:0.75,lut:0:255,sen:0,isv:0", "c1=ven%3A0%2Ccol%3Aff0000%2Cclz%3A1%2Ccza%3A0.5%2Cisa%3A0.75%2Clut%3A0%3A255%2Csen%3A0%2Cisv%3A0", {
663
712
  color: "ff0000",
664
713
  name: undefined,
@@ -669,7 +718,9 @@ describe("parseViewerUrlParams", function () {
669
718
  surfaceEnabled: false,
670
719
  enabled: false,
671
720
  isovalue: 0,
672
- lut: ["0", "255"]
721
+ intensity: {
722
+ lut: ["0", "255"]
723
+ }
673
724
  }], ["c5=ven:0,col:00ff00,clz:0,cza:0,isa:1,lut:autoij:,sen:1,isv:100", "c5=ven%3A0%2Ccol%3A00ff00%2Cclz%3A0%2Ccza%3A0%2Cisa%3A1%2Clut%3Aautoij%3A%2Csen%3A1%2Cisv%3A100", {
674
725
  color: "00ff00",
675
726
  name: undefined,
@@ -680,111 +731,109 @@ describe("parseViewerUrlParams", function () {
680
731
  surfaceEnabled: true,
681
732
  enabled: false,
682
733
  isovalue: 100,
683
- lut: ["autoij", ""]
734
+ intensity: {
735
+ lut: ["autoij", ""]
736
+ }
684
737
  }]];
685
738
  it("parses unencoded per-channel setting", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
686
- var _i7, _channelParamToSettin, _args$viewerChannelSe, _channelParamToSettin2, queryString, expected, params, _yield$parseViewerUrl, args, channelSetting;
739
+ var _i7, _channelParamToSettin, _args$viewerChannelSe, _channelParamToSettin2, queryString, expected, _yield$parseViewerUrl, args, channelSetting;
687
740
  return _regeneratorRuntime().wrap(function _callee$(_context) {
688
741
  while (1) switch (_context.prev = _context.next) {
689
742
  case 0:
690
743
  _i7 = 0, _channelParamToSettin = channelParamToSetting;
691
744
  case 1:
692
745
  if (!(_i7 < _channelParamToSettin.length)) {
693
- _context.next = 13;
746
+ _context.next = 12;
694
747
  break;
695
748
  }
696
749
  _channelParamToSettin2 = _slicedToArray(_channelParamToSettin[_i7], 3), queryString = _channelParamToSettin2[0], expected = _channelParamToSettin2[2];
697
- params = new URLSearchParams(queryString);
698
- _context.next = 6;
699
- return parseViewerUrlParams(params);
700
- case 6:
750
+ _context.next = 5;
751
+ return parseViewerUrlParams(queryString);
752
+ case 5:
701
753
  _yield$parseViewerUrl = _context.sent;
702
754
  args = _yield$parseViewerUrl.args;
703
755
  channelSetting = (_args$viewerChannelSe = args.viewerChannelSettings) === null || _args$viewerChannelSe === void 0 ? void 0 : _args$viewerChannelSe.groups[0].channels[0];
704
756
  expect(channelSetting).toEqual(expected);
705
- case 10:
757
+ case 9:
706
758
  _i7++;
707
759
  _context.next = 1;
708
760
  break;
709
- case 13:
761
+ case 12:
710
762
  case "end":
711
763
  return _context.stop();
712
764
  }
713
765
  }, _callee);
714
766
  })));
715
767
  it("parses encoded per-channel settings", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
716
- var _i8, _channelParamToSettin3, _args$viewerChannelSe2, _channelParamToSettin4, queryString, expected, params, _yield$parseViewerUrl2, args, channelSetting;
768
+ var _i8, _channelParamToSettin3, _args$viewerChannelSe2, _channelParamToSettin4, queryString, expected, _yield$parseViewerUrl2, args, channelSetting;
717
769
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
718
770
  while (1) switch (_context2.prev = _context2.next) {
719
771
  case 0:
720
772
  _i8 = 0, _channelParamToSettin3 = channelParamToSetting;
721
773
  case 1:
722
774
  if (!(_i8 < _channelParamToSettin3.length)) {
723
- _context2.next = 13;
775
+ _context2.next = 12;
724
776
  break;
725
777
  }
726
778
  _channelParamToSettin4 = _slicedToArray(_channelParamToSettin3[_i8], 3), queryString = _channelParamToSettin4[1], expected = _channelParamToSettin4[2];
727
- params = new URLSearchParams(queryString);
728
- _context2.next = 6;
729
- return parseViewerUrlParams(params);
730
- case 6:
779
+ _context2.next = 5;
780
+ return parseViewerUrlParams(queryString);
781
+ case 5:
731
782
  _yield$parseViewerUrl2 = _context2.sent;
732
783
  args = _yield$parseViewerUrl2.args;
733
784
  channelSetting = (_args$viewerChannelSe2 = args.viewerChannelSettings) === null || _args$viewerChannelSe2 === void 0 ? void 0 : _args$viewerChannelSe2.groups[0].channels[0];
734
785
  expect(channelSetting).toEqual(expected);
735
- case 10:
786
+ case 9:
736
787
  _i8++;
737
788
  _context2.next = 1;
738
789
  break;
739
- case 13:
790
+ case 12:
740
791
  case "end":
741
792
  return _context2.stop();
742
793
  }
743
794
  }, _callee2);
744
795
  })));
745
796
  it("parses multiple per-channel settings", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
746
- var i, _args$viewerChannelSe3, queryString, params, _yield$parseViewerUrl3, args, channelSettings;
797
+ var i, _args$viewerChannelSe3, queryString, _yield$parseViewerUrl3, args, channelSettings;
747
798
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
748
799
  while (1) switch (_context3.prev = _context3.next) {
749
800
  case 0:
750
801
  i = 0;
751
802
  case 1:
752
803
  if (!(i < 2)) {
753
- _context3.next = 15;
804
+ _context3.next = 14;
754
805
  break;
755
806
  }
756
807
  queryString = channelParamToSetting[0][i] + "&" + channelParamToSetting[1][i] + "&" + channelParamToSetting[2][i];
757
- params = new URLSearchParams(queryString);
758
- _context3.next = 6;
759
- return parseViewerUrlParams(params);
760
- case 6:
808
+ _context3.next = 5;
809
+ return parseViewerUrlParams(queryString);
810
+ case 5:
761
811
  _yield$parseViewerUrl3 = _context3.sent;
762
812
  args = _yield$parseViewerUrl3.args;
763
813
  channelSettings = (_args$viewerChannelSe3 = args.viewerChannelSettings) === null || _args$viewerChannelSe3 === void 0 ? void 0 : _args$viewerChannelSe3.groups[0].channels; // Order is not guaranteed, so check if any of the expected settings are present
764
814
  expect(channelSettings).toContainEqual(channelParamToSetting[0][2]);
765
815
  expect(channelSettings).toContainEqual(channelParamToSetting[1][2]);
766
816
  expect(channelSettings).toContainEqual(channelParamToSetting[2][2]);
767
- case 12:
817
+ case 11:
768
818
  i++;
769
819
  _context3.next = 1;
770
820
  break;
771
- case 15:
821
+ case 14:
772
822
  case "end":
773
823
  return _context3.stop();
774
824
  }
775
825
  }, _callee3);
776
826
  })));
777
827
  it("overrides ch settings when per-channel settings are included", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
778
- var _args$viewerChannelSe4;
779
- var queryString, params, _yield$parseViewerUrl4, args, groups, channelSetting;
828
+ var _args$viewerChannelSe4, _channelSetting$inten;
829
+ var queryString, _yield$parseViewerUrl4, args, groups, channelSetting;
780
830
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
781
831
  while (1) switch (_context4.prev = _context4.next) {
782
832
  case 0:
783
833
  queryString = "?ch=0&lut=1,2&c1=ven:1,lut:4:5";
784
- params = new URLSearchParams(queryString);
785
- _context4.next = 4;
786
- return parseViewerUrlParams(params);
787
- case 4:
834
+ _context4.next = 3;
835
+ return parseViewerUrlParams(queryString);
836
+ case 3:
788
837
  _yield$parseViewerUrl4 = _context4.sent;
789
838
  args = _yield$parseViewerUrl4.args;
790
839
  groups = (_args$viewerChannelSe4 = args.viewerChannelSettings) === null || _args$viewerChannelSe4 === void 0 ? void 0 : _args$viewerChannelSe4.groups[0];
@@ -792,24 +841,23 @@ describe("parseViewerUrlParams", function () {
792
841
  channelSetting = groups.channels[0];
793
842
  expect(channelSetting.match).toEqual(1);
794
843
  expect(channelSetting.enabled).toEqual(true);
795
- expect(channelSetting.lut).toEqual(["4", "5"]);
796
- case 12:
844
+ expect((_channelSetting$inten = channelSetting.intensity) === null || _channelSetting$inten === void 0 ? void 0 : _channelSetting$inten.lut).toEqual(["4", "5"]);
845
+ case 11:
797
846
  case "end":
798
847
  return _context4.stop();
799
848
  }
800
849
  }, _callee4);
801
850
  })));
802
851
  it("skips missing channel indices", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
803
- var _args$viewerChannelSe5;
804
- var queryString, params, _yield$parseViewerUrl5, args, groups, channelSetting1, channelSetting2;
852
+ var _args$viewerChannelSe5, _channelSetting2$inte;
853
+ var queryString, _yield$parseViewerUrl5, args, groups, channelSetting1, channelSetting2;
805
854
  return _regeneratorRuntime().wrap(function _callee5$(_context5) {
806
855
  while (1) switch (_context5.prev = _context5.next) {
807
856
  case 0:
808
857
  queryString = "?c0=ven:1&c15=ven:1,lut:4:5";
809
- params = new URLSearchParams(queryString);
810
- _context5.next = 4;
811
- return parseViewerUrlParams(params);
812
- case 4:
858
+ _context5.next = 3;
859
+ return parseViewerUrlParams(queryString);
860
+ case 3:
813
861
  _yield$parseViewerUrl5 = _context5.sent;
814
862
  args = _yield$parseViewerUrl5.args;
815
863
  groups = (_args$viewerChannelSe5 = args.viewerChannelSettings) === null || _args$viewerChannelSe5 === void 0 ? void 0 : _args$viewerChannelSe5.groups[0];
@@ -820,8 +868,8 @@ describe("parseViewerUrlParams", function () {
820
868
  expect(channelSetting1.enabled).toEqual(true);
821
869
  expect(channelSetting2.match).toEqual(15);
822
870
  expect(channelSetting2.enabled).toEqual(true);
823
- expect(channelSetting2.lut).toEqual(["4", "5"]);
824
- case 15:
871
+ expect((_channelSetting2$inte = channelSetting2.intensity) === null || _channelSetting2$inte === void 0 ? void 0 : _channelSetting2$inte.lut).toEqual(["4", "5"]);
872
+ case 14:
825
873
  case "end":
826
874
  return _context5.stop();
827
875
  }
@@ -829,15 +877,14 @@ describe("parseViewerUrlParams", function () {
829
877
  })));
830
878
  it("creates empty default data for bad per-channel setting formats", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
831
879
  var _args$viewerChannelSe6;
832
- var queryString, params, _yield$parseViewerUrl6, args, channelSettings, i, channelSetting;
880
+ var queryString, _yield$parseViewerUrl6, args, channelSettings, i, channelSetting;
833
881
  return _regeneratorRuntime().wrap(function _callee6$(_context6) {
834
882
  while (1) switch (_context6.prev = _context6.next) {
835
883
  case 0:
836
884
  queryString = "c1=bad&c0=ultrabad:bad&c2=,,,,,,";
837
- params = new URLSearchParams(queryString);
838
- _context6.next = 4;
839
- return parseViewerUrlParams(params);
840
- case 4:
885
+ _context6.next = 3;
886
+ return parseViewerUrlParams(queryString);
887
+ case 3:
841
888
  _yield$parseViewerUrl6 = _context6.sent;
842
889
  args = _yield$parseViewerUrl6.args;
843
890
  channelSettings = (_args$viewerChannelSe6 = args.viewerChannelSettings) === null || _args$viewerChannelSe6 === void 0 ? void 0 : _args$viewerChannelSe6.groups[0].channels;
@@ -848,7 +895,7 @@ describe("parseViewerUrlParams", function () {
848
895
  match: channelSetting.match
849
896
  }));
850
897
  }
851
- case 9:
898
+ case 8:
852
899
  case "end":
853
900
  return _context6.stop();
854
901
  }
@@ -856,15 +903,14 @@ describe("parseViewerUrlParams", function () {
856
903
  })));
857
904
  it("enables first three channels by default if no channel settings are provided", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
858
905
  var _args$viewerChannelSe7;
859
- var queryString, params, _yield$parseViewerUrl7, args, channelSettingsGroups, channelSettings;
906
+ var queryString, _yield$parseViewerUrl7, args, channelSettingsGroups, channelSettings;
860
907
  return _regeneratorRuntime().wrap(function _callee7$(_context7) {
861
908
  while (1) switch (_context7.prev = _context7.next) {
862
909
  case 0:
863
910
  queryString = "url=https://example.com/image.tiff";
864
- params = new URLSearchParams(queryString);
865
- _context7.next = 4;
866
- return parseViewerUrlParams(params);
867
- case 4:
911
+ _context7.next = 3;
912
+ return parseViewerUrlParams(queryString);
913
+ case 3:
868
914
  _yield$parseViewerUrl7 = _context7.sent;
869
915
  args = _yield$parseViewerUrl7.args;
870
916
  // Should have one group
@@ -879,23 +925,22 @@ describe("parseViewerUrlParams", function () {
879
925
  match: "(.+)",
880
926
  enabled: false
881
927
  });
882
- case 11:
928
+ case 10:
883
929
  case "end":
884
930
  return _context7.stop();
885
931
  }
886
932
  }, _callee7);
887
933
  })));
888
934
  it("parses default nucmorph settings", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
889
- var _args$viewerChannelSe8;
890
- var queryString, params, _yield$parseViewerUrl8, args, viewerSettings, channelSettings;
935
+ var _args$viewerChannelSe8, _channelSettings$chan;
936
+ var queryString, _yield$parseViewerUrl8, args, viewerSettings, channelSettings;
891
937
  return _regeneratorRuntime().wrap(function _callee8$(_context8) {
892
938
  while (1) switch (_context8.prev = _context8.next) {
893
939
  case 0:
894
940
  queryString = "url=https://example.com/image1.ome.zarr,https://example.com/image2.ome.zarr&c0=ven:0&c1=ven:1,lut:autoij:&c2=ven:1,clz:1&view=Z";
895
- params = new URLSearchParams(queryString);
896
- _context8.next = 4;
897
- return parseViewerUrlParams(params);
898
- case 4:
941
+ _context8.next = 3;
942
+ return parseViewerUrlParams(queryString);
943
+ case 3:
899
944
  _yield$parseViewerUrl8 = _context8.sent;
900
945
  args = _yield$parseViewerUrl8.args;
901
946
  viewerSettings = _yield$parseViewerUrl8.viewerSettings;
@@ -914,58 +959,149 @@ describe("parseViewerUrlParams", function () {
914
959
  expect(channelSettings.channels[0].enabled).toEqual(false);
915
960
  expect(channelSettings.channels[1].match).toEqual(1);
916
961
  expect(channelSettings.channels[1].enabled).toEqual(true);
917
- expect(channelSettings.channels[1].lut).toEqual(["autoij", ""]);
962
+ expect((_channelSettings$chan = channelSettings.channels[1].intensity) === null || _channelSettings$chan === void 0 ? void 0 : _channelSettings$chan.lut).toEqual(["autoij", ""]);
918
963
  expect(channelSettings.channels[2].match).toEqual(2);
919
964
  expect(channelSettings.channels[2].enabled).toEqual(true);
920
965
  expect(channelSettings.channels[2].colorizeEnabled).toEqual(true);
921
- case 21:
966
+ case 20:
922
967
  case "end":
923
968
  return _context8.stop();
924
969
  }
925
970
  }, _callee8);
926
971
  })));
927
- it("parses viewer settings", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
928
- var queryString, params, _yield$parseViewerUrl9, viewerSettings;
972
+ it("can handle arbitrary levels of URL encoding", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
973
+ var scenes, _allEncodingCombinations, encodings, _iterator3, _step3, encoding, _yield$parseViewerUrl9, args;
929
974
  return _regeneratorRuntime().wrap(function _callee9$(_context9) {
930
975
  while (1) switch (_context9.prev = _context9.next) {
931
976
  case 0:
932
- queryString = "mask=30&view=X";
933
- params = new URLSearchParams(queryString);
934
- _context9.next = 4;
935
- return parseViewerUrlParams(params);
936
- case 4:
977
+ // GOAL: no matter how, where, or how many times URL encoding is applied when concatenating
978
+ // these scene URLs into one param, they should decode back to the same URLs.
979
+ scenes = [["https://example.com/image1.ome.zarr"], ["https://example.com/image2.ome.zarr", "https://example.com/image3.ome.zarr?foo=1%2C2%2C3"]]; // Recursively generate combinations of encoded and unencoded URLs
980
+ _allEncodingCombinations = function allEncodingCombinations(urls, delims) {
981
+ // BASE CASE: generate an unencoded and encoded variant of a single URL
982
+ if (typeof urls === "string") {
983
+ return [urls, encodeURIComponent(urls)];
984
+ }
985
+
986
+ // Recursively generate combinations for all array elements
987
+ var nextDelims = delims.slice(1);
988
+ var encoded = urls.map(function (url) {
989
+ return _allEncodingCombinations(url, nextDelims);
990
+ });
991
+
992
+ // Concatenate those together in all possible combinations
993
+ var combined = encoded.reduce(function (accum, next) {
994
+ var result = [];
995
+ var _iterator = _createForOfIteratorHelper(accum),
996
+ _step;
997
+ try {
998
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
999
+ var a = _step.value;
1000
+ var _iterator2 = _createForOfIteratorHelper(next),
1001
+ _step2;
1002
+ try {
1003
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
1004
+ var n = _step2.value;
1005
+ result.push(a + delims[0] + n);
1006
+ }
1007
+ } catch (err) {
1008
+ _iterator2.e(err);
1009
+ } finally {
1010
+ _iterator2.f();
1011
+ }
1012
+ }
1013
+ } catch (err) {
1014
+ _iterator.e(err);
1015
+ } finally {
1016
+ _iterator.f();
1017
+ }
1018
+ return result;
1019
+ });
1020
+
1021
+ // Generate unencoded, encoded, and double-encoded variants of all those concatenated strings
1022
+ return combined.flatMap(function (url) {
1023
+ var encodedOnce = encodeURIComponent(url);
1024
+ return [url, encodedOnce, encodeURIComponent(encodedOnce)];
1025
+ });
1026
+ };
1027
+ encodings = _allEncodingCombinations(scenes, ["+", ","]);
1028
+ _iterator3 = _createForOfIteratorHelper(encodings);
1029
+ _context9.prev = 4;
1030
+ _iterator3.s();
1031
+ case 6:
1032
+ if ((_step3 = _iterator3.n()).done) {
1033
+ _context9.next = 15;
1034
+ break;
1035
+ }
1036
+ encoding = _step3.value;
1037
+ _context9.next = 10;
1038
+ return parseViewerUrlParams("url=".concat(encoding));
1039
+ case 10:
937
1040
  _yield$parseViewerUrl9 = _context9.sent;
938
- viewerSettings = _yield$parseViewerUrl9.viewerSettings;
939
- expect(viewerSettings.viewMode).toEqual(ViewMode.yz);
940
- expect(viewerSettings.maskAlpha).toEqual(30);
941
- case 8:
1041
+ args = _yield$parseViewerUrl9.args;
1042
+ expect(args.imageUrl).toEqual({
1043
+ scenes: scenes
1044
+ });
1045
+ case 13:
1046
+ _context9.next = 6;
1047
+ break;
1048
+ case 15:
1049
+ _context9.next = 20;
1050
+ break;
1051
+ case 17:
1052
+ _context9.prev = 17;
1053
+ _context9.t0 = _context9["catch"](4);
1054
+ _iterator3.e(_context9.t0);
1055
+ case 20:
1056
+ _context9.prev = 20;
1057
+ _iterator3.f();
1058
+ return _context9.finish(20);
1059
+ case 23:
942
1060
  case "end":
943
1061
  return _context9.stop();
944
1062
  }
945
- }, _callee9);
1063
+ }, _callee9, null, [[4, 17, 20, 23]]);
946
1064
  })));
947
- it("returns an empty object when no params are passed in", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
948
- var queryString, params, _yield$parseViewerUrl10, args, viewerSettings;
1065
+ it("parses viewer settings", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
1066
+ var queryString, _yield$parseViewerUrl10, viewerSettings;
949
1067
  return _regeneratorRuntime().wrap(function _callee10$(_context10) {
950
1068
  while (1) switch (_context10.prev = _context10.next) {
951
1069
  case 0:
952
- queryString = "";
953
- params = new URLSearchParams(queryString);
954
- _context10.next = 4;
955
- return parseViewerUrlParams(params);
956
- case 4:
1070
+ queryString = "mask=30&view=X";
1071
+ _context10.next = 3;
1072
+ return parseViewerUrlParams(queryString);
1073
+ case 3:
957
1074
  _yield$parseViewerUrl10 = _context10.sent;
958
- args = _yield$parseViewerUrl10.args;
959
1075
  viewerSettings = _yield$parseViewerUrl10.viewerSettings;
1076
+ expect(viewerSettings.viewMode).toEqual(ViewMode.yz);
1077
+ expect(viewerSettings.maskAlpha).toEqual(30);
1078
+ case 7:
1079
+ case "end":
1080
+ return _context10.stop();
1081
+ }
1082
+ }, _callee10);
1083
+ })));
1084
+ it("returns an empty object when no params are passed in", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee11() {
1085
+ var queryString, _yield$parseViewerUrl11, args, viewerSettings;
1086
+ return _regeneratorRuntime().wrap(function _callee11$(_context11) {
1087
+ while (1) switch (_context11.prev = _context11.next) {
1088
+ case 0:
1089
+ queryString = "";
1090
+ _context11.next = 3;
1091
+ return parseViewerUrlParams(queryString);
1092
+ case 3:
1093
+ _yield$parseViewerUrl11 = _context11.sent;
1094
+ args = _yield$parseViewerUrl11.args;
1095
+ viewerSettings = _yield$parseViewerUrl11.viewerSettings;
960
1096
  expect(Object.keys(args).length === 0);
961
1097
  expect(args).toEqual({});
962
1098
  expect(Object.keys(viewerSettings).length === 0);
963
1099
  expect(viewerSettings).toEqual({});
964
- case 11:
1100
+ case 10:
965
1101
  case "end":
966
- return _context10.stop();
1102
+ return _context11.stop();
967
1103
  }
968
- }, _callee10);
1104
+ }, _callee11);
969
1105
  })));
970
1106
  });
971
1107
  describe("serializeViewerUrlParams", function () {
@@ -992,7 +1128,8 @@ describe("serializeViewerUrlParams", function () {
992
1128
  }],
993
1129
  ramp: [-10, 260.1],
994
1130
  plotMin: 0,
995
- plotMax: 255
1131
+ plotMax: 255,
1132
+ keepIntensityRange: true
996
1133
  }, {
997
1134
  name: "channel1",
998
1135
  displayName: "channel1",
@@ -1027,7 +1164,8 @@ describe("serializeViewerUrlParams", function () {
1027
1164
  }],
1028
1165
  ramp: [50, 140],
1029
1166
  plotMin: 0,
1030
- plotMax: 255
1167
+ plotMax: 255,
1168
+ keepIntensityRange: false
1031
1169
  }];
1032
1170
  var serialized = serializeViewerUrlParams({
1033
1171
  channelSettings: channelStates
@@ -1043,9 +1181,10 @@ describe("serializeViewerUrlParams", function () {
1043
1181
  isa: "0.75",
1044
1182
  sen: "1",
1045
1183
  isv: "128",
1046
- rmp: "-10:260.1",
1047
- cps: "0:0:808080:1:1:ff0000",
1048
- cpe: "0"
1184
+ ram: "-10:260.1",
1185
+ cpt: "0:0:808080:1:1:ff0000",
1186
+ cpe: "0",
1187
+ pin: "1"
1049
1188
  };
1050
1189
  var expectedChannel1 = {
1051
1190
  ven: "0",
@@ -1055,9 +1194,10 @@ describe("serializeViewerUrlParams", function () {
1055
1194
  isa: "0",
1056
1195
  sen: "0",
1057
1196
  isv: "57",
1058
- rmp: "50:140",
1059
- cps: "-10:0:000000:50:0:000000:100:0.3:0010ff:140:0.8:00ffff:260:1:00ffb4",
1060
- cpe: "1"
1197
+ ram: "50:140",
1198
+ cpt: "-10:0:000000:50:0:000000:100:0.3:0010ff:140:0.8:00ffff:260:1:00ffb4",
1199
+ cpe: "1",
1200
+ pin: "0"
1061
1201
  };
1062
1202
  expect(serialized["c0"]).toBeDefined();
1063
1203
  expect(parseKeyValueList(serialized["c0"])).toEqual(expectedChannel0);