@deephaven/app-utils 1.20.0 → 1.21.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.
@@ -27,8 +27,9 @@ export declare function loadModulePlugin(pluginUrl: string): Promise<LegacyPlugi
27
27
  export declare function loadJson(jsonUrl: string): Promise<PluginManifest>;
28
28
  /**
29
29
  * Load all plugin modules available based on the manifest file at the provided base URL.
30
- * Plugins are loaded sequentially so that each plugin's exports are registered
31
- * in the module resolve map before subsequent plugins load. This enables
30
+ * Plugins are grouped into dependency levels and loaded in parallel within each
31
+ * level. Levels are processed sequentially so that each level's exports are
32
+ * registered in the module resolve map before the next level loads, enabling
32
33
  * cross-plugin imports via standard import statements.
33
34
  * @param modulePluginsUrl The base URL of the module plugins to load
34
35
  * @returns A map from the name of the plugin to the plugin module that was loaded
@@ -1 +1 @@
1
- {"version":3,"file":"PluginUtils.d.ts","sourceRoot":"","sources":["../../src/plugins/PluginUtils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,mBAAmB,EAExB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,MAAM,EAKX,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAM3B;;GAEG;AACH,YAAY,EAAE,wBAAwB,EAAE,CAAC;AAEzC;;GAEG;AACH,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAEhC;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAG7C;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAUvE;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,eAAe,CAAC,CA2C1B;AAED,wBAAgB,eAAe,CAC7B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,MAAM,EAAE,CAEV;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,eAAe,EAC1B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,WAAW,6CAAmD,GAC7D,mBAAmB,CAwCrB"}
1
+ {"version":3,"file":"PluginUtils.d.ts","sourceRoot":"","sources":["../../src/plugins/PluginUtils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,mBAAmB,EAExB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,MAAM,EAKX,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAM3B;;GAEG;AACH,YAAY,EAAE,wBAAwB,EAAE,CAAC;AAEzC;;GAEG;AACH,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAEhC;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAG7C;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAUvE;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,eAAe,CAAC,CAuD1B;AAED,wBAAgB,eAAe,CAC7B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,MAAM,EAAE,CAEV;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,eAAe,EAC1B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,WAAW,6CAAmD,GAC7D,mBAAmB,CAwCrB"}
@@ -1,7 +1,7 @@
1
1
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
2
2
  function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
3
3
  import Log from '@deephaven/log';
4
- import { isAuthPlugin, PluginType, isLegacyAuthPlugin, processLoadedModule, sortPluginsByDependency, getPluginModuleValue } from '@deephaven/plugin';
4
+ import { isAuthPlugin, PluginType, isLegacyAuthPlugin, processLoadedModule, groupByDependencyLevel, getPluginModuleValue } from '@deephaven/plugin';
5
5
  import loadRemoteModule from "./loadRemoteModule.js";
6
6
  import { resolve } from "./remote-component.config.js";
7
7
  var log = Log.module('@deephaven/app-utils.PluginUtils');
@@ -46,8 +46,9 @@ export function loadJson(_x2) {
46
46
 
47
47
  /**
48
48
  * Load all plugin modules available based on the manifest file at the provided base URL.
49
- * Plugins are loaded sequentially so that each plugin's exports are registered
50
- * in the module resolve map before subsequent plugins load. This enables
49
+ * Plugins are grouped into dependency levels and loaded in parallel within each
50
+ * level. Levels are processed sequentially so that each level's exports are
51
+ * registered in the module resolve map before the next level loads, enabling
51
52
  * cross-plugin imports via standard import statements.
52
53
  * @param modulePluginsUrl The base URL of the module plugins to load
53
54
  * @returns A map from the name of the plugin to the plugin module that was loaded
@@ -78,25 +79,50 @@ function _loadModulePlugins() {
78
79
  throw new Error('Plugin manifest JSON does not contain plugins array');
79
80
  }
80
81
  log.debug('Plugin manifest loaded:', manifest);
81
- var sortedPlugins = sortPluginsByDependency(manifest.plugins);
82
+ var levels = groupByDependencyLevel(manifest.plugins);
82
83
  var pluginMap = new Map();
83
84
 
84
- // Load plugins sequentially so each plugin's exports are available
85
- // to subsequently loaded plugins via import
86
- for (var i = 0; i < sortedPlugins.length; i += 1) {
87
- var {
88
- name,
89
- main,
90
- version,
91
- package: packageName
92
- } = sortedPlugins[i];
93
- var pluginMainUrl = "".concat(modulePluginsUrl, "/").concat(name, "/").concat(main);
94
- try {
95
- // eslint-disable-next-line no-await-in-loop
96
- var pluginExports = yield loadModulePlugin(pluginMainUrl);
97
- processLoadedModule(pluginMap, resolve, pluginExports, name, packageName, version);
98
- } catch (e) {
99
- log.error("Unable to load plugin '".concat(name, "'"), e);
85
+ // Load plugins level by level. Plugins within a level have no
86
+ // inter-dependencies and load in parallel. Each level completes
87
+ // before the next starts so cross-plugin imports resolve correctly.
88
+ for (var lvl = 0; lvl < levels.length; lvl += 1) {
89
+ var level = levels[lvl];
90
+
91
+ // eslint-disable-next-line no-await-in-loop
92
+ var results = yield Promise.allSettled(level.map(/*#__PURE__*/function () {
93
+ var _ref5 = _asyncToGenerator(function* (plugin) {
94
+ var {
95
+ name,
96
+ main,
97
+ version,
98
+ package: packageName
99
+ } = plugin;
100
+ var pluginMainUrl = "".concat(modulePluginsUrl, "/").concat(name, "/").concat(main);
101
+ var pluginExports = yield loadModulePlugin(pluginMainUrl);
102
+ return {
103
+ pluginExports,
104
+ name,
105
+ packageName,
106
+ version
107
+ };
108
+ });
109
+ return function (_x4) {
110
+ return _ref5.apply(this, arguments);
111
+ };
112
+ }()));
113
+ for (var r = 0; r < results.length; r += 1) {
114
+ var result = results[r];
115
+ if (result.status === 'fulfilled') {
116
+ var {
117
+ pluginExports,
118
+ name,
119
+ packageName,
120
+ version
121
+ } = result.value;
122
+ processLoadedModule(pluginMap, resolve, pluginExports, name, packageName, version);
123
+ } else {
124
+ log.error("Unable to load plugin '".concat(level[r].name, "'"), result.reason);
125
+ }
100
126
  }
