studiokit-scaffolding-js 4.6.0 → 4.7.1-alpha.1

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.
@@ -8,10 +8,10 @@ var react_1 = __importDefault(require("react"));
8
8
  var react_bootstrap_1 = require("react-bootstrap");
9
9
  var react_helmet_1 = __importDefault(require("react-helmet"));
10
10
  var lockDownBrowser_1 = require("../utils/lockDownBrowser");
11
- var LockDownBrowserExitButton_1 = require("./LockDownBrowserExitButton");
12
- var lockDownBrowserInfo = lockDownBrowser_1.getLockDownBrowserInfo();
11
+ var ExitButton_1 = require("./LockDownBrowser/ExitButton");
13
12
  var Error = function (props) {
14
13
  var message = query_string_1.parse(props.location.search).message;
14
+ var lockDownBrowserInfo = lockDownBrowser_1.getLockDownBrowserInfo();
15
15
  return (react_1.default.createElement(react_1.default.Fragment, null,
16
16
  react_1.default.createElement(react_helmet_1.default, { title: "Error" }),
17
17
  react_1.default.createElement(react_bootstrap_1.Container, null,
@@ -24,6 +24,6 @@ var Error = function (props) {
24
24
  "If you have any questions or concerns please contact us at",
25
25
  ' ',
26
26
  react_1.default.createElement("a", { href: "mailto:tlt@purdue.edu" }, "tlt@purdue.edu")),
27
- lockDownBrowserInfo.isClientLockDownBrowser && react_1.default.createElement(LockDownBrowserExitButton_1.LockDownBrowserExitButton, null))))));
27
+ lockDownBrowserInfo.isClientLockDownBrowser && react_1.default.createElement(ExitButton_1.LockDownBrowserExitButton, null))))));
28
28
  };
29
29
  exports.default = Error;
@@ -0,0 +1,3 @@
1
+ import { FunctionComponent } from 'react';
2
+ declare const LockDownBrowserCheck: FunctionComponent;
3
+ export default LockDownBrowserCheck;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var Cancel_1 = __importDefault(require("@material-ui/icons/Cancel"));
7
+ var CheckCircle_1 = __importDefault(require("@material-ui/icons/CheckCircle"));
8
+ var react_1 = __importDefault(require("react"));
9
+ var react_bootstrap_1 = require("react-bootstrap");
10
+ var react_helmet_1 = require("react-helmet");
11
+ var operatingSystem_1 = require("../../constants/operatingSystem");
12
+ var lockDownBrowser_1 = require("../../utils/lockDownBrowser");
13
+ var ExitButton_1 = require("./ExitButton");
14
+ var LockDownBrowserCheck = function () {
15
+ var lockDownBrowserInfo = lockDownBrowser_1.getLockDownBrowserInfo();
16
+ var platform = lockDownBrowserInfo.buildDateWindows
17
+ ? operatingSystem_1.OPERATING_SYSTEM.WINDOWS
18
+ : lockDownBrowserInfo.buildDateMac
19
+ ? operatingSystem_1.OPERATING_SYSTEM.MAC
20
+ : lockDownBrowserInfo.buildDateIpad
21
+ ? operatingSystem_1.OPERATING_SYSTEM.IPAD
22
+ : undefined;
23
+ var buildDate = lockDownBrowserInfo.buildDateWindows || lockDownBrowserInfo.buildDateMac || lockDownBrowserInfo.buildDateIpad;
24
+ return (react_1.default.createElement(react_1.default.Fragment, null,
25
+ react_1.default.createElement(react_helmet_1.Helmet, { title: "LockDown Browser Check" }),
26
+ react_1.default.createElement(react_bootstrap_1.Container, { className: "main-content" },
27
+ react_1.default.createElement(react_bootstrap_1.Row, null,
28
+ react_1.default.createElement(react_bootstrap_1.Col, { xs: 12 },
29
+ react_1.default.createElement("h1", null, lockDownBrowserInfo.isClientLockDownBrowser ? (react_1.default.createElement(react_1.default.Fragment, null,
30
+ react_1.default.createElement(CheckCircle_1.default, { className: "fill-green f1 mr2" }),
31
+ " Success! You are using LockDown Browser.")) : (react_1.default.createElement(react_1.default.Fragment, null,
32
+ react_1.default.createElement(Cancel_1.default, { className: "fill-red f1 mr2" }),
33
+ "Oops! You are not using LockDown Browser."))),
34
+ lockDownBrowserInfo.isClientLockDownBrowser && (react_1.default.createElement(react_1.default.Fragment, null,
35
+ react_1.default.createElement("p", null, "You\u2019re all set to use LockDown Browser for your assessments. You can close LockDown Browser when you\u2019re ready."),
36
+ (lockDownBrowserInfo.buildId || platform) && (react_1.default.createElement("dl", { className: "f6" },
37
+ lockDownBrowserInfo.buildId && (react_1.default.createElement(react_1.default.Fragment, null,
38
+ react_1.default.createElement("dt", null, "Build Id"),
39
+ react_1.default.createElement("dd", null, lockDownBrowserInfo.buildId))),
40
+ platform && (react_1.default.createElement(react_1.default.Fragment, null,
41
+ react_1.default.createElement("dt", null, "Platform"),
42
+ react_1.default.createElement("dd", null, platform),
43
+ react_1.default.createElement("dt", null, "Build Date"),
44
+ react_1.default.createElement("dd", null, buildDate))))),
45
+ react_1.default.createElement(ExitButton_1.LockDownBrowserExitButton, null))))))));
46
+ };
47
+ exports.default = LockDownBrowserCheck;
@@ -7,15 +7,12 @@ exports.LockDownBrowserExitButton = void 0;
7
7
  var Button_1 = __importDefault(require("@material-ui/core/Button"));
