@aics/vole-app 3.3.0 → 3.4.0

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 (60) hide show
  1. package/LICENSE +21 -25
  2. package/es/aics-image-viewer/components/App/index.js +11 -9
  3. package/es/aics-image-viewer/components/BottomPanel/index.js +48 -19
  4. package/es/aics-image-viewer/components/BottomPanel/styles.css +16 -7
  5. package/es/aics-image-viewer/components/CellViewerCanvasWrapper/index.js +39 -19
  6. package/es/aics-image-viewer/components/ChannelsWidget.js +2 -2
  7. package/es/aics-image-viewer/components/ControlPanel/index.js +17 -11
  8. package/es/aics-image-viewer/components/ControlPanel/styles.css +5 -5
  9. package/es/aics-image-viewer/components/ErrorAlert/index.js +91 -64
  10. package/es/aics-image-viewer/components/ErrorAlert/styles.css +33 -4
  11. package/es/aics-image-viewer/components/StyleProvider/index.js +42 -22
  12. package/es/aics-image-viewer/components/TfEditor/index.js +8 -1
  13. package/es/aics-image-viewer/components/Toolbar/index.js +33 -12
  14. package/es/aics-image-viewer/components/Toolbar/styles.css +21 -130
  15. package/es/aics-image-viewer/components/dimension_sliders/AxisClipSliders.js +148 -0
  16. package/es/aics-image-viewer/components/dimension_sliders/RotationSliders.js +165 -0
  17. package/es/aics-image-viewer/components/dimension_sliders/SliderRows.js +167 -0
  18. package/es/aics-image-viewer/components/{AxisClipSliders → dimension_sliders}/styles.css +7 -1
  19. package/es/aics-image-viewer/components/shared/ControlPanelRow/styles.css +1 -1
  20. package/es/aics-image-viewer/components/shared/NumericInput/index.js +4 -2
  21. package/es/aics-image-viewer/components/shared/SliderRow/index.js +2 -0
  22. package/es/aics-image-viewer/components/shared/SliderRow/styles.css +2 -1
  23. package/es/aics-image-viewer/components/useVolume.js +3 -0
  24. package/es/aics-image-viewer/shared/constants.js +2 -2
  25. package/es/aics-image-viewer/shared/utils/camera.js +122 -0
  26. package/es/aics-image-viewer/shared/utils/playControls.js +12 -1
  27. package/es/aics-image-viewer/shared/utils/sceneStore.js +8 -0
  28. package/es/aics-image-viewer/shared/utils/test/camera.test.js +127 -0
  29. package/es/aics-image-viewer/shared/utils/test/urlParsing.test.js +23 -702
  30. package/es/aics-image-viewer/shared/utils/urlParsing.js +14 -828
  31. package/es/aics-image-viewer/shared/utils/viewerChannelSettings.js +3 -4
  32. package/es/aics-image-viewer/state/deserialize.js +437 -0
  33. package/es/aics-image-viewer/state/serialize.js +145 -0
  34. package/es/aics-image-viewer/state/test/deserialize.test.js +432 -0
  35. package/es/aics-image-viewer/state/test/serialize.test.js +97 -0
  36. package/es/aics-image-viewer/state/test/test_data.js +168 -0
  37. package/es/aics-image-viewer/state/types.js +265 -1
  38. package/package.json +6 -5
  39. package/type-declarations/aics-image-viewer/components/App/types.d.ts +2 -2
  40. package/type-declarations/aics-image-viewer/components/BottomPanel/index.d.ts +6 -3
  41. package/type-declarations/aics-image-viewer/components/CellViewerCanvasWrapper/index.d.ts +1 -0
  42. package/type-declarations/aics-image-viewer/components/ControlPanel/index.d.ts +4 -5
  43. package/type-declarations/aics-image-viewer/components/ErrorAlert/index.d.ts +8 -5
  44. package/type-declarations/aics-image-viewer/components/Toolbar/index.d.ts +2 -1
  45. package/type-declarations/aics-image-viewer/components/{AxisClipSliders/index.d.ts → dimension_sliders/AxisClipSliders.d.ts} +2 -3
  46. package/type-declarations/aics-image-viewer/components/dimension_sliders/RotationSliders.d.ts +6 -0
  47. package/type-declarations/aics-image-viewer/components/dimension_sliders/SliderRows.d.ts +31 -0
  48. package/type-declarations/aics-image-viewer/components/shared/NumericInput/index.d.ts +1 -0
  49. package/type-declarations/aics-image-viewer/components/shared/SliderRow/index.d.ts +3 -1
  50. package/type-declarations/aics-image-viewer/components/useVolume.d.ts +1 -1
  51. package/type-declarations/aics-image-viewer/shared/constants.d.ts +1 -1
  52. package/type-declarations/aics-image-viewer/shared/utils/camera.d.ts +19 -0
  53. package/type-declarations/aics-image-viewer/shared/utils/playControls.d.ts +1 -0
  54. package/type-declarations/aics-image-viewer/shared/utils/sceneStore.d.ts +2 -1
  55. package/type-declarations/aics-image-viewer/shared/utils/urlParsing.d.ts +1 -307
  56. package/type-declarations/aics-image-viewer/state/deserialize.d.ts +70 -0
  57. package/type-declarations/aics-image-viewer/state/serialize.d.ts +20 -0
  58. package/type-declarations/aics-image-viewer/state/types.d.ts +216 -0
  59. package/LICENSE.txt +0 -26
  60. package/es/aics-image-viewer/components/AxisClipSliders/index.js +0 -295
