Selaa lähdekoodia

Merge branch 'candidate-7.10.x'

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 4 vuotta sitten
vanhempi
commit
3a203e3a2a
47 muutettua tiedostoa jossa 8942 lisäystä ja 8908 poistoa
  1. 1 1
      cmake_modules/docMacros.cmake
  2. 10 0
      ecl/hqlcpp/hqlttcpp.cpp
  3. 2 1
      esp/bindings/SOAP/Platform/soapparam.hpp
  4. 19 1
      esp/bindings/http/platform/httptransport.cpp
  5. 1 1
      esp/services/ws_store/espstorelib/daliKVStore.cpp
  6. 1 1
      esp/services/ws_store/ws_storeService.cpp
  7. 1 0
      esp/src/.gitignore
  8. 1 0
      esp/src/CMakeLists.txt
  9. 965 967
      esp/src/eclwatch/nls/bs/hpcc.js
  10. 966 968
      esp/src/eclwatch/nls/es/hpcc.js
  11. 950 952
      esp/src/eclwatch/nls/fr/hpcc.js
  12. 960 961
      esp/src/eclwatch/nls/hpcc.js
  13. 965 967
      esp/src/eclwatch/nls/hr/hpcc.js
  14. 966 968
      esp/src/eclwatch/nls/hu/hpcc.js
  15. 968 970
      esp/src/eclwatch/nls/pt-br/hpcc.js
  16. 966 968
      esp/src/eclwatch/nls/sr/hpcc.js
  17. 965 967
      esp/src/eclwatch/nls/zh/hpcc.js
  18. 127 125
      esp/src/package-lock.json
  19. 19 18
      esp/src/package.json
  20. 1 3
      esp/src/src/Clippy.ts
  21. 1 3
      esp/src/src/DataPatternsWidget.ts
  22. 1 3
      esp/src/src/DiskUsage.ts
  23. 1 3
      esp/src/src/ECLArchiveWidget.ts
  24. 1 4
      esp/src/src/ESPDFUWorkunit.ts
  25. 1 3
      esp/src/src/ESPPackageProcess.ts
  26. 1 4
      esp/src/src/ESPPreflight.ts
  27. 1 3
      esp/src/src/ESPQuery.ts
  28. 1 3
      esp/src/src/ESPResult.ts
  29. 1 3
      esp/src/src/ESPUtil.ts
  30. 1 3
      esp/src/src/ESPWorkunit.ts
  31. 1 3
      esp/src/src/Graph7Widget.ts
  32. 1 3
      esp/src/src/GraphTree7Widget.ts
  33. 1 3
      esp/src/src/GraphTreeWidget.ts
  34. 1 4
      esp/src/src/WUStatus.ts
  35. 2 4
      esp/src/src/WsPackageMaps.ts
  36. 1 3
      esp/src/src/WsWorkunits.ts
  37. 6 0
      esp/src/src/nlsHPCC.ts
  38. 2 5
      esp/src/src/react/aboutDialog.tsx
  39. 1 3
      esp/src/src/react/recentFilters.tsx
  40. 2 4
      esp/src/src/react/wuStatus.tsx
  41. 1 1
      esp/src/tsconfig.json
  42. 14 0
      esp/src/util/genLangTypes.js
  43. 14 0
      helm/hpcc/templates/thor.yaml
  44. 2 0
      roxie/ccd/ccddali.cpp
  45. 3 3
      roxie/ccd/ccdmain.cpp
  46. 2 1
      roxie/udplib/udptrs.cpp
  47. 24 0
      thorlcr/activities/keyedjoin/thkeyedjoin.cpp

+ 1 - 1
cmake_modules/docMacros.cmake