8
8
  var react_1 = __importDefault(require("react"));
9
9
  var react_router_1 = require("react-router");
10
- var constants_1 = require("../constants");
10
+ var constants_1 = require("../../constants");
11
11
  var LockDownBrowserExitButton = function () {
12
- var history = react_router_1.useHistory();
13
12
  var location = react_router_1.useLocation();
14
13
  return (react_1.default.createElement(Button_1.default, { className: "btn-primary mb4", onClick: function () {
15
- return history.push({
16
- pathname: location.pathname,
17
- search: "?" + constants_1.LOCKDOWN_BROWSER_KEY.EXIT_BROWSER + "=" + constants_1.LOCKDOWN_BROWSER_TRUE
18
- });
14
+ return (window.location.href =
15
+ location.pathname + ("?" + constants_1.LOCKDOWN_BROWSER_KEY.EXIT_BROWSER + "=" + constants_1.LOCKDOWN_BROWSER_TRUE));
19
16
  } }, "Close LockDown Browser"));
20
17
  };
21
18
  exports.LockDownBrowserExitButton = LockDownBrowserExitButton;
@@ -0,0 +1,3 @@
1
+ import { FunctionComponent } from 'react';
2
+ declare const LockDownBrowserLaunch: FunctionComponent;
3
+ export default LockDownBrowserLaunch;
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ var Sentry = __importStar(require("@sentry/react"));
26
+ var query_string_1 = require("query-string");
27
+ var react_1 = __importDefault(require("react"));
28
+ var react_2 = require("react");
29
+ var react_helmet_1 = require("react-helmet");
30
+ var react_router_1 = require("react-router");
31
+ var constants_1 = require("../../constants");
32
+ var lockDownBrowser_1 = require("../../utils/lockDownBrowser");
33
+ var Loading_1 = __importDefault(require("../Loading"));
34
+ var LockDownBrowserLaunch = function () {
35
+ var history = react_router_1.useHistory();
36
+ var location = react_router_1.useLocation();
37
+ var search = query_string_1.parse(location.search);
38
+ var redirectPath = search.redirectPath;
39
+ var reloadCount = search.reloadCount && typeof search.reloadCount === 'string' ? parseInt(search.reloadCount) : 0;
40
+ // this effect will run once after this component renders
41
+ // allow LockDown Browser to set its cookies
42
+ react_2.useEffect(function () {
43
+ var lockDownBrowserInfo = lockDownBrowser_1.getLockDownBrowserInfo();
44
+ // redirect path is required and must be a single string
45
+ if (!redirectPath || typeof redirectPath !== 'string') {
46
+ Sentry.captureException('redirectPath is undefined');
47
+ history.push({
48
+ pathname: '/error',
49
+ search: query_string_1.stringify({ message: constants_1.LOCKDOWN_BROWSER_LAUNCH_ERROR })
50
+ });
51
+ return;
52
+ }
53
+ // if LDB cookies are set, redirect to the final path
54
+ if (lockDownBrowserInfo.isClientLockDownBrowser) {
55
+ history.push({
56
+ pathname: redirectPath
57
+ });
58
+ return;
59
+ }
60
+ // increment reloadCount and reload the current url fully (not using in-app router)
61
+ // try 3 times before going to the error route
62
+ if (reloadCount < 2) {
63
+ Sentry.captureMessage('could not determine if client is LockDown Browser, reloading');
64
+ reloadCount++;
65
+ search.reloadCount = reloadCount.toString();
66
+ window.location.href =
67
+ window.location.protocol +
68
+ '//' +
69
+ window.location.host +
70
+ window.location.pathname +
71
+ '?' +
72
+ query_string_1.stringify(search);
73
+ return;
74
+ }
75
+ Sentry.captureException('client is not LockDown Browser');
76
+ history.push({
77
+ pathname: '/error',
78
+ search: query_string_1.stringify({ message: constants_1.LOCKDOWN_BROWSER_LAUNCH_ERROR })
79
+ });
80
+ // eslint-disable-next-line react-hooks/exhaustive-deps
81
+ }, []);
82
+ return (react_1.default.createElement(react_1.default.Fragment, null,
83
+ react_1.default.createElement(react_helmet_1.Helmet, { title: "LockDown Browser Launch" }),
84
+ react_1.default.createElement(Loading_1.default, null)));
85
+ };
86
+ exports.default = LockDownBrowserLaunch;
@@ -13,3 +13,8 @@ export declare enum LOCKDOWN_BROWSER_KEY {
13
13
  EXIT_BROWSER = "rldbxb"
14
14
  }
