@deephaven/auth-plugins 0.37.4-logout.0 → 0.37.4-logout.17

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.
@@ -1 +1 @@
1
- {"version":3,"file":"AuthPlugin.js","names":["isAuthPlugin","plugin","authPlugin","Component","undefined","isAvailable"],"sources":["../src/AuthPlugin.ts"],"sourcesContent":["import React from 'react';\n\n/**\n * Map from auth config keys to their values\n * E.g. Map { AuthHandlers → \"io.deephaven.auth.AnonymousAuthenticationHandler\" }\n */\nexport type AuthConfigMap = Map<string, string>;\n\n/**\n * Props for the auth plugin component to render\n */\nexport type AuthPluginProps = {\n /** Map from config keys to their values */\n authConfigValues: AuthConfigMap;\n\n /**\n * The children to render after authentication is completed.\n */\n children: React.ReactNode;\n};\n\nexport type AuthPluginComponent = React.FunctionComponent<AuthPluginProps>;\n\n/**\n * Whether the auth plugin is available given the current configuration\n */\nexport type AuthPluginIsAvailableFunction = (\n authHandlers: string[],\n authConfig: AuthConfigMap\n) => boolean;\n\nexport type AuthPlugin = {\n Component: AuthPluginComponent;\n isAvailable: AuthPluginIsAvailableFunction;\n};\n\nexport function isAuthPlugin(plugin?: unknown): plugin is AuthPlugin {\n if (plugin == null) return false;\n const authPlugin = plugin as AuthPlugin;\n return (\n authPlugin.Component !== undefined &&\n typeof authPlugin.isAvailable === 'function'\n );\n}\n"],"mappings":"AAEA;AACA;AACA;AACA;;AAGA;AACA;AACA;;AAaA;AACA;AACA;;AAWA,OAAO,SAASA,YAAY,CAACC,MAAgB,EAAwB;EACnE,IAAIA,MAAM,IAAI,IAAI,EAAE,OAAO,KAAK;EAChC,IAAMC,UAAU,GAAGD,MAAoB;EACvC,OACEC,UAAU,CAACC,SAAS,KAAKC,SAAS,IAClC,OAAOF,UAAU,CAACG,WAAW,KAAK,UAAU;AAEhD"}
1
+ {"version":3,"file":"AuthPlugin.js","names":["isAuthPlugin","plugin","authPlugin","Component","undefined","isAvailable"],"sources":["../src/AuthPlugin.ts"],"sourcesContent":["import React from 'react';\n\n/**\n * Map from auth config keys to their values\n * E.g. Map { AuthHandlers → \"io.deephaven.auth.AnonymousAuthenticationHandler\" }\n */\nexport type AuthConfigMap = Map<string, string>;\n\n/**\n * Props for the auth plugin component to render\n */\nexport type AuthPluginProps = {\n /** Map from config keys to their values */\n authConfigValues: AuthConfigMap;\n\n /**\n * The children to render after authentication is completed.\n */\n children: React.ReactNode;\n};\n\nexport type AuthPluginComponent = React.FunctionComponent<AuthPluginProps>;\n\n/**\n * Whether the auth plugin is available given the current configuration\n */\nexport type AuthPluginIsAvailableFunction = (\n authHandlers: string[],\n authConfig: AuthConfigMap\n) => boolean;\n\nexport type AuthPlugin = {\n Component: AuthPluginComponent;\n isAvailable: AuthPluginIsAvailableFunction;\n};\n\nexport function isAuthPlugin(plugin?: unknown): plugin is AuthPlugin {\n if (plugin == null) return false;\n const authPlugin = plugin as AuthPlugin;\n return (\n authPlugin.Component !== undefined &&\n typeof authPlugin.isAvailable === 'function'\n );\n}\n"],"mappings":"AAEA;AACA;AACA;AACA;;AAGA;AACA;AACA;;AAaA;AACA;AACA;;AAWA,OAAO,SAASA,YAAYA,CAACC,MAAgB,EAAwB;EACnE,IAAIA,MAAM,IAAI,IAAI,EAAE,OAAO,KAAK;EAChC,IAAMC,UAAU,GAAGD,MAAoB;EACvC,OACEC,UAAU,CAACC,SAAS,KAAKC,SAAS,IAClC,OAAOF,UAAU,CAACG,WAAW,KAAK,UAAU;AAEhD"}
@@ -1,5 +1,3 @@
1
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
2
- function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
3
1
  import React, { useCallback } from 'react';
4
2
  import { useApi } from '@deephaven/jsapi-bootstrap';
5
3
  import { AUTH_HANDLER_TYPE_ANONYMOUS } from "./AuthHandlerTypes.js";
@@ -17,10 +15,8 @@ function Component(_ref) {
17
15
  children
18
16
  } = _ref;
19
17
  var dh = useApi();