@@ -122,7 +122,7 @@ MACRO(DOCBOOK_TO_HTML _xsl_file _xml_file _out_dir _html_target _css_path _zip_t
            OUTPUT ${_out_dir}/${css_file_name}
            )
        ADD_CUSTOM_TARGET(${_html_target}
-           COMMAND ${XSLTPROC_EXECUTABLE} --nonet --xinclude --stringparam html.stylesheet ${css_file_name} --stringparam generate.toc "book toc"  --param use.id.as.filename 1 --param chapter.autolabel 0  ${_xsl_file} ${_xml_file}
+           COMMAND ${XSLTPROC_EXECUTABLE} --nonet --xinclude --stringparam html.stylesheet ${css_file_name} --stringparam generate.toc "book toc"  --param chapter.autolabel 0  ${_xsl_file} ${_xml_file}
            WORKING_DIRECTORY ${_out_dir}
            DEPENDS docbook-expand ${_out_dir}/${css_file_name} ${HELP_DEPENDENCIES}
            #SOURCES ${_xsl_file}

+ 10 - 0
ecl/hqlcpp/hqlttcpp.cpp

@@ -5937,6 +5937,13 @@ static IHqlExpression * createResultsAttribute(const HqlExprArray & results)
 
 //------------------------------------------------------------------------
 
+int compareWorkflowItems(CInterface * const * _left, CInterface * const * _right)
+{
+    WorkflowItem * left = static_cast<WorkflowItem *>(*_left);
+    WorkflowItem * right = static_cast<WorkflowItem *>(*_right);
+    return (int)(left->queryWfid() - right->queryWfid());
+}
+
 static HqlTransformerInfo workflowTransformerInfo("WorkflowTransformer");
 WorkflowTransformer::WorkflowTransformer(IWorkUnit * _wu, HqlCppTranslator & _translator)
 : NewHqlTransformer(workflowTransformerInfo), wu(_wu), translator(_translator), wfidCount(0)
@@ -7319,6 +7326,9 @@ void WorkflowTransformer::transformRoot(const HqlExprArray & in, WorkflowArray &
 
     percolateScheduledIds();
 
+    //Sort by workflow id, so that the graphs are generated in workflow id order - and therefore sorted correctly
+    //to avoid the need for extra processing when iterating over the graph information
+    workflow.sort(compareWorkflowItems);
     appendArray(out, workflow);
     appendArray(out, functions);
     translator.setMaxWfid(wfidCount);

+ 2 - 1
esp/bindings/SOAP/Platform/soapparam.hpp

@@ -1022,7 +1022,8 @@ public:
 
     void marshall(IRpcMessage &rpc_call, const char *tagname, const char* itemname, const char* elementtype="",const char *basepath="", const char *prefix="")
     {
-        rpc_call.add_value(basepath, prefix, tagname, "string", enumstrings.item(value));
+        if ((value >= 0) && (value < enumstrings.length()))
+            rpc_call.add_value(basepath, prefix, tagname, "string", enumstrings.item(value));
     }
 
     bool unmarshall(IRpcMessage &rpc_call, const char *tagname, const char *basepath="", const char* optGroup=NULL, const char *prefix="")

+ 19 - 1
esp/bindings/http/platform/httptransport.cpp

@@ -2606,13 +2606,31 @@ StringBuffer &toText(StringBuffer &content, IMultiException *me)
     return content;
 }
 
+/*
+ * Function to determine ESP exception logging class based on exception audience
+ */
+inline LogMsgClass mapErrAudToLogClass(IMultiException *me)
+{
+    switch (me->errorAudience())
+    {
+    case MSGAUD_user:
+        return MSGCLS_information;
+    case MSGAUD_programmer:
+        return MSGCLS_error;
+    case MSGAUD_audit:
+    case MSGAUD_operator:
+    default:
+        return MSGCLS_warning;
+    }
+}
+
 bool CHttpResponse::handleExceptions(IXslProcessor *xslp, IMultiException *me, const char *serv, const char *meth, const char *errorXslt)
 {
     IEspContext *context=queryContext();
     if (me->ordinality()>0)
     {
         StringBuffer msg;
-        IWARNLOG("Exception(s) in %s::%s - %s", serv, meth, me->errorMessage(msg).append('\n').str());
+        LOG(MCexception(me, mapErrAudToLogClass(me)), "Exception(s) in %s::%s - %s", serv, meth, me->errorMessage(msg).append('\n').str());
 
         StringBuffer content;
         switch (context->getResponseFormat())

+ 1 - 1
esp/services/ws_store/espstorelib/daliKVStore.cpp

@@ -410,7 +410,7 @@ bool CDALIKVStore::fetch(const char * storename, const char * ns, const char * k
     {
         xpath.appendf("/%s", key);
         if(!storetree->hasProp(xpath.str()))
-            throw MakeStringException(-1, "DALI Keystore fetch: invalid key '%s' detected!", key);
+            throw makeStringExceptionV(MSGAUD_user, -1, "DALI Keystore fetch: invalid key '%s' detected!", key);
 
         value.set(storetree->queryProp(xpath.str()));
 

+ 1 - 1
esp/services/ws_store/ws_storeService.cpp

@@ -280,7 +280,7 @@ bool CwsstoreEx::onSet(IEspContext &context, IEspSetRequest &req, IEspSetRespons
 
     const char *user = context.queryUserId();
     Owned<ISecUser> secuser = new CSecureUser(user, nullptr);
-	resp.setSuccess(m_storeProvider->set(storename, ns, key, value, secuser.get(), !req.getUserSpecific()));
+    resp.setSuccess(m_storeProvider->set(storename, ns, key, value, secuser.get(), !req.getUserSpecific()));
 
     return true;
 }

+ 1 - 0
esp/src/.gitignore

@@ -2,4 +2,5 @@ build/
 hpcc-js/
 lib/
 node_modules/
+src/nlsHPCCType.ts
 lws.target.txt

+ 1 - 0
esp/src/CMakeLists.txt

@@ -31,6 +31,7 @@ file(COPY
     ${CMAKE_CURRENT_SOURCE_DIR}/tsconfig.json
     ${CMAKE_CURRENT_SOURCE_DIR}/webpack.config.js
     ${CMAKE_CURRENT_SOURCE_DIR}/xstyle
+    ${CMAKE_CURRENT_SOURCE_DIR}/util
     DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
 
 set ( SRCS

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 965 - 967
esp/src/eclwatch/nls/bs/hpcc.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 966 - 968
esp/src/eclwatch/nls/es/hpcc.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 950 - 952
esp/src/eclwatch/nls/fr/hpcc.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 960 - 961
esp/src/eclwatch/nls/hpcc.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 965 - 967
esp/src/eclwatch/nls/hr/hpcc.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 966 - 968
esp/src/eclwatch/nls/hu/hpcc.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 968 - 970
esp/src/eclwatch/nls/pt-br/hpcc.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 966 - 968
esp/src/eclwatch/nls/sr/hpcc.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 965 - 967
esp/src/eclwatch/nls/zh/hpcc.js


+ 127 - 125
esp/src/package-lock.json

@@ -44,37 +44,37 @@
       "integrity": "sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A=="
     },
     "@hpcc-js/api": {
-      "version": "2.8.32",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/api/-/api-2.8.32.tgz",
-      "integrity": "sha512-h31do5IMVv2E+YAg6RH6HcJxLXyMdeTDxMDerThSGHd8kTWVEKe7kBv29jL5zdikBqTDkFjXfx1zDLd31Up1hA==",
+      "version": "2.8.35",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/api/-/api-2.8.35.tgz",
+      "integrity": "sha512-PiZj5ZBTwb7ODpoCj8PazY1LlES24mlaYvI5cFE02jE5q2U3SMbLXI9maS3xj7k8H2WzjIfiHUDRZ1D/q85M8g==",
       "requires": {
-        "@hpcc-js/common": "^2.37.0"
+        "@hpcc-js/common": "^2.40.0"
       }
     },
     "@hpcc-js/chart": {
-      "version": "2.44.0",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/chart/-/chart-2.44.0.tgz",
-      "integrity": "sha512-IB1Ge9ikOsssLp2xP0lolLU1ax2i5ch+7jDR1YkVXWVMCO+kYoJ7hXz5ugD6eR8D9hoACFwc3sY7hbvLVmcBvA==",
+      "version": "2.47.0",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/chart/-/chart-2.47.0.tgz",
+      "integrity": "sha512-Y+2KcDOf9n18/TJP0PmlOqrf3BMZkGvNtTZty0p8qpuhoqg/P+egkooiQ34cPdJPlUYbA2scFyMeCE+RpLZH5g==",
       "requires": {
-        "@hpcc-js/api": "^2.8.32",
-        "@hpcc-js/common": "^2.37.0",
-        "@hpcc-js/util": "^2.24.0"
+        "@hpcc-js/api": "^2.8.35",
+        "@hpcc-js/common": "^2.40.0",
+        "@hpcc-js/util": "^2.26.0"
       }
     },
     "@hpcc-js/codemirror": {
-      "version": "2.27.0",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/codemirror/-/codemirror-2.27.0.tgz",
-      "integrity": "sha512-fFg99jQ1fsp4Jul2U2WNpLDKEDR+PVScEhrXi/H4JIU/H1ISPpWlBnRj6NdegUGW8RPz/wY2rLFsI7f37GOjhQ==",
+      "version": "2.30.0",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/codemirror/-/codemirror-2.30.0.tgz",
+      "integrity": "sha512-OwmDZ+F1xRG4js8vAPsZCT2thchDX3AvdMBSC2o0irAGTb5szam05ySHGnl73faOGineYPqK3JB2ahaqGYG2bA==",
       "requires": {
-        "@hpcc-js/common": "^2.37.0"
+        "@hpcc-js/common": "^2.40.0"
       }
     },
     "@hpcc-js/common": {
-      "version": "2.37.0",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/common/-/common-2.37.0.tgz",
-      "integrity": "sha512-oZ73IwE5Lxvo8I3sjYXNfMuXmyHnPDhZslrVAN14GetTsqyhlUSHsGM6SCxBdYrhwr4tsLUweZOXzRP+fbwK/g==",
+      "version": "2.40.0",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/common/-/common-2.40.0.tgz",
+      "integrity": "sha512-Q/+illzsBYnkamLoLIrPH4vHTXxkOdlWteqHaTvOB87W+EIE0bNM1ZXPm0Ufj0DItD8FxM9R4jCGkEsjM4v74A==",
       "requires": {
-        "@hpcc-js/util": "^2.24.0",
+        "@hpcc-js/util": "^2.26.0",
         "@types/d3-array": "1.2.6",
         "@types/d3-brush": "1.0.10",
         "@types/d3-collection": "1.0.8",
@@ -93,12 +93,12 @@
       }
     },
     "@hpcc-js/comms": {
-      "version": "2.22.0",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/comms/-/comms-2.22.0.tgz",
-      "integrity": "sha512-GmMzJ5YuR0qgbA+2QOKewQHVsCZFYf630ky0z1n2mIrqxwaz+tz+qwA/m39wB3xUGcrVnMIq/ug/HgHAHibTYw==",
+      "version": "2.24.0",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/comms/-/comms-2.24.0.tgz",
+      "integrity": "sha512-3k4LBXHiJxZFAo38Yk8mxKkRQpwMRqdfRSRDCLzVJRult/NzJKMr/g6iMiyV9vaT5RirBVhO+HUr0SOrugyhkw==",
       "requires": {
-        "@hpcc-js/ddl-shim": "^2.17.14",
-        "@hpcc-js/util": "^2.24.0",
+        "@hpcc-js/ddl-shim": "^2.17.15",
+        "@hpcc-js/util": "^2.26.0",
         "node-fetch": "2.3.0",
         "safe-buffer": "5.1.2",
         "tmp": "0.0.33",
@@ -106,82 +106,82 @@
       }
     },
     "@hpcc-js/ddl-shim": {
-      "version": "2.17.14",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/ddl-shim/-/ddl-shim-2.17.14.tgz",
-      "integrity": "sha512-mNZ2tNsTWOPTDOQKasL9AENM5OH8Lc3rZLnhIbpr1YJqF4JYea5LUX/87dYeOa7U6jQxpl1XlJ8+GEwgbBwS6w==",
+      "version": "2.17.15",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/ddl-shim/-/ddl-shim-2.17.15.tgz",
+      "integrity": "sha512-hKg+BdNvEYAzbU+SDS4iGNc40lA4EN6axENlKIilthYYb+my3r4goHffco+YGRbnLA2N/xj6MrhEV10ov/Y2ww==",
       "requires": {
         "ajv": "6.10.0"
       }
     },
     "@hpcc-js/dgrid": {
-      "version": "2.8.30",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid/-/dgrid-2.8.30.tgz",
-      "integrity": "sha512-cHpyPiMFDDA6nGF0vMe4RHjgKXKDMybFpwSe8CQU2mZkihaAOFl6xCkeStg6TTDmSxQ8HO3cJ92cKqkA0v3t5Q==",
+      "version": "2.8.33",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid/-/dgrid-2.8.33.tgz",
+      "integrity": "sha512-LDvyEDizX5AiEgLEd4PrSiIVjE8lYUjPM7QWgGAeF44H9e10J7NEEWY8oi/8BNxHdEVTTnx+kCI2QpL+750Tmw==",
       "requires": {
-        "@hpcc-js/common": "^2.37.0",
-        "@hpcc-js/ddl-shim": "^2.17.14",
-        "@hpcc-js/dgrid-shim": "^2.11.21",
-        "@hpcc-js/util": "^2.24.0"
+        "@hpcc-js/common": "^2.40.0",
+        "@hpcc-js/ddl-shim": "^2.17.15",
+        "@hpcc-js/dgrid-shim": "^2.11.22",
+        "@hpcc-js/util": "^2.26.0"
       }
     },
     "@hpcc-js/dgrid-shim": {
-      "version": "2.11.21",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid-shim/-/dgrid-shim-2.11.21.tgz",
-      "integrity": "sha512-zPcJ5wyZvbIkPZBJEpjPeTWu7HfE9JvoqkTXTRCkEF8rcg8LEwCyw4gyxKZt2lCDJfUtpGco7bZgANTVYfRIxA=="
+      "version": "2.11.22",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid-shim/-/dgrid-shim-2.11.22.tgz",
+      "integrity": "sha512-D2S7JBWJyTV819G00xis9yj4NA/tV+o79kiwBeqma5tAMF9UPBgOdtj24BsXVPbjM3uLiCD7irsfY0g+DuFD5Q=="
     },
     "@hpcc-js/eclwatch": {
-      "version": "2.8.48",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/eclwatch/-/eclwatch-2.8.48.tgz",
-      "integrity": "sha512-Yp7thXM6NTCYq4Ya+xf5rsaKyy9YjjS4sMxlIFjCTD3o67uAmEHbYbRg9yH5v4bMq0HOG1lPqedwqyuX+Fl7aA==",
-      "requires": {
-        "@hpcc-js/codemirror": "^2.27.0",
-        "@hpcc-js/common": "^2.37.0",
-        "@hpcc-js/comms": "^2.22.0",
-        "@hpcc-js/dgrid": "^2.8.30",
-        "@hpcc-js/graph": "^2.36.0",
-        "@hpcc-js/layout": "^2.16.42",
-        "@hpcc-js/phosphor": "^2.14.25",
-        "@hpcc-js/timeline": "^2.10.0",
-        "@hpcc-js/tree": "^2.12.23",
-        "@hpcc-js/util": "^2.24.0"
+      "version": "2.9.0",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/eclwatch/-/eclwatch-2.9.0.tgz",
+      "integrity": "sha512-j6iGLRV4xuY3TQsu1JQM+IsSBeMcPxznUVVusUWRd0EQldYMgYjLagdIyQeE4b9SLFuzKNpz+2vGgID1dThSEw==",
+      "requires": {
+        "@hpcc-js/codemirror": "^2.30.0",
+        "@hpcc-js/common": "^2.40.0",
+        "@hpcc-js/comms": "^2.24.0",
+        "@hpcc-js/dgrid": "^2.8.33",
+        "@hpcc-js/graph": "^2.40.0",
+        "@hpcc-js/layout": "^2.16.45",
+        "@hpcc-js/phosphor": "^2.14.28",
+        "@hpcc-js/timeline": "^2.14.0",
+        "@hpcc-js/tree": "^2.12.26",
+        "@hpcc-js/util": "^2.26.0"
       }
     },
     "@hpcc-js/graph": {
-      "version": "2.36.0",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/graph/-/graph-2.36.0.tgz",
-      "integrity": "sha512-95kES8udG9Y0cmFOoUkr6pV8P1JogMpBG6ibRstH2j5JOzdRip5/xfp7jxLLIZ4oDv2xeExpUjC46wbvd6VdpQ==",
+      "version": "2.40.0",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/graph/-/graph-2.40.0.tgz",
+      "integrity": "sha512-SD2DR5yqSdqqKh8+IYRCI7b9WzeR30MyIzvB/T/WWRUs1Re8aG8N6lLcb933LV+RoT2RRrmzjYvD5qbdMBbDNw==",
       "requires": {
-        "@hpcc-js/api": "^2.8.32",
-        "@hpcc-js/common": "^2.37.0",
-        "@hpcc-js/html": "^2.10.0",
-        "@hpcc-js/react": "^2.18.0",
-        "@hpcc-js/util": "^2.24.0"
+        "@hpcc-js/api": "^2.8.35",
+        "@hpcc-js/common": "^2.40.0",
+        "@hpcc-js/html": "^2.14.0",
+        "@hpcc-js/react": "^2.22.0",
+        "@hpcc-js/util": "^2.26.0"
       }
     },
     "@hpcc-js/html": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/html/-/html-2.10.0.tgz",
-      "integrity": "sha512-d1bjZwwvjMVd59qHB5RlBmnOoMK0iU13JyMkDFvH/XXTB1q4N/WR72CcqCgV5BQzKNndAevPk2Uy4HAbeGH0Gg==",
+      "version": "2.14.0",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/html/-/html-2.14.0.tgz",
+      "integrity": "sha512-gA0f2VrowBZlUV0R4dd6TbhbtFHlLlrYoGIrQtVXFmliQ/SKlokyFKP/Wx7fzdDPjcpc7pu2T6XOwbVu7wQnlQ==",
       "requires": {
-        "@hpcc-js/common": "^2.37.0",
-        "@hpcc-js/preact-shim": "^2.13.12",
-        "@hpcc-js/util": "^2.24.0"
+        "@hpcc-js/common": "^2.40.0",
+        "@hpcc-js/preact-shim": "^2.13.13",
+        "@hpcc-js/util": "^2.26.0"
       }
     },
     "@hpcc-js/layout": {
-      "version": "2.16.42",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/layout/-/layout-2.16.42.tgz",
-      "integrity": "sha512-CVL7NOsn60AlSvpmVtI3YAJskaNJfA7LSTlRj+mkhzt9xElBqDoj4JAjamVEdlFYH+tkGFDB2F6KO5UUtadk9A==",
+      "version": "2.16.45",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/layout/-/layout-2.16.45.tgz",
+      "integrity": "sha512-uX3NLkn6ydNgFqS5iTHgK1H8oPTMT6TmubYOSX8xWK6T5+6gWL/+VvsQu+qSHkfCzTvVsLhI5E7vWI+XqT8hQQ==",
       "requires": {
-        "@hpcc-js/api": "^2.8.32",
-        "@hpcc-js/common": "^2.37.0",
-        "@hpcc-js/dgrid": "^2.8.30"
+        "@hpcc-js/api": "^2.8.35",
+        "@hpcc-js/common": "^2.40.0",
+        "@hpcc-js/dgrid": "^2.8.33"
       }
     },
     "@hpcc-js/leaflet-shim": {
-      "version": "2.1.13",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/leaflet-shim/-/leaflet-shim-2.1.13.tgz",
-      "integrity": "sha512-jvRWg75vRR3FQkQ9sWIeCilmOnMRVQPLOBJ8tWD92xut8pTwQkfX2ref8bhla2uljI3mIL9Pa2sjzU8WwENdzg==",
+      "version": "2.1.14",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/leaflet-shim/-/leaflet-shim-2.1.14.tgz",
+      "integrity": "sha512-gcZFV//2b2itXENWDUN5gJUN2FrzMBx5XJ5xEcl4J4xAus4n7vWr3+HuJXYEGmsFjjg0HJH9OzsddzN9supFbw==",
       "requires": {
         "@types/leaflet": "1.5.1",
         "leaflet": "1.5.1",
@@ -189,44 +189,44 @@
       }
     },
     "@hpcc-js/map": {
-      "version": "2.26.0",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/map/-/map-2.26.0.tgz",
-      "integrity": "sha512-+fy40t3apqVluOemLI9p31g5IiPxRoRqpe+cLi9IKUGM/WanSDVpmhfG2bzV3wiI654Ste17C8pDdpUzI7P04Q==",
+      "version": "2.30.0",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/map/-/map-2.30.0.tgz",
+      "integrity": "sha512-3rLPwx71bibDTxpch8/YIoUt5uvy6Ht/2t8qU9AUtdrQ7/tMNw8OvzoGxc45UqmVzzqVFd4T7q2OfGuTlsRZAg==",
       "requires": {
-        "@hpcc-js/api": "^2.8.32",
-        "@hpcc-js/common": "^2.37.0",
-        "@hpcc-js/graph": "^2.36.0",
-        "@hpcc-js/layout": "^2.16.42",
-        "@hpcc-js/leaflet-shim": "^2.1.13",
-        "@hpcc-js/other": "^2.13.45",
-        "@hpcc-js/util": "^2.24.0"
+        "@hpcc-js/api": "^2.8.35",
+        "@hpcc-js/common": "^2.40.0",
+        "@hpcc-js/graph": "^2.40.0",
+        "@hpcc-js/layout": "^2.16.45",
+        "@hpcc-js/leaflet-shim": "^2.1.14",
+        "@hpcc-js/other": "^2.13.48",
+        "@hpcc-js/util": "^2.26.0"
       }
     },
     "@hpcc-js/other": {
-      "version": "2.13.45",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/other/-/other-2.13.45.tgz",
-      "integrity": "sha512-Fi7bF3gG2tZN6wrOVQfzl4NZrZ64PjehB5Bk4Hys3ONd7km2kPvdCQfEW40Z754BsVyg/DTgncUV2vJHxyCmzg==",
+      "version": "2.13.48",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/other/-/other-2.13.48.tgz",
+      "integrity": "sha512-PdN4ehvZZHAfP2wlE4zVCAQt26kii2U3SYRqMfaNpSWaz5Zx+EB4JFqyqNBUkoSevyH+bvuXIKiDFRDrYsXerw==",
       "requires": {
-        "@hpcc-js/api": "^2.8.32",
-        "@hpcc-js/common": "^2.37.0",
-        "@hpcc-js/layout": "^2.16.42"
+        "@hpcc-js/api": "^2.8.35",
+        "@hpcc-js/common": "^2.40.0",
+        "@hpcc-js/layout": "^2.16.45"
       }
     },
     "@hpcc-js/phosphor": {
-      "version": "2.14.25",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/phosphor/-/phosphor-2.14.25.tgz",
-      "integrity": "sha512-vecX0pPDaZWDl7FS6Z8Obtr+pSlpw+Gqsks6i6bqk54VUz5ZqdPDOS+h3aFBBwU+DewthH2ieLUBR37KxDIXcw==",
+      "version": "2.14.28",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/phosphor/-/phosphor-2.14.28.tgz",
+      "integrity": "sha512-sseFFJ9KvKR1ndmJ8n9OsCQCU9EAd0NNNSsoWv2JL4p1Yn8IGGepsaSQb5cGQQ5QnXkAIFlRcxiI+HWPGQ2PGA==",
       "requires": {
-        "@hpcc-js/common": "^2.37.0",
-        "@hpcc-js/other": "^2.13.45",
-        "@hpcc-js/phosphor-shim": "^2.11.16",
-        "@hpcc-js/util": "^2.24.0"
+        "@hpcc-js/common": "^2.40.0",
+        "@hpcc-js/other": "^2.13.48",
+        "@hpcc-js/phosphor-shim": "^2.11.17",
+        "@hpcc-js/util": "^2.26.0"
       }
     },
     "@hpcc-js/phosphor-shim": {
-      "version": "2.11.16",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/phosphor-shim/-/phosphor-shim-2.11.16.tgz",
-      "integrity": "sha512-MvFCpdwhR+KyI3F1k6y2qHdWdIjqBhbFef04sRYIkZwAS/b94PAStt10dVDP72fxNUfTMZ1TLwDjg6SaJLbyow==",
+      "version": "2.11.17",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/phosphor-shim/-/phosphor-shim-2.11.17.tgz",
+      "integrity": "sha512-Jip+bhRvH44KmaXYS6CjkZHC1gGeKjEnAiSqnxqIcjit5e6PXUvdqSDE9oIEwma1Tkdyk/kEH1TcMxoZBMp45g==",
       "requires": {
         "@phosphor/algorithm": "1.1.2",
         "@phosphor/commands": "1.5.0",
@@ -235,53 +235,55 @@
       }
     },
     "@hpcc-js/preact-shim": {
-      "version": "2.13.12",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/preact-shim/-/preact-shim-2.13.12.tgz",
-      "integrity": "sha512-XB5eboxjHTgtcSCQOlGSDU1sEeMuK2cSLcRa4jN6HmyFzfsvXhMa6kTIviUYcgENcXxBfU0Kf5/Ev6I9HwfiJA==",
+      "version": "2.13.13",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/preact-shim/-/preact-shim-2.13.13.tgz",
+      "integrity": "sha512-AB3MT44+J9Iu/fcZ7fU+BFPxLOIwt0+YoOP46U53pwHF2mABwBlvkN2YN5fBU4IA9vd8xcr26HxtEQX8zwSYZw==",
       "requires": {
         "preact": "10.1.1"
       }
     },
     "@hpcc-js/react": {
-      "version": "2.18.0",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/react/-/react-2.18.0.tgz",
-      "integrity": "sha512-BsJiIQtzySq8082bnItuuw4DjstRIYj3Qp58Y6a1ClUyj5UnAIvzzOFtzU8cKpD/egZMUYpRjMIcd/xPCicIlg==",
+      "version": "2.22.0",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/react/-/react-2.22.0.tgz",
+      "integrity": "sha512-zsfshyUeaZ94PKkKAzZctPC/ufPVwhKyjO8XUv50EbrEQU9qegNUlpppA+08Vxkh7m3insMyh64Tn6MPrJjBTg==",
       "requires": {
-        "@hpcc-js/common": "^2.37.0",
-        "@hpcc-js/preact-shim": "^2.13.12"
+        "@hpcc-js/common": "^2.40.0",
+        "@hpcc-js/preact-shim": "^2.13.13"
       }
     },
     "@hpcc-js/timeline": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/timeline/-/timeline-2.10.0.tgz",
-      "integrity": "sha512-6+UXCny+JlBAGia/6ia4dQ+zq7iuDDRzuTiWnl71wO4sZ87hIuVDAqittmKIp6ImvwtAjR93vUgv9UU26z33LA==",
+      "version": "2.14.0",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/timeline/-/timeline-2.14.0.tgz",
+      "integrity": "sha512-W03n65it9iUIt2qDv0GuDIv+DDckwVN7QTcwGqrmtt9eCTjymjx0GeEudb3s+dZu+1gl9NgIVHQpTrV0W1XwjQ==",
       "requires": {
-        "@hpcc-js/api": "^2.8.32",
-        "@hpcc-js/chart": "^2.44.0",
-        "@hpcc-js/common": "^2.37.0"
+        "@hpcc-js/api": "^2.8.35",
+        "@hpcc-js/chart": "^2.47.0",
+        "@hpcc-js/common": "^2.40.0",
+        "@hpcc-js/html": "^2.14.0",
+        "@hpcc-js/react": "^2.22.0"
       }
     },
     "@hpcc-js/tree": {
-      "version": "2.12.23",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/tree/-/tree-2.12.23.tgz",
-      "integrity": "sha512-rzpm0aOIaPHlJdo96icBKwCZ85O2N/tGRXNdMKmutOyjBzIBngzY+zB7y7W02p5hEtU5wq7y14MVhctVbR0B1w==",
+      "version": "2.12.26",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/tree/-/tree-2.12.26.tgz",
+      "integrity": "sha512-Ti3rMYnr9rYbxcKm8klItlLB3Co+bG3DzesfSDEN+mndiymhjN2CI61Aq4Pyd9JwDeaGfhJLDs6TpLdNsA3hlg==",
       "requires": {
-        "@hpcc-js/api": "^2.8.32",
-        "@hpcc-js/common": "^2.37.0"
+        "@hpcc-js/api": "^2.8.35",
+        "@hpcc-js/common": "^2.40.0"
       }
     },
     "@hpcc-js/util": {
-      "version": "2.24.0",
-      "resolved": "https://registry.npmjs.org/@hpcc-js/util/-/util-2.24.0.tgz",
-      "integrity": "sha512-z8d/lhMcaelHm6cvvt3dC5n/UaUOpeim04MEGtSZk6l7V9TkC1ps2zZ2Q8V1nh3PGo0FzQx4LdzBMvtMBP7tYA==",
+      "version": "2.26.0",
+      "resolved": "https://registry.npmjs.org/@hpcc-js/util/-/util-2.26.0.tgz",
+      "integrity": "sha512-QEWndrJ7cSrgql/EhjR/pDD8jKMrL9vfJtdQoDdiHMQxHougoZTUEO3jiambq3Ahhi7Robth8UcqIhA3AVZhgw==",
       "requires": {
-        "tslib": "1.10.0"
+        "tslib": "2.0.1"
       },
       "dependencies": {
         "tslib": {
-          "version": "1.10.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
-          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
+          "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ=="
         }
       }
     },

+ 19 - 18
esp/src/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "description": "'ECL Watch' Web interface for HPCC Platform.",
   "scripts": {
-    "clean": "rimraf ./build && rimraf ./lib",
+    "clean": "rimraf ./build ./lib ./src/nlsHPCCType.ts",
     "lint": "eslint eclwatch/**/*.js src/**/*.ts",
     "copy-res-es6-promise": "cpx \"./node_modules/es6-promise/dist/es6-promise.auto.min.js\" ./build/node_modules/es6-promise/dist/",
     "copy-res-eclwatch-img": "cpx \"./eclwatch/img/**/*.{png,jpg,gif}\" ./build/eclwatch/img/",
@@ -15,13 +15,14 @@
     "copy-res-wasm": "cpx \"./node_modules/@hpcc-js/graph/dist/graphvizlib.wasm\" ./build/dist/",
     "copy-res-stub_htm": "cpx \"./stub.htm\" ./build/",
     "copy-res": "run-s copy-res-es6-promise copy-res-eclwatch-img copy-res-eclwatch-ecl copy-res-dojo copy-res-dojox copy-res-TopoJSON copy-res-font-awesome copy-res-stub_htm copy-res-wasm",
+    "gen-lang-types": "node ./util/genLangTypes.js",
     "compile": "tsc",
     "compile-watch": "npm run compile -- -w",
     "bundle": "node node_modules/webpack/bin/webpack.js --env production --config webpack.config.js",
     "bundle-dev": "node node_modules/webpack/bin/webpack.js --env development --config webpack.config.js",
     "bundle-watch": "npm run bundle-dev -- --watch",
-    "build": "npm-run-all --parallel copy-res compile --serial bundle",
-    "build-dev": "npm-run-all --parallel copy-res compile --serial bundle-dev",
+    "build": "npm-run-all gen-lang-types --parallel copy-res compile --serial bundle",
+    "build-dev": "npm-run-all gen-lang-types --parallel copy-res compile --serial bundle-dev",
     "dev-start-ws": "ws",
     "dev-start": "run-p bundle-watch dev-start-ws",
     "dev-start-verbose": "ws --verbose.include request response",
@@ -30,20 +31,20 @@
   },
   "main": "src/stub.js",
   "dependencies": {
-    "@hpcc-js/chart": "2.44.0",
-    "@hpcc-js/codemirror": "2.27.0",
-    "@hpcc-js/common": "2.37.0",
-    "@hpcc-js/comms": "2.22.0",
-    "@hpcc-js/eclwatch": "2.8.48",
-    "@hpcc-js/graph": "2.36.0",
-    "@hpcc-js/html": "2.10.0",
-    "@hpcc-js/layout": "2.16.42",
-    "@hpcc-js/map": "2.26.0",
-    "@hpcc-js/other": "2.13.45",
-    "@hpcc-js/phosphor": "2.14.25",
-    "@hpcc-js/react": "2.18.0",
-    "@hpcc-js/tree": "2.12.23",
-    "@hpcc-js/util": "2.24.0",
+    "@hpcc-js/chart": "2.47.0",
+    "@hpcc-js/codemirror": "2.30.0",
+    "@hpcc-js/common": "2.40.0",
+    "@hpcc-js/comms": "2.24.0",
+    "@hpcc-js/eclwatch": "2.9.0",
+    "@hpcc-js/graph": "2.40.0",
+    "@hpcc-js/html": "2.14.0",
+    "@hpcc-js/layout": "2.16.45",
+    "@hpcc-js/map": "2.30.0",
+    "@hpcc-js/other": "2.13.48",
+    "@hpcc-js/phosphor": "2.14.28",
+    "@hpcc-js/react": "2.22.0",
+    "@hpcc-js/tree": "2.12.26",
+    "@hpcc-js/util": "2.26.0",
     "@material-ui/core": "4.8.3",
     "@material-ui/icons": "4.9.1",
     "@material-ui/lab": "4.0.0-alpha.47",
@@ -89,4 +90,4 @@
     "type": "git",
     "url": "https://github.com/hpcc-systems/HPCC-Platform"
   }
-}
+}

+ 1 - 3
esp/src/src/Clippy.ts

@@ -1,11 +1,9 @@
 import * as Clipboard from "clipboard";
 import * as Tooltip from "dijit/Tooltip";
 import * as dom from "dojo/dom";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 import * as mouse from "dojo/mouse";
 import * as on from "dojo/on";
+import nlsHPCC from "./nlsHPCC";
 
 export function attach(domID: string): void {
     const clipboard: Clipboard = new Clipboard(`#${domID}`);

+ 1 - 3
esp/src/src/DataPatternsWidget.ts

@@ -1,9 +1,7 @@
 import * as dom from "dojo/dom";
 import * as domClass from "dojo/dom-class";
 import * as domForm from "dojo/dom-form";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
+import nlsHPCC from "./nlsHPCC";
 
 import * as registry from "dijit/registry";
 

+ 1 - 3
esp/src/src/DiskUsage.ts

@@ -3,9 +3,7 @@ import { Palette } from "@hpcc-js/common";
 import { GetTargetClusterUsageEx, MachineService } from "@hpcc-js/comms";
 import { ColumnFormat, Table } from "@hpcc-js/dgrid";
 import { FlexGrid } from "@hpcc-js/layout";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
+import nlsHPCC from "./nlsHPCC";
 
 Palette.rainbow("DiskUsage", ["green", "green", "green", "green", "green", "green", "green", "green", "orange", "red", "red"]);
 

+ 1 - 3
esp/src/src/ECLArchiveWidget.ts

@@ -9,9 +9,7 @@ import "dijit/layout/ContentPane";
 import * as registry from "dijit/registry";
 import "dijit/Toolbar";
 import "dijit/ToolbarSeparator";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
+import nlsHPCC from "./nlsHPCC";
 // @ts-ignore
 import * as template from "dojo/text!../templates/ECLArchiveWidget.html";
 // @ts-ignore

+ 1 - 4
esp/src/src/ESPDFUWorkunit.ts

@@ -1,14 +1,11 @@
 import * as declare from "dojo/_base/declare";
 import * as lang from "dojo/_base/lang";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 import * as Observable from "dojo/store/Observable";
 import * as topic from "dojo/topic";
-
 import * as ESPRequest from "./ESPRequest";
 import * as ESPUtil from "./ESPUtil";
 import * as FileSpray from "./FileSpray";
+import nlsHPCC from "./nlsHPCC";
 import * as Utility from "./Utility";
 
 const i18n = nlsHPCC;

+ 1 - 3
esp/src/src/ESPPackageProcess.ts

@@ -1,8 +1,6 @@
 import * as declare from "dojo/_base/declare";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 import * as Observable from "dojo/store/Observable";
+import nlsHPCC from "./nlsHPCC";
 import * as ESPRequest from "./ESPRequest";
 
 const Store = declare([ESPRequest.Store], {

+ 1 - 4
esp/src/src/ESPPreflight.ts

@@ -4,10 +4,7 @@ import * as lang from "dojo/_base/lang";
 import * as Observable from "dojo/store/Observable";
 import * as QueryResults from "dojo/store/util/QueryResults";
 import * as ESPRequest from "./ESPRequest";
-
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
+import nlsHPCC from "./nlsHPCC";
 
 const i18n = nlsHPCC;
 

+ 1 - 3
esp/src/src/ESPQuery.ts

@@ -2,9 +2,6 @@
 import * as declare from "dojo/_base/declare";
 import * as Deferred from "dojo/_base/Deferred";
 import * as lang from "dojo/_base/lang";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 import * as Observable from "dojo/store/Observable";
 import * as topic from "dojo/topic";
 
@@ -13,6 +10,7 @@ import * as parser from "dojox/xml/parser";
 import * as ESPRequest from "./ESPRequest";
 import * as ESPUtil from "./ESPUtil";
 import * as ESPWorkunit from "./ESPWorkunit";
+import nlsHPCC from "./nlsHPCC";
 import * as WsEcl from "./WsEcl";
 import * as WsWorkunits from "./WsWorkunits";
 

+ 1 - 3
esp/src/src/ESPResult.ts

@@ -3,15 +3,13 @@ import * as declare from "dojo/_base/declare";
 import * as Deferred from "dojo/_base/Deferred";
 import * as lang from "dojo/_base/lang";
 import * as domConstruct from "dojo/dom-construct";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 
 import * as entities from "dojox/html/entities";
 import * as parser from "dojox/xml/parser";
 
 import { ESPBase } from "./ESPBase";
 import * as ESPRequest from "./ESPRequest";
+import nlsHPCC from "./nlsHPCC";
 import * as Utility from "./Utility";
 import * as WsWorkunits from "./WsWorkunits";
 

+ 1 - 3
esp/src/src/ESPUtil.ts

@@ -8,9 +8,6 @@ import * as aspect from "dojo/aspect";
 import * as domClass from "dojo/dom-class";
 import * as domStyle from "dojo/dom-style";
 import * as Evented from "dojo/Evented";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 import * as json from "dojo/json";
 import * as on from "dojo/on";
 import * as query from "dojo/query";
@@ -33,6 +30,7 @@ import * as OnDemandGrid from "dgrid/OnDemandGrid";
 import * as Selection from "dgrid/Selection";
 
 import { declareDecorator } from "./DeclareDecorator";
+import nlsHPCC from "./nlsHPCC";
 import { userKeyValStore } from "./KeyValStore";
 import { Pagination } from "./Pagination";
 

+ 1 - 3
esp/src/src/ESPWorkunit.ts

@@ -2,9 +2,6 @@
 import * as declare from "dojo/_base/declare";
 import * as Deferred from "dojo/_base/Deferred";
 import * as lang from "dojo/_base/lang";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 import * as all from "dojo/promise/all";
 import * as Observable from "dojo/store/Observable";
 import * as topic from "dojo/topic";
@@ -15,6 +12,7 @@ import { IEvent } from "@hpcc-js/util";
 import * as ESPRequest from "./ESPRequest";
 import * as ESPResult from "./ESPResult";
 import * as ESPUtil from "./ESPUtil";
+import nlsHPCC from "./nlsHPCC";
 import * as Utility from "./Utility";
 import * as WsTopology from "./WsTopology";
 import * as WsWorkunits from "./WsWorkunits";

+ 1 - 3
esp/src/src/Graph7Widget.ts

@@ -1,9 +1,6 @@
 import * as lang from "dojo/_base/lang";
 import * as aspect from "dojo/aspect";
 import * as dom from "dojo/dom";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 
 import * as registry from "dijit/registry";
 
@@ -23,6 +20,7 @@ import "dijit/Toolbar";
 import "dijit/ToolbarSeparator";
 
 import { declareDecorator } from "./DeclareDecorator";
+import nlsHPCC from "./nlsHPCC";
 import { WUScopeController } from "./WUScopeController";
 
 type _Widget = {

+ 1 - 3
esp/src/src/GraphTree7Widget.ts

@@ -4,9 +4,6 @@ import * as lang from "dojo/_base/lang";
 import * as aspect from "dojo/aspect";
 import * as dom from "dojo/dom";
 import * as has from "dojo/has";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 import * as topic from "dojo/topic";
 
 import * as registry from "dijit/registry";
@@ -20,6 +17,7 @@ import * as _Widget from "hpcc/_Widget";
 import { declareDecorator } from "./DeclareDecorator";
 import { Grid, maximizeWidget } from "./ESPUtil";
 import { GraphStore, GraphTreeStore } from "./GraphStore";
+import nlsHPCC from "./nlsHPCC";
 import { debounce, getImageURL, Persist } from "./Utility";
 import * as WsWorkunits from "./WsWorkunits";
 import { WUGraphLegend } from "./WUGraphLegend";

+ 1 - 3
esp/src/src/GraphTreeWidget.ts

@@ -4,9 +4,6 @@ import * as Deferred from "dojo/_base/Deferred";
 import * as lang from "dojo/_base/lang";
 import * as dom from "dojo/dom";
 import * as html from "dojo/html";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 import * as on from "dojo/on";
 import * as topic from "dojo/topic";
 
@@ -25,6 +22,7 @@ import * as tree from "../dgrid/tree";
 import * as _Widget from "hpcc/_Widget";
 import * as ESPUtil from "./ESPUtil";
 import * as ESPWorkunit from "./ESPWorkunit";
+import nlsHPCC from "./nlsHPCC";
 import * as Utility from "./Utility";
 import * as WsWorkunits from "./WsWorkunits";
 

+ 1 - 4
esp/src/src/WUStatus.ts

@@ -1,10 +1,7 @@
 import { Workunit, WUStateID } from "@hpcc-js/comms";
 import { Edge, Graph, Vertex } from "@hpcc-js/graph";
 import { hashSum, IObserverHandle } from "@hpcc-js/util";
-
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
+import nlsHPCC from "./nlsHPCC";
 
 export class WUStatus extends Graph {
 

+ 2 - 4
esp/src/src/WsPackageMaps.ts

@@ -1,9 +1,7 @@
 import * as lang from "dojo/_base/lang";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 
 import * as ESPRequest from "./ESPRequest";
+import nlsHPCC from "./nlsHPCC";
 
 const i18n = nlsHPCC;
 
@@ -128,7 +126,7 @@ export function deletePackageMap(params) {
     return ESPRequest.send("WsPackageProcess", "DeletePackage", params);
 }
 
-export function GetPackageMapSelectOptions (params) {
+export function GetPackageMapSelectOptions(params) {
     return ESPRequest.send("WsPackageProcess", "GetPackageMapSelectOptions", {
         request: {
             IncludeTargets: params.IncludeTargets,

+ 1 - 3
esp/src/src/WsWorkunits.ts

@@ -2,13 +2,11 @@ import * as arrayUtil from "dojo/_base/array";
 import * as declare from "dojo/_base/declare";
 import * as Deferred from "dojo/_base/Deferred";
 import * as lang from "dojo/_base/lang";
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 import * as all from "dojo/promise/all";
 import * as Observable from "dojo/store/Observable";
 import * as topic from "dojo/topic";
 import * as ESPRequest from "./ESPRequest";
+import nlsHPCC from "./nlsHPCC";
 
 declare const dojo;
 

+ 6 - 0
esp/src/src/nlsHPCC.ts

@@ -0,0 +1,6 @@
+import "dojo/i18n";
+// @ts-ignore
+import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
+import type nlsHPCCType from "./nlsHPCCType";
+
+export default nlsHPCC as nlsHPCCType;

+ 2 - 5
esp/src/src/react/aboutDialog.tsx

@@ -9,13 +9,10 @@ import ToggleButton from "@material-ui/lab/ToggleButton";
 import Typography from "@material-ui/core/Typography";
 import Box from "@material-ui/core/Box";
 import { Bar } from "@hpcc-js/chart";
+import { fetchStats } from "../KeyValStore";
+import nlsHPCC from "../nlsHPCC";
 import { theme } from "./theme";
 import { VisualizationComponent } from "./vizComponent";
-import { fetchStats } from "../KeyValStore";
-
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 
 interface BarChart {
     columns: string[];

+ 1 - 3
esp/src/src/react/recentFilters.tsx

@@ -3,10 +3,8 @@ import Skeleton from '@material-ui/lab/Skeleton';
 import { Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Button, Typography, Paper } from "@material-ui/core";
 import { ThemeProvider } from "@material-ui/core/styles";
 import Tooltip from '@material-ui/core/Tooltip';
+import nlsHPCC from "../nlsHPCC";
 import { theme } from './theme';
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 import { useGet } from "./hooks/useWsStore";
 
 interface RecentFilterProps {

+ 2 - 4
esp/src/src/react/wuStatus.tsx

@@ -3,12 +3,10 @@ import Step from "@material-ui/core/Step";
 import StepLabel from "@material-ui/core/StepLabel";
 import Stepper from "@material-ui/core/Stepper";
 import { MuiThemeProvider } from "@material-ui/core/styles";
+import nlsHPCC from "../nlsHPCC";
 import { theme } from "./theme";
 import * as React from "react";
 
-import "dojo/i18n";
-// @ts-ignore
-import * as nlsHPCC from "dojo/i18n!hpcc/nls/hpcc";
 
 const Steps = [
     {
@@ -25,7 +23,7 @@ const Steps = [
     },
     {
         text: nlsHPCC.Completed,
-        activeText: nlsHPCC.Completing
+        activeText: nlsHPCC.Completed
     }
 ];
 

+ 1 - 1
esp/src/tsconfig.json

@@ -33,4 +33,4 @@
     "include": [
         "src/**/*"
     ]
-}
+}

+ 14 - 0
esp/src/util/genLangTypes.js

@@ -0,0 +1,14 @@
+/* eslint-disable no-undef */
+/* eslint-disable @typescript-eslint/no-var-requires */
+
+const fs = require('fs');
+
+globalThis.define = nlsHPCC => {
+    fs.writeFileSync('./src/nlsHPCCType.ts', `\
+export default interface nlsHPCC {
+${Object.keys(nlsHPCC.root).map(id => `    ${id}: string;`).join("\n")}
+}
+    `);
+};
+
+require("../eclwatch/nls/hpcc");

+ 14 - 0
helm/hpcc/templates/thor.yaml

@@ -190,6 +190,13 @@ data:
           - name: %jobname
 {{- include "hpcc.addSecurityContext" (dict "root" $ "me" .) | indent 12 }}
 {{ include "hpcc.addImageAttrs" (dict "root" $ "me" .) | indent 12 }}
+            resources:
+              requests:
+                #request-memory
+                #request-cpu
+              limits:
+                #limit-memory
+                #limit-cpu
             workingDir: /var/lib/HPCCSystems
             command: [ thormaster_lcr ] 
             args: [
@@ -226,6 +233,13 @@ data:
           - name: %jobname
 {{- include "hpcc.addSecurityContext" (dict "root" $ "me" .) | indent 12 }}
 {{ include "hpcc.addImageAttrs" (dict "root" $ "me" .) | indent 12 }}
+            resources:
+              requests:
+                #request-memory
+                #request-cpu
+              limits:
+                #limit-memory
+                #limit-cpu
             workingDir: /var/lib/HPCCSystems
             command: [ thorslave_lcr ] 
             args: [

+ 2 - 0
roxie/ccd/ccddali.cpp

@@ -268,6 +268,8 @@ private:
 
     static IPropertyTree *readCache(const char *xpath)
     {
+        if (oneShotRoxie)
+            return nullptr;
         CriticalBlock b(cacheCrit);
         loadCache();
         return cache->getPropTree(xpath);

+ 3 - 3
roxie/ccd/ccdmain.cpp

@@ -1182,13 +1182,13 @@ int CCD_API roxie_main(int argc, const char *argv[], const char * defaultYaml)
 
         if (!oneShotRoxie)
             loadPlugins();
-        createDelayedReleaser();
-        globalPackageSetManager = createRoxiePackageSetManager(standAloneDll.getClear());
-        globalPackageSetManager->load();
         unsigned snifferChannel = numChannels+2; // MORE - why +2 not +1??
 #ifdef _CONTAINERIZED
         initializeTopology(topoValues, myRoles, traceLevel);
 #endif
+        createDelayedReleaser();
+        globalPackageSetManager = createRoxiePackageSetManager(standAloneDll.getClear());
+        globalPackageSetManager->load();
         ROQ = createOutputQueueManager(snifferChannel, numAgentThreads);
         ROQ->setHeadRegionSize(headRegionSize);
         ROQ->start();

+ 2 - 1
roxie/udplib/udptrs.cpp

@@ -919,7 +919,8 @@ private:
                 maxMetaLength = DATA_PAYLOAD - sizeof(UdpPacketHeader);
                 part_buffer = bufferManager->allocate();
             }
-            memcpy(&part_buffer->data[sizeof(UdpPacketHeader)+data_used], metaData, metaLength);
+            if (metaLength)
+                memcpy(&part_buffer->data[sizeof(UdpPacketHeader)+data_used], metaData, metaLength);
             package_header.pktSeq |= UDP_PACKET_COMPLETE;
             put_package(part_buffer, data_used, metaLength);
         }

+ 24 - 0
thorlcr/activities/keyedjoin/thkeyedjoin.cpp

@@ -404,6 +404,30 @@ public:
                 if (totalIndexParts)
                 {
                     indexMap.map(*this, indexFile, keyHasTlk, getOptBool("allLocalIndexParts"));
+                    if (remoteKeyedLookup && !getOptBool(THOROPT_FORCE_REMOTE_KEYED_LOOKUP))
+                    {
+                        /* heuristic to determine how many nodes in this cluster, have had parts
+                         * mapped for remote lookup.
+                         * If <50%, then turn off remoteKeyedLookup, and process directly
+                         * This scenario can happen, when the index has been written to an overlapping but smaller cluster,
+                         * or if a narrow index has been copied to this cluster (e.g a 1-way hthor index).
+                         */ 
+                        unsigned nodesWithMappedParts = 0;
+                        unsigned groupSize = queryDfsGroup().ordinality();
+                        for (unsigned s=0; s<groupSize; s++)
+                        {
+                            std::vector<unsigned> &parts = indexMap.querySlaveParts(s);
+                            if (parts.size())
+                                nodesWithMappedParts++;
+                        }
+                        if ((nodesWithMappedParts * 2) < groupSize) // i.e. if less than 50% nodes have any parts mapped
+                        {
+                            remoteKeyedLookup = false;
+                            remoteKeyedFetch = false;
+                            ActPrintLog("Remote keyed lookups disabled, because too few nodes mapped to service requests of narrow key [cluster nodes=%u, key width=%u, nodes mapped=%u]", groupSize, indexFile->numParts(), nodesWithMappedParts);
+                        }
+                    }
+
                     initMb.append(numTags);
                     for (auto &tag: tags)
                         initMb.append(tag);