15
15
  export declare const LOCKDOWN_BROWSER_TRUE = "1";
16
+ export declare enum LOCKDOWN_BROWSER_PATH {
17
+ LAUNCH = "ldb-launch",
18
+ CHECK = "ldb-check"
19
+ }
20
+ export declare const LOCKDOWN_BROWSER_LAUNCH_ERROR = "A LockDown Browser session could not be started. Please close the browser and try again.";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LOCKDOWN_BROWSER_TRUE = exports.LOCKDOWN_BROWSER_KEY = void 0;
3
+ exports.LOCKDOWN_BROWSER_LAUNCH_ERROR = exports.LOCKDOWN_BROWSER_PATH = exports.LOCKDOWN_BROWSER_TRUE = exports.LOCKDOWN_BROWSER_KEY = void 0;
4
4
  var LOCKDOWN_BROWSER_KEY;
5
5
  (function (LOCKDOWN_BROWSER_KEY) {
6
6
  /** Cookie set by LDB to claim it is LDB. */
@@ -17,3 +17,9 @@ var LOCKDOWN_BROWSER_KEY;
17
17
  LOCKDOWN_BROWSER_KEY["EXIT_BROWSER"] = "rldbxb";
18
18
  })(LOCKDOWN_BROWSER_KEY = exports.LOCKDOWN_BROWSER_KEY || (exports.LOCKDOWN_BROWSER_KEY = {}));
19
19
  exports.LOCKDOWN_BROWSER_TRUE = '1';