101
127
  }
102
128
  log.info('Plugins loaded:', pluginMap);
@@ -1 +1 @@
1
- {"version":3,"file":"PluginUtils.js","names":["Log","isAuthPlugin","PluginType","isLegacyAuthPlugin","processLoadedModule","sortPluginsByDependency","getPluginModuleValue","loadRemoteModule","resolve","log","module","loadModulePlugin","_x","_loadModulePlugin","apply","arguments","_asyncToGenerator","pluginUrl","myModule","loadJson","_x2","_loadJson","jsonUrl","res","fetch","ok","Error","statusText","json","_unused","loadModulePlugins","_x3","_loadModulePlugins","modulePluginsUrl","debug","manifest","concat","Array","isArray","plugins","sortedPlugins","pluginMap","Map","i","length","name","main","version","package","packageName","pluginMainUrl","pluginExports","e","error","info","getAuthHandlers","authConfigValues","_authConfigValues$get","_authConfigValues$get2","get","split","getAuthPluginComponent","corePlugins","undefined","authHandlers","authPlugins","entries","filter","_ref","plugin","map","_ref2","type","AUTH_PLUGIN","component","AuthPlugin","Component","isAvailable","availableAuthPlugins","_ref3","warn","_ref4","join"],"sources":["../../src/plugins/PluginUtils.ts"],"sourcesContent":["import Log from '@deephaven/log';\nimport {\n type PluginModuleMap,\n type AuthPlugin,\n type AuthPluginComponent,\n isAuthPlugin,\n type LegacyAuthPlugin,\n type LegacyPlugin,\n type Plugin,\n PluginType,\n isLegacyAuthPlugin,\n processLoadedModule,\n sortPluginsByDependency,\n type PluginManifest,\n type PluginManifestPluginInfo,\n getPluginModuleValue,\n} from '@deephaven/plugin';\nimport loadRemoteModule from './loadRemoteModule';\nimport { resolve } from './remote-component.config';\n\nconst log = Log.module('@deephaven/app-utils.PluginUtils');\n\n/**\n * @deprecated Import from `@deephaven/plugin` instead.\n */\nexport type { PluginManifestPluginInfo };\n\n/**\n * @deprecated Import from `@deephaven/plugin` instead.\n */\nexport type { PluginManifest };\n\n/**\n * @deprecated Import from `@deephaven/plugin` instead.\n */\nexport { getPluginModuleValue };\n\n/**\n * Imports a commonjs plugin module from the provided URL\n * @param pluginUrl The URL of the plugin to load\n * @returns The loaded module\n */\nexport async function loadModulePlugin(\n pluginUrl: string\n): Promise<LegacyPlugin | { default: Plugin }> {\n const myModule = await loadRemoteModule(pluginUrl);\n return myModule;\n}\n\n/**\n * Loads a JSON file and returns the JSON object\n * @param jsonUrl The URL of the JSON file to load\n * @returns The JSON object of the manifest file\n */\nexport async function loadJson(jsonUrl: string): Promise<PluginManifest> {\n const res = await fetch(jsonUrl);\n if (!res.ok) {\n throw new Error(res.statusText);\n }\n try {\n return await res.json();\n } catch {\n throw new Error('Could not be parsed as JSON');\n }\n}\n\n/**\n * Load all plugin modules available based on the manifest file at the provided base URL.\n * Plugins are loaded sequentially so that each plugin's exports are registered\n * in the module resolve map before subsequent plugins load. This enables\n * cross-plugin imports via standard import statements.\n * @param modulePluginsUrl The base URL of the module plugins to load\n * @returns A map from the name of the plugin to the plugin module that was loaded\n */\nexport async function loadModulePlugins(\n modulePluginsUrl: string\n): Promise<PluginModuleMap> {\n log.debug('Loading plugins...');\n try {\n const manifest = await loadJson(`${modulePluginsUrl}/manifest.json`);\n\n if (!Array.isArray(manifest.plugins)) {\n throw new Error('Plugin manifest JSON does not contain plugins array');\n }\n\n log.debug('Plugin manifest loaded:', manifest);\n\n const sortedPlugins = sortPluginsByDependency(manifest.plugins);\n\n const pluginMap: PluginModuleMap = new Map();\n\n // Load plugins sequentially so each plugin's exports are available\n // to subsequently loaded plugins via import\n for (let i = 0; i < sortedPlugins.length; i += 1) {\n const { name, main, version, package: packageName } = sortedPlugins[i];\n const pluginMainUrl = `${modulePluginsUrl}/${name}/${main}`;\n try {\n // eslint-disable-next-line no-await-in-loop\n const pluginExports = await loadModulePlugin(pluginMainUrl);\n\n processLoadedModule(\n pluginMap,\n resolve,\n pluginExports,\n name,\n packageName,\n version\n );\n } catch (e) {\n log.error(`Unable to load plugin '${name}'`, e);\n }\n }\n log.info('Plugins loaded:', pluginMap);\n\n return pluginMap;\n } catch (e) {\n log.error('Unable to load plugins:', e);\n return new Map();\n }\n}\n\nexport function getAuthHandlers(\n authConfigValues: Map<string, string>\n): string[] {\n return authConfigValues.get('AuthHandlers')?.split(',') ?? [];\n}\n\n/**\n * Get the auth plugin component from the plugin map and current configuration\n * Throws if no auth plugin is available\n *\n * @param pluginMap Map of plugins loaded from the server\n * @param authConfigValues Auth config values from the server\n * @param corePlugins Map of core auth plugins to include in the list. They are added after the loaded plugins\n * @returns The auth plugin component to render\n */\nexport function getAuthPluginComponent(\n pluginMap: PluginModuleMap,\n authConfigValues: Map<string, string>,\n corePlugins = new Map<string, AuthPlugin | LegacyAuthPlugin>()\n): AuthPluginComponent {\n const authHandlers = getAuthHandlers(authConfigValues);\n // User plugins take priority over core plugins\n const authPlugins = (\n [...pluginMap.entries(), ...corePlugins.entries()].filter(\n ([, plugin]) => isAuthPlugin(plugin) || isLegacyAuthPlugin(plugin)\n ) as [string, AuthPlugin | LegacyAuthPlugin][]\n ).map(([name, plugin]) => {\n if (isLegacyAuthPlugin(plugin)) {\n return {\n type: PluginType.AUTH_PLUGIN,\n name,\n component: plugin.AuthPlugin.Component,\n isAvailable: plugin.AuthPlugin.isAvailable,\n };\n }\n\n return plugin;\n });\n\n // Filter the available auth plugins\n const availableAuthPlugins = authPlugins.filter(({ isAvailable }) =>\n isAvailable(authHandlers, authConfigValues)\n );\n\n if (availableAuthPlugins.length === 0) {\n throw new Error(\n `No login plugins found, please register a login plugin for auth handlers: ${authHandlers}`\n );\n } else if (availableAuthPlugins.length > 1) {\n log.warn(\n 'More than one login plugin available, will use the first one: ',\n availableAuthPlugins.map(({ name }) => name).join(', ')\n );\n }\n\n const { name, component } = availableAuthPlugins[0];\n log.info('Using LoginPlugin', name);\n\n return component;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"PluginUtils.js","names":["Log","isAuthPlugin","PluginType","isLegacyAuthPlugin","processLoadedModule","groupByDependencyLevel","getPluginModuleValue","loadRemoteModule","resolve","log","module","loadModulePlugin","_x","_loadModulePlugin","apply","arguments","_asyncToGenerator","pluginUrl","myModule","loadJson","_x2","_loadJson","jsonUrl","res","fetch","ok","Error","statusText","json","_unused","loadModulePlugins","_x3","_loadModulePlugins","modulePluginsUrl","debug","manifest","concat","Array","isArray","plugins","levels","pluginMap","Map","lvl","length","level","results","Promise","allSettled","map","_ref5","plugin","name","main","version","package","packageName","pluginMainUrl","pluginExports","_x4","r","result","status","value","error","reason","info","e","getAuthHandlers","authConfigValues","_authConfigValues$get","_authConfigValues$get2","get","split","getAuthPluginComponent","corePlugins","undefined","authHandlers","authPlugins","entries","filter","_ref","_ref2","type","AUTH_PLUGIN","component","AuthPlugin","Component","isAvailable","availableAuthPlugins","_ref3","warn","_ref4","join"],"sources":["../../src/plugins/PluginUtils.ts"],"sourcesContent":["import Log from '@deephaven/log';\nimport {\n type PluginModuleMap,\n type AuthPlugin,\n type AuthPluginComponent,\n isAuthPlugin,\n type LegacyAuthPlugin,\n type LegacyPlugin,\n type Plugin,\n PluginType,\n isLegacyAuthPlugin,\n processLoadedModule,\n groupByDependencyLevel,\n type PluginManifest,\n type PluginManifestPluginInfo,\n getPluginModuleValue,\n} from '@deephaven/plugin';\nimport loadRemoteModule from './loadRemoteModule';\nimport { resolve } from './remote-component.config';\n\nconst log = Log.module('@deephaven/app-utils.PluginUtils');\n\n/**\n * @deprecated Import from `@deephaven/plugin` instead.\n */\nexport type { PluginManifestPluginInfo };\n\n/**\n * @deprecated Import from `@deephaven/plugin` instead.\n */\nexport type { PluginManifest };\n\n/**\n * @deprecated Import from `@deephaven/plugin` instead.\n */\nexport { getPluginModuleValue };\n\n/**\n * Imports a commonjs plugin module from the provided URL\n * @param pluginUrl The URL of the plugin to load\n * @returns The loaded module\n */\nexport async function loadModulePlugin(\n pluginUrl: string\n): Promise<LegacyPlugin | { default: Plugin }> {\n const myModule = await loadRemoteModule(pluginUrl);\n return myModule;\n}\n\n/**\n * Loads a JSON file and returns the JSON object\n * @param jsonUrl The URL of the JSON file to load\n * @returns The JSON object of the manifest file\n */\nexport async function loadJson(jsonUrl: string): Promise<PluginManifest> {\n const res = await fetch(jsonUrl);\n if (!res.ok) {\n throw new Error(res.statusText);\n }\n try {\n return await res.json();\n } catch {\n throw new Error('Could not be parsed as JSON');\n }\n}\n\n/**\n * Load all plugin modules available based on the manifest file at the provided base URL.\n * Plugins are grouped into dependency levels and loaded in parallel within each\n * level. Levels are processed sequentially so that each level's exports are\n * registered in the module resolve map before the next level loads, enabling\n * cross-plugin imports via standard import statements.\n * @param modulePluginsUrl The base URL of the module plugins to load\n * @returns A map from the name of the plugin to the plugin module that was loaded\n */\nexport async function loadModulePlugins(\n modulePluginsUrl: string\n): Promise<PluginModuleMap> {\n log.debug('Loading plugins...');\n try {\n const manifest = await loadJson(`${modulePluginsUrl}/manifest.json`);\n\n if (!Array.isArray(manifest.plugins)) {\n throw new Error('Plugin manifest JSON does not contain plugins array');\n }\n\n log.debug('Plugin manifest loaded:', manifest);\n\n const levels = groupByDependencyLevel(manifest.plugins);\n\n const pluginMap: PluginModuleMap = new Map();\n\n // Load plugins level by level. Plugins within a level have no\n // inter-dependencies and load in parallel. Each level completes\n // before the next starts so cross-plugin imports resolve correctly.\n for (let lvl = 0; lvl < levels.length; lvl += 1) {\n const level = levels[lvl];\n\n // eslint-disable-next-line no-await-in-loop\n const results = await Promise.allSettled(\n level.map(async plugin => {\n const { name, main, version, package: packageName } = plugin;\n const pluginMainUrl = `${modulePluginsUrl}/${name}/${main}`;\n const pluginExports = await loadModulePlugin(pluginMainUrl);\n return { pluginExports, name, packageName, version };\n })\n );\n\n for (let r = 0; r < results.length; r += 1) {\n const result = results[r];\n if (result.status === 'fulfilled') {\n const { pluginExports, name, packageName, version } = result.value;\n processLoadedModule(\n pluginMap,\n resolve,\n pluginExports,\n name,\n packageName,\n version\n );\n } else {\n log.error(`Unable to load plugin '${level[r].name}'`, result.reason);\n }\n }\n }\n log.info('Plugins loaded:', pluginMap);\n\n return pluginMap;\n } catch (e) {\n log.error('Unable to load plugins:', e);\n return new Map();\n }\n}\n\nexport function getAuthHandlers(\n authConfigValues: Map<string, string>\n): string[] {\n return authConfigValues.get('AuthHandlers')?.split(',') ?? [];\n}\n\n/**\n * Get the auth plugin component from the plugin map and current configuration\n * Throws if no auth plugin is available\n *\n * @param pluginMap Map of plugins loaded from the server\n * @param authConfigValues Auth config values from the server\n * @param corePlugins Map of core auth plugins to include in the list. They are added after the loaded plugins\n * @returns The auth plugin component to render\n */\nexport function getAuthPluginComponent(\n pluginMap: PluginModuleMap,\n authConfigValues: Map<string, string>,\n corePlugins = new Map<string, AuthPlugin | LegacyAuthPlugin>()\n): AuthPluginComponent {\n const authHandlers = getAuthHandlers(authConfigValues);\n // User plugins take priority over core plugins\n const authPlugins = (\n [...pluginMap.entries(), ...corePlugins.entries()].filter(\n ([, plugin]) => isAuthPlugin(plugin) || isLegacyAuthPlugin(plugin)\n ) as [string, AuthPlugin | LegacyAuthPlugin][]\n ).map(([name, plugin]) => {\n if (isLegacyAuthPlugin(plugin)) {\n return {\n type: PluginType.AUTH_PLUGIN,\n name,\n component: plugin.AuthPlugin.Component,\n isAvailable: plugin.AuthPlugin.isAvailable,\n };\n }\n\n return plugin;\n });\n\n // Filter the available auth plugins\n const availableAuthPlugins = authPlugins.filter(({ isAvailable }) =>\n isAvailable(authHandlers, authConfigValues)\n );\n\n if (availableAuthPlugins.length === 0) {\n throw new Error(\n `No login plugins found, please register a login plugin for auth handlers: ${authHandlers}`\n );\n } else if (availableAuthPlugins.length > 1) {\n log.warn(\n 'More than one login plugin available, will use the first one: ',\n availableAuthPlugins.map(({ name }) => name).join(', ')\n );\n }\n\n const { name, component } = availableAuthPlugins[0];\n log.info('Using LoginPlugin', name);\n\n return component;\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/app-utils",
3
- "version": "1.20.0",
3
+ "version": "1.21.1",
4
4
  "description": "Deephaven App Utils",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -25,24 +25,24 @@
25
25
  "@deephaven/test-utils": "^1.8.0"
26
26
  },
27
27
  "dependencies": {
28
- "@adobe/react-spectrum": "3.38.0",
29
- "@deephaven/auth-plugins": "^1.20.0",
30
- "@deephaven/chart": "^1.20.0",
31
- "@deephaven/components": "^1.20.0",
32
- "@deephaven/console": "^1.20.0",
33
- "@deephaven/dashboard": "^1.20.0",
34
- "@deephaven/dashboard-core-plugins": "^1.20.0",
35
- "@deephaven/file-explorer": "^1.20.0",
36
- "@deephaven/golden-layout": "^1.20.0",
28
+ "@adobe/react-spectrum": "3.47.0",
29
+ "@deephaven/auth-plugins": "^1.21.1",
30
+ "@deephaven/chart": "^1.21.1",
31
+ "@deephaven/components": "^1.21.1",
32
+ "@deephaven/console": "^1.21.1",
33
+ "@deephaven/dashboard": "^1.21.1",
34
+ "@deephaven/dashboard-core-plugins": "^1.21.1",
35
+ "@deephaven/file-explorer": "^1.21.1",
36
+ "@deephaven/golden-layout": "^1.21.1",
37
37
  "@deephaven/icons": "^1.2.0",
38
- "@deephaven/iris-grid": "^1.20.0",
39
- "@deephaven/jsapi-bootstrap": "^1.20.0",
40
- "@deephaven/jsapi-components": "^1.20.0",
38
+ "@deephaven/iris-grid": "^1.21.1",
39
+ "@deephaven/jsapi-bootstrap": "^1.21.1",
40
+ "@deephaven/jsapi-components": "^1.21.1",
41
41
  "@deephaven/jsapi-types": "^1.0.0-dev0.40.4",
42
42
  "@deephaven/jsapi-utils": "^1.16.0",
43
43
  "@deephaven/log": "^1.8.0",
44
- "@deephaven/plugin": "^1.20.0",
45
- "@deephaven/react-hooks": "^1.14.0",
44
+ "@deephaven/plugin": "^1.21.1",
45
+ "@deephaven/react-hooks": "^1.21.1",
46
46
  "@deephaven/redux": "^1.19.0",
47
47
  "@deephaven/storage": "^1.8.0",
48
48
  "@deephaven/utils": "^1.10.0",
@@ -68,5 +68,5 @@
68
68
  "publishConfig": {
69
69
  "access": "public"
70
70
  },
71
- "gitHead": "8450735e2c855217cb5a6fa4ea0b1b3fda57221c"
71
+ "gitHead": "1b42d0daee02a340363c972ffb8fffce6da56968"
72
72
  }