@deephaven/app-utils 0.49.1-deephaven-ui.6 → 0.49.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.
- package/dist/components/AppBootstrap.d.ts +4 -1
- package/dist/components/AppBootstrap.d.ts.map +1 -1
- package/dist/components/AppBootstrap.js +2 -0
- package/dist/components/AppBootstrap.js.map +1 -1
- package/dist/components/PluginsBootstrap.d.ts +4 -1
- package/dist/components/PluginsBootstrap.d.ts.map +1 -1
- package/dist/components/PluginsBootstrap.js +6 -2
- package/dist/components/PluginsBootstrap.js.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/useLoadTablePlugin.d.ts +8 -0
- package/dist/components/useLoadTablePlugin.d.ts.map +1 -0
- package/dist/components/useLoadTablePlugin.js +31 -0
- package/dist/components/useLoadTablePlugin.js.map +1 -0
- package/dist/plugins/remote-component.config.d.ts +0 -8
- package/dist/plugins/remote-component.config.d.ts.map +1 -1
- package/dist/plugins/remote-component.config.js +0 -8
- package/dist/plugins/remote-component.config.js.map +1 -1
- package/package.json +13 -17
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import '@deephaven/components/scss/BaseStyleSheet.scss';
|
|
3
|
+
import { type DashboardPlugin } from '@deephaven/plugin';
|
|
3
4
|
export type AppBootstrapProps = {
|
|
4
5
|
/** URL of the server. */
|
|
5
6
|
serverUrl: string;
|
|
6
7
|
/** URL of the plugins to load. */
|
|
7
8
|
pluginsUrl: string;
|
|
9
|
+
/** The core plugins to load. */
|
|
10
|
+
getCorePlugins?: () => Promise<DashboardPlugin[]>;
|
|
8
11
|
/** Font class names to load. */
|
|
9
12
|
fontClassNames?: string[];
|
|
10
13
|
/**
|
|
@@ -16,6 +19,6 @@ export type AppBootstrapProps = {
|
|
|
16
19
|
* AppBootstrap component. Handles loading the fonts, client, and authentication.
|
|
17
20
|
* Will display the children when everything is loaded and authenticated.
|
|
18
21
|
*/
|
|
19
|
-
export declare function AppBootstrap({ fontClassNames, pluginsUrl, serverUrl, children, }: AppBootstrapProps): JSX.Element;
|
|
22
|
+
export declare function AppBootstrap({ fontClassNames, pluginsUrl, getCorePlugins, serverUrl, children, }: AppBootstrapProps): JSX.Element;
|
|
20
23
|
export default AppBootstrap;
|
|
21
24
|
//# sourceMappingURL=AppBootstrap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppBootstrap.d.ts","sourceRoot":"","sources":["../../src/components/AppBootstrap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAC9D,OAAO,gDAAgD,CAAC;
|
|
1
|
+
{"version":3,"file":"AppBootstrap.d.ts","sourceRoot":"","sources":["../../src/components/AppBootstrap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAC9D,OAAO,gDAAgD,CAAC;AAMxD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAUzD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAElB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IAEnB,gCAAgC;IAChC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAElD,gCAAgC;IAChC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B;;OAEG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,cAAc,EACd,UAAU,EACV,cAAc,EACd,SAAS,EACT,QAAQ,GACT,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAiCjC;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -19,6 +19,7 @@ export function AppBootstrap(_ref) {
|
|
|
19
19
|
var {
|
|
20
20
|
fontClassNames,
|
|
21
21
|
pluginsUrl,
|
|
22
|
+
getCorePlugins,
|
|
22
23
|
serverUrl,
|
|
23
24
|
children
|
|
24
25
|
} = _ref;
|
|
@@ -34,6 +35,7 @@ export function AppBootstrap(_ref) {
|
|
|
34
35
|
return /*#__PURE__*/_jsx(FontBootstrap, {
|
|
35
36
|
fontClassNames: fontClassNames,
|
|
36
37
|
children: /*#__PURE__*/_jsx(PluginsBootstrap, {
|
|
38
|
+
getCorePlugins: getCorePlugins,
|
|
37
39
|
pluginsUrl: pluginsUrl,
|
|
38
40
|
children: /*#__PURE__*/_jsx(ClientBootstrap, {
|
|
39
41
|
serverUrl: serverUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppBootstrap.js","names":["React","useCallback","useMemo","useState","ClientBootstrap","RefreshTokenBootstrap","useBroadcastLoginListener","FontBootstrap","PluginsBootstrap","AuthBootstrap","ConnectionBootstrap","getConnectOptions","FontsLoaded","UserBootstrap","ServerConfigBootstrap","AppBootstrap","fontClassNames","pluginsUrl","serverUrl","children","clientOptions","logoutCount","setLogoutCount","onLogin","undefined","onLogout","value"],"sources":["../../src/components/AppBootstrap.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from 'react';\nimport '@deephaven/components/scss/BaseStyleSheet.scss';\nimport { ClientBootstrap } from '@deephaven/jsapi-bootstrap';\nimport {\n RefreshTokenBootstrap,\n useBroadcastLoginListener,\n} from '@deephaven/jsapi-components';\nimport FontBootstrap from './FontBootstrap';\nimport PluginsBootstrap from './PluginsBootstrap';\nimport AuthBootstrap from './AuthBootstrap';\nimport ConnectionBootstrap from './ConnectionBootstrap';\nimport { getConnectOptions } from '../utils';\nimport FontsLoaded from './FontsLoaded';\nimport UserBootstrap from './UserBootstrap';\nimport ServerConfigBootstrap from './ServerConfigBootstrap';\n\nexport type AppBootstrapProps = {\n /** URL of the server. */\n serverUrl: string;\n\n /** URL of the plugins to load. */\n pluginsUrl: string;\n\n /** Font class names to load. */\n fontClassNames?: string[];\n\n /**\n * The children to render wrapped when everything is loaded and authenticated.\n */\n children: React.ReactNode;\n};\n\n/**\n * AppBootstrap component. Handles loading the fonts, client, and authentication.\n * Will display the children when everything is loaded and authenticated.\n */\nexport function AppBootstrap({\n fontClassNames,\n pluginsUrl,\n serverUrl,\n children,\n}: AppBootstrapProps): JSX.Element {\n const clientOptions = useMemo(() => getConnectOptions(), []);\n\n // On logout, we reset the client and have user login again\n const [logoutCount, setLogoutCount] = useState(0);\n const onLogin = useCallback(() => undefined, []);\n const onLogout = useCallback(() => {\n setLogoutCount(value => value + 1);\n }, []);\n useBroadcastLoginListener(onLogin, onLogout);\n return (\n <FontBootstrap fontClassNames={fontClassNames}>\n <PluginsBootstrap pluginsUrl={pluginsUrl}>\n <ClientBootstrap\n serverUrl={serverUrl}\n options={clientOptions}\n key={logoutCount}\n >\n <RefreshTokenBootstrap>\n <AuthBootstrap>\n <ServerConfigBootstrap>\n <UserBootstrap>\n <ConnectionBootstrap>\n <FontsLoaded>{children}</FontsLoaded>\n </ConnectionBootstrap>\n </UserBootstrap>\n </ServerConfigBootstrap>\n </AuthBootstrap>\n </RefreshTokenBootstrap>\n </ClientBootstrap>\n </PluginsBootstrap>\n </FontBootstrap>\n );\n}\n\nexport default AppBootstrap;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAC7D,OAAO,gDAAgD;AACvD,SAASC,eAAe,QAAQ,4BAA4B;AAC5D,SACEC,qBAAqB,EACrBC,yBAAyB,QACpB,6BAA6B;AAAC,
|
|
1
|
+
{"version":3,"file":"AppBootstrap.js","names":["React","useCallback","useMemo","useState","ClientBootstrap","RefreshTokenBootstrap","useBroadcastLoginListener","FontBootstrap","PluginsBootstrap","AuthBootstrap","ConnectionBootstrap","getConnectOptions","FontsLoaded","UserBootstrap","ServerConfigBootstrap","AppBootstrap","fontClassNames","pluginsUrl","getCorePlugins","serverUrl","children","clientOptions","logoutCount","setLogoutCount","onLogin","undefined","onLogout","value"],"sources":["../../src/components/AppBootstrap.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from 'react';\nimport '@deephaven/components/scss/BaseStyleSheet.scss';\nimport { ClientBootstrap } from '@deephaven/jsapi-bootstrap';\nimport {\n RefreshTokenBootstrap,\n useBroadcastLoginListener,\n} from '@deephaven/jsapi-components';\nimport { type DashboardPlugin } from '@deephaven/plugin';\nimport FontBootstrap from './FontBootstrap';\nimport PluginsBootstrap from './PluginsBootstrap';\nimport AuthBootstrap from './AuthBootstrap';\nimport ConnectionBootstrap from './ConnectionBootstrap';\nimport { getConnectOptions } from '../utils';\nimport FontsLoaded from './FontsLoaded';\nimport UserBootstrap from './UserBootstrap';\nimport ServerConfigBootstrap from './ServerConfigBootstrap';\n\nexport type AppBootstrapProps = {\n /** URL of the server. */\n serverUrl: string;\n\n /** URL of the plugins to load. */\n pluginsUrl: string;\n\n /** The core plugins to load. */\n getCorePlugins?: () => Promise<DashboardPlugin[]>;\n\n /** Font class names to load. */\n fontClassNames?: string[];\n\n /**\n * The children to render wrapped when everything is loaded and authenticated.\n */\n children: React.ReactNode;\n};\n\n/**\n * AppBootstrap component. Handles loading the fonts, client, and authentication.\n * Will display the children when everything is loaded and authenticated.\n */\nexport function AppBootstrap({\n fontClassNames,\n pluginsUrl,\n getCorePlugins,\n serverUrl,\n children,\n}: AppBootstrapProps): JSX.Element {\n const clientOptions = useMemo(() => getConnectOptions(), []);\n\n // On logout, we reset the client and have user login again\n const [logoutCount, setLogoutCount] = useState(0);\n const onLogin = useCallback(() => undefined, []);\n const onLogout = useCallback(() => {\n setLogoutCount(value => value + 1);\n }, []);\n useBroadcastLoginListener(onLogin, onLogout);\n return (\n <FontBootstrap fontClassNames={fontClassNames}>\n <PluginsBootstrap getCorePlugins={getCorePlugins} pluginsUrl={pluginsUrl}>\n <ClientBootstrap\n serverUrl={serverUrl}\n options={clientOptions}\n key={logoutCount}\n >\n <RefreshTokenBootstrap>\n <AuthBootstrap>\n <ServerConfigBootstrap>\n <UserBootstrap>\n <ConnectionBootstrap>\n <FontsLoaded>{children}</FontsLoaded>\n </ConnectionBootstrap>\n </UserBootstrap>\n </ServerConfigBootstrap>\n </AuthBootstrap>\n </RefreshTokenBootstrap>\n </ClientBootstrap>\n </PluginsBootstrap>\n </FontBootstrap>\n );\n}\n\nexport default AppBootstrap;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAC7D,OAAO,gDAAgD;AACvD,SAASC,eAAe,QAAQ,4BAA4B;AAC5D,SACEC,qBAAqB,EACrBC,yBAAyB,QACpB,6BAA6B;AAAC,OAE9BC,aAAa;AAAA,OACbC,gBAAgB;AAAA,OAChBC,aAAa;AAAA,OACbC,mBAAmB;AAAA,SACjBC,iBAAiB;AAAA,OACnBC,WAAW;AAAA,OACXC,aAAa;AAAA,OACbC,qBAAqB;AAAA;AAqB5B;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAY,OAMO;EAAA,IANN;IAC3BC,cAAc;IACdC,UAAU;IACVC,cAAc;IACdC,SAAS;IACTC;EACiB,CAAC;EAClB,IAAMC,aAAa,GAAGnB,OAAO,CAAC,MAAMS,iBAAiB,EAAE,EAAE,EAAE,CAAC;;EAE5D;EACA,IAAM,CAACW,WAAW,EAAEC,cAAc,CAAC,GAAGpB,QAAQ,CAAC,CAAC,CAAC;EACjD,IAAMqB,OAAO,GAAGvB,WAAW,CAAC,MAAMwB,SAAS,EAAE,EAAE,CAAC;EAChD,IAAMC,QAAQ,GAAGzB,WAAW,CAAC,MAAM;IACjCsB,cAAc,CAACI,KAAK,IAAIA,KAAK,GAAG,CAAC,CAAC;EACpC,CAAC,EAAE,EAAE,CAAC;EACNrB,yBAAyB,CAACkB,OAAO,EAAEE,QAAQ,CAAC;EAC5C,oBACE,KAAC,aAAa;IAAC,cAAc,EAAEV,cAAe;IAAA,uBAC5C,KAAC,gBAAgB;MAAC,cAAc,EAAEE,cAAe;MAAC,UAAU,EAAED,UAAW;MAAA,uBACvE,KAAC,eAAe;QACd,SAAS,EAAEE,SAAU;QACrB,OAAO,EAAEE,aAAc;QAAA,uBAGvB,KAAC,qBAAqB;UAAA,uBACpB,KAAC,aAAa;YAAA,uBACZ,KAAC,qBAAqB;cAAA,uBACpB,KAAC,aAAa;gBAAA,uBACZ,KAAC,mBAAmB;kBAAA,uBAClB,KAAC,WAAW;oBAAA,UAAED;kBAAQ;gBAAe;cACjB;YACR;UACM;QACV;MACM,GAZnBE,WAAW;IAaA;EACD,EACL;AAEpB;AAEA,eAAeP,YAAY"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type DashboardPlugin } from '@deephaven/plugin';
|
|
1
2
|
import React from 'react';
|
|
2
3
|
import { PluginModuleMap } from '../plugins';
|
|
3
4
|
export declare const PluginsContext: React.Context<PluginModuleMap | null>;
|
|
@@ -6,6 +7,8 @@ export type PluginsBootstrapProps = {
|
|
|
6
7
|
* Base URL of the plugins to load.
|
|
7
8
|
*/
|
|
8
9
|
pluginsUrl: string;
|
|
10
|
+
/** The core plugins to load. */
|
|
11
|
+
getCorePlugins?: () => Promise<DashboardPlugin[]>;
|
|
9
12
|
/**
|
|
10
13
|
* The children to render wrapped with the PluginsContext.
|
|
11
14
|
* Note that it renders the children even if the plugins aren't loaded yet.
|
|
@@ -15,6 +18,6 @@ export type PluginsBootstrapProps = {
|
|
|
15
18
|
/**
|
|
16
19
|
* PluginsBootstrap component. Handles loading the plugins.
|
|
17
20
|
*/
|
|
18
|
-
export declare function PluginsBootstrap({ pluginsUrl, children, }: PluginsBootstrapProps): JSX.Element;
|
|
21
|
+
export declare function PluginsBootstrap({ pluginsUrl, getCorePlugins, children, }: PluginsBootstrapProps): JSX.Element;
|
|
19
22
|
export default PluginsBootstrap;
|
|
20
23
|
//# sourceMappingURL=PluginsBootstrap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PluginsBootstrap.d.ts","sourceRoot":"","sources":["../../src/components/PluginsBootstrap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,eAAe,EAAqB,MAAM,YAAY,CAAC;AAEhE,eAAO,MAAM,cAAc,uCAA8C,CAAC;AAE1E,MAAM,MAAM,qBAAqB,GAAG;IAClC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,QAAQ,GACT,EAAE,qBAAqB,GAAG,GAAG,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"PluginsBootstrap.d.ts","sourceRoot":"","sources":["../../src/components/PluginsBootstrap.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAA6C,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,eAAe,EAAqB,MAAM,YAAY,CAAC;AAEhE,eAAO,MAAM,cAAc,uCAA8C,CAAC;AAE1E,MAAM,MAAM,qBAAqB,GAAG;IAClC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB,gCAAgC;IAChC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAElD;;;OAGG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,cAAc,EACd,QAAQ,GACT,EAAE,qBAAqB,GAAG,GAAG,CAAC,OAAO,CA4BrC;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -10,6 +10,7 @@ export var PluginsContext = /*#__PURE__*/createContext(null);
|
|
|
10
10
|
export function PluginsBootstrap(_ref) {
|
|
11
11
|
var {
|
|
12
12
|
pluginsUrl,
|
|
13
|
+
getCorePlugins,
|
|
13
14
|
children
|
|
14
15
|
} = _ref;
|
|
15
16
|
var [plugins, setPlugins] = useState(null);
|
|
@@ -20,9 +21,12 @@ export function PluginsBootstrap(_ref) {
|
|
|
20
21
|
}
|
|
21
22
|
function _loadPlugins() {
|
|
22
23
|
_loadPlugins = _asyncToGenerator(function* () {
|
|
24
|
+
var _yield$getCorePlugins;
|
|
25
|
+
var corePlugins = (_yield$getCorePlugins = yield getCorePlugins === null || getCorePlugins === void 0 ? void 0 : getCorePlugins()) !== null && _yield$getCorePlugins !== void 0 ? _yield$getCorePlugins : [];
|
|
23
26
|
var pluginModules = yield loadModulePlugins(pluginsUrl);
|
|
24
27
|
if (!isCanceled) {
|
|
25
|
-
|
|
28
|
+
var corePluginPairs = corePlugins.map(plugin => [plugin.name, plugin]);
|
|
29
|
+
setPlugins(new Map([...corePluginPairs, ...pluginModules]));
|
|
26
30
|
}
|
|
27
31
|
});
|
|
28
32
|
return _loadPlugins.apply(this, arguments);
|
|
@@ -31,7 +35,7 @@ export function PluginsBootstrap(_ref) {
|
|
|
31
35
|
return () => {
|
|
32
36
|
isCanceled = true;
|
|
33
37
|
};
|
|
34
|
-
}, [pluginsUrl]);
|
|
38
|
+
}, [pluginsUrl, getCorePlugins]);
|
|
35
39
|
return /*#__PURE__*/_jsx(PluginsContext.Provider, {
|
|
36
40
|
value: plugins,
|
|
37
41
|
children: children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PluginsBootstrap.js","names":["React","createContext","useEffect","useState","loadModulePlugins","PluginsContext","PluginsBootstrap","pluginsUrl","children","plugins","setPlugins","initPlugins","isCanceled","loadPlugins","pluginModules"],"sources":["../../src/components/PluginsBootstrap.tsx"],"sourcesContent":["import React, { createContext, useEffect, useState } from 'react';\nimport { PluginModuleMap, loadModulePlugins } from '../plugins';\n\nexport const PluginsContext = createContext<PluginModuleMap | null>(null);\n\nexport type PluginsBootstrapProps = {\n /**\n * Base URL of the plugins to load.\n */\n pluginsUrl: string;\n\n /**\n * The children to render wrapped with the PluginsContext.\n * Note that it renders the children even if the plugins aren't loaded yet.\n */\n children: React.ReactNode;\n};\n\n/**\n * PluginsBootstrap component. Handles loading the plugins.\n */\nexport function PluginsBootstrap({\n pluginsUrl,\n children,\n}: PluginsBootstrapProps): JSX.Element {\n const [plugins, setPlugins] = useState<PluginModuleMap | null>(null);\n useEffect(\n function initPlugins() {\n let isCanceled = false;\n async function loadPlugins(): Promise<void> {\n const pluginModules = await loadModulePlugins(pluginsUrl);\n if (!isCanceled) {\n setPlugins(pluginModules);\n }\n }\n loadPlugins();\n return () => {\n isCanceled = true;\n };\n },\n [pluginsUrl]\n );\n\n return (\n <PluginsContext.Provider value={plugins}>\n {children}\n </PluginsContext.Provider>\n );\n}\n\nexport default PluginsBootstrap;\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"PluginsBootstrap.js","names":["React","createContext","useEffect","useState","loadModulePlugins","PluginsContext","PluginsBootstrap","pluginsUrl","getCorePlugins","children","plugins","setPlugins","initPlugins","isCanceled","loadPlugins","corePlugins","pluginModules","corePluginPairs","map","plugin","name","Map"],"sources":["../../src/components/PluginsBootstrap.tsx"],"sourcesContent":["import { type DashboardPlugin } from '@deephaven/plugin';\nimport React, { createContext, useEffect, useState } from 'react';\nimport { PluginModuleMap, loadModulePlugins } from '../plugins';\n\nexport const PluginsContext = createContext<PluginModuleMap | null>(null);\n\nexport type PluginsBootstrapProps = {\n /**\n * Base URL of the plugins to load.\n */\n pluginsUrl: string;\n\n /** The core plugins to load. */\n getCorePlugins?: () => Promise<DashboardPlugin[]>;\n\n /**\n * The children to render wrapped with the PluginsContext.\n * Note that it renders the children even if the plugins aren't loaded yet.\n */\n children: React.ReactNode;\n};\n\n/**\n * PluginsBootstrap component. Handles loading the plugins.\n */\nexport function PluginsBootstrap({\n pluginsUrl,\n getCorePlugins,\n children,\n}: PluginsBootstrapProps): JSX.Element {\n const [plugins, setPlugins] = useState<PluginModuleMap | null>(null);\n useEffect(\n function initPlugins() {\n let isCanceled = false;\n async function loadPlugins(): Promise<void> {\n const corePlugins = (await getCorePlugins?.()) ?? [];\n const pluginModules = await loadModulePlugins(pluginsUrl);\n if (!isCanceled) {\n const corePluginPairs = corePlugins.map(\n plugin => [plugin.name, plugin] as const\n );\n setPlugins(new Map([...corePluginPairs, ...pluginModules]));\n }\n }\n loadPlugins();\n return () => {\n isCanceled = true;\n };\n },\n [pluginsUrl, getCorePlugins]\n );\n\n return (\n <PluginsContext.Provider value={plugins}>\n {children}\n </PluginsContext.Provider>\n );\n}\n\nexport default PluginsBootstrap;\n"],"mappings":";;AACA,OAAOA,KAAK,IAAIC,aAAa,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAAC,SACxCC,iBAAiB;AAAA;AAE3C,OAAO,IAAMC,cAAc,gBAAGJ,aAAa,CAAyB,IAAI,CAAC;AAkBzE;AACA;AACA;AACA,OAAO,SAASK,gBAAgB,OAIO;EAAA,IAJN;IAC/BC,UAAU;IACVC,cAAc;IACdC;EACqB,CAAC;EACtB,IAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGR,QAAQ,CAAyB,IAAI,CAAC;EACpED,SAAS,CACP,SAASU,WAAW,GAAG;IACrB,IAAIC,UAAU,GAAG,KAAK;IAAC,SACRC,WAAW;MAAA;IAAA;IAAA;MAAA,iCAA1B,aAA4C;QAAA;QAC1C,IAAMC,WAAW,kCAAUP,cAAc,aAAdA,cAAc,uBAAdA,cAAc,EAAI,yEAAK,EAAE;QACpD,IAAMQ,aAAa,SAASZ,iBAAiB,CAACG,UAAU,CAAC;QACzD,IAAI,CAACM,UAAU,EAAE;UACf,IAAMI,eAAe,GAAGF,WAAW,CAACG,GAAG,CACrCC,MAAM,IAAI,CAACA,MAAM,CAACC,IAAI,EAAED,MAAM,CAAU,CACzC;UACDR,UAAU,CAAC,IAAIU,GAAG,CAAC,CAAC,GAAGJ,eAAe,EAAE,GAAGD,aAAa,CAAC,CAAC,CAAC;QAC7D;MACF,CAAC;MAAA;IAAA;IACDF,WAAW,EAAE;IACb,OAAO,MAAM;MACXD,UAAU,GAAG,IAAI;IACnB,CAAC;EACH,CAAC,EACD,CAACN,UAAU,EAAEC,cAAc,CAAC,CAC7B;EAED,oBACE,KAAC,cAAc,CAAC,QAAQ;IAAC,KAAK,EAAEE,OAAQ;IAAA,UACrCD;EAAQ,EACe;AAE9B;AAEA,eAAeH,gBAAgB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC"}
|
package/dist/components/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/components/index.ts"],"sourcesContent":["export * from './AppBootstrap';\nexport * from './AuthBootstrap';\nexport * from './ConnectionBootstrap';\nexport * from './FontBootstrap';\nexport * from './FontsLoaded';\nexport * from './PluginsBootstrap';\nexport * from './usePlugins';\nexport * from './useConnection';\nexport * from './useServerConfig';\nexport * from './useUser';\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/components/index.ts"],"sourcesContent":["export * from './AppBootstrap';\nexport * from './AuthBootstrap';\nexport * from './ConnectionBootstrap';\nexport * from './FontBootstrap';\nexport * from './FontsLoaded';\nexport * from './PluginsBootstrap';\nexport * from './usePlugins';\nexport * from './useConnection';\nexport * from './useServerConfig';\nexport * from './useUser';\nexport * from './useLoadTablePlugin';\n"],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type TablePluginComponent } from '@deephaven/plugin';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a table plugin loader function.
|
|
4
|
+
* @returns A function to load a Table plugin element by name
|
|
5
|
+
*/
|
|
6
|
+
export declare function useLoadTablePlugin(): (name: string) => TablePluginComponent;
|
|
7
|
+
export default useLoadTablePlugin;
|
|
8
|
+
//# sourceMappingURL=useLoadTablePlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLoadTablePlugin.d.ts","sourceRoot":"","sources":["../../src/components/useLoadTablePlugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,oBAAoB,EAG1B,MAAM,mBAAmB,CAAC;AAM3B;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,oBAAoB,CAwB3E;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { isTablePlugin, isLegacyTablePlugin } from '@deephaven/plugin';
|
|
3
|
+
import Log from '@deephaven/log';
|
|
4
|
+
import usePlugins from "./usePlugins.js";
|
|
5
|
+
var log = Log.module('@deephaven/app-utils/useTablePlugin');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Creates a table plugin loader function.
|
|
9
|
+
* @returns A function to load a Table plugin element by name
|
|
10
|
+
*/
|
|
11
|
+
export function useLoadTablePlugin() {
|
|
12
|
+
var plugins = usePlugins();
|
|
13
|
+
var plugin = useCallback(name => {
|
|
14
|
+
// First check if we have any plugin modules loaded that match the TablePlugin.
|
|
15
|
+
var pluginModule = plugins.get(name);
|
|
16
|
+
if (pluginModule != null) {
|
|
17
|
+
if (isTablePlugin(pluginModule)) {
|
|
18
|
+
return pluginModule.component;
|
|
19
|
+
}
|
|
20
|
+
if (isLegacyTablePlugin(pluginModule)) {
|
|
21
|
+
return pluginModule.TablePlugin;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
var errorMessage = "Unable to find table plugin ".concat(name, ".");
|
|
25
|
+
log.error(errorMessage);
|
|
26
|
+
throw new Error(errorMessage);
|
|
27
|
+
}, [plugins]);
|
|
28
|
+
return plugin;
|
|
29
|
+
}
|
|
30
|
+
export default useLoadTablePlugin;
|
|
31
|
+
//# sourceMappingURL=useLoadTablePlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLoadTablePlugin.js","names":["useCallback","isTablePlugin","isLegacyTablePlugin","Log","usePlugins","log","module","useLoadTablePlugin","plugins","plugin","name","pluginModule","get","component","TablePlugin","errorMessage","error","Error"],"sources":["../../src/components/useLoadTablePlugin.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport {\n type TablePluginComponent,\n isTablePlugin,\n isLegacyTablePlugin,\n} from '@deephaven/plugin';\nimport Log from '@deephaven/log';\nimport usePlugins from './usePlugins';\n\nconst log = Log.module('@deephaven/app-utils/useTablePlugin');\n\n/**\n * Creates a table plugin loader function.\n * @returns A function to load a Table plugin element by name\n */\nexport function useLoadTablePlugin(): (name: string) => TablePluginComponent {\n const plugins = usePlugins();\n\n const plugin = useCallback(\n (name: string) => {\n // First check if we have any plugin modules loaded that match the TablePlugin.\n const pluginModule = plugins.get(name);\n if (pluginModule != null) {\n if (isTablePlugin(pluginModule)) {\n return pluginModule.component;\n }\n if (isLegacyTablePlugin(pluginModule)) {\n return pluginModule.TablePlugin;\n }\n }\n\n const errorMessage = `Unable to find table plugin ${name}.`;\n log.error(errorMessage);\n throw new Error(errorMessage);\n },\n [plugins]\n );\n\n return plugin;\n}\n\nexport default useLoadTablePlugin;\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,OAAO;AACnC,SAEEC,aAAa,EACbC,mBAAmB,QACd,mBAAmB;AAC1B,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,UAAU;AAEjB,IAAMC,GAAG,GAAGF,GAAG,CAACG,MAAM,CAAC,qCAAqC,CAAC;;AAE7D;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkB,GAA2C;EAC3E,IAAMC,OAAO,GAAGJ,UAAU,EAAE;EAE5B,IAAMK,MAAM,GAAGT,WAAW,CACvBU,IAAY,IAAK;IAChB;IACA,IAAMC,YAAY,GAAGH,OAAO,CAACI,GAAG,CAACF,IAAI,CAAC;IACtC,IAAIC,YAAY,IAAI,IAAI,EAAE;MACxB,IAAIV,aAAa,CAACU,YAAY,CAAC,EAAE;QAC/B,OAAOA,YAAY,CAACE,SAAS;MAC/B;MACA,IAAIX,mBAAmB,CAACS,YAAY,CAAC,EAAE;QACrC,OAAOA,YAAY,CAACG,WAAW;MACjC;IACF;IAEA,IAAMC,YAAY,yCAAkCL,IAAI,MAAG;IAC3DL,GAAG,CAACW,KAAK,CAACD,YAAY,CAAC;IACvB,MAAM,IAAIE,KAAK,CAACF,YAAY,CAAC;EAC/B,CAAC,EACD,CAACP,OAAO,CAAC,CACV;EAED,OAAOC,MAAM;AACf;AAEA,eAAeF,kBAAkB"}
|
|
@@ -7,12 +7,8 @@ import react from 'react';
|
|
|
7
7
|
import * as redux from 'redux';
|
|
8
8
|
import * as reactRedux from 'react-redux';
|
|
9
9
|
import ReactDOM from 'react-dom';
|
|
10
|
-
import * as AdobeReactSpectrum from '@adobe/react-spectrum';
|
|
11
10
|
import * as DeephavenAuthPlugins from '@deephaven/auth-plugins';
|
|
12
|
-
import * as DeephavenChart from '@deephaven/chart';
|
|
13
11
|
import * as DeephavenComponents from '@deephaven/components';
|
|
14
|
-
import * as DeephavenIcons from '@deephaven/icons';
|
|
15
|
-
import * as DeephavenIrisGrid from '@deephaven/iris-grid';
|
|
16
12
|
import * as DeephavenJsapiBootstrap from '@deephaven/jsapi-bootstrap';
|
|
17
13
|
import * as DeephavenJsapiComponents from '@deephaven/jsapi-components';
|
|
18
14
|
import * as DeephavenJsapiUtils from '@deephaven/jsapi-utils';
|
|
@@ -23,12 +19,8 @@ export declare const resolve: {
|
|
|
23
19
|
'react-dom': typeof ReactDOM;
|
|
24
20
|
redux: typeof redux;
|
|
25
21
|
'react-redux': typeof reactRedux;
|
|
26
|
-
'@adobe/react-spectrum': typeof AdobeReactSpectrum;
|
|
27
22
|
'@deephaven/auth-plugins': typeof DeephavenAuthPlugins;
|
|
28
|
-
'@deephaven/chart': typeof DeephavenChart;
|
|
29
23
|
'@deephaven/components': typeof DeephavenComponents;
|
|
30
|
-
'@deephaven/icons': typeof DeephavenIcons;
|
|
31
|
-
'@deephaven/iris-grid': typeof DeephavenIrisGrid;
|
|
32
24
|
'@deephaven/jsapi-bootstrap': typeof DeephavenJsapiBootstrap;
|
|
33
25
|
'@deephaven/jsapi-components': typeof DeephavenJsapiComponents;
|
|
34
26
|
'@deephaven/jsapi-utils': typeof DeephavenJsapiUtils;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-component.config.d.ts","sourceRoot":"","sources":["../../src/plugins/remote-component.config.ts"],"names":[],"mappings":"AACA;;;;GAIG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAC1C,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"remote-component.config.d.ts","sourceRoot":"","sources":["../../src/plugins/remote-component.config.ts"],"names":[],"mappings":"AACA;;;;GAIG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAC1C,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,oBAAoB,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,mBAAmB,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,uBAAuB,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,wBAAwB,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,mBAAmB,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,mBAAmB,MAAM,wBAAwB,CAAC;AAG9D,eAAO,MAAM,OAAO;;;;;;;;;;;;CAYnB,CAAC"}
|
|
@@ -8,12 +8,8 @@ import react from 'react';
|
|
|
8
8
|
import * as redux from 'redux';
|
|
9
9
|
import * as reactRedux from 'react-redux';
|
|
10
10
|
import ReactDOM from 'react-dom';
|
|
11
|
-
import * as AdobeReactSpectrum from '@adobe/react-spectrum';
|
|
12
11
|
import * as DeephavenAuthPlugins from '@deephaven/auth-plugins';
|
|
13
|
-
import * as DeephavenChart from '@deephaven/chart';
|
|
14
12
|
import * as DeephavenComponents from '@deephaven/components';
|
|
15
|
-
import * as DeephavenIcons from '@deephaven/icons';
|
|
16
|
-
import * as DeephavenIrisGrid from '@deephaven/iris-grid';
|
|
17
13
|
import * as DeephavenJsapiBootstrap from '@deephaven/jsapi-bootstrap';
|
|
18
14
|
import * as DeephavenJsapiComponents from '@deephaven/jsapi-components';
|
|
19
15
|
import * as DeephavenJsapiUtils from '@deephaven/jsapi-utils';
|
|
@@ -26,12 +22,8 @@ export var resolve = {
|
|
|
26
22
|
'react-dom': ReactDOM,
|
|
27
23
|
redux,
|
|
28
24
|
'react-redux': reactRedux,
|
|
29
|
-
'@adobe/react-spectrum': AdobeReactSpectrum,
|
|
30
25
|
'@deephaven/auth-plugins': DeephavenAuthPlugins,
|
|
31
|
-
'@deephaven/chart': DeephavenChart,
|
|
32
26
|
'@deephaven/components': DeephavenComponents,
|
|
33
|
-
'@deephaven/icons': DeephavenIcons,
|
|
34
|
-
'@deephaven/iris-grid': DeephavenIrisGrid,
|
|
35
27
|
'@deephaven/jsapi-bootstrap': DeephavenJsapiBootstrap,
|
|
36
28
|
'@deephaven/jsapi-components': DeephavenJsapiComponents,
|
|
37
29
|
'@deephaven/jsapi-utils': DeephavenJsapiUtils,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-component.config.js","names":["react","redux","reactRedux","ReactDOM","
|
|
1
|
+
{"version":3,"file":"remote-component.config.js","names":["react","redux","reactRedux","ReactDOM","DeephavenAuthPlugins","DeephavenComponents","DeephavenJsapiBootstrap","DeephavenJsapiComponents","DeephavenJsapiUtils","DeephavenLog","DeephavenReactHooks","resolve"],"sources":["../../src/plugins/remote-component.config.ts"],"sourcesContent":["/* eslint-disable global-require */\n/**\n * remote-component.config.js\n *\n * Dependencies for Remote Components\n */\nimport react from 'react';\nimport * as redux from 'redux';\nimport * as reactRedux from 'react-redux';\nimport ReactDOM from 'react-dom';\nimport * as DeephavenAuthPlugins from '@deephaven/auth-plugins';\nimport * as DeephavenComponents from '@deephaven/components';\nimport * as DeephavenJsapiBootstrap from '@deephaven/jsapi-bootstrap';\nimport * as DeephavenJsapiComponents from '@deephaven/jsapi-components';\nimport * as DeephavenJsapiUtils from '@deephaven/jsapi-utils';\nimport * as DeephavenLog from '@deephaven/log';\nimport * as DeephavenReactHooks from '@deephaven/react-hooks';\n\n// eslint-disable-next-line import/prefer-default-export\nexport const resolve = {\n react,\n 'react-dom': ReactDOM,\n redux,\n 'react-redux': reactRedux,\n '@deephaven/auth-plugins': DeephavenAuthPlugins,\n '@deephaven/components': DeephavenComponents,\n '@deephaven/jsapi-bootstrap': DeephavenJsapiBootstrap,\n '@deephaven/jsapi-components': DeephavenJsapiComponents,\n '@deephaven/jsapi-utils': DeephavenJsapiUtils,\n '@deephaven/log': DeephavenLog,\n '@deephaven/react-hooks': DeephavenReactHooks,\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAO,KAAKC,KAAK,MAAM,OAAO;AAC9B,OAAO,KAAKC,UAAU,MAAM,aAAa;AACzC,OAAOC,QAAQ,MAAM,WAAW;AAChC,OAAO,KAAKC,oBAAoB,MAAM,yBAAyB;AAC/D,OAAO,KAAKC,mBAAmB,MAAM,uBAAuB;AAC5D,OAAO,KAAKC,uBAAuB,MAAM,4BAA4B;AACrE,OAAO,KAAKC,wBAAwB,MAAM,6BAA6B;AACvE,OAAO,KAAKC,mBAAmB,MAAM,wBAAwB;AAC7D,OAAO,KAAKC,YAAY,MAAM,gBAAgB;AAC9C,OAAO,KAAKC,mBAAmB,MAAM,wBAAwB;;AAE7D;AACA,OAAO,IAAMC,OAAO,GAAG;EACrBX,KAAK;EACL,WAAW,EAAEG,QAAQ;EACrBF,KAAK;EACL,aAAa,EAAEC,UAAU;EACzB,yBAAyB,EAAEE,oBAAoB;EAC/C,uBAAuB,EAAEC,mBAAmB;EAC5C,4BAA4B,EAAEC,uBAAuB;EACrD,6BAA6B,EAAEC,wBAAwB;EACvD,wBAAwB,EAAEC,mBAAmB;EAC7C,gBAAgB,EAAEC,YAAY;EAC9B,wBAAwB,EAAEC;AAC5B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/app-utils",
|
|
3
|
-
"version": "0.49.1
|
|
3
|
+
"version": "0.49.1",
|
|
4
4
|
"description": "Deephaven App Utils",
|
|
5
5
|
"author": "Deephaven Data Labs LLC",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -28,21 +28,17 @@
|
|
|
28
28
|
"redux": "^4.x"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@
|
|
32
|
-
"@deephaven/
|
|
33
|
-
"@deephaven/
|
|
34
|
-
"@deephaven/components": "^0.49.1
|
|
35
|
-
"@deephaven/
|
|
36
|
-
"@deephaven/
|
|
37
|
-
"@deephaven/
|
|
38
|
-
"@deephaven/
|
|
39
|
-
"@deephaven/
|
|
40
|
-
"@deephaven/
|
|
41
|
-
"@deephaven/
|
|
42
|
-
"@deephaven/plugin": "^0.49.1-deephaven-ui.6+45d47859",
|
|
43
|
-
"@deephaven/react-hooks": "^0.49.1-deephaven-ui.6+45d47859",
|
|
44
|
-
"@deephaven/redux": "^0.49.1-deephaven-ui.6+45d47859",
|
|
45
|
-
"@deephaven/utils": "^0.49.1-deephaven-ui.6+45d47859",
|
|
31
|
+
"@deephaven/auth-plugins": "^0.49.1",
|
|
32
|
+
"@deephaven/components": "^0.49.1",
|
|
33
|
+
"@deephaven/jsapi-bootstrap": "^0.49.1",
|
|
34
|
+
"@deephaven/jsapi-components": "^0.49.1",
|
|
35
|
+
"@deephaven/jsapi-types": "^0.49.0",
|
|
36
|
+
"@deephaven/jsapi-utils": "^0.49.0",
|
|
37
|
+
"@deephaven/log": "^0.49.0",
|
|
38
|
+
"@deephaven/plugin": "^0.49.1",
|
|
39
|
+
"@deephaven/react-hooks": "^0.49.0",
|
|
40
|
+
"@deephaven/redux": "^0.49.1",
|
|
41
|
+
"@deephaven/utils": "^0.49.0",
|
|
46
42
|
"@paciolan/remote-component": "2.13.0",
|
|
47
43
|
"@paciolan/remote-module-loader": "^3.0.2",
|
|
48
44
|
"fira": "mozilla/fira#4.202"
|
|
@@ -62,5 +58,5 @@
|
|
|
62
58
|
"publishConfig": {
|
|
63
59
|
"access": "public"
|
|
64
60
|
},
|
|
65
|
-
"gitHead": "
|
|
61
|
+
"gitHead": "d14b58ca26fc5bdae33c60673aba4732262cc1f3"
|
|
66
62
|
}
|