20
+ var LOCKDOWN_BROWSER_PATH;
21
+ (function (LOCKDOWN_BROWSER_PATH) {
22
+ LOCKDOWN_BROWSER_PATH["LAUNCH"] = "ldb-launch";
23
+ LOCKDOWN_BROWSER_PATH["CHECK"] = "ldb-check";
24
+ })(LOCKDOWN_BROWSER_PATH = exports.LOCKDOWN_BROWSER_PATH || (exports.LOCKDOWN_BROWSER_PATH = {}));
25
+ exports.LOCKDOWN_BROWSER_LAUNCH_ERROR = 'A LockDown Browser session could not be started. Please close the browser and try again.';
@@ -0,0 +1,6 @@
1
+ export declare enum OPERATING_SYSTEM {
2
+ WINDOWS = "Windows",
3
+ MAC = "macOS",
4
+ IPAD = "iPad",
5
+ UNKNOWN = "Unknown"
6
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OPERATING_SYSTEM = void 0;
4
+ var OPERATING_SYSTEM;
5
+ (function (OPERATING_SYSTEM) {
6
+ OPERATING_SYSTEM["WINDOWS"] = "Windows";
7
+ OPERATING_SYSTEM["MAC"] = "macOS";
8
+ OPERATING_SYSTEM["IPAD"] = "iPad";
9
+ OPERATING_SYSTEM["UNKNOWN"] = "Unknown";
10
+ })(OPERATING_SYSTEM = exports.OPERATING_SYSTEM || (exports.OPERATING_SYSTEM = {}));
package/lib/utils/url.js CHANGED
@@ -44,6 +44,7 @@ var lodash_1 = __importDefault(require("lodash"));
44
44
  var shard_1 = __importDefault(require("../constants/shard"));
45
45
  var tier_1 = __importDefault(require("../constants/tier"));
46
46
  var windowService_1 = __importDefault(require("../services/windowService"));
47
+ var logger_1 = require("./logger");
47
48
  var shard_2 = require("./shard");
48
49
  function getApiBaseUrl(tier, apiUrlString) {
49
50
  // skip shard logic on LOCAL or if not using a custom domain (e.g. staging)
@@ -74,15 +75,46 @@ function isUrlValid(url) {
74
75
  return /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w.-]+)+[\w\-._~:/?#[\]@!$&'()*+,;=]+$/.test(url);
75
76
  }
76
77
  exports.isUrlValid = isUrlValid;
78
+ var RETRY_LIMIT = 5;
79
+ function wait(time) {
80
+ return new Promise(function (resolve) {
81
+ setTimeout(resolve, time);
82
+ });
83
+ }
77
84
  function fetchText(url, options) {
78
85
  return __awaiter(this, void 0, void 0, function () {
79
- var resp;
86
+ var tryCount, didFail, resp, text, error_1;
80
87
  return __generator(this, function (_a) {
81
88
  switch (_a.label) {
82
- case 0: return [4 /*yield*/, fetch(url, options)];
89
+ case 0:
90
+ tryCount = 0;
91
+ didFail = false;
92
+ _a.label = 1;
83
93
  case 1:
94
+ didFail = false;
95
+ tryCount++;
96
+ _a.label = 2;
97
+ case 2:
98
+ _a.trys.push([2, 5, , 7]);
99
+ return [4 /*yield*/, fetch(url, options)];
100
+ case 3:
84
101
  resp = _a.sent();
85
- return [2 /*return*/, resp.text()];
102
+ return [4 /*yield*/, resp.text()];
103
+ case 4:
104
+ text = _a.sent();
105
+ return [2 /*return*/, text];
106
+ case 5:
107
+ error_1 = _a.sent();
108
+ didFail = true;
109
+ logger_1.getLogger().error("Failed to fetch " + url + ". attempt: " + tryCount + ", error: " + error_1);
110
+ return [4 /*yield*/, wait(2 ^ (tryCount * 100))]; // 100, 200, 400...
111
+ case 6:
112
+ _a.sent(); // 100, 200, 400...
113
+ return [3 /*break*/, 7];
114
+ case 7:
115
+ if (tryCount < RETRY_LIMIT && didFail) return [3 /*break*/, 1];
116
+ _a.label = 8;
117
+ case 8: throw new Error("Failed to fetch " + url + " after " + RETRY_LIMIT + " attempts.");
86
118
  }
87
119
  });
88
120
  });
@@ -0,0 +1,2 @@
1
+ import { OPERATING_SYSTEM } from '../constants/operatingSystem';
2
+ export declare const getOperatingSystem: () => OPERATING_SYSTEM.WINDOWS | OPERATING_SYSTEM.MAC | OPERATING_SYSTEM.UNKNOWN;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getOperatingSystem = void 0;
4
+ var operatingSystem_1 = require("../constants/operatingSystem");
5
+ var getOperatingSystem = function () {
6
+ var userAgent = window.navigator.userAgent.toLowerCase();
7
+ var macOSPlatforms = /(macintosh|macintel|macppc|mac68k|macos)/i;
8
+ var windowsPlatforms = /(win32|win64|windows|wince)/i;
9
+ return macOSPlatforms.test(userAgent)
10
+ ? operatingSystem_1.OPERATING_SYSTEM.MAC
11
+ : windowsPlatforms.test(userAgent)
12
+ ? operatingSystem_1.OPERATING_SYSTEM.WINDOWS
13
+ : operatingSystem_1.OPERATING_SYSTEM.UNKNOWN;
14
+ };
15
+ exports.getOperatingSystem = getOperatingSystem;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "studiokit-scaffolding-js",
3
- "version": "4.6.0",
3
+ "version": "4.7.1-alpha.1",
4
4
  "description": "Common scaffolding for Studio apps at Purdue",
5
5
  "repository": "https://gitlab.com/purdue-informatics/studiokit/studiokit-scaffolding-js",
6
6
  "license": "MIT",
@@ -1,3 +0,0 @@
1
- /// <reference types="react" />
2
- declare const LockDownBrowserCheck: () => JSX.Element;
3
- export default LockDownBrowserCheck;
@@ -1,40 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- var Cancel_1 = __importDefault(require("@material-ui/icons/Cancel"));
7
- var CheckCircle_1 = __importDefault(require("@material-ui/icons/CheckCircle"));
8
- var react_1 = __importDefault(require("react"));
9
- var react_bootstrap_1 = require("react-bootstrap");
10
- var react_helmet_1 = require("react-helmet");
11
- var lockDownBrowser_1 = require("../utils/lockDownBrowser");
12
- var LockDownBrowserExitButton_1 = require("./LockDownBrowserExitButton");
13
- var lockDownBrowserInfo = lockDownBrowser_1.getLockDownBrowserInfo();
14
- var LockDownBrowserCheck = function () { return (react_1.default.createElement(react_1.default.Fragment, null,
15
- react_1.default.createElement(react_helmet_1.Helmet, { title: "LockDown Browser Check" }),
16
- react_1.default.createElement(react_bootstrap_1.Container, { className: "main-content" },
17
- react_1.default.createElement(react_bootstrap_1.Row, null,
18
- react_1.default.createElement(react_bootstrap_1.Col, { xs: 12 },
19
- react_1.default.createElement("h1", null, lockDownBrowserInfo.isClientLockDownBrowser ? (react_1.default.createElement(react_1.default.Fragment, null,
20
- react_1.default.createElement(CheckCircle_1.default, { className: "fill-green f1 mr2" }),
21
- " Success! You are using LockDown Browser.")) : (react_1.default.createElement(react_1.default.Fragment, null,
22
- react_1.default.createElement(Cancel_1.default, { className: "fill-red f1 mr2" }),
23
- "Oops! You are not using LockDown Browser."))),
24
- lockDownBrowserInfo.isClientLockDownBrowser && (react_1.default.createElement(react_1.default.Fragment, null,
25
- react_1.default.createElement("p", null, "You\u2019re all set to use LockDown Browser for your assessments. You can close LockDown Browser when you\u2019re ready."),
26
- react_1.default.createElement("dl", { className: "f6" },
27
- react_1.default.createElement("dt", null, "Build Id"),
28
- react_1.default.createElement("dd", null, lockDownBrowserInfo.buildId),
29
- react_1.default.createElement("dt", null, "Platform"),
30
- react_1.default.createElement("dd", null, lockDownBrowserInfo.buildDateWindows
31
- ? 'Windows'
32
- : lockDownBrowserInfo.buildDateMac
33
- ? 'macOS'
34
- : 'iPad'),
35
- react_1.default.createElement("dt", null, "Build Date"),
36
- react_1.default.createElement("dd", null, lockDownBrowserInfo.buildDateWindows ||
37
- lockDownBrowserInfo.buildDateMac ||
38
- lockDownBrowserInfo.buildDateIpad)),
39
- react_1.default.createElement(LockDownBrowserExitButton_1.LockDownBrowserExitButton, null)))))))); };
40
- exports.default = LockDownBrowserCheck;