20
- var getLoginOptions = useCallback( /*#__PURE__*/_asyncToGenerator(function* () {
21
- return {
22
- type: dh.CoreClient.LOGIN_TYPE_ANONYMOUS
23
- };
18
+ var getLoginOptions = useCallback(() => ({
19
+ type: dh.CoreClient.LOGIN_TYPE_ANONYMOUS
24
20
  }), [dh]);
25
21
  return /*#__PURE__*/React.createElement(AuthPluginBase, {
26
22
  getLoginOptions: getLoginOptions
@@ -1 +1 @@
1
- {"version":3,"file":"AuthPluginAnonymous.js","names":["React","useCallback","useApi","AUTH_HANDLER_TYPE_ANONYMOUS","AuthPluginBase","UserPermissionsOverrideContext","permissionsOverrides","canLogout","Component","children","dh","getLoginOptions","type","CoreClient","LOGIN_TYPE_ANONYMOUS","AuthPluginAnonymous","isAvailable","authHandlers","includes"],"sources":["../src/AuthPluginAnonymous.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport { AUTH_HANDLER_TYPE_ANONYMOUS } from './AuthHandlerTypes';\nimport { AuthPlugin, AuthPluginProps } from './AuthPlugin';\nimport AuthPluginBase from './AuthPluginBase';\nimport {\n UserPermissionsOverride,\n UserPermissionsOverrideContext,\n} from './UserContexts';\n\nconst permissionsOverrides: UserPermissionsOverride = { canLogout: false };\n\n/**\n * AuthPlugin that tries to login anonymously. Fails if anonymous login fails\n */\nfunction Component({ children }: AuthPluginProps): JSX.Element {\n const dh = useApi();\n\n const getLoginOptions = useCallback(\n async () => ({ type: dh.CoreClient.LOGIN_TYPE_ANONYMOUS }),\n [dh]\n );\n\n return (\n <AuthPluginBase getLoginOptions={getLoginOptions}>\n <UserPermissionsOverrideContext.Provider value={permissionsOverrides}>\n {children}\n </UserPermissionsOverrideContext.Provider>\n </AuthPluginBase>\n );\n}\n\nconst AuthPluginAnonymous: AuthPlugin = {\n Component,\n isAvailable: authHandlers =>\n authHandlers.includes(AUTH_HANDLER_TYPE_ANONYMOUS),\n};\n\nexport default AuthPluginAnonymous;\n"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,SAASC,MAAM,QAAQ,4BAA4B;AAAC,SAC3CC,2BAA2B;AAAA,OAE7BC,cAAc;AAAA,SAGnBC,8BAA8B;AAGhC,IAAMC,oBAA6C,GAAG;EAAEC,SAAS,EAAE;AAAM,CAAC;;AAE1E;AACA;AACA;AACA,SAASC,SAAS,OAA6C;EAAA,IAA5C;IAAEC;EAA0B,CAAC;EAC9C,IAAMC,EAAE,GAAGR,MAAM,EAAE;EAEnB,IAAMS,eAAe,GAAGV,WAAW,iCACjC;IAAA,OAAa;MAAEW,IAAI,EAAEF,EAAE,CAACG,UAAU,CAACC;IAAqB,CAAC;EAAA,CAAC,GAC1D,CAACJ,EAAE,CAAC,CACL;EAED,oBACE,oBAAC,cAAc;IAAC,eAAe,EAAEC;EAAgB,gBAC/C,oBAAC,8BAA8B,CAAC,QAAQ;IAAC,KAAK,EAAEL;EAAqB,GAClEG,QAAQ,CAC+B,CAC3B;AAErB;AAEA,IAAMM,mBAA+B,GAAG;EACtCP,SAAS;EACTQ,WAAW,EAAEC,YAAY,IACvBA,YAAY,CAACC,QAAQ,CAACf,2BAA2B;AACrD,CAAC;AAED,eAAeY,mBAAmB"}
1
+ {"version":3,"file":"AuthPluginAnonymous.js","names":["React","useCallback","useApi","AUTH_HANDLER_TYPE_ANONYMOUS","AuthPluginBase","UserPermissionsOverrideContext","permissionsOverrides","canLogout","Component","_ref","children","dh","getLoginOptions","type","CoreClient","LOGIN_TYPE_ANONYMOUS","createElement","Provider","value","AuthPluginAnonymous","isAvailable","authHandlers","includes"],"sources":["../src/AuthPluginAnonymous.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport { AUTH_HANDLER_TYPE_ANONYMOUS } from './AuthHandlerTypes';\nimport { AuthPlugin, AuthPluginProps } from './AuthPlugin';\nimport AuthPluginBase from './AuthPluginBase';\nimport {\n UserPermissionsOverride,\n UserPermissionsOverrideContext,\n} from './UserContexts';\n\nconst permissionsOverrides: UserPermissionsOverride = { canLogout: false };\n\n/**\n * AuthPlugin that tries to login anonymously. Fails if anonymous login fails\n */\nfunction Component({ children }: AuthPluginProps): JSX.Element {\n const dh = useApi();\n\n const getLoginOptions = useCallback(\n () => ({ type: dh.CoreClient.LOGIN_TYPE_ANONYMOUS }),\n [dh]\n );\n\n return (\n <AuthPluginBase getLoginOptions={getLoginOptions}>\n <UserPermissionsOverrideContext.Provider value={permissionsOverrides}>\n {children}\n </UserPermissionsOverrideContext.Provider>\n </AuthPluginBase>\n );\n}\n\nconst AuthPluginAnonymous: AuthPlugin = {\n Component,\n isAvailable: authHandlers =>\n authHandlers.includes(AUTH_HANDLER_TYPE_ANONYMOUS),\n};\n\nexport default AuthPluginAnonymous;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,SAASC,MAAM,QAAQ,4BAA4B;AAAC,SAC3CC,2BAA2B;AAAA,OAE7BC,cAAc;AAAA,SAGnBC,8BAA8B;AAGhC,IAAMC,oBAA6C,GAAG;EAAEC,SAAS,EAAE;AAAM,CAAC;;AAE1E;AACA;AACA;AACA,SAASC,SAASA,CAAAC,IAAA,EAA6C;EAAA,IAA5C;IAAEC;EAA0B,CAAC,GAAAD,IAAA;EAC9C,IAAME,EAAE,GAAGT,MAAM,CAAC,CAAC;EAEnB,IAAMU,eAAe,GAAGX,WAAW,CACjC,OAAO;IAAEY,IAAI,EAAEF,EAAE,CAACG,UAAU,CAACC;EAAqB,CAAC,CAAC,EACpD,CAACJ,EAAE,CACL,CAAC;EAED,oBACEX,KAAA,CAAAgB,aAAA,CAACZ,cAAc;IAACQ,eAAe,EAAEA;EAAgB,gBAC/CZ,KAAA,CAAAgB,aAAA,CAACX,8BAA8B,CAACY,QAAQ;IAACC,KAAK,EAAEZ;EAAqB,GAClEI,QACsC,CAC3B,CAAC;AAErB;AAEA,IAAMS,mBAA+B,GAAG;EACtCX,SAAS;EACTY,WAAW,EAAEC,YAAY,IACvBA,YAAY,CAACC,QAAQ,CAACnB,2BAA2B;AACrD,CAAC;AAED,eAAegB,mBAAmB"}
@@ -9,7 +9,7 @@ export type AuthPluginBaseProps = {
9
9
  * Retrieve the login options for logging in to the client
10
10
  * @returns A promise for the login options
11
11
  */
12
- getLoginOptions: () => Promise<LoginOptions>;
12
+ getLoginOptions: () => LoginOptions | Promise<LoginOptions>;
13
13
  };
14
14
  /**
15
15
  * Base AuthPlugin that gets passed a function for retrieving the login options, and then attempting to login with them.
@@ -1 +1 @@
1
- {"version":3,"file":"AuthPluginBase.d.ts","sourceRoot":"","sources":["../src/AuthPluginBase.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAKtD,MAAM,MAAM,mBAAmB,GAAG;IAChC;;OAEG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAE1B;;;OAGG;IACH,eAAe,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;CAC9C,CAAC;AAEF;;;GAGG;AACH,iBAAS,cAAc,CAAC,EACtB,QAAQ,EACR,eAAe,GAChB,EAAE,mBAAmB,GAAG,GAAG,CAAC,OAAO,CAiDnC;AAED,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"AuthPluginBase.d.ts","sourceRoot":"","sources":["../src/AuthPluginBase.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAMtD,MAAM,MAAM,mBAAmB,GAAG;IAChC;;OAEG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAE1B;;;OAGG;IACH,eAAe,EAAE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC7D,CAAC;AAEF;;;GAGG;AACH,iBAAS,cAAc,CAAC,EACtB,QAAQ,EACR,eAAe,GAChB,EAAE,mBAAmB,GAAG,GAAG,CAAC,OAAO,CAmDnC;AAED,eAAe,cAAc,CAAC"}
@@ -4,7 +4,8 @@ import React, { useEffect, useState } from 'react';
4
4
  import { LoadingOverlay } from '@deephaven/components';
5
5
  import { useClient } from '@deephaven/jsapi-bootstrap';
6
6
  import Log from '@deephaven/log';
7
- import { CanceledPromiseError } from '@deephaven/utils';
7
+ import { CanceledPromiseError, getErrorMessage } from '@deephaven/utils';
8
+ import AuthenticationError from "./AuthenticationError.js";
8
9
  var log = Log.module('AuthPluginBase');
9
10
  /**
10
11
  * Base AuthPlugin that gets passed a function for retrieving the login options, and then attempting to login with them.
@@ -39,8 +40,10 @@ function AuthPluginBase(_ref) {
39
40
  setIsLoggedIn(true);
40
41
  } catch (e) {
41
42
  if (!isCanceled) {
43
+ var _getErrorMessage;
42
44
  log.error('Unable to login:', e);
43
- setError(e);
45
+ var message = (_getErrorMessage = getErrorMessage(e)) !== null && _getErrorMessage !== void 0 ? _getErrorMessage : 'Unable to login. Verify credentials.';
46
+ setError(new AuthenticationError(message));
44
47
  setIsLoggedIn(false);
45
48
  }
46
49
  }
@@ -57,7 +60,7 @@ function AuthPluginBase(_ref) {
57
60
  "data-testid": "auth-base-loading",
58
61
  isLoading: error == null,
59
62
  isLoaded: false,
60
- errorMessage: error != null ? "".concat(error) : null
63
+ errorMessage: getErrorMessage(error)
61
64
  });
62
65
  }
63
66
 
@@ -1 +1 @@
1
- {"version":3,"file":"AuthPluginBase.js","names":["React","useEffect","useState","LoadingOverlay","useClient","Log","CanceledPromiseError","log","module","AuthPluginBase","children","getLoginOptions","client","error","setError","isLoggedIn","setIsLoggedIn","isCanceled","verifyNotCanceled","login","loginOptions","info","e"],"sources":["../src/AuthPluginBase.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { LoadingOverlay } from '@deephaven/components';\nimport { useClient } from '@deephaven/jsapi-bootstrap';\nimport Log from '@deephaven/log';\nimport { LoginOptions } from '@deephaven/jsapi-types';\nimport { CanceledPromiseError } from '@deephaven/utils';\n\nconst log = Log.module('AuthPluginBase');\n\nexport type AuthPluginBaseProps = {\n /**\n * The children to render after authentication is completed.\n */\n children: React.ReactNode;\n\n /**\n * Retrieve the login options for logging in to the client\n * @returns A promise for the login options\n */\n getLoginOptions: () => Promise<LoginOptions>;\n};\n\n/**\n * Base AuthPlugin that gets passed a function for retrieving the login options, and then attempting to login with them.\n * @param getLoginOptions Function that returns a promise for the login options\n */\nfunction AuthPluginBase({\n children,\n getLoginOptions,\n}: AuthPluginBaseProps): JSX.Element {\n const client = useClient();\n const [error, setError] = useState<unknown>();\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n\n useEffect(() => {\n let isCanceled = false;\n function verifyNotCanceled() {\n if (isCanceled) {\n throw new CanceledPromiseError('Login canceled.');\n }\n }\n async function login() {\n try {\n const loginOptions = await getLoginOptions();\n verifyNotCanceled();\n\n log.info('Logging in...');\n await client.login(loginOptions);\n verifyNotCanceled();\n\n setIsLoggedIn(true);\n } catch (e) {\n if (!isCanceled) {\n log.error('Unable to login:', e);\n setError(e);\n setIsLoggedIn(false);\n }\n }\n }\n login();\n return () => {\n isCanceled = true;\n };\n }, [client, getLoginOptions]);\n\n if (!isLoggedIn) {\n return (\n <LoadingOverlay\n data-testid=\"auth-base-loading\"\n isLoading={error == null}\n isLoaded={false}\n errorMessage={error != null ? `${error}` : null}\n />\n );\n }\n\n // eslint-disable-next-line react/jsx-no-useless-fragment\n return <>{children}</>;\n}\n\nexport default AuthPluginBase;\n"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAClD,SAASC,cAAc,QAAQ,uBAAuB;AACtD,SAASC,SAAS,QAAQ,4BAA4B;AACtD,OAAOC,GAAG,MAAM,gBAAgB;AAEhC,SAASC,oBAAoB,QAAQ,kBAAkB;AAEvD,IAAMC,GAAG,GAAGF,GAAG,CAACG,MAAM,CAAC,gBAAgB,CAAC;AAexC;AACA;AACA;AACA;AACA,SAASC,cAAc,OAGc;EAAA,IAHb;IACtBC,QAAQ;IACRC;EACmB,CAAC;EACpB,IAAMC,MAAM,GAAGR,SAAS,EAAE;EAC1B,IAAM,CAACS,KAAK,EAAEC,QAAQ,CAAC,GAAGZ,QAAQ,EAAW;EAC7C,IAAM,CAACa,UAAU,EAAEC,aAAa,CAAC,GAAGd,QAAQ,CAAC,KAAK,CAAC;EAEnDD,SAAS,CAAC,MAAM;IACd,IAAIgB,UAAU,GAAG,KAAK;IACtB,SAASC,iBAAiB,GAAG;MAC3B,IAAID,UAAU,EAAE;QACd,MAAM,IAAIX,oBAAoB,CAAC,iBAAiB,CAAC;MACnD;IACF;IAAC,SACca,KAAK;MAAA;IAAA;IAAA;MAAA,2BAApB,aAAuB;QACrB,IAAI;UACF,IAAMC,YAAY,SAAST,eAAe,EAAE;UAC5CO,iBAAiB,EAAE;UAEnBX,GAAG,CAACc,IAAI,CAAC,eAAe,CAAC;UACzB,MAAMT,MAAM,CAACO,KAAK,CAACC,YAAY,CAAC;UAChCF,iBAAiB,EAAE;UAEnBF,aAAa,CAAC,IAAI,CAAC;QACrB,CAAC,CAAC,OAAOM,CAAC,EAAE;UACV,IAAI,CAACL,UAAU,EAAE;YACfV,GAAG,CAACM,KAAK,CAAC,kBAAkB,EAAES,CAAC,CAAC;YAChCR,QAAQ,CAACQ,CAAC,CAAC;YACXN,aAAa,CAAC,KAAK,CAAC;UACtB;QACF;MACF,CAAC;MAAA;IAAA;IACDG,KAAK,EAAE;IACP,OAAO,MAAM;MACXF,UAAU,GAAG,IAAI;IACnB,CAAC;EACH,CAAC,EAAE,CAACL,MAAM,EAAED,eAAe,CAAC,CAAC;EAE7B,IAAI,CAACI,UAAU,EAAE;IACf,oBACE,oBAAC,cAAc;MACb,eAAY,mBAAmB;MAC/B,SAAS,EAAEF,KAAK,IAAI,IAAK;MACzB,QAAQ,EAAE,KAAM;MAChB,YAAY,EAAEA,KAAK,IAAI,IAAI,aAAMA,KAAK,IAAK;IAAK,EAChD;EAEN;;EAEA;EACA,oBAAO,0CAAGH,QAAQ,CAAI;AACxB;AAEA,eAAeD,cAAc"}
1
+ {"version":3,"file":"AuthPluginBase.js","names":["React","useEffect","useState","LoadingOverlay","useClient","Log","CanceledPromiseError","getErrorMessage","AuthenticationError","log","module","AuthPluginBase","_ref","children","getLoginOptions","client","error","setError","isLoggedIn","setIsLoggedIn","isCanceled","verifyNotCanceled","login","_login","apply","arguments","_asyncToGenerator","loginOptions","info","e","_getErrorMessage","message","createElement","isLoading","isLoaded","errorMessage","Fragment"],"sources":["../src/AuthPluginBase.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { LoadingOverlay } from '@deephaven/components';\nimport { useClient } from '@deephaven/jsapi-bootstrap';\nimport Log from '@deephaven/log';\nimport { LoginOptions } from '@deephaven/jsapi-types';\nimport { CanceledPromiseError, getErrorMessage } from '@deephaven/utils';\nimport AuthenticationError from './AuthenticationError';\n\nconst log = Log.module('AuthPluginBase');\n\nexport type AuthPluginBaseProps = {\n /**\n * The children to render after authentication is completed.\n */\n children: React.ReactNode;\n\n /**\n * Retrieve the login options for logging in to the client\n * @returns A promise for the login options\n */\n getLoginOptions: () => LoginOptions | Promise<LoginOptions>;\n};\n\n/**\n * Base AuthPlugin that gets passed a function for retrieving the login options, and then attempting to login with them.\n * @param getLoginOptions Function that returns a promise for the login options\n */\nfunction AuthPluginBase({\n children,\n getLoginOptions,\n}: AuthPluginBaseProps): JSX.Element {\n const client = useClient();\n const [error, setError] = useState<unknown>();\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n\n useEffect(() => {\n let isCanceled = false;\n function verifyNotCanceled() {\n if (isCanceled) {\n throw new CanceledPromiseError('Login canceled.');\n }\n }\n async function login() {\n try {\n const loginOptions = await getLoginOptions();\n verifyNotCanceled();\n\n log.info('Logging in...');\n await client.login(loginOptions);\n verifyNotCanceled();\n\n setIsLoggedIn(true);\n } catch (e) {\n if (!isCanceled) {\n log.error('Unable to login:', e);\n const message =\n getErrorMessage(e) ?? 'Unable to login. Verify credentials.';\n setError(new AuthenticationError(message));\n setIsLoggedIn(false);\n }\n }\n }\n login();\n return () => {\n isCanceled = true;\n };\n }, [client, getLoginOptions]);\n\n if (!isLoggedIn) {\n return (\n <LoadingOverlay\n data-testid=\"auth-base-loading\"\n isLoading={error == null}\n isLoaded={false}\n errorMessage={getErrorMessage(error)}\n />\n );\n }\n\n // eslint-disable-next-line react/jsx-no-useless-fragment\n return <>{children}</>;\n}\n\nexport default AuthPluginBase;\n"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAClD,SAASC,cAAc,QAAQ,uBAAuB;AACtD,SAASC,SAAS,QAAQ,4BAA4B;AACtD,OAAOC,GAAG,MAAM,gBAAgB;AAEhC,SAASC,oBAAoB,EAAEC,eAAe,QAAQ,kBAAkB;AAAC,OAClEC,mBAAmB;AAE1B,IAAMC,GAAG,GAAGJ,GAAG,CAACK,MAAM,CAAC,gBAAgB,CAAC;AAexC;AACA;AACA;AACA;AACA,SAASC,cAAcA,CAAAC,IAAA,EAGc;EAAA,IAHb;IACtBC,QAAQ;IACRC;EACmB,CAAC,GAAAF,IAAA;EACpB,IAAMG,MAAM,GAAGX,SAAS,CAAC,CAAC;EAC1B,IAAM,CAACY,KAAK,EAAEC,QAAQ,CAAC,GAAGf,QAAQ,CAAU,CAAC;EAC7C,IAAM,CAACgB,UAAU,EAAEC,aAAa,CAAC,GAAGjB,QAAQ,CAAC,KAAK,CAAC;EAEnDD,SAAS,CAAC,MAAM;IACd,IAAImB,UAAU,GAAG,KAAK;IACtB,SAASC,iBAAiBA,CAAA,EAAG;MAC3B,IAAID,UAAU,EAAE;QACd,MAAM,IAAId,oBAAoB,CAAC,iBAAiB,CAAC;MACnD;IACF;IAAC,SACcgB,KAAKA,CAAA;MAAA,OAAAC,MAAA,CAAAC,KAAA,OAAAC,SAAA;IAAA;IAAA,SAAAF,OAAA;MAAAA,MAAA,GAAAG,iBAAA,CAApB,aAAuB;QACrB,IAAI;UACF,IAAMC,YAAY,SAASb,eAAe,CAAC,CAAC;UAC5CO,iBAAiB,CAAC,CAAC;UAEnBZ,GAAG,CAACmB,IAAI,CAAC,eAAe,CAAC;UACzB,MAAMb,MAAM,CAACO,KAAK,CAACK,YAAY,CAAC;UAChCN,iBAAiB,CAAC,CAAC;UAEnBF,aAAa,CAAC,IAAI,CAAC;QACrB,CAAC,CAAC,OAAOU,CAAC,EAAE;UACV,IAAI,CAACT,UAAU,EAAE;YAAA,IAAAU,gBAAA;YACfrB,GAAG,CAACO,KAAK,CAAC,kBAAkB,EAAEa,CAAC,CAAC;YAChC,IAAME,OAAO,IAAAD,gBAAA,GACXvB,eAAe,CAACsB,CAAC,CAAC,cAAAC,gBAAA,cAAAA,gBAAA,GAAI,sCAAsC;YAC9Db,QAAQ,CAAC,IAAIT,mBAAmB,CAACuB,OAAO,CAAC,CAAC;YAC1CZ,aAAa,CAAC,KAAK,CAAC;UACtB;QACF;MACF,CAAC;MAAA,OAAAI,MAAA,CAAAC,KAAA,OAAAC,SAAA;IAAA;IACDH,KAAK,CAAC,CAAC;IACP,OAAO,MAAM;MACXF,UAAU,GAAG,IAAI;IACnB,CAAC;EACH,CAAC,EAAE,CAACL,MAAM,EAAED,eAAe,CAAC,CAAC;EAE7B,IAAI,CAACI,UAAU,EAAE;IACf,oBACElB,KAAA,CAAAgC,aAAA,CAAC7B,cAAc;MACb,eAAY,mBAAmB;MAC/B8B,SAAS,EAAEjB,KAAK,IAAI,IAAK;MACzBkB,QAAQ,EAAE,KAAM;MAChBC,YAAY,EAAE5B,eAAe,CAACS,KAAK;IAAE,CACtC,CAAC;EAEN;;EAEA;EACA,oBAAOhB,KAAA,CAAAgC,aAAA,CAAAhC,KAAA,CAAAoC,QAAA,QAAGvB,QAAW,CAAC;AACxB;AAEA,eAAeF,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"AuthPluginParent.js","names":["React","LOGIN_OPTIONS_REQUEST","requestParentResponse","Log","AuthPluginBase","UserPermissionsOverrideContext","log","module","permissionsOverrides","canLogout","getLoginOptions","info","getWindowAuthProvider","URLSearchParams","window","location","search","get","Component","children","AuthPluginParent","isAvailable","opener"],"sources":["../src/AuthPluginParent.tsx"],"sourcesContent":["import React from 'react';\nimport { LoginOptions } from '@deephaven/jsapi-types';\nimport {\n LOGIN_OPTIONS_REQUEST,\n requestParentResponse,\n} from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { AuthPlugin, AuthPluginProps } from './AuthPlugin';\nimport AuthPluginBase from './AuthPluginBase';\nimport {\n UserPermissionsOverride,\n UserPermissionsOverrideContext,\n} from './UserContexts';\n\nconst log = Log.module('AuthPluginParent');\n\nconst permissionsOverrides: UserPermissionsOverride = { canLogout: false };\n\nfunction getLoginOptions(): Promise<LoginOptions> {\n log.info('Logging in by delegating to parent window...');\n return requestParentResponse<LoginOptions>(LOGIN_OPTIONS_REQUEST);\n}\n\nfunction getWindowAuthProvider(): string {\n return new URLSearchParams(window.location.search).get('authProvider') ?? '';\n}\n\n/**\n * AuthPlugin that tries to delegate to the parent window for authentication. Fails if there is no parent window.\n */\nfunction Component({ children }: AuthPluginProps): JSX.Element {\n return (\n <AuthPluginBase getLoginOptions={getLoginOptions}>\n <UserPermissionsOverrideContext.Provider value={permissionsOverrides}>\n {children}\n </UserPermissionsOverrideContext.Provider>\n </AuthPluginBase>\n );\n}\n\nconst AuthPluginParent: AuthPlugin = {\n Component,\n isAvailable: () =>\n window.opener != null && getWindowAuthProvider() === 'parent',\n};\n\nexport default AuthPluginParent;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SACEC,qBAAqB,EACrBC,qBAAqB,QAChB,wBAAwB;AAC/B,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAE1BC,cAAc;AAAA,SAGnBC,8BAA8B;AAGhC,IAAMC,GAAG,GAAGH,GAAG,CAACI,MAAM,CAAC,kBAAkB,CAAC;AAE1C,IAAMC,oBAA6C,GAAG;EAAEC,SAAS,EAAE;AAAM,CAAC;AAE1E,SAASC,eAAe,GAA0B;EAChDJ,GAAG,CAACK,IAAI,CAAC,8CAA8C,CAAC;EACxD,OAAOT,qBAAqB,CAAeD,qBAAqB,CAAC;AACnE;AAEA,SAASW,qBAAqB,GAAW;EAAA;EACvC,+BAAO,IAAIC,eAAe,CAACC,MAAM,CAACC,QAAQ,CAACC,MAAM,CAAC,CAACC,GAAG,CAAC,cAAc,CAAC,uEAAI,EAAE;AAC9E;;AAEA;AACA;AACA;AACA,SAASC,SAAS,OAA6C;EAAA,IAA5C;IAAEC;EAA0B,CAAC;EAC9C,oBACE,oBAAC,cAAc;IAAC,eAAe,EAAET;EAAgB,gBAC/C,oBAAC,8BAA8B,CAAC,QAAQ;IAAC,KAAK,EAAEF;EAAqB,GAClEW,QAAQ,CAC+B,CAC3B;AAErB;AAEA,IAAMC,gBAA4B,GAAG;EACnCF,SAAS;EACTG,WAAW,EAAE,MACXP,MAAM,CAACQ,MAAM,IAAI,IAAI,IAAIV,qBAAqB,EAAE,KAAK;AACzD,CAAC;AAED,eAAeQ,gBAAgB"}
1
+ {"version":3,"file":"AuthPluginParent.js","names":["React","LOGIN_OPTIONS_REQUEST","requestParentResponse","Log","AuthPluginBase","UserPermissionsOverrideContext","log","module","permissionsOverrides","canLogout","getLoginOptions","info","getWindowAuthProvider","_URLSearchParams$get","URLSearchParams","window","location","search","get","Component","_ref","children","createElement","Provider","value","AuthPluginParent","isAvailable","opener"],"sources":["../src/AuthPluginParent.tsx"],"sourcesContent":["import React from 'react';\nimport { LoginOptions } from '@deephaven/jsapi-types';\nimport {\n LOGIN_OPTIONS_REQUEST,\n requestParentResponse,\n} from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { AuthPlugin, AuthPluginProps } from './AuthPlugin';\nimport AuthPluginBase from './AuthPluginBase';\nimport {\n UserPermissionsOverride,\n UserPermissionsOverrideContext,\n} from './UserContexts';\n\nconst log = Log.module('AuthPluginParent');\n\nconst permissionsOverrides: UserPermissionsOverride = { canLogout: false };\n\nfunction getLoginOptions(): Promise<LoginOptions> {\n log.info('Logging in by delegating to parent window...');\n return requestParentResponse<LoginOptions>(LOGIN_OPTIONS_REQUEST);\n}\n\nfunction getWindowAuthProvider(): string {\n return new URLSearchParams(window.location.search).get('authProvider') ?? '';\n}\n\n/**\n * AuthPlugin that tries to delegate to the parent window for authentication. Fails if there is no parent window.\n */\nfunction Component({ children }: AuthPluginProps): JSX.Element {\n return (\n <AuthPluginBase getLoginOptions={getLoginOptions}>\n <UserPermissionsOverrideContext.Provider value={permissionsOverrides}>\n {children}\n </UserPermissionsOverrideContext.Provider>\n </AuthPluginBase>\n );\n}\n\nconst AuthPluginParent: AuthPlugin = {\n Component,\n isAvailable: () =>\n window.opener != null && getWindowAuthProvider() === 'parent',\n};\n\nexport default AuthPluginParent;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SACEC,qBAAqB,EACrBC,qBAAqB,QAChB,wBAAwB;AAC/B,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAE1BC,cAAc;AAAA,SAGnBC,8BAA8B;AAGhC,IAAMC,GAAG,GAAGH,GAAG,CAACI,MAAM,CAAC,kBAAkB,CAAC;AAE1C,IAAMC,oBAA6C,GAAG;EAAEC,SAAS,EAAE;AAAM,CAAC;AAE1E,SAASC,eAAeA,CAAA,EAA0B;EAChDJ,GAAG,CAACK,IAAI,CAAC,8CAA8C,CAAC;EACxD,OAAOT,qBAAqB,CAAeD,qBAAqB,CAAC;AACnE;AAEA,SAASW,qBAAqBA,CAAA,EAAW;EAAA,IAAAC,oBAAA;EACvC,QAAAA,oBAAA,GAAO,IAAIC,eAAe,CAACC,MAAM,CAACC,QAAQ,CAACC,MAAM,CAAC,CAACC,GAAG,CAAC,cAAc,CAAC,cAAAL,oBAAA,cAAAA,oBAAA,GAAI,EAAE;AAC9E;;AAEA;AACA;AACA;AACA,SAASM,SAASA,CAAAC,IAAA,EAA6C;EAAA,IAA5C;IAAEC;EAA0B,CAAC,GAAAD,IAAA;EAC9C,oBACEpB,KAAA,CAAAsB,aAAA,CAAClB,cAAc;IAACM,eAAe,EAAEA;EAAgB,gBAC/CV,KAAA,CAAAsB,aAAA,CAACjB,8BAA8B,CAACkB,QAAQ;IAACC,KAAK,EAAEhB;EAAqB,GAClEa,QACsC,CAC3B,CAAC;AAErB;AAEA,IAAMI,gBAA4B,GAAG;EACnCN,SAAS;EACTO,WAAW,EAAEA,CAAA,KACXX,MAAM,CAACY,MAAM,IAAI,IAAI,IAAIf,qBAAqB,CAAC,CAAC,KAAK;AACzD,CAAC;AAED,eAAea,gBAAgB"}
@@ -1 +1 @@
1
- {"version":3,"file":"AuthPluginPsk.d.ts","sourceRoot":"","sources":["../src/AuthPluginPsk.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AA8M3D,QAAA,MAAM,aAAa,EAAE,UAGpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"AuthPluginPsk.d.ts","sourceRoot":"","sources":["../src/AuthPluginPsk.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AA2M3D,QAAA,MAAM,aAAa,EAAE,UAGpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -6,9 +6,11 @@ import { LoadingOverlay, ThemeExport } from '@deephaven/components';
6
6
  import { useClient } from '@deephaven/jsapi-bootstrap';
7
7
  import { useBroadcastLoginListener } from '@deephaven/jsapi-components';
8
8
  import Log from '@deephaven/log';
9
+ import { getErrorMessage } from '@deephaven/utils';
9
10
  import Cookies from 'js-cookie';
10
11
  import LoginForm from "./LoginForm.js";
11
12
  import Login from "./Login.js";
13
+ import AuthenticationError from "./AuthenticationError.js";
12
14
  var AUTH_TYPE = 'io.deephaven.authentication.psk.PskAuthenticationHandler';
13
15
  var PSK_QUERY_PARAM_KEY = 'psk';
14
16
  var PSK_TOKEN_KEY = 'io.deephaven.web.client.auth.psk.token';
@@ -18,14 +20,9 @@ function getWindowToken() {
18
20
  }
19
21
  function clearWindowToken() {
20
22
  log.debug2('clearWindowToken');
21
- var params = new URLSearchParams(window.location.search);
22
- params.delete(PSK_QUERY_PARAM_KEY);
23
- var queryString = "".concat(params);
24
- if (queryString.length > 0) {
25
- queryString = "?".concat(queryString);
26
- }
27
- var newPath = "".concat(window.location.pathname).concat(queryString).concat(window.location.hash);
28
- window.history.replaceState(null, '', newPath);
23
+ var url = new URL(window.location.href);
24
+ url.searchParams.delete(PSK_QUERY_PARAM_KEY);
25
+ window.history.replaceState(null, '', url.href);
29
26
  }
30
27
  function readCookieToken() {
31
28
  var _Cookies$get;
@@ -87,8 +84,10 @@ function Component(_ref) {
87
84
  }
88
85
  setIsInputRequired(true);
89
86
  if (showError) {
90
- var _detail;
91
- setError((_detail = e === null || e === void 0 ? void 0 : e.detail) !== null && _detail !== void 0 ? _detail : 'Unable to login: Verify credentials.');
87
+ var _getErrorMessage;
88
+ log.error('Unable to login', e);
89
+ var message = (_getErrorMessage = getErrorMessage(e)) !== null && _getErrorMessage !== void 0 ? _getErrorMessage : 'Unable to login: Verify credentials.';
90
+ setError(new AuthenticationError(message));
92
91
  }
93
92
  }
94
93
  setIsLoggingIn(false);
@@ -172,7 +171,7 @@ function Component(_ref) {
172
171
  mountOnEnter: true,
173
172
  unmountOnExit: true
174
173
  }, /*#__PURE__*/React.createElement(Login, null, /*#__PURE__*/React.createElement(LoginForm, {
175
- errorMessage: error != null ? "".concat(error) : undefined,
174
+ errorMessage: getErrorMessage(error),
176
175
  isLoggingIn: isLoggingIn,
177
176
  onSubmit: handleSubmit
178
177
  }, /*#__PURE__*/React.createElement("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"AuthPluginPsk.js","names":["React","useCallback","useEffect","useRef","useState","CSSTransition","LoadingOverlay","ThemeExport","useClient","useBroadcastLoginListener","Log","Cookies","LoginForm","Login","AUTH_TYPE","PSK_QUERY_PARAM_KEY","PSK_TOKEN_KEY","log","module","getWindowToken","URLSearchParams","window","location","search","get","clearWindowToken","debug2","params","delete","queryString","length","newPath","pathname","hash","history","replaceState","readCookieToken","storeCookieToken","token","set","secure","sameSite","remove","Component","children","client","inputField","loginPromise","error","setError","isInputRequired","setIsInputRequired","isLoggedIn","setIsLoggedIn","isLoggingIn","setIsLoggingIn","setToken","login","loginToken","showError","info","newLoginPromise","type","current","e","detail","cancelLogin","onLogin","debug","newToken","onLogout","isCanceled","initialLogin","initialToken","handleSubmit","autoFocusInput","focus","transitionMs","undefined","event","target","value","AuthPluginPsk","isAvailable","authHandlers","includes"],"sources":["../src/AuthPluginPsk.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport { LoadingOverlay, ThemeExport } from '@deephaven/components';\nimport { useClient } from '@deephaven/jsapi-bootstrap';\nimport { useBroadcastLoginListener } from '@deephaven/jsapi-components';\nimport Log from '@deephaven/log';\nimport Cookies from 'js-cookie';\nimport { AuthPlugin, AuthPluginProps } from './AuthPlugin';\nimport LoginForm from './LoginForm';\nimport Login from './Login';\n\nconst AUTH_TYPE = 'io.deephaven.authentication.psk.PskAuthenticationHandler';\n\nconst PSK_QUERY_PARAM_KEY = 'psk';\n\nconst PSK_TOKEN_KEY = 'io.deephaven.web.client.auth.psk.token';\n\nconst log = Log.module('AuthPluginPsk');\n\nfunction getWindowToken(): string | null {\n return new URLSearchParams(window.location.search).get(PSK_QUERY_PARAM_KEY);\n}\n\nfunction clearWindowToken() {\n log.debug2('clearWindowToken');\n const params = new URLSearchParams(window.location.search);\n params.delete(PSK_QUERY_PARAM_KEY);\n\n let queryString = `${params}`;\n if (queryString.length > 0) {\n queryString = `?${queryString}`;\n }\n const newPath = `${window.location.pathname}${queryString}${window.location.hash}`;\n window.history.replaceState(null, '', newPath);\n}\n\nfunction readCookieToken(): string | null {\n return Cookies.get(PSK_TOKEN_KEY) ?? null;\n}\n\nfunction storeCookieToken(token: string | null): void {\n log.debug2('Storing token in cookie', token);\n if (token != null) {\n Cookies.set(PSK_TOKEN_KEY, token, { secure: true, sameSite: 'strict' });\n } else {\n Cookies.remove(PSK_TOKEN_KEY);\n }\n}\n\n/**\n * AuthPlugin that tries to login using a pre-shared key.\n * Add the `psk=<token>` parameter to your URL string to set the token.\n */\nfunction Component({ children }: AuthPluginProps): JSX.Element {\n const client = useClient();\n const inputField = useRef<HTMLInputElement>(null);\n const loginPromise = useRef<Promise<void> | null>(null);\n const [error, setError] = useState<unknown>();\n const [isInputRequired, setIsInputRequired] = useState(false);\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [isLoggingIn, setIsLoggingIn] = useState(false);\n const [token, setToken] = useState('');\n\n const login = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n async (loginToken: string, showError: boolean = true) => {\n log.info('Logging in...');\n setIsLoggingIn(true);\n let newLoginPromise: Promise<void> | null = null;\n try {\n newLoginPromise = client.login({ type: AUTH_TYPE, token: loginToken });\n loginPromise.current = newLoginPromise;\n await newLoginPromise;\n\n log.info('Logged in successfully');\n if (loginPromise.current !== newLoginPromise) {\n return;\n }\n storeCookieToken(loginToken);\n setIsLoggedIn(true);\n } catch (e) {\n if (loginPromise.current !== newLoginPromise) {\n return;\n }\n setIsInputRequired(true);\n if (showError) {\n setError(\n (e as CustomEvent)?.detail ?? 'Unable to login: Verify credentials.'\n );\n }\n }\n setIsLoggingIn(false);\n },\n [client]\n );\n\n const cancelLogin = useCallback(() => {\n loginPromise.current = null;\n setIsLoggingIn(false);\n }, []);\n\n const onLogin = useCallback(async () => {\n log.debug('onLogin');\n\n // User logged in successfully in another tab, we should be able to read the token from the cookie and login\n const newToken = readCookieToken();\n if (isLoggedIn || isLoggingIn || newToken == null) {\n return;\n }\n\n login(newToken, false);\n }, [isLoggedIn, isLoggingIn, login]);\n const onLogout = useCallback(() => {\n storeCookieToken(null);\n }, []);\n useBroadcastLoginListener(onLogin, onLogout);\n\n useEffect(() => {\n let isCanceled = false;\n async function initialLogin() {\n const initialToken = getWindowToken() ?? readCookieToken();\n clearWindowToken();\n\n if (initialToken == null) {\n setIsInputRequired(true);\n return;\n }\n\n setIsLoggingIn(true);\n try {\n await client.login({ type: AUTH_TYPE, token: initialToken });\n if (!isCanceled) {\n storeCookieToken(initialToken);\n setIsLoggedIn(true);\n setIsLoggingIn(false);\n }\n } catch (e) {\n if (!isCanceled) {\n setIsInputRequired(true);\n setIsLoggingIn(false);\n }\n }\n }\n initialLogin();\n return () => {\n isCanceled = true;\n };\n }, [client]);\n\n const handleSubmit = useCallback(() => {\n if (!isLoggingIn) {\n login(token);\n } else {\n cancelLogin();\n }\n }, [cancelLogin, isLoggingIn, login, token]);\n\n useEffect(\n function autoFocusInput() {\n inputField.current?.focus();\n },\n [inputField, isInputRequired]\n );\n\n return (\n <>\n {isLoggedIn && children}\n {isInputRequired && (\n <CSSTransition\n in={!isLoggedIn}\n timeout={ThemeExport.transitionMs}\n classNames=\"fade\"\n mountOnEnter\n unmountOnExit\n >\n <Login>\n <LoginForm\n errorMessage={error != null ? `${error}` : undefined}\n isLoggingIn={isLoggingIn}\n onSubmit={handleSubmit}\n >\n <div className=\"form-group\">\n <label htmlFor=\"auth-psk-token-input\">Token</label>\n <input\n id=\"auth-psk-token-input\"\n name=\"token\"\n className=\"input-token form-control\"\n type=\"text\"\n autoComplete=\"username\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n ref={inputField}\n value={token}\n onChange={event => {\n setError(undefined);\n setToken(event.target.value);\n }}\n />\n </div>\n </LoginForm>\n </Login>\n </CSSTransition>\n )}\n <LoadingOverlay\n data-testid=\"auth-psk-loading\"\n isLoaded={isLoggedIn || isInputRequired}\n isLoading={!isLoggedIn && !isInputRequired}\n />\n </>\n );\n}\n\nconst AuthPluginPsk: AuthPlugin = {\n Component,\n isAvailable: authHandlers => authHandlers.includes(AUTH_TYPE),\n};\n\nexport default AuthPluginPsk;\n"],"mappings":"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"}
1
+ {"version":3,"file":"AuthPluginPsk.js","names":["React","useCallback","useEffect","useRef","useState","CSSTransition","LoadingOverlay","ThemeExport","useClient","useBroadcastLoginListener","Log","getErrorMessage","Cookies","LoginForm","Login","AuthenticationError","AUTH_TYPE","PSK_QUERY_PARAM_KEY","PSK_TOKEN_KEY","log","module","getWindowToken","URLSearchParams","window","location","search","get","clearWindowToken","debug2","url","URL","href","searchParams","delete","history","replaceState","readCookieToken","_Cookies$get","storeCookieToken","token","set","secure","sameSite","remove","Component","_ref","children","client","inputField","loginPromise","error","setError","isInputRequired","setIsInputRequired","isLoggedIn","setIsLoggedIn","isLoggingIn","setIsLoggingIn","setToken","login","_ref2","_asyncToGenerator","loginToken","showError","arguments","length","undefined","info","newLoginPromise","type","current","e","_getErrorMessage","message","_x","apply","cancelLogin","onLogin","debug","newToken","onLogout","isCanceled","initialLogin","_initialLogin","_getWindowToken","initialToken","handleSubmit","autoFocusInput","_inputField$current","focus","createElement","Fragment","in","timeout","transitionMs","classNames","mountOnEnter","unmountOnExit","errorMessage","onSubmit","className","htmlFor","id","name","autoComplete","autoCapitalize","autoCorrect","spellCheck","ref","value","onChange","event","target","isLoaded","isLoading","AuthPluginPsk","isAvailable","authHandlers","includes"],"sources":["../src/AuthPluginPsk.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport { LoadingOverlay, ThemeExport } from '@deephaven/components';\nimport { useClient } from '@deephaven/jsapi-bootstrap';\nimport { useBroadcastLoginListener } from '@deephaven/jsapi-components';\nimport Log from '@deephaven/log';\nimport { getErrorMessage } from '@deephaven/utils';\nimport Cookies from 'js-cookie';\nimport { AuthPlugin, AuthPluginProps } from './AuthPlugin';\nimport LoginForm from './LoginForm';\nimport Login from './Login';\nimport AuthenticationError from './AuthenticationError';\n\nconst AUTH_TYPE = 'io.deephaven.authentication.psk.PskAuthenticationHandler';\n\nconst PSK_QUERY_PARAM_KEY = 'psk';\n\nconst PSK_TOKEN_KEY = 'io.deephaven.web.client.auth.psk.token';\n\nconst log = Log.module('AuthPluginPsk');\n\nfunction getWindowToken(): string | null {\n return new URLSearchParams(window.location.search).get(PSK_QUERY_PARAM_KEY);\n}\n\nfunction clearWindowToken() {\n log.debug2('clearWindowToken');\n const url = new URL(window.location.href);\n url.searchParams.delete(PSK_QUERY_PARAM_KEY);\n\n window.history.replaceState(null, '', url.href);\n}\n\nfunction readCookieToken(): string | null {\n return Cookies.get(PSK_TOKEN_KEY) ?? null;\n}\n\nfunction storeCookieToken(token: string | null): void {\n log.debug2('Storing token in cookie', token);\n if (token != null) {\n Cookies.set(PSK_TOKEN_KEY, token, { secure: true, sameSite: 'strict' });\n } else {\n Cookies.remove(PSK_TOKEN_KEY);\n }\n}\n\n/**\n * AuthPlugin that tries to login using a pre-shared key.\n * Add the `psk=<token>` parameter to your URL string to set the token.\n */\nfunction Component({ children }: AuthPluginProps): JSX.Element {\n const client = useClient();\n const inputField = useRef<HTMLInputElement>(null);\n const loginPromise = useRef<Promise<void> | null>(null);\n const [error, setError] = useState<unknown>();\n const [isInputRequired, setIsInputRequired] = useState(false);\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [isLoggingIn, setIsLoggingIn] = useState(false);\n const [token, setToken] = useState('');\n\n const login = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n async (loginToken: string, showError: boolean = true) => {\n log.info('Logging in...');\n setIsLoggingIn(true);\n let newLoginPromise: Promise<void> | null = null;\n try {\n newLoginPromise = client.login({ type: AUTH_TYPE, token: loginToken });\n loginPromise.current = newLoginPromise;\n await newLoginPromise;\n\n log.info('Logged in successfully');\n if (loginPromise.current !== newLoginPromise) {\n return;\n }\n storeCookieToken(loginToken);\n setIsLoggedIn(true);\n } catch (e) {\n if (loginPromise.current !== newLoginPromise) {\n return;\n }\n setIsInputRequired(true);\n if (showError) {\n log.error('Unable to login', e);\n const message =\n getErrorMessage(e) ?? 'Unable to login: Verify credentials.';\n setError(new AuthenticationError(message));\n }\n }\n setIsLoggingIn(false);\n },\n [client]\n );\n\n const cancelLogin = useCallback(() => {\n loginPromise.current = null;\n setIsLoggingIn(false);\n }, []);\n\n const onLogin = useCallback(async () => {\n log.debug('onLogin');\n\n // User logged in successfully in another tab, we should be able to read the token from the cookie and login\n const newToken = readCookieToken();\n if (isLoggedIn || isLoggingIn || newToken == null) {\n return;\n }\n\n login(newToken, false);\n }, [isLoggedIn, isLoggingIn, login]);\n const onLogout = useCallback(() => {\n storeCookieToken(null);\n }, []);\n useBroadcastLoginListener(onLogin, onLogout);\n\n useEffect(() => {\n let isCanceled = false;\n async function initialLogin() {\n const initialToken = getWindowToken() ?? readCookieToken();\n clearWindowToken();\n\n if (initialToken == null) {\n setIsInputRequired(true);\n return;\n }\n\n setIsLoggingIn(true);\n try {\n await client.login({ type: AUTH_TYPE, token: initialToken });\n if (!isCanceled) {\n storeCookieToken(initialToken);\n setIsLoggedIn(true);\n setIsLoggingIn(false);\n }\n } catch (e) {\n if (!isCanceled) {\n setIsInputRequired(true);\n setIsLoggingIn(false);\n }\n }\n }\n initialLogin();\n return () => {\n isCanceled = true;\n };\n }, [client]);\n\n const handleSubmit = useCallback(() => {\n if (!isLoggingIn) {\n login(token);\n } else {\n cancelLogin();\n }\n }, [cancelLogin, isLoggingIn, login, token]);\n\n useEffect(\n function autoFocusInput() {\n inputField.current?.focus();\n },\n [inputField, isInputRequired]\n );\n\n return (\n <>\n {isLoggedIn && children}\n {isInputRequired && (\n <CSSTransition\n in={!isLoggedIn}\n timeout={ThemeExport.transitionMs}\n classNames=\"fade\"\n mountOnEnter\n unmountOnExit\n >\n <Login>\n <LoginForm\n errorMessage={getErrorMessage(error)}\n isLoggingIn={isLoggingIn}\n onSubmit={handleSubmit}\n >\n <div className=\"form-group\">\n <label htmlFor=\"auth-psk-token-input\">Token</label>\n <input\n id=\"auth-psk-token-input\"\n name=\"token\"\n className=\"input-token form-control\"\n type=\"text\"\n autoComplete=\"username\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n ref={inputField}\n value={token}\n onChange={event => {\n setError(undefined);\n setToken(event.target.value);\n }}\n />\n </div>\n </LoginForm>\n </Login>\n </CSSTransition>\n )}\n <LoadingOverlay\n data-testid=\"auth-psk-loading\"\n isLoaded={isLoggedIn || isInputRequired}\n isLoading={!isLoggedIn && !isInputRequired}\n />\n </>\n );\n}\n\nconst AuthPluginPsk: AuthPlugin = {\n Component,\n isAvailable: authHandlers => authHandlers.includes(AUTH_TYPE),\n};\n\nexport default AuthPluginPsk;\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare class AuthenticationError extends Error {
2
+ name: string;
3
+ isAuthenticationError: boolean;
4
+ }
5
+ export default AuthenticationError;
6
+ //# sourceMappingURL=AuthenticationError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthenticationError.d.ts","sourceRoot":"","sources":["../src/AuthenticationError.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,IAAI,SAAyB;IAE7B,qBAAqB,UAAQ;CAC9B;AAED,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,12 @@
1
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
3
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
4
+ export class AuthenticationError extends Error {
5
+ constructor() {
6
+ super(...arguments);
7
+ _defineProperty(this, "name", 'AuthenticationError');
8
+ _defineProperty(this, "isAuthenticationError", true);
9
+ }
10
+ }
11
+ export default AuthenticationError;
12
+ //# sourceMappingURL=AuthenticationError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthenticationError.js","names":["AuthenticationError","Error","constructor","arguments","_defineProperty"],"sources":["../src/AuthenticationError.ts"],"sourcesContent":["export class AuthenticationError extends Error {\n name = 'AuthenticationError';\n\n isAuthenticationError = true;\n}\n\nexport default AuthenticationError;\n"],"mappings":";;;AAAA,OAAO,MAAMA,mBAAmB,SAASC,KAAK,CAAC;EAAAC,YAAA;IAAA,SAAAC,SAAA;IAAAC,eAAA,eACtC,qBAAqB;IAAAA,eAAA,gCAEJ,IAAI;EAAA;AAC9B;AAEA,eAAeJ,mBAAmB"}
@@ -1 +1 @@
1
- {"version":3,"file":"Login.d.ts","sourceRoot":"","sources":["../src/Login.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,cAAc,CAAC;AAEtB,UAAU,UAAU;IAClB,8DAA8D;IAC9D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,UAAU,eAgB7C;AAED,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Login.d.ts","sourceRoot":"","sources":["../src/Login.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,cAAc,CAAC;AAEtB,UAAU,UAAU;IAClB,8DAA8D;IAC9D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,UAAU,eAgB7C;AAED,eAAe,KAAK,CAAC"}
package/dist/Login.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { RandomAreaPlotAnimation } from '@deephaven/components';
3
+ import Logo from "./logo.png.js";
3
4
  import "./Login.css";
4
5
  export function Login(_ref) {
5
6
  var {
@@ -12,7 +13,7 @@ export function Login(_ref) {
12
13
  }, /*#__PURE__*/React.createElement("div", {
13
14
  className: "logo"
14
15
  }, /*#__PURE__*/React.createElement("img", {
15
- src: "/logo",
16
+ src: Logo,
16
17
  alt: "Deephaven Data Labs"
17
18
  })), children, /*#__PURE__*/React.createElement("p", {
18
19
  className: "footer"
package/dist/Login.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Login.js","names":["React","RandomAreaPlotAnimation","Login","children","Date","getFullYear"],"sources":["../src/Login.tsx"],"sourcesContent":["import React from 'react';\nimport { RandomAreaPlotAnimation } from '@deephaven/components';\nimport './Login.scss';\n\ninterface LoginProps {\n /** What to show in the login input part of the login form. */\n children: React.ReactNode;\n}\n\nexport function Login({ children }: LoginProps) {\n return (\n <div className=\"login-container\">\n <RandomAreaPlotAnimation />\n <div className=\"login-box\">\n <div className=\"logo\">\n <img src=\"/logo\" alt=\"Deephaven Data Labs\" />\n </div>\n {children}\n <p className=\"footer\">\n © 2016-{new Date().getFullYear()} Deephaven Data Labs LLC. Patent\n Pending.\n </p>\n </div>\n </div>\n );\n}\n\nexport default Login;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,uBAAuB,QAAQ,uBAAuB;AAAC;AAQhE,OAAO,SAASC,KAAK,OAA2B;EAAA,IAA1B;IAAEC;EAAqB,CAAC;EAC5C,oBACE;IAAK,SAAS,EAAC;EAAiB,gBAC9B,oBAAC,uBAAuB,OAAG,eAC3B;IAAK,SAAS,EAAC;EAAW,gBACxB;IAAK,SAAS,EAAC;EAAM,gBACnB;IAAK,GAAG,EAAC,OAAO;IAAC,GAAG,EAAC;EAAqB,EAAG,CACzC,EACLA,QAAQ,eACT;IAAG,SAAS,EAAC;EAAQ,GAAC,YACb,EAAC,IAAIC,IAAI,EAAE,CAACC,WAAW,EAAE,EAAC,2CAEnC,CAAI,CACA,CACF;AAEV;AAEA,eAAeH,KAAK"}
1
+ {"version":3,"file":"Login.js","names":["React","RandomAreaPlotAnimation","Logo","Login","_ref","children","createElement","className","src","alt","Date","getFullYear"],"sources":["../src/Login.tsx"],"sourcesContent":["import React from 'react';\nimport { RandomAreaPlotAnimation } from '@deephaven/components';\nimport Logo from './logo.png';\nimport './Login.scss';\n\ninterface LoginProps {\n /** What to show in the login input part of the login form. */\n children: React.ReactNode;\n}\n\nexport function Login({ children }: LoginProps) {\n return (\n <div className=\"login-container\">\n <RandomAreaPlotAnimation />\n <div className=\"login-box\">\n <div className=\"logo\">\n <img src={Logo} alt=\"Deephaven Data Labs\" />\n </div>\n {children}\n <p className=\"footer\">\n © 2016-{new Date().getFullYear()} Deephaven Data Labs LLC. Patent\n Pending.\n </p>\n </div>\n </div>\n );\n}\n\nexport default Login;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,uBAAuB,QAAQ,uBAAuB;AAAC,OACzDC,IAAI;AAAA;AAQX,OAAO,SAASC,KAAKA,CAAAC,IAAA,EAA2B;EAAA,IAA1B;IAAEC;EAAqB,CAAC,GAAAD,IAAA;EAC5C,oBACEJ,KAAA,CAAAM,aAAA;IAAKC,SAAS,EAAC;EAAiB,gBAC9BP,KAAA,CAAAM,aAAA,CAACL,uBAAuB,MAAE,CAAC,eAC3BD,KAAA,CAAAM,aAAA;IAAKC,SAAS,EAAC;EAAW,gBACxBP,KAAA,CAAAM,aAAA;IAAKC,SAAS,EAAC;EAAM,gBACnBP,KAAA,CAAAM,aAAA;IAAKE,GAAG,EAAEN,IAAK;IAACO,GAAG,EAAC;EAAqB,CAAE,CACxC,CAAC,EACLJ,QAAQ,eACTL,KAAA,CAAAM,aAAA;IAAGC,SAAS,EAAC;EAAQ,GAAC,YACb,EAAC,IAAIG,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,EAAC,2CAEhC,CACA,CACF,CAAC;AAEV;AAEA,eAAeR,KAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"LoginForm.js","names":["LoadingSpinner","classNames","React","LoginForm","children","errorMessage","isLoggingIn","onSubmit","event","preventDefault","stopPropagation"],"sources":["../src/LoginForm.tsx"],"sourcesContent":["import { LoadingSpinner } from '@deephaven/components';\nimport classNames from 'classnames';\nimport React, { FormEventHandler } from 'react';\nimport './LoginForm.scss';\n\nexport interface LoginFormProps {\n /** What to display inside the form */\n children: React.ReactNode;\n\n /** Error message to display */\n errorMessage?: string;\n\n /** Whether currently logging in */\n isLoggingIn?: boolean;\n\n /** Triggered when the form is submitting */\n onSubmit?: FormEventHandler;\n}\n\nexport function LoginForm({\n children,\n errorMessage,\n isLoggingIn = false,\n onSubmit,\n}: LoginFormProps) {\n return (\n <form\n className=\"login-form\"\n onSubmit={event => {\n event.preventDefault();\n event.stopPropagation();\n onSubmit?.(event);\n }}\n >\n <div className=\"flex-spacer\" />\n <div className=\"flex-wrapper\">\n <fieldset disabled={isLoggingIn} className=\"container-fluid\">\n {children}\n </fieldset>\n <div className=\"form-group d-flex justify-content-end align-items-center mb-0\">\n <button\n type=\"submit\"\n className={classNames(\n 'btn btn-primary',\n { 'btn-spinner': isLoggingIn },\n { 'btn-cancelable': isLoggingIn }\n )}\n data-testid=\"btn-login\"\n >\n {isLoggingIn && (\n <span>\n <LoadingSpinner />\n <span className=\"btn-normal-content\">Logging in</span>\n <span className=\"btn-hover-content\">Cancel</span>\n </span>\n )}\n {!isLoggingIn && 'Login'}\n </button>\n </div>\n </div>\n <div className=\"flex-spacer\">\n {errorMessage != null && (\n <p className=\"error-message mb-0\" role=\"alert\">{`${errorMessage}`}</p>\n )}\n </div>\n </form>\n );\n}\n\nexport default LoginForm;\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ,uBAAuB;AACtD,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,MAA4B,OAAO;AAAC;AAiBhD,OAAO,SAASC,SAAS,OAKN;EAAA,IALO;IACxBC,QAAQ;IACRC,YAAY;IACZC,WAAW,GAAG,KAAK;IACnBC,QAAQ,EAARA;EACc,CAAC;EACf,oBACE;IACE,SAAS,EAAC,YAAY;IACtB,QAAQ,EAAEC,KAAK,IAAI;MACjBA,KAAK,CAACC,cAAc,EAAE;MACtBD,KAAK,CAACE,eAAe,EAAE;MACvBH,SAAQ,aAARA,SAAQ,uBAARA,SAAQ,CAAGC,KAAK,CAAC;IACnB;EAAE,gBAEF;IAAK,SAAS,EAAC;EAAa,EAAG,eAC/B;IAAK,SAAS,EAAC;EAAc,gBAC3B;IAAU,QAAQ,EAAEF,WAAY;IAAC,SAAS,EAAC;EAAiB,GACzDF,QAAQ,CACA,eACX;IAAK,SAAS,EAAC;EAA+D,gBAC5E;IACE,IAAI,EAAC,QAAQ;IACb,SAAS,EAAEH,UAAU,CACnB,iBAAiB,EACjB;MAAE,aAAa,EAAEK;IAAY,CAAC,EAC9B;MAAE,gBAAgB,EAAEA;IAAY,CAAC,CACjC;IACF,eAAY;EAAW,GAEtBA,WAAW,iBACV,+CACE,oBAAC,cAAc,OAAG,eAClB;IAAM,SAAS,EAAC;EAAoB,GAAC,YAAU,CAAO,eACtD;IAAM,SAAS,EAAC;EAAmB,GAAC,QAAM,CAAO,CAEpD,EACA,CAACA,WAAW,IAAI,OAAO,CACjB,CACL,CACF,eACN;IAAK,SAAS,EAAC;EAAa,GACzBD,YAAY,IAAI,IAAI,iBACnB;IAAG,SAAS,EAAC,oBAAoB;IAAC,IAAI,EAAC;EAAO,aAAKA,YAAY,EAChE,CACG,CACD;AAEX;AAEA,eAAeF,SAAS"}
1
+ {"version":3,"file":"LoginForm.js","names":["LoadingSpinner","classNames","React","LoginForm","_ref","children","errorMessage","isLoggingIn","onSubmit","createElement","className","event","preventDefault","stopPropagation","disabled","type","role","concat"],"sources":["../src/LoginForm.tsx"],"sourcesContent":["import { LoadingSpinner } from '@deephaven/components';\nimport classNames from 'classnames';\nimport React, { FormEventHandler } from 'react';\nimport './LoginForm.scss';\n\nexport interface LoginFormProps {\n /** What to display inside the form */\n children: React.ReactNode;\n\n /** Error message to display */\n errorMessage?: string;\n\n /** Whether currently logging in */\n isLoggingIn?: boolean;\n\n /** Triggered when the form is submitting */\n onSubmit?: FormEventHandler;\n}\n\nexport function LoginForm({\n children,\n errorMessage,\n isLoggingIn = false,\n onSubmit,\n}: LoginFormProps) {\n return (\n <form\n className=\"login-form\"\n onSubmit={event => {\n event.preventDefault();\n event.stopPropagation();\n onSubmit?.(event);\n }}\n >\n <div className=\"flex-spacer\" />\n <div className=\"flex-wrapper\">\n <fieldset disabled={isLoggingIn} className=\"container-fluid\">\n {children}\n </fieldset>\n <div className=\"form-group d-flex justify-content-end align-items-center mb-0\">\n <button\n type=\"submit\"\n className={classNames(\n 'btn btn-primary',\n { 'btn-spinner': isLoggingIn },\n { 'btn-cancelable': isLoggingIn }\n )}\n data-testid=\"btn-login\"\n >\n {isLoggingIn && (\n <span>\n <LoadingSpinner />\n <span className=\"btn-normal-content\">Logging in</span>\n <span className=\"btn-hover-content\">Cancel</span>\n </span>\n )}\n {!isLoggingIn && 'Login'}\n </button>\n </div>\n </div>\n <div className=\"flex-spacer\">\n {errorMessage != null && (\n <p className=\"error-message mb-0\" role=\"alert\">{`${errorMessage}`}</p>\n )}\n </div>\n </form>\n );\n}\n\nexport default LoginForm;\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ,uBAAuB;AACtD,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,MAA4B,OAAO;AAAC;AAiBhD,OAAO,SAASC,SAASA,CAAAC,IAAA,EAKN;EAAA,IALO;IACxBC,QAAQ;IACRC,YAAY;IACZC,WAAW,GAAG,KAAK;IACnBC,QAAQ,EAARA;EACc,CAAC,GAAAJ,IAAA;EACf,oBACEF,KAAA,CAAAO,aAAA;IACEC,SAAS,EAAC,YAAY;IACtBF,QAAQ,EAAEG,KAAK,IAAI;MACjBA,KAAK,CAACC,cAAc,CAAC,CAAC;MACtBD,KAAK,CAACE,eAAe,CAAC,CAAC;MACvBL,SAAQ,aAARA,SAAQ,uBAARA,SAAQ,CAAGG,KAAK,CAAC;IACnB;EAAE,gBAEFT,KAAA,CAAAO,aAAA;IAAKC,SAAS,EAAC;EAAa,CAAE,CAAC,eAC/BR,KAAA,CAAAO,aAAA;IAAKC,SAAS,EAAC;EAAc,gBAC3BR,KAAA,CAAAO,aAAA;IAAUK,QAAQ,EAAEP,WAAY;IAACG,SAAS,EAAC;EAAiB,GACzDL,QACO,CAAC,eACXH,KAAA,CAAAO,aAAA;IAAKC,SAAS,EAAC;EAA+D,gBAC5ER,KAAA,CAAAO,aAAA;IACEM,IAAI,EAAC,QAAQ;IACbL,SAAS,EAAET,UAAU,CACnB,iBAAiB,EACjB;MAAE,aAAa,EAAEM;IAAY,CAAC,EAC9B;MAAE,gBAAgB,EAAEA;IAAY,CAClC,CAAE;IACF,eAAY;EAAW,GAEtBA,WAAW,iBACVL,KAAA,CAAAO,aAAA,4BACEP,KAAA,CAAAO,aAAA,CAACT,cAAc,MAAE,CAAC,eAClBE,KAAA,CAAAO,aAAA;IAAMC,SAAS,EAAC;EAAoB,GAAC,YAAgB,CAAC,eACtDR,KAAA,CAAAO,aAAA;IAAMC,SAAS,EAAC;EAAmB,GAAC,QAAY,CAC5C,CACP,EACA,CAACH,WAAW,IAAI,OACX,CACL,CACF,CAAC,eACNL,KAAA,CAAAO,aAAA;IAAKC,SAAS,EAAC;EAAa,GACzBJ,YAAY,IAAI,IAAI,iBACnBJ,KAAA,CAAAO,aAAA;IAAGC,SAAS,EAAC,oBAAoB;IAACM,IAAI,EAAC;EAAO,MAAAC,MAAA,CAAKX,YAAY,CAAM,CAEpE,CACD,CAAC;AAEX;AAEA,eAAeH,SAAS"}
@@ -1 +1 @@
1
- {"version":3,"file":"UserContexts.js","names":["createContext","UserOverrideContext","UserPermissionsOverrideContext"],"sources":["../src/UserContexts.ts"],"sourcesContent":["import { createContext } from 'react';\nimport { User, UserPermissions } from '@deephaven/redux';\n\nexport type UserOverride = Partial<Omit<User, 'permissions'>>;\n\nexport type UserPermissionsOverride = Partial<UserPermissions>;\n\nexport const UserOverrideContext = createContext<UserOverride>({});\n\nexport const UserPermissionsOverrideContext = createContext<UserPermissionsOverride>(\n {}\n);\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,OAAO;AAOrC,OAAO,IAAMC,mBAAmB,gBAAGD,aAAa,CAAe,CAAC,CAAC,CAAC;AAElE,OAAO,IAAME,8BAA8B,gBAAGF,aAAa,CACzD,CAAC,CAAC,CACH"}
1
+ {"version":3,"file":"UserContexts.js","names":["createContext","UserOverrideContext","UserPermissionsOverrideContext"],"sources":["../src/UserContexts.ts"],"sourcesContent":["import { createContext } from 'react';\nimport { User, UserPermissions } from '@deephaven/redux';\n\nexport type UserOverride = Partial<Omit<User, 'permissions'>>;\n\nexport type UserPermissionsOverride = Partial<UserPermissions>;\n\nexport const UserOverrideContext = createContext<UserOverride>({});\n\nexport const UserPermissionsOverrideContext = createContext<UserPermissionsOverride>(\n {}\n);\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,OAAO;AAOrC,OAAO,IAAMC,mBAAmB,gBAAGD,aAAa,CAAe,CAAC,CAAC,CAAC;AAElE,OAAO,IAAME,8BAA8B,gBAAGF,aAAa,CACzD,CAAC,CACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/auth-plugins",
3
- "version": "0.37.4-logout.0+8e151036",
3
+ "version": "0.37.4-logout.17+a5bc3af7",
4
4
  "description": "Deephaven Auth Plugins",
5
5
  "keywords": [
6
6
  "Deephaven",
@@ -33,24 +33,25 @@
33
33
  "build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
34
34
  },
35
35
  "dependencies": {
36
- "@deephaven/components": "^0.37.4-logout.0+8e151036",
37
- "@deephaven/jsapi-bootstrap": "^0.37.4-logout.0+8e151036",
38
- "@deephaven/jsapi-components": "^0.37.4-logout.0+8e151036",
39
- "@deephaven/jsapi-types": "^0.37.4-logout.0+8e151036",
40
- "@deephaven/jsapi-utils": "^0.37.4-logout.0+8e151036",
41
- "@deephaven/log": "^0.37.4-logout.0+8e151036",
42
- "@deephaven/redux": "^0.37.4-logout.0+8e151036",
43
- "@deephaven/utils": "^0.37.4-logout.0+8e151036",
36
+ "@deephaven/components": "^0.37.4-logout.17+a5bc3af7",
37
+ "@deephaven/jsapi-bootstrap": "^0.37.4-logout.17+a5bc3af7",
38
+ "@deephaven/jsapi-components": "^0.37.4-logout.17+a5bc3af7",
39
+ "@deephaven/jsapi-types": "^0.37.4-logout.17+a5bc3af7",
40
+ "@deephaven/jsapi-utils": "^0.37.4-logout.17+a5bc3af7",
41
+ "@deephaven/log": "^0.37.4-logout.17+a5bc3af7",
42
+ "@deephaven/redux": "^0.37.4-logout.17+a5bc3af7",
43
+ "@deephaven/utils": "^0.37.4-logout.17+a5bc3af7",
44
44
  "classnames": "^2.3.1",
45
45
  "js-cookie": "^3.0.5",
46
46
  "react-transition-group": "^4.4.2"
47
47
  },
48
48
  "devDependencies": {
49
- "@deephaven/tsconfig": "^0.37.4-logout.0+8e151036",
49
+ "@deephaven/tsconfig": "^0.37.4-logout.17+a5bc3af7",
50
50
  "@types/react": "^17.0.2"
51
51
  },
52
52
  "peerDependencies": {
53
- "react": "^17.x"
53
+ "react": "^17.x",
54
+ "react-dom": "^17.x"
54
55
  },
55
56
  "files": [
56
57
  "dist"
@@ -59,5 +60,5 @@
59
60
  "publishConfig": {
60
61
  "access": "public"
61
62
  },
62
- "gitHead": "8e1510368d71c624f955c768068638b1e9a2e551"
63
+ "gitHead": "a5bc3af798e649c843c13f585b76e8d5449c9fa7"
63
64
  }