@@ -1,5 +1,10 @@
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
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 ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
6
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
7
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
3
8
  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
9
  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
10
  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; }; }
@@ -9,704 +14,20 @@ function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c
9
14
  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
15
  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
16
  function _OverloadYield(e, d) { this.v = e, this.k = d; }
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); }
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); }); }; }
14
17
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
15
18
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
16
19
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
17
20
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
18
21
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
19
22
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
20
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
21
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
22
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
23
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
24
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
23
+ 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); }
24
+ 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); }); }; }
25
25
  import { describe, expect, it } from "@jest/globals";
26
- import { getDefaultCameraState, getDefaultChannelState, getDefaultViewerState } from "../../constants";
27
- import { ImageType, RenderMode, ViewMode } from "../../enums";
28
- import { CONTROL_POINTS_REGEX, deserializeViewerChannelSetting, deserializeViewerState, LEGACY_CONTROL_POINTS_REGEX, parseHexColorAsColorArray, parseKeyValueList, parseStringEnum, parseStringFloat, parseStringInt, parseViewerUrlParams, serializeCameraState, serializeViewerChannelSetting, serializeViewerState, serializeViewerUrlParams } from "../urlParsing";
29
- var defaultSettings = {
30
- match: 0,
31
- color: undefined,
32
- enabled: undefined,
33
- surfaceEnabled: undefined,
34
- isovalue: undefined,
35
- surfaceOpacity: undefined,
36
- colorizeEnabled: undefined,
37
- colorizeAlpha: undefined
38
- };
39
-
40
- //// VALUE PARSING ///////////////////////////////////////
41
-
42
- describe("LEGACY_CONTROL_POINTS_REGEX", function () {
43
- it("accepts single control points", function () {
44
- var data = "1:0.5:ffffff";
45
- expect(LEGACY_CONTROL_POINTS_REGEX.test(data)).toBe(true);
46
- });
47
- it("accepts multiple control points", function () {
48
- var data = "1:0.5:ff0000,128:0.7:ffff00,255:1:ff0000";
49
- expect(LEGACY_CONTROL_POINTS_REGEX.test(data)).toBe(true);
50
- });
51
- it("accepts negative numbers", function () {
52
- var data = "-1:0.5:ff0000,-255:1:ff0000";
53
- expect(LEGACY_CONTROL_POINTS_REGEX.test(data)).toBe(true);
54
- });
55
- it("allows 'w' as a placeholder for color strings", function () {
56
- var data = "1:0.5:1,255:1:1";
57
- expect(LEGACY_CONTROL_POINTS_REGEX.test(data)).toBe(true);
58
- });
59
- });
60
- describe("CONTROL_POINTS_REGEX", function () {
61
- it("accepts single control points", function () {
62
- var data = "1:0.5:ffffff";
63
- expect(CONTROL_POINTS_REGEX.test(data)).toBe(true);
64
- });
65
- it("accepts multiple control points", function () {
66
- var data = "1:0.5:ff0000:128:0.7:ffff00:255:1:ff0000";
67
- expect(CONTROL_POINTS_REGEX.test(data)).toBe(true);
68
- });
69
- it("accepts negative numbers", function () {
70
- var data = "-1:0.5:ff0000:-255:1:ff0000";
71
- expect(CONTROL_POINTS_REGEX.test(data)).toBe(true);
72
- });
73
- it("allows empty color strings", function () {
74
- var data = "1:0.5:1:255:1:1";
75
- expect(CONTROL_POINTS_REGEX.test(data)).toBe(true);
76
- });
77
- });
78
- describe("parseKeyValueList", function () {
79
- it("returns expected key value pairs", function () {
80
- var data = "key1:value1,key2:value2";
81
- var result = parseKeyValueList(data);
82
- expect(result).toEqual({
83
- key1: "value1",
84
- key2: "value2"
85
- });
86
- });
87
- it("decodes encoded key and value string names", function () {
88
- var data = "ampersand%26:ampersand%26,comma%2C:comma%2C,colon%3A:colon%3A";
89
- var result = parseKeyValueList(data);
90
- expect(result).toEqual({
91
- "ampersand&": "ampersand&",
92
- "comma,": "comma,",
93
- "colon:": "colon:"
94
- });
95
- });
96
- it("ignores repeat colons in value string", function () {
97
- var data = "key1:value1:extra:extra,key2:value2";
98
- var result = parseKeyValueList(data);
99
- expect(result).toEqual({
100
- key1: "value1:extra:extra",
101
- key2: "value2"
102
- });
103
- });
104
- it("returns empty object for empty string", function () {
105
- var data = "";
106
- var result = parseKeyValueList(data);
107
- expect(result).toEqual({});
108
- });
109
- it("parses example viewer channel settings", function () {
110
- var data = "col:FF0000,clz:1,cza:0.5,isa:0.75,ven:1,sen:1,isv:128,lut:autoij:";
111
- var result = parseKeyValueList(data);
112
- expect(result).toEqual({
113
- col: "FF0000",
114
- clz: "1",
115
- cza: "0.5",
116
- isa: "0.75",
117
- ven: "1",
118
- sen: "1",
119
- isv: "128",
120
- lut: "autoij:"
121
- });
122
- });
123
- it("removes trailing and leading whitespace", function () {
124
- var data = " key1 : value1 , key2 : value2 , key3: value 3";
125
- var result = parseKeyValueList(data);
126
- expect(result).toEqual({
127
- key1: "value1",
128
- key2: "value2",
129
- key3: "value 3"
130
- });
131
- });
132
- });
133
- describe("parseHexColorAsColorArray", function () {
134
- it("parses hex values", function () {
135
- expect(parseHexColorAsColorArray("000000")).toEqual([0, 0, 0]);
136
- expect(parseHexColorAsColorArray("FFFFFF")).toEqual([255, 255, 255]);
137
- expect(parseHexColorAsColorArray("ff0000")).toEqual([255, 0, 0]);
138
- expect(parseHexColorAsColorArray("123456")).toEqual([18, 52, 86]);
139
- expect(parseHexColorAsColorArray("7890ab")).toEqual([120, 144, 171]);
140
- expect(parseHexColorAsColorArray("cdefef")).toEqual([205, 239, 239]);
141
- expect(parseHexColorAsColorArray("ABCDEF")).toEqual([171, 205, 239]);
142
- });
143
- it("ignores unrecognized formats", function () {
144
- expect(parseHexColorAsColorArray("f")).toBeUndefined();
145
- expect(parseHexColorAsColorArray("fff")).toBeUndefined();
146
- expect(parseHexColorAsColorArray("fffffff")).toBeUndefined();
147
- expect(parseHexColorAsColorArray("hjklmn")).toBeUndefined();
148
- });
149
- it("parses the '1' code as white", function () {
150
- expect(parseHexColorAsColorArray("1")).toEqual([255, 255, 255]);
151
- });
152
- });
153
- describe("parseStringEnum", function () {
154
- var TestEnum = /*#__PURE__*/function (TestEnum) {
155
- TestEnum["SOME_VALUE"] = "some_value";
156
- TestEnum["ANOTHER_VALUE"] = "another_value";
157
- return TestEnum;
158
- }({});
159
- it("recognizes enum values", function () {
160
- expect(parseStringEnum("some_value", TestEnum)).toEqual(TestEnum.SOME_VALUE);
161
- expect(parseStringEnum("another_value", TestEnum)).toEqual(TestEnum.ANOTHER_VALUE);
162
- });
163
- it("returns default values for unrecognized enum values", function () {
164
- expect(parseStringEnum("unexpected", TestEnum, undefined)).toEqual(undefined);
165
- expect(parseStringEnum("unexpected", TestEnum, TestEnum.SOME_VALUE)).toEqual(TestEnum.SOME_VALUE);
166
- });
167
- });
168
- describe("parseStringInt", function () {
169
- it("parses int and undefined values", function () {
170
- expect(parseStringInt("0", 0, 1000)).toEqual(0);
171
- expect(parseStringInt("1", 0, 1000)).toEqual(1);
172
- expect(parseStringInt("100", 0, 1000)).toEqual(100);
173
- expect(parseStringInt("255", 0, 1000)).toEqual(255);
174
- expect(parseStringInt("-1", -1000, 1000)).toEqual(-1);
175
- });
176
- it("returns undefined for undefined and NaN values", function () {
177
- expect(parseStringInt("bad", -1000, 1000)).toEqual(undefined);
178
- expect(parseStringInt("NaN", -1000, 1000)).toEqual(undefined);
179
- expect(parseStringInt(undefined, -1000, 1000)).toEqual(undefined);
180
- });
181
- it("casts float values to integers", function () {
182
- expect(parseStringInt("0.5", 0, 1000)).toEqual(0);
183
- expect(parseStringInt("99.5", 0, 1000)).toEqual(99);
184
- expect(parseStringInt("-10.5", -1000, 1000)).toEqual(-10);
185
- });
186
- it("applies clamping", function () {
187
- expect(parseStringInt("0", 0, 255)).toEqual(0);
188
- expect(parseStringInt("-1", 0, 255)).toEqual(0);
189
- expect(parseStringInt("128", 0, 255)).toEqual(128);
190
- expect(parseStringInt("255", 0, 255)).toEqual(255);
191
- expect(parseStringInt("256", 0, 255)).toEqual(255);
192
- });
193
- });
194
- describe("parseStringFloat", function () {
195
- it("parses strings to float values", function () {
196
- expect(parseStringFloat("0", -1000, 1000)).toEqual(0);
197
- expect(parseStringFloat("1.0", -1000, 1000)).toEqual(1.0);
198
- expect(parseStringFloat("0.5", -1000, 1000)).toEqual(0.5);
199
- expect(parseStringFloat("128.5", -1000, 1000)).toEqual(128.5);
200
- expect(parseStringFloat("495.344", -1000, 1000)).toEqual(495.344);
201
- expect(parseStringFloat("-1", -1000, 1000)).toEqual(-1);
202
- });
203
- it("returns undefined for NaN or undefined values", function () {
204
- expect(parseStringFloat("bad", -1000, 1000)).toEqual(undefined);
205
- expect(parseStringFloat("NaN", -1000, 1000)).toEqual(undefined);
206
- expect(parseStringFloat(undefined, -1000, 1000)).toEqual(undefined);
207
- });
208
- it("applies clamping", function () {
209
- expect(parseStringFloat("0.5", 0, 1.0)).toEqual(0.5);
210
- expect(parseStringFloat("1.0", 0, 1.0)).toEqual(1.0);
211
- expect(parseStringFloat("1.1", 0, 1.0)).toEqual(1.0);
212
- expect(parseStringFloat("0", 0, 1.0)).toEqual(0);
213
- expect(parseStringFloat("-0.1", 0, 1.0)).toEqual(0);
214
- });
215
- });
216
-
217
- //// SERIALIZE STATES ///////////////////////
218
-
219
- describe("Channel state serialization", function () {
220
- var DEFAULT_CHANNEL_STATE = {
221
- name: "",
222
- displayName: "",
223
- color: [255, 0, 0],
224
- volumeEnabled: true,
225
- isosurfaceEnabled: true,
226
- isovalue: 128,
227
- opacity: 0.75,
228
- colorizeEnabled: true,
229
- colorizeAlpha: 0.5,
230
- useControlPoints: false,
231
- controlPoints: [{
232
- x: 0,
233
- opacity: 0.5,
234
- color: [255, 255, 255]
235
- }, {
236
- x: 255,
237
- opacity: 1.0,
238
- color: [255, 255, 255]
239
- }],
240
- ramp: [0, 255],
241
- plotMin: 0,
242
- plotMax: 255,
243
- keepIntensityRange: false
244
- };
245
- var DEFAULT_SERIALIZED_CHANNEL_STATE = {
246
- col: "ff0000",
247
- ven: "1",
248
- sen: "1",
249
- isv: "128",
250
- isa: "0.75",
251
- clz: "1",
252
- cza: "0.5",
253
- cpe: "0",
254
- cpt: "0:0.5:1:255:1:1",
255
- ram: "0:255",
256
- pin: "0"
257
- };
258
-
259
- // Note that the serialization + deserialization are NOT direct inverses.
260
- // Serializing converts a ChannelState object to a ViewerChannelSettingParams object,
261
- // deserializing converts a ViewerChannelSettingParams object to a **ViewerChannelSetting** object.
262
-
263
- // ChannelStates are per-channel and are used internally, while ViewerChannelSettings are
264
- // input into the viewer and support grouping/matching to multiple channels.
265
- // TODO: refactor these to all be the same state?
266
-
267
- describe("deserializeViewerChannelSetting", function () {
268
- it("returns default settings for empty objects", function () {
269
- var data = {};
270
- var result = deserializeViewerChannelSetting(0, data);
271
- expect(result).toEqual(defaultSettings);
272
- });
273
- it("ignores unexpected keys", function () {
274
- var data = {
275
- badKey: "badValue",
276
- ven: "1",
277
- sen: "1"
278
- };
279
- var result = deserializeViewerChannelSetting(0, data);
280
- expect(result).toEqual(_objectSpread(_objectSpread({}, defaultSettings), {}, {
281
- enabled: true,
282
- surfaceEnabled: true
283
- }));
284
- });
285
- it("parses settings correctly", function () {
286
- var data = {
287
- col: "FF0000",
288
- clz: "1",
289
- cza: "0.5",
290
- isa: "0.75",
291
- ven: "1",
292
- sen: "1",
293
- isv: "128",
294
- lut: "0:255"
295
- };
296
- expect(deserializeViewerChannelSetting(0, data)).toEqual({
297
- match: 0,
298
- color: "FF0000",
299
- enabled: true,
300
- surfaceEnabled: true,
301
- isovalue: 128,
302
- surfaceOpacity: 0.75,
303
- colorizeEnabled: true,
304
- colorizeAlpha: 0.5,
305
- intensity: {
306
- lut: ["0", "255"]
307
- }
308
- });
309
- });
310
- it("handles expected lut formatting", function () {
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
312
- ];
313
- for (var _i = 0, _luts = luts; _i < _luts.length; _i++) {
314
- var _result$intensity;
315
- var _luts$_i = _slicedToArray(_luts[_i], 2),
316
- encodedLut = _luts$_i[0],
317
- decodedLut = _luts$_i[1];
318
- var data = {
319
- lut: encodedLut
320
- };
321
- var result = deserializeViewerChannelSetting(0, data);
322
- expect((_result$intensity = result.intensity) === null || _result$intensity === void 0 ? void 0 : _result$intensity.lut).toEqual(decodedLut);
323
- }
324
- });
325
- it("ignores unexpected lut formats", function () {
326
- var luts = ["!:0", "0:9:93", "255", ""];
327
- for (var _i2 = 0, _luts2 = luts; _i2 < _luts2.length; _i2++) {
328
- var lut = _luts2[_i2];
329
- var data = {
330
- lut: lut
331
- };
332
- var result = deserializeViewerChannelSetting(0, data);
333
- expect(result.lut).toBeUndefined();
334
- }
335
- });
336
- it("handles hex color formats", function () {
337
- var colors = ["000000", "FFFFFF", "ffffff", "012345", "6789AB", "CDEF01", "abcdef"];
338
- for (var _i3 = 0, _colors = colors; _i3 < _colors.length; _i3++) {
339
- var color = _colors[_i3];
340
- var data = {
341
- col: color
342
- };
343
- var result = deserializeViewerChannelSetting(0, data);
344
- expect(result.color).toEqual(color);
345
- }
346
- });
347
- it("ignores bad color formats", function () {
348
- var badColors = ["f", "ff00", "red", "rgb(255,0,0)"];
349
- for (var _i4 = 0, _badColors = badColors; _i4 < _badColors.length; _i4++) {
350
- var color = _badColors[_i4];
351
- var data = {
352
- col: color
353
- };
354
- var result = deserializeViewerChannelSetting(0, data);
355
- expect(result.color).toBeUndefined();
356
- }
357
- });
358
- it("ignores bad float data", function () {
359
- var data = {
360
- cza: "NaN",
361
- isa: "bad",
362
- isv: "f8"
363
- };
364
- var result = deserializeViewerChannelSetting(0, data);
365
- expect(result.colorizeAlpha).toBeUndefined();
366
- expect(result.surfaceOpacity).toBeUndefined();
367
- expect(result.isovalue).toBeUndefined();
368
- });
369
- });
370
- describe("serializeViewerChannelSetting", function () {
371
- it("serializes channel settings", function () {
372
- expect(serializeViewerChannelSetting(DEFAULT_CHANNEL_STATE, false)).toEqual(DEFAULT_SERIALIZED_CHANNEL_STATE);
373
- });
374
- it("serializes custom channel settings", function () {
375
- var customChannelState = {
376
- name: "a",
377
- displayName: "a",
378
- color: [3, 255, 157],
379
- volumeEnabled: false,
380
- isosurfaceEnabled: false,
381
- isovalue: 0,
382
- opacity: 0.54,
383
- colorizeEnabled: false,
384
- colorizeAlpha: 1.0,
385
- useControlPoints: false,
386
- controlPoints: [],
387
- ramp: [0, 255],
388
- // TODO: the settings below are not serialized. should they be? (see #384)
389
- plotMin: 0,
390
- plotMax: 255,
391
- keepIntensityRange: false
392
- };
393
- var serializedCustomChannelState = {
394
- col: "03ff9d",
395
- ven: "0",
396
- sen: "0",
397
- isv: "0",
398
- isa: "0.54",
399
- clz: "0",
400
- cza: "1",
401
- cpe: "0",
402
- cpt: "",
403
- ram: "0:255",
404
- pin: "0"
405
- };
406
- expect(serializeViewerChannelSetting(customChannelState, false)).toEqual(serializedCustomChannelState);
407
- });
408
- });
409
- });
410
- describe("Viewer state", function () {
411
- var DEFAULT_VIEWER_STATE = {
412
- viewMode: ViewMode.threeD,
413
- // "XY", "XZ", "YZ"
414
- renderMode: RenderMode.volumetric,
415
- // "pathtrace", "maxproject"
416
- imageType: ImageType.segmentedCell,
417
- showAxes: false,
418
- showBoundingBox: false,
419
- backgroundColor: [0, 0, 0],
420
- boundingBoxColor: [255, 255, 255],
421
- autorotate: false,
422
- maskAlpha: 0,
423
- brightness: 70,
424
- density: 50,
425
- levels: [35, 140, 255],
426
- interpolationEnabled: true,
427
- region: {
428
- x: [0, 1],
429
- y: [0, 1],
430
- z: [0, 1]
431
- },
432
- slice: {
433
- x: 0.5,
434
- y: 0.5,
435
- z: 0.5
436
- },
437
- time: 0,
438
- scene: 0,
439
- cameraState: undefined,
440
- singleChannelMode: false,
441
- singleChannelIndex: 0,
442
- useExactScaleLevel: false,
443
- scaleLevelIndex: 0
444
- };
445
- var SERIALIZED_DEFAULT_VIEWER_STATE = {
446
- mode: "volumetric",
447
- view: "3D",
448
- image: "cell",
449
- axes: "0",
450
- bb: "0",
451
- bgcol: "000000",
452
- bbcol: "ffffff",
453
- rot: "0",
454
- mask: "0",
455
- bright: "70",
456
- dens: "50",
457
- lvl: "35,140,255",
458
- interp: "1",
459
- reg: "0:1,0:1,0:1",
460
- slice: "0.5,0.5,0.5",
461
- t: "0",
462
- scene: "0",
463
- scm: "0",
464
- sci: "0",
465
- esl: "0",
466
- scl: "0"
467
- };
468
- var CUSTOM_VIEWER_STATE = {
469
- renderMode: RenderMode.pathTrace,
470
- viewMode: ViewMode.xy,
471
- imageType: ImageType.fullField,
472
- showAxes: true,
473
- showBoundingBox: true,
474
- backgroundColor: [255, 0, 0],
475
- boundingBoxColor: [0, 255, 0],
476
- autorotate: true,
477
- maskAlpha: 55,
478
- brightness: 100,
479
- density: 75,
480
- levels: [0, 250, 251],
481
- interpolationEnabled: false,
482
- region: {
483
- x: [0, 0.5],
484
- y: [0, 1],
485
- z: [0, 1]
486
- },
487
- slice: {
488
- x: 0.25,
489
- y: 0.75,
490
- z: 0.5
491
- },
492
- time: 100,
493
- scene: 3,
494
- singleChannelMode: true,
495
- singleChannelIndex: 3,
496
- useExactScaleLevel: true,
497
- scaleLevelIndex: 3,
498
- cameraState: {
499
- position: [-1.05, -4, 45],
500
- target: [0, 0, 0],
501
- up: [0, 1, 0],
502
- orthoScale: 3.534,
503
- fov: 43.5
504
- }
505
- };
506
- var SERIALIZED_CUSTOM_VIEWER_STATE = {
507
- mode: "pathtrace",
508
- view: "Z",
509
- image: "fov",
510
- axes: "1",
511
- bb: "1",
512
- bgcol: "ff0000",
513
- bbcol: "00ff00",
514
- rot: "1",
515
- mask: "55",
516
- bright: "100",
517
- dens: "75",
518
- lvl: "0,250,251",
519
- interp: "0",
520
- reg: "0:0.5,0:1,0:1",
521
- slice: "0.25,0.75,0.5",
522
- t: "100",
523
- scene: "3",
524
- scm: "1",
525
- sci: "3",
526
- esl: "1",
527
- scl: "3",
528
- cam: "pos:-1.05:-4:45,tar:0:0:0,up:0:1:0,ort:3.534,fov:43.5"
529
- };
530
- describe("serializeViewerState", function () {
531
- it("serializes the default viewer settings", function () {
532
- expect(serializeViewerState(DEFAULT_VIEWER_STATE, false)).toEqual(SERIALIZED_DEFAULT_VIEWER_STATE);
533
- });
534
- it("serializes custom viewer settings", function () {
535
- expect(serializeViewerState(CUSTOM_VIEWER_STATE, false)).toEqual(SERIALIZED_CUSTOM_VIEWER_STATE);
536
- });
537
- it("shortens long numbers in the slice and region parameters", function () {
538
- // Floats should be rounded to 7 significant digits or less
539
- var state = {
540
- region: {
541
- x: [0.4566666666, 0.8667332],
542
- y: [0.49999999, 0.8999999],
543
- z: [0.3000000001, 0.16467883]
544
- },
545
- slice: {
546
- x: 0.41111186,
547
- y: 0.49999999,
548
- z: 0.677402
549
- }
550
- };
551
- var serializedState = serializeViewerState(state, true);
552
- expect(serializedState.reg).toEqual("0.4566667:0.8667332,0.5:0.8999999,0.3:0.1646788");
553
- expect(serializedState.slice).toEqual("0.4111119,0.5,0.677402");
554
- });
555
- });
556
- describe("deserializeViewerState", function () {
557
- it("returns an empty object for empty input", function () {
558
- expect(deserializeViewerState({})).toEqual({});
559
- });
560
- it("deserializes the default viewer settings", function () {
561
- var params = SERIALIZED_DEFAULT_VIEWER_STATE;
562
- expect(deserializeViewerState(params)).toEqual(DEFAULT_VIEWER_STATE);
563
- });
564
- it("deserializes custom viewer settings", function () {
565
- var params = SERIALIZED_CUSTOM_VIEWER_STATE;
566
- expect(deserializeViewerState(params)).toEqual(CUSTOM_VIEWER_STATE);
567
- });
568
- it("handles all ViewMode values", function () {
569
- var viewModes = Object.values(ViewMode);
570
- for (var _i5 = 0, _viewModes = viewModes; _i5 < _viewModes.length; _i5++) {
571
- var viewMode = _viewModes[_i5];
572
- var state = _objectSpread(_objectSpread({}, DEFAULT_VIEWER_STATE), {}, {
573
- viewMode: viewMode
574
- });
575
- expect(deserializeViewerState(serializeViewerState(state, false)).viewMode).toEqual(viewMode);
576
- }
577
- });
578
- it("handles all RenderMode values", function () {
579
- var renderModes = Object.values(RenderMode);
580
- for (var _i6 = 0, _renderModes = renderModes; _i6 < _renderModes.length; _i6++) {
581
- var renderMode = _renderModes[_i6];
582
- var state = _objectSpread(_objectSpread({}, DEFAULT_VIEWER_STATE), {}, {
583
- renderMode: renderMode
584
- });
585
- expect(deserializeViewerState(serializeViewerState(state, false)).renderMode).toEqual(renderMode);
586
- }
587
- });
588
- it("deserializes partial camera settings", function () {
589
- var state = {
590
- cameraState: {
591
- position: [1.0, -1.4, 45],
592
- up: [0, 1, 0],
593
- fov: 43.5
594
- }
595
- };
596
- var serializedState = "pos:1:-1.4:45,up:0:1:0,fov:43.5";
597
- expect(deserializeViewerState({
598
- cam: serializedState
599
- })).toEqual(state);
600
- });
601
- });
602
- });
603
- describe("Camera state", function () {
604
- it("uses default camera state when choosing elements to exclude/ignore", function () {
605
- var cameraState = _objectSpread({}, getDefaultCameraState());
606
- // No changes from default
607
- expect(serializeCameraState(cameraState, true)).toEqual(undefined);
608
- cameraState = _objectSpread(_objectSpread({}, cameraState), {}, {
609
- position: [1, 2, 3]
610
- });
611
- expect(serializeCameraState(cameraState, true)).toEqual("pos:1:2:3");
612
- });
613
- it("default camera state has not been changed", function () {
614
- // The default camera state should NOT change unless backwards compatibility
615
- // is added to ensure old links still maintain the same camera orientation;
616
- // otherwise, cameras will appear in the new default orientation unexpectedly.
617
- expect(getDefaultCameraState()).toEqual({
618
- position: [0, 0, 5],
619
- target: [0, 0, 0],
620
- up: [0, 1, 0],
621
- fov: 20,
622
- orthoScale: 0.5
623
- });
624
- });
625
- });
626
-
627
- //// DESERIALIZE STATES ///////////////////////
628
-
629
- describe("Channel state deserialization", function () {
630
- var DEFAULT_CONTROL_POINTS = [{
631
- x: -10,
632
- opacity: 0,
633
- color: [0, 0, 0]
634
- }, {
635
- x: 50,
636
- opacity: 0,
637
- color: [0, 0, 0]
638
- }, {
639
- x: 100,
640
- opacity: 0.3,
641
- color: [0, 16, 255]
642
- }, {
643
- x: 140,
644
- opacity: 0.8,
645
- color: [0, 255, 255]
646
- }, {
647
- x: 260,
648
- opacity: 1,
649
- color: [0, 255, 180]
650
- }];
651
- describe("legacy control points", function () {
652
- it("parses comma-separated control points", function () {
653
- var result = deserializeViewerChannelSetting(0, {
654
- cps: "-10:0:000000,50:0:000000,100:0.3:0010ff,140:0.8:00ffff,260:1:00ffb4"
655
- });
656
- expect(result.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
657
- });
658
- it("parses colon-separated control points", function () {
659
- var result = deserializeViewerChannelSetting(0, {
660
- cps: "-10:0:000000:50:0:000000:100:0.3:0010ff:140:0.8:00ffff:260:1:00ffb4"
661
- });
662
- expect(result.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
663
- });
664
- it("replaces '1' color strings with default color #ffffff", function () {
665
- var result = deserializeViewerChannelSetting(0, {
666
- cps: "0:0:1:50:1:1"
667
- });
668
- expect(result.controlPoints).toEqual([{
669
- x: 0,
670
- opacity: 0,
671
- color: [255, 255, 255]
672
- }, {
673
- x: 50,
674
- opacity: 1,
675
- color: [255, 255, 255]
676
- }]);
677
- });
678
- });
679
- it("parses comma-separated control points", function () {
680
- var _result$intensity2;
681
- var result = deserializeViewerChannelSetting(0, {
682
- cpt: "-10:0:000000,50:0:000000,100:0.3:0010ff,140:0.8:00ffff,260:1:00ffb4"
683
- });
684
- expect((_result$intensity2 = result.intensity) === null || _result$intensity2 === void 0 ? void 0 : _result$intensity2.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
685
- });
686
- it("parses colon-separated control points", function () {
687
- var _result$intensity3;
688
- var result = deserializeViewerChannelSetting(0, {
689
- cpt: "-10:0:000000:50:0:000000:100:0.3:0010ff:140:0.8:00ffff:260:1:00ffb4"
690
- });
691
- expect((_result$intensity3 = result.intensity) === null || _result$intensity3 === void 0 ? void 0 : _result$intensity3.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
692
- });
693
- it("replaces '1' color strings with default color #ffffff", function () {
694
- var _result$intensity4;
695
- var result = deserializeViewerChannelSetting(0, {
696
- cpt: "0:0:1:50:1:1"
697
- });
698
- expect((_result$intensity4 = result.intensity) === null || _result$intensity4 === void 0 ? void 0 : _result$intensity4.controlPoints).toEqual([{
699
- x: 0,
700
- opacity: 0,
701
- color: [255, 255, 255]
702
- }, {
703
- x: 50,
704
- opacity: 1,
705
- color: [255, 255, 255]
706
- }]);
707
- });
708
- });
709
-
26
+ import { parseKeyValueList } from "../../../state/deserialize";
27
+ import { DEFAULT_TEST_VIEWER_CHANNEL_SETTING } from "../../../state/test/test_data";
28
+ import { getDefaultChannelState, getDefaultViewerState } from "../../constants";
29
+ import { ViewMode } from "../../enums";
30
+ import { parseViewerUrlParams, serializeViewerUrlParams } from "../urlParsing";
710
31
  //// URL parsing /////////////////////////////////
711
32
 
712
33
  describe("parseViewerUrlParams", function () {
@@ -752,17 +73,17 @@ describe("parseViewerUrlParams", function () {
752
73
  }
753
74
  }]];
754
75
  it("parses unencoded per-channel setting", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
755
- var _i7, _channelParamToSettin, _args$viewerChannelSe, _channelParamToSettin2, queryString, expected, _yield$parseViewerUrl, args, channelSetting;
76
+ var _i, _channelParamToSettin, _args$viewerChannelSe, _channelParamToSettin2, queryString, expected, _yield$parseViewerUrl, args, channelSetting;
756
77
  return _regeneratorRuntime().wrap(function _callee$(_context) {
757
78
  while (1) switch (_context.prev = _context.next) {
758
79
  case 0:
759
- _i7 = 0, _channelParamToSettin = channelParamToSetting;
80
+ _i = 0, _channelParamToSettin = channelParamToSetting;
760
81
  case 1:
761
- if (!(_i7 < _channelParamToSettin.length)) {
82
+ if (!(_i < _channelParamToSettin.length)) {
762
83
  _context.next = 12;
763
84
  break;
764
85
  }
765
- _channelParamToSettin2 = _slicedToArray(_channelParamToSettin[_i7], 3), queryString = _channelParamToSettin2[0], expected = _channelParamToSettin2[2];
86
+ _channelParamToSettin2 = _slicedToArray(_channelParamToSettin[_i], 3), queryString = _channelParamToSettin2[0], expected = _channelParamToSettin2[2];
766
87
  _context.next = 5;
767
88
  return parseViewerUrlParams(queryString);
768
89
  case 5:
@@ -771,7 +92,7 @@ describe("parseViewerUrlParams", function () {
771
92
  channelSetting = (_args$viewerChannelSe = args.viewerChannelSettings) === null || _args$viewerChannelSe === void 0 ? void 0 : _args$viewerChannelSe.groups[0].channels[0];
772
93
  expect(channelSetting).toEqual(expected);
773
94
  case 9:
774
- _i7++;
95
+ _i++;
775
96
  _context.next = 1;
776
97
  break;
777
98
  case 12:
@@ -781,17 +102,17 @@ describe("parseViewerUrlParams", function () {
781
102
  }, _callee);
782
103
  })));
783
104
  it("parses encoded per-channel settings", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
784
- var _i8, _channelParamToSettin3, _args$viewerChannelSe2, _channelParamToSettin4, queryString, expected, _yield$parseViewerUrl2, args, channelSetting;
105
+ var _i2, _channelParamToSettin3, _args$viewerChannelSe2, _channelParamToSettin4, queryString, expected, _yield$parseViewerUrl2, args, channelSetting;
785
106
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
786
107
  while (1) switch (_context2.prev = _context2.next) {
787
108
  case 0:
788
- _i8 = 0, _channelParamToSettin3 = channelParamToSetting;
109
+ _i2 = 0, _channelParamToSettin3 = channelParamToSetting;
789
110
  case 1:
790
- if (!(_i8 < _channelParamToSettin3.length)) {
111
+ if (!(_i2 < _channelParamToSettin3.length)) {
791
112
  _context2.next = 12;
792
113
  break;
793
114
  }
794
- _channelParamToSettin4 = _slicedToArray(_channelParamToSettin3[_i8], 3), queryString = _channelParamToSettin4[1], expected = _channelParamToSettin4[2];
115
+ _channelParamToSettin4 = _slicedToArray(_channelParamToSettin3[_i2], 3), queryString = _channelParamToSettin4[1], expected = _channelParamToSettin4[2];
795
116
  _context2.next = 5;
796
117
  return parseViewerUrlParams(queryString);
797
118
  case 5:
@@ -800,7 +121,7 @@ describe("parseViewerUrlParams", function () {
800
121
  channelSetting = (_args$viewerChannelSe2 = args.viewerChannelSettings) === null || _args$viewerChannelSe2 === void 0 ? void 0 : _args$viewerChannelSe2.groups[0].channels[0];
801
122
  expect(channelSetting).toEqual(expected);
802
123
  case 9:
803
- _i8++;
124
+ _i2++;
804
125
  _context2.next = 1;
805
126
  break;
806
127
  case 12:
@@ -907,7 +228,7 @@ describe("parseViewerUrlParams", function () {
907
228
  expect(channelSettings).toHaveLength(3);
908
229
  for (i = 0; i < channelSettings.length; i++) {
909
230
  channelSetting = channelSettings[i]; // Match with default on everything except match number
910
- expect(channelSetting).toEqual(_objectSpread(_objectSpread({}, defaultSettings), {}, {
231
+ expect(channelSetting).toEqual(_objectSpread(_objectSpread({}, DEFAULT_TEST_VIEWER_CHANNEL_SETTING), {}, {
911
232
  match: channelSetting.match
912
233
  }));
913
234
  }