Jelajahi Sumber

WIP HAD to move NodeDish out - NONE of it is async!

d98762625 6 tahun lalu
induk
melakukan
04b7f2fa8c

+ 2 - 2
Gruntfile.js

@@ -271,7 +271,7 @@ module.exports = function (grunt) {
                 ]
             },
             node: {
-                mode: process.env.NODE_ENV,
+                mode: process.env.NODE_ENV === "prodction" ? "production" : "development",
                 target: "node",
                 entry: "./src/node/index.mjs",
                 externals: [NodeExternals({
@@ -302,7 +302,7 @@ module.exports = function (grunt) {
                 }
             },
             nodeRepl: {
-                mode: process.env.NODE_ENV,
+                mode: process.env.NODE_ENV === "prodction" ? "production" : "development",
                 target: "node",
                 entry: "./src/node/repl-index.mjs",
                 externals: [NodeExternals({

+ 72 - 73
package-lock.json

@@ -1664,7 +1664,7 @@
       "dependencies": {
         "es6-promisify": {
           "version": "5.0.0",
-          "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
+          "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
           "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
           "dev": true,
           "requires": {
@@ -1839,7 +1839,7 @@
     },
     "array-equal": {
       "version": "1.0.0",
-      "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
       "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
       "dev": true
     },
@@ -2072,7 +2072,7 @@
     },
     "axios": {
       "version": "0.18.0",
-      "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
       "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
       "dev": true,
       "requires": {
@@ -2550,7 +2550,7 @@
     },
     "browserify-aes": {
       "version": "1.2.0",
-      "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
       "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
       "dev": true,
       "requires": {
@@ -2587,7 +2587,7 @@
     },
     "browserify-rsa": {
       "version": "4.0.1",
-      "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
       "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
       "dev": true,
       "requires": {
@@ -2652,7 +2652,7 @@
     },
     "buffer": {
       "version": "4.9.1",
-      "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
       "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
       "dev": true,
       "requires": {
@@ -2791,7 +2791,7 @@
     },
     "camelcase-keys": {
       "version": "2.1.0",
-      "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
       "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
       "dev": true,
       "requires": {
@@ -2840,7 +2840,7 @@
     },
     "chalk": {
       "version": "1.1.3",
-      "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
       "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
       "requires": {
         "ansi-styles": "^2.2.1",
@@ -3381,7 +3381,7 @@
     },
     "create-hash": {
       "version": "1.2.0",
-      "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
       "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
       "dev": true,
       "requires": {
@@ -3394,7 +3394,7 @@
     },
     "create-hmac": {
       "version": "1.1.7",
-      "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
       "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
       "dev": true,
       "requires": {
@@ -3494,7 +3494,7 @@
         },
         "json5": {
           "version": "1.0.1",
-          "resolved": "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
           "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
           "dev": true,
           "requires": {
@@ -3547,7 +3547,7 @@
     },
     "css-select": {
       "version": "1.2.0",
-      "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
       "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
       "dev": true,
       "requires": {
@@ -3570,7 +3570,7 @@
       "dependencies": {
         "jsesc": {
           "version": "0.5.0",
-          "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
           "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
           "dev": true
         },
@@ -3748,7 +3748,7 @@
     },
     "deep-eql": {
       "version": "0.1.3",
-      "resolved": "http://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
+      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
       "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
       "dev": true,
       "requires": {
@@ -3928,7 +3928,7 @@
     },
     "diffie-hellman": {
       "version": "5.0.3",
-      "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
       "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
       "dev": true,
       "requires": {
@@ -3992,7 +3992,7 @@
       "dependencies": {
         "domelementtype": {
           "version": "1.1.3",
-          "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
           "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
           "dev": true
         },
@@ -4051,7 +4051,7 @@
     },
     "duplexer": {
       "version": "0.1.1",
-      "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
       "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
       "dev": true
     },
@@ -4197,7 +4197,7 @@
     },
     "entities": {
       "version": "1.0.0",
-      "resolved": "http://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
       "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=",
       "dev": true
     },
@@ -4628,7 +4628,7 @@
     },
     "eventemitter2": {
       "version": "0.4.14",
-      "resolved": "http://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
+      "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
       "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
       "dev": true
     },
@@ -4640,7 +4640,7 @@
     },
     "events": {
       "version": "1.1.1",
-      "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz",
+      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
       "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
       "dev": true
     },
@@ -5351,7 +5351,7 @@
     },
     "fs-extra": {
       "version": "1.0.0",
-      "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
       "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
       "dev": true,
       "requires": {
@@ -6086,7 +6086,7 @@
     },
     "get-stream": {
       "version": "3.0.0",
-      "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
       "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
       "dev": true
     },
@@ -6228,7 +6228,7 @@
       "dependencies": {
         "pify": {
           "version": "2.3.0",
-          "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
           "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
           "dev": true
         }
@@ -6337,7 +6337,7 @@
         },
         "grunt-cli": {
           "version": "1.2.0",
-          "resolved": "http://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
+          "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
           "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=",
           "dev": true,
           "requires": {
@@ -6437,7 +6437,7 @@
       "dependencies": {
         "shelljs": {
           "version": "0.5.3",
-          "resolved": "http://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz",
+          "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz",
           "integrity": "sha1-xUmCuZbHbvDB5rWfvcWCX1txMRM=",
           "dev": true
         }
@@ -6457,7 +6457,7 @@
       "dependencies": {
         "async": {
           "version": "1.5.2",
-          "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz",
+          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
           "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
           "dev": true
         }
@@ -6502,7 +6502,7 @@
     },
     "grunt-contrib-jshint": {
       "version": "1.1.0",
-      "resolved": "http://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz",
+      "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz",
       "integrity": "sha1-Np2QmyWTxA6L55lAshNAhQx5Oaw=",
       "dev": true,
       "requires": {
@@ -6842,7 +6842,7 @@
     },
     "html-webpack-plugin": {
       "version": "3.2.0",
-      "resolved": "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
       "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
       "dev": true,
       "requires": {
@@ -6890,7 +6890,7 @@
     },
     "htmlparser2": {
       "version": "3.8.3",
-      "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
       "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
       "dev": true,
       "requires": {
@@ -6909,7 +6909,7 @@
     },
     "http-errors": {
       "version": "1.6.3",
-      "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
       "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
       "dev": true,
       "requires": {
@@ -6967,7 +6967,7 @@
     },
     "http-proxy-middleware": {
       "version": "0.18.0",
-      "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz",
       "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==",
       "dev": true,
       "requires": {
@@ -7407,7 +7407,7 @@
     },
     "is-builtin-module": {
       "version": "1.0.0",
-      "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
       "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
       "dev": true,
       "requires": {
@@ -7987,7 +7987,7 @@
     },
     "jsonfile": {
       "version": "2.4.0",
-      "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
       "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
       "dev": true,
       "requires": {
@@ -8098,7 +8098,7 @@
     },
     "kew": {
       "version": "0.7.0",
-      "resolved": "http://registry.npmjs.org/kew/-/kew-0.7.0.tgz",
+      "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz",
       "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=",
       "dev": true
     },
@@ -8217,7 +8217,7 @@
     },
     "load-json-file": {
       "version": "1.1.0",
-      "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
       "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
       "dev": true,
       "requires": {
@@ -8230,7 +8230,7 @@
       "dependencies": {
         "pify": {
           "version": "2.3.0",
-          "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
           "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
           "dev": true
         }
@@ -8588,7 +8588,7 @@
     },
     "media-typer": {
       "version": "0.3.0",
-      "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
       "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
       "dev": true
     },
@@ -8647,7 +8647,7 @@
     },
     "meow": {
       "version": "3.7.0",
-      "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
       "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
       "dev": true,
       "requires": {
@@ -8707,10 +8707,9 @@
       }
     },
     "mime": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
-      "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
-      "dev": true
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz",
+      "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w=="
     },
     "mime-db": {
       "version": "1.37.0",
@@ -8794,7 +8793,7 @@
     },
     "minimist": {
       "version": "1.2.0",
-      "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
       "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
     },
     "mississippi": {
@@ -8868,7 +8867,7 @@
     },
     "mkdirp": {
       "version": "0.5.1",
-      "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
       "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
       "requires": {
         "minimist": "0.0.8"
@@ -8876,7 +8875,7 @@
       "dependencies": {
         "minimist": {
           "version": "0.0.8",
-          "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
           "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
         }
       }
@@ -8909,7 +8908,7 @@
       "dependencies": {
         "commander": {
           "version": "2.15.1",
-          "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
           "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
           "dev": true,
           "optional": true
@@ -9078,7 +9077,7 @@
     },
     "ncp": {
       "version": "1.0.1",
-      "resolved": "http://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz",
       "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=",
       "dev": true
     },
@@ -9177,7 +9176,7 @@
       "dependencies": {
         "semver": {
           "version": "5.3.0",
-          "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
           "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
           "dev": true
         }
@@ -9358,7 +9357,7 @@
       "dependencies": {
         "colors": {
           "version": "0.5.1",
-          "resolved": "http://registry.npmjs.org/colors/-/colors-0.5.1.tgz",
+          "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz",
           "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q="
         },
         "underscore": {
@@ -9640,13 +9639,13 @@
     },
     "os-homedir": {
       "version": "1.0.2",
-      "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
       "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
       "dev": true
     },
     "os-locale": {
       "version": "1.4.0",
-      "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
       "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
       "dev": true,
       "requires": {
@@ -9655,7 +9654,7 @@
     },
     "os-tmpdir": {
       "version": "1.0.2",
-      "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
       "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
       "dev": true
     },
@@ -9879,7 +9878,7 @@
     },
     "parse-asn1": {
       "version": "5.1.1",
-      "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
       "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
       "dev": true,
       "requires": {
@@ -9965,7 +9964,7 @@
     },
     "path-is-absolute": {
       "version": "1.0.1",
-      "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
       "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
       "dev": true
     },
@@ -10006,7 +10005,7 @@
       "dependencies": {
         "pify": {
           "version": "2.3.0",
-          "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
           "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
           "dev": true
         }
@@ -10177,7 +10176,7 @@
       "dependencies": {
         "async": {
           "version": "1.5.2",
-          "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz",
+          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
           "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
           "dev": true
         }
@@ -10548,7 +10547,7 @@
     },
     "progress": {
       "version": "1.1.8",
-      "resolved": "http://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
       "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74="
     },
     "promise-inflight": {
@@ -10816,7 +10815,7 @@
       "dependencies": {
         "pify": {
           "version": "2.3.0",
-          "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
           "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
           "dev": true
         }
@@ -11005,7 +11004,7 @@
       "dependencies": {
         "jsesc": {
           "version": "0.5.0",
-          "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
           "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
           "dev": true
         }
@@ -11056,7 +11055,7 @@
         },
         "htmlparser2": {
           "version": "3.3.0",
-          "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz",
+          "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz",
           "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=",
           "dev": true,
           "requires": {
@@ -11068,7 +11067,7 @@
         },
         "readable-stream": {
           "version": "1.0.34",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
           "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
           "dev": true,
           "requires": {
@@ -11349,7 +11348,7 @@
     },
     "safe-regex": {
       "version": "1.1.0",
-      "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
       "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
       "dev": true,
       "requires": {
@@ -11681,7 +11680,7 @@
     },
     "sha.js": {
       "version": "2.4.11",
-      "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
       "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
       "dev": true,
       "requires": {
@@ -11725,7 +11724,7 @@
     },
     "shelljs": {
       "version": "0.3.0",
-      "resolved": "http://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
+      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
       "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=",
       "dev": true
     },
@@ -12436,7 +12435,7 @@
     },
     "strip-ansi": {
       "version": "3.0.1",
-      "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
       "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
       "requires": {
         "ansi-regex": "^2.0.0"
@@ -12453,7 +12452,7 @@
     },
     "strip-eof": {
       "version": "1.0.0",
-      "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
       "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
       "dev": true
     },
@@ -12554,7 +12553,7 @@
     },
     "tar": {
       "version": "2.2.1",
-      "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
       "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
       "dev": true,
       "requires": {
@@ -12712,7 +12711,7 @@
     },
     "through": {
       "version": "2.3.8",
-      "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
       "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
       "dev": true
     },
@@ -13507,7 +13506,7 @@
       "dependencies": {
         "async": {
           "version": "0.9.2",
-          "resolved": "http://registry.npmjs.org/async/-/async-0.9.2.tgz",
+          "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
           "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
           "dev": true
         },
@@ -13533,7 +13532,7 @@
     },
     "valid-data-url": {
       "version": "0.1.6",
-      "resolved": "http://registry.npmjs.org/valid-data-url/-/valid-data-url-0.1.6.tgz",
+      "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-0.1.6.tgz",
       "integrity": "sha512-FXg2qXMzfAhZc0y2HzELNfUeiOjPr+52hU1DNBWiJJ2luXD+dD1R9NA48Ug5aj0ibbxroeGDc/RJv6ThiGgkDw==",
       "dev": true
     },
@@ -13549,7 +13548,7 @@
     },
     "validator": {
       "version": "9.4.1",
-      "resolved": "http://registry.npmjs.org/validator/-/validator-9.4.1.tgz",
+      "resolved": "https://registry.npmjs.org/validator/-/validator-9.4.1.tgz",
       "integrity": "sha512-YV5KjzvRmSyJ1ee/Dm5UED0G+1L4GZnLN3w6/T+zZm8scVua4sOhYKWTUrKa0H/tMiJyO9QLHMPN+9mB/aMunA==",
       "dev": true
     },
@@ -14081,7 +14080,7 @@
     },
     "webpack-node-externals": {
       "version": "1.7.2",
-      "resolved": "http://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz",
+      "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz",
       "integrity": "sha512-ajerHZ+BJKeCLviLUUmnyd5B4RavLF76uv3cs6KNuO8W+HuQaEs0y0L7o40NQxdPy5w0pcv8Ew7yPUAQG0UdCg==",
       "dev": true
     },
@@ -14244,7 +14243,7 @@
     },
     "wrap-ansi": {
       "version": "2.1.0",
-      "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
       "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
       "dev": true,
       "requires": {

+ 1 - 0
package.json

@@ -115,6 +115,7 @@
     "lodash": "^4.17.11",
     "loglevel": "^1.6.1",
     "loglevel-message-prefix": "^3.0.0",
+    "mime": "^2.4.0",
     "moment": "^2.23.0",
     "moment-timezone": "^0.5.23",
     "ngeohash": "^0.6.3",

+ 1 - 1
src/core/Dish.mjs

@@ -74,6 +74,7 @@ class Dish {
             case "list<file>":
                 return Dish.LIST_FILE;
             default:
+                console.log(typeStr);
                 throw new DishError("Invalid data type string. No matching enum.");
         }
     }
@@ -383,7 +384,6 @@ class Dish {
 
         return newDish;
     }
-
 }
 
 

+ 55 - 24
src/core/Utils.mjs

@@ -9,6 +9,7 @@ import {fromBase64, toBase64} from "./lib/Base64";
 import {fromHex} from "./lib/Hex";
 import {fromDecimal} from "./lib/Decimal";
 import {fromBinary} from "./lib/Binary";
+import { fstat } from "fs";
 
 
 /**
@@ -919,7 +920,7 @@ class Utils {
     /**
      * Reads a File and returns the data as a Uint8Array.
      *
-     * @param {File} file
+     * @param {File | for node: array|arrayBuffer|buffer|string} file
      * @returns {Uint8Array}
      *
      * @example
@@ -927,33 +928,49 @@ class Utils {
      * await Utils.readFile(new File(["hello"], "test"))
      */
     static readFile(file) {
-        return new Promise((resolve, reject) => {
-            const reader = new FileReader();
-            const data = new Uint8Array(file.size);
-            let offset = 0;
-            const CHUNK_SIZE = 10485760; // 10MiB
-
-            const seek = function() {
-                if (offset >= file.size) {
-                    resolve(data);
-                    return;
-                }
-                const slice = file.slice(offset, offset + CHUNK_SIZE);
-                reader.readAsArrayBuffer(slice);
-            };
+        if (Utils.isBrowser()) {
+            return new Promise((resolve, reject) => {
+                const reader = new FileReader();
+                const data = new Uint8Array(file.size);
+                let offset = 0;
+                const CHUNK_SIZE = 10485760; // 10MiB
+
+                const seek = function() {
+                    if (offset >= file.size) {
+                        resolve(data);
+                        return;
+                    }
+                    const slice = file.slice(offset, offset + CHUNK_SIZE);
+                    reader.readAsArrayBuffer(slice);
+                };
+
+                reader.onload = function(e) {
+                    data.set(new Uint8Array(reader.result), offset);
+                    offset += CHUNK_SIZE;
+                    seek();
+                };
+
+                reader.onerror = function(e) {
+                    reject(reader.error.message);
+                };
 
-            reader.onload = function(e) {
-                data.set(new Uint8Array(reader.result), offset);
-                offset += CHUNK_SIZE;
                 seek();
-            };
+            });
 
-            reader.onerror = function(e) {
-                reject(reader.error.message);
-            };
+        } else if (Utils.isNode()) {
+            return Buffer.from(file).buffer;
+        }
 
-            seek();
-        });
+        throw new Error("Unkown environment!");
+    }
+
+    /** */
+    static readFileSync(file) {
+        if (Utils.isBrowser()) {
+            throw new TypeError("Browser environment cannot support readFileSync");
+        }
+
+        return Buffer.from(file).buffer;
     }
 
 
@@ -1050,6 +1067,20 @@ class Utils {
         }[token];
     }
 
+    /**
+     * Check if code is running in a browser environment
+     */
+    static isBrowser() {
+        return typeof window !== "undefined" && typeof window.document !== "undefined";
+    }
+
+    /**
+     * Check if code is running in a Node environment
+     */
+    static isNode() {
+        return typeof process !== "undefined" && process.versions != null && process.versions.node != null;
+    }
+
 }
 
 export default Utils;

+ 2 - 0
src/core/operations/Tar.mjs

@@ -132,6 +132,8 @@ class Tar extends Operation {
         tarball.writeBytes(input);
         tarball.writeEndBlocks();
 
+        console.log("here");
+
         return new File([new Uint8Array(tarball.bytes)], args[0]);
     }
 

+ 1 - 0
src/core/operations/Untar.mjs

@@ -131,6 +131,7 @@ class Untar extends Operation {
      * @returns {html}
      */
     async present(files) {
+        console.log("err....");
         return await Utils.displayFilesAsHTML(files);
     }
 

+ 41 - 0
src/node/File.mjs

@@ -0,0 +1,41 @@
+/**
+ * @author d98762625 [d98762625@gmail.com]
+ * @copyright Crown Copyright 2019
+ * @license Apache-2.0
+ */
+
+import mime from "mime";
+
+/**
+ * FileShim
+ *
+ * Create a class that behaves like the File object in the Browser so that
+ * operations that use the File object still work.
+ *
+ * File doesn't write to disk, but it would be easy to do so with e.gfs.writeFile.
+ */
+class File {
+
+    /**
+     * Constructor
+     *
+     * @param {String|Array|ArrayBuffer|Buffer} bits - file content
+     * @param {String} name (optional) - file name
+     * @param {Object} stats (optional) - file stats e.g. lastModified
+     */
+    constructor(data, name="", stats={}) {
+        this.data = Buffer.from(data);
+        this.name = name;
+        this.lastModified = stats.lastModified || Date.now();
+        this.type = stats.type || mime.getType(this.name);
+    }
+
+    /**
+     * size property
+     */
+    get size() {
+        return this.data.length;
+    }
+}
+
+export default File;

+ 186 - 0
src/node/NodeDish.mjs

@@ -0,0 +1,186 @@
+/**
+ * @author d98762625 [d98762625@gmail.com]
+ * @copyright Crown Copyright 2018
+ * @license Apache-2.0
+ */
+
+import util from "util";
+import Dish from "../core/Dish";
+import Utils from "../core/Utils";
+import DishError from "../core/errors/DishError";
+import BigNumber from "bignumber.js";
+
+
+/**
+ * Subclass of Dish where `get` and `_translate` are synchronous.
+ * Also define functions to improve coercion behaviour.
+ */
+class NodeDish extends Dish {
+
+    /**
+    * Create a Dish
+    * @param {any} inputOrDish - The dish input
+    * @param {String|Number} - The dish type, as enum or string
+    */
+    constructor(inputOrDish=null, type=null) {
+
+        // Allow `fs` file input:
+        // Any node fs Buffers transformed to array buffer
+        // NOT Buffer.buff, as this makes a buffer of the whole object.
+        if (Buffer.isBuffer(inputOrDish)) {
+            inputOrDish = new Uint8Array(inputOrDish).buffer;
+        }
+
+        super(inputOrDish, type);
+    }
+
+     /**
+     * Returns the value of the data in the type format specified.
+     *
+     * @param {number} type - The data type of value, see Dish enums.
+     * @param {boolean} [notUTF8=false] - Do not treat strings as UTF8.
+     * @returns {*} - The value of the output data.
+     */
+    get(type, notUTF8=false) {
+        if (typeof type === "string") {
+            type = Dish.typeEnum(type);
+        }
+        if (this.type !== type) {
+            this._translate(type, notUTF8);
+        }
+        return this.value;
+    }
+
+    /**
+     * alias for get
+     * @param args see get args
+     */
+    to(...args) {
+        return this.get(...args);
+    }
+
+    /**
+     * Avoid coercion to a String primitive.
+     */
+    toString() {
+        return this.get(Dish.typeEnum("string"));
+    }
+
+    /**
+     * What we want to log to the console.
+     */
+    [util.inspect.custom](depth, options) {
+        return this.get(Dish.typeEnum("string"));
+    }
+
+    /**
+     * Backwards compatibility for node v6
+     * Log only the value to the console in node.
+     */
+    inspect() {
+        return this.get(Dish.typeEnum("string"));
+    }
+
+    /**
+     * Avoid coercion to a Number primitive.
+     */
+    valueOf() {
+        return this.get(Dish.typeEnum("number"));
+    }
+
+    /**
+     * Translates the data to the given type format.
+     *
+     * @param {number} toType - The data type of value, see Dish enums.
+     * @param {boolean} [notUTF8=false] - Do not treat strings as UTF8.
+     */
+    _translate(toType, notUTF8=false) {
+        log.debug(`Translating Dish from ${Dish.enumLookup(this.type)} to ${Dish.enumLookup(toType)}`);
+        const byteArrayToStr = notUTF8 ? Utils.byteArrayToChars : Utils.byteArrayToUtf8;
+
+        // Convert data to intermediate byteArray type
+        try {
+            switch (this.type) {
+                case Dish.STRING:
+                    this.value = this.value ? Utils.strToByteArray(this.value) : [];
+                    break;
+                case Dish.NUMBER:
+                    this.value = typeof this.value === "number" ? Utils.strToByteArray(this.value.toString()) : [];
+                    break;
+                case Dish.HTML:
+                    this.value = this.value ? Utils.strToByteArray(Utils.unescapeHtml(Utils.stripHtmlTags(this.value, true))) : [];
+                    break;
+                case Dish.ARRAY_BUFFER:
+                    // Array.from() would be nicer here, but it's slightly slower
+                    this.value = Array.prototype.slice.call(new Uint8Array(this.value));
+                    break;
+                case Dish.BIG_NUMBER:
+                    this.value = BigNumber.isBigNumber(this.value) ? Utils.strToByteArray(this.value.toFixed()) : [];
+                    break;
+                case Dish.JSON:
+                    this.value = this.value ? Utils.strToByteArray(JSON.stringify(this.value, null, 4)) : [];
+                    break;
+                case Dish.FILE:
+                    this.value = Utils.readFileSync(this.value);
+                    this.value = Array.prototype.slice.call(this.value);
+                    break;
+                case Dish.LIST_FILE:
+                    this.value = this.value.map(f => Utils.readFileSync(f));
+                    this.value = this.value.map(b => Array.prototype.slice.call(b));
+                    this.value = [].concat.apply([], this.value);
+                    break;
+                default:
+                    break;
+            }
+        } catch (err) {
+            throw new DishError(`Error translating from ${Dish.enumLookup(this.type)} to byteArray: ${err}`);
+        }
+
+        this.type = Dish.BYTE_ARRAY;
+
+        // Convert from byteArray to toType
+        try {
+            switch (toType) {
+                case Dish.STRING:
+                case Dish.HTML:
+                    this.value = this.value ? byteArrayToStr(this.value) : "";
+                    this.type = Dish.STRING;
+                    break;
+                case Dish.NUMBER:
+                    this.value = this.value ? parseFloat(byteArrayToStr(this.value)) : 0;
+                    this.type = Dish.NUMBER;
+                    break;
+                case Dish.ARRAY_BUFFER:
+                    this.value = new Uint8Array(this.value).buffer;
+                    this.type = Dish.ARRAY_BUFFER;
+                    break;
+                case Dish.BIG_NUMBER:
+                    try {
+                        this.value = new BigNumber(byteArrayToStr(this.value));
+                    } catch (err) {
+                        this.value = new BigNumber(NaN);
+                    }
+                    this.type = Dish.BIG_NUMBER;
+                    break;
+                case Dish.JSON:
+                    this.value = JSON.parse(byteArrayToStr(this.value));
+                    this.type = Dish.JSON;
+                    break;
+                case Dish.FILE:
+                    this.value = new File(this.value, "unknown");
+                    break;
+                case Dish.LIST_FILE:
+                    this.value = [new File(this.value, "unknown")];
+                    this.type = Dish.LIST_FILE;
+                    break;
+                default:
+                    break;
+            }
+        } catch (err) {
+            throw new DishError(`Error translating from byteArray to ${Dish.enumLookup(toType)}: ${err}`);
+        }
+    }
+
+}
+
+export default NodeDish;

+ 7 - 7
src/node/NodeRecipe.mjs

@@ -9,7 +9,7 @@ import { sanitise } from "./apiUtils";
 
 /**
  * Similar to core/Recipe, Recipe controls a list of operations and
- * the SyncDish the operate on. However, this Recipe is for the node
+ * the NodeDish the operate on. However, this Recipe is for the node
  * environment.
  */
 class NodeRecipe {
@@ -73,17 +73,17 @@ class NodeRecipe {
 
     /**
      * Run the dish through each operation, one at a time.
-     * @param {SyncDish} dish
-     * @returns {SyncDish}
+     * @param {NodeDish} dish
+     * @returns {NodeDish}
      */
-    execute(dish) {
-        return this.opList.reduce((prev, curr) => {
+    async execute(dish) {
+        return await this.opList.reduce(async (prev, curr) => {
             // CASE where opLis item is op and args
             if (curr.hasOwnProperty("op") && curr.hasOwnProperty("args")) {
-                return curr.op(prev, curr.args);
+                return await curr.op(prev, curr.args);
             }
             // CASE opList item is just op.
-            return curr(prev);
+            return await curr(prev);
         }, dish);
     }
 }

+ 0 - 196
src/node/SyncDish.mjs

@@ -1,196 +0,0 @@
-/**
- * @author d98762625 [d98762625@gmail.com]
- * @copyright Crown Copyright 2018
- * @license Apache-2.0
- */
-
-import util from "util";
-import Utils from "../core/Utils";
-import Dish from "../core/Dish";
-import BigNumber from "bignumber.js";
-import log from "loglevel";
-
-/**
- * Subclass of Dish where `get` and `_translate` are synchronous.
- * Also define functions to improve coercion behaviour.
- */
-class SyncDish extends Dish {
-
-    /**
-    * Create a Dish
-    * @param {any} inputOrDish - The dish input
-    * @param {String|Number} - The dish type, as enum or string
-    */
-    constructor(inputOrDish=null, type=null) {
-
-        // Allow `fs` file input:
-        // Any node fs Buffers transformed to array buffer
-        // NOT Buffer.buff, as this makes a buffer of the whole object.
-        if (Buffer.isBuffer(inputOrDish)) {
-            inputOrDish = new Uint8Array(inputOrDish).buffer;
-        }
-
-        super(inputOrDish, type);
-    }
-
-    /**
-     * Apply the inputted operation to the dish.
-     *
-     * @param {WrappedOperation} operation the operation to perform
-     * @param {*} args - any arguments for the operation
-     * @returns {Dish} a new dish with the result of the operation.
-     */
-    apply(operation, args=null) {
-        return operation(this.value, args);
-    }
-
-    /**
-     * Synchronously returns the value of the data in the type format specified.
-     *
-     * @param {number} type - The data type of value, see Dish enums.
-     * @param {boolean} [notUTF8=false] - Do not treat strings as UTF8.
-     * @returns {*} - The value of the output data.
-     */
-    get(type, notUTF8=false) {
-        if (typeof type === "string") {
-            type = Dish.typeEnum(type);
-        }
-        if (this.type !== type) {
-            this._translate(type, notUTF8);
-        }
-        return this.value;
-    }
-
-    /**
-     * alias for get
-     * @param args see get args
-     */
-    to(...args) {
-        return this.get(...args);
-    }
-
-    /**
-     * Avoid coercion to a String primitive.
-     */
-    toString() {
-        return this.get(Dish.typeEnum("string"));
-    }
-
-    /**
-     * What we want to log to the console.
-     */
-    [util.inspect.custom](depth, options) {
-        return this.get(Dish.typeEnum("string"));
-    }
-
-    /**
-     * Backwards compatibility for node v6
-     * Log only the value to the console in node.
-     */
-    inspect() {
-        return this.get(Dish.typeEnum("string"));
-    }
-
-    /**
-     * Avoid coercion to a Number primitive.
-     */
-    valueOf() {
-        return this.get(Dish.typeEnum("number"));
-    }
-
-    /**
-     * Synchronously translates the data to the given type format.
-     *
-     * @param {number} toType - The data type of value, see Dish enums.
-     * @param {boolean} [notUTF8=false] - Do not treat strings as UTF8.
-     */
-    _translate(toType, notUTF8=false) {
-        log.debug(`Translating Dish from ${Dish.enumLookup(this.type)} to ${Dish.enumLookup(toType)}`);
-        const byteArrayToStr = notUTF8 ? Utils.byteArrayToChars : Utils.byteArrayToUtf8;
-
-        // Convert data to intermediate byteArray type
-        switch (this.type) {
-            case Dish.STRING:
-                this.value = this.value ? Utils.strToByteArray(this.value) : [];
-                break;
-            case Dish.NUMBER:
-                this.value = typeof this.value === "number" ? Utils.strToByteArray(this.value.toString()) : [];
-                break;
-            case Dish.HTML:
-                this.value = this.value ? Utils.strToByteArray(Utils.unescapeHtml(Utils.stripHtmlTags(this.value, true))) : [];
-                break;
-            case Dish.ARRAY_BUFFER:
-                // Array.from() would be nicer here, but it's slightly slower
-                this.value = Array.prototype.slice.call(new Uint8Array(this.value));
-                break;
-            case Dish.BIG_NUMBER:
-                this.value = this.value instanceof BigNumber ? Utils.strToByteArray(this.value.toFixed()) : [];
-                break;
-            case Dish.JSON:
-                this.value = this.value ? Utils.strToByteArray(JSON.stringify(this.value)) : [];
-                break;
-            case Dish.BUFFER:
-                this.value = this.value instanceof Buffer ? this.value.buffer : [];
-                break;
-            // No such API in Node.js.
-            // case Dish.FILE:
-            //     this.value = Utils.readFileSync(this.value);
-            //     this.value = Array.prototype.slice.call(this.value);
-            //     break;
-            // case Dish.LIST_FILE:
-            //     this.value = this.value.map(f => Utils.readFileSync(f));
-            //     this.value = this.value.map(b => Array.prototype.slice.call(b));
-            //     this.value = [].concat.apply([], this.value);
-            //     break;
-            default:
-                break;
-        }
-
-        this.type = Dish.BYTE_ARRAY;
-
-        // Convert from byteArray to toType
-        switch (toType) {
-            case Dish.STRING:
-            case Dish.HTML:
-                this.value = this.value ? byteArrayToStr(this.value) : "";
-                this.type = Dish.STRING;
-                break;
-            case Dish.NUMBER:
-                this.value = this.value ? parseFloat(byteArrayToStr(this.value)) : 0;
-                this.type = Dish.NUMBER;
-                break;
-            case Dish.ARRAY_BUFFER:
-                this.value = new Uint8Array(this.value).buffer;
-                this.type = Dish.ARRAY_BUFFER;
-                break;
-            case Dish.BIG_NUMBER:
-                try {
-                    this.value = new BigNumber(byteArrayToStr(this.value));
-                } catch (err) {
-                    this.value = new BigNumber(NaN);
-                }
-                this.type = Dish.BIG_NUMBER;
-                break;
-            case Dish.JSON:
-                this.value = JSON.parse(byteArrayToStr(this.value));
-                this.type = Dish.JSON;
-                break;
-            case Dish.BUFFER:
-                this.value = Buffer.from(new Uint8Array(this.value));
-                this.type = Dish.BUFFER;
-                break;
-            // No such API in Node.js.
-            // case Dish.FILE:
-            //     this.value = new File(this.value, "unknown");
-            //     break;
-            // case Dish.LIST_FILE:
-            //     this.value = [new File(this.value, "unknown")];
-            //     this.type = Dish.LIST_FILE;
-            //     break;
-            default:
-                break;
-        }
-    }
-}
-
-export default SyncDish;

+ 66 - 103
src/node/api.mjs

@@ -8,37 +8,13 @@
 
 /*eslint no-console: ["off"] */
 
-import SyncDish from "./SyncDish";
+import NodeDish from "./NodeDish";
 import NodeRecipe from "./NodeRecipe";
 import OperationConfig from "../core/config/OperationConfig.json";
 import { sanitise, removeSubheadingsFromArray, sentenceToCamelCase } from "./apiUtils";
 import ExludedOperationError from "../core/errors/ExcludedOperationError";
 
 
-/**
- * Extract default arg value from operation argument
- * @param {Object} arg - an arg from an operation
- */
-function extractArg(arg) {
-    if (arg.type === "option") {
-        // pick default option if not already chosen
-        return typeof arg.value === "string" ? arg.value : arg.value[0];
-    }
-
-    if (arg.type === "editableOption") {
-        return typeof arg.value === "string" ? arg.value : arg.value[0].value;
-    }
-
-    if (arg.type === "toggleString") {
-        // ensure string and option exist when user hasn't defined
-        arg.string = arg.string || "";
-        arg.option = arg.option || arg.toggleValues[0];
-        return arg;
-    }
-
-    return arg.value;
-}
-
 /**
  * transformArgs
  *
@@ -52,84 +28,87 @@ function extractArg(arg) {
  * @param {Object[]} originalArgs - the operation-s args list
  * @param {Object} newArgs - any inputted args
  */
-function transformArgs(originalArgs, newArgs) {
+function reconcileOpArgs(operationArgs, objectStyleArgs) {
+
+    if (Array.isArray(objectStyleArgs)) {
+        return objectStyleArgs;
+    }
 
     // Filter out arg values that are list subheadings - they are surrounded in [].
     // See Strings op for example.
-    const allArgs = Object.assign([], originalArgs).map((a) => {
+    const opArgs = Object.assign([], operationArgs).map((a) => {
         if (Array.isArray(a.value)) {
             a.value = removeSubheadingsFromArray(a.value);
         }
         return a;
     });
 
-    if (newArgs) {
-        Object.keys(newArgs).map((key) => {
-            const index = allArgs.findIndex((arg) => {
+    // transform object style arg objects to the same shape as op's args
+    if (objectStyleArgs) {
+        Object.keys(objectStyleArgs).map((key) => {
+            const index = opArgs.findIndex((arg) => {
                 return arg.name.toLowerCase().replace(/ /g, "") ===
                     key.toLowerCase().replace(/ /g, "");
             });
 
             if (index > -1) {
-                const argument = allArgs[index];
+                const argument = opArgs[index];
                 if (argument.type === "toggleString") {
-                    if (typeof newArgs[key] === "string") {
-                        argument.string = newArgs[key];
+                    if (typeof objectStyleArgs[key] === "string") {
+                        argument.string = objectStyleArgs[key];
                     } else {
-                        argument.string = newArgs[key].string;
-                        argument.option = newArgs[key].option;
+                        argument.string = objectStyleArgs[key].string;
+                        argument.option = objectStyleArgs[key].option;
                     }
                 } else if (argument.type === "editableOption") {
                     // takes key: "option", key: {name, val: "string"}, key: {name, val: [...]}
-                    argument.value = typeof newArgs[key] === "string" ? newArgs[key]: newArgs[key].value;
+                    argument.value = typeof objectStyleArgs[key] === "string" ? objectStyleArgs[key]: objectStyleArgs[key].value;
                 } else {
-                    argument.value = newArgs[key];
+                    argument.value = objectStyleArgs[key];
                 }
             }
         });
     }
-    return allArgs.map(extractArg);
+
+    return opArgs.map((arg) => {
+        if (arg.type === "option") {
+            // pick default option if not already chosen
+            return typeof arg.value === "string" ? arg.value : arg.value[0];
+        }
+
+        if (arg.type === "editableOption") {
+            return typeof arg.value === "string" ? arg.value : arg.value[0].value;
+        }
+
+        if (arg.type === "toggleString") {
+            // ensure string and option exist when user hasn't defined
+            arg.string = arg.string || "";
+            arg.option = arg.option || arg.toggleValues[0];
+            return arg;
+        }
+
+        return arg.value;
+    });
 }
 
 
 /**
- * Ensure an input is a SyncDish object.
+ * Ensure an input is a NodeDish object.
  * @param input
  */
 function ensureIsDish(input) {
     if (!input) {
-        return new SyncDish();
+        return new NodeDish();
     }
 
-    if (input instanceof SyncDish) {
+    if (input instanceof NodeDish) {
         return input;
     } else {
-        return new SyncDish(input);
+        return new NodeDish(input);
     }
 }
 
 
-/**
- * prepareOp: transform args, make input the right type.
- * Also convert any Buffers to ArrayBuffers.
- * @param opInstance - instance of the operation
- * @param input - operation input
- * @param args - operation args
- */
-function prepareOp(opInstance, input, args) {
-    const dish = ensureIsDish(input);
-    let transformedArgs;
-    // Transform object-style args to original args array
-    if (!Array.isArray(args)) {
-        transformedArgs = transformArgs(opInstance.args, args);
-    } else {
-        transformedArgs = args;
-    }
-    const transformedInput = dish.get(opInstance.inputType);
-    return {transformedInput, transformedArgs};
-}
-
-
 /**
  * createArgOptions
  *
@@ -154,7 +133,6 @@ function createArgOptions(op) {
     return result;
 }
 
-
 /**
  * Wrap an operation to be consumed by node API.
  * Checks to see if run function is async or not.
@@ -169,44 +147,29 @@ export function wrap(OpClass) {
 
     // Check to see if class's run function is async.
     const opInstance = new OpClass();
-    const isAsync = opInstance.run.constructor.name === "AsyncFunction";
-
-    let wrapped;
-
-    // If async, wrap must be async.
-    if (isAsync) {
-        /**
-         * Async wrapped operation run function
-         * @param {*} input
-         * @param {Object | String[]} args - either in Object or normal args array
-         * @returns {Promise<SyncDish>} operation's output, on a Dish.
-         * @throws {OperationError} if the operation throws one.
-         */
-        wrapped = async (input, args=null) => {
-            const {transformedInput, transformedArgs} = prepareOp(opInstance, input, args);
-            const result = await opInstance.run(transformedInput, transformedArgs);
-            return new SyncDish({
-                value: result,
-                type: opInstance.outputType
-            });
-        };
-    } else {
-        /**
-         * wrapped operation run function
-         * @param {*} input
-         * @param {Object | String[]} args - either in Object or normal args array
-         * @returns {SyncDish} operation's output, on a Dish.
-         * @throws {OperationError} if the operation throws one.
-         */
-        wrapped = (input, args=null) => {
-            const {transformedInput, transformedArgs} = prepareOp(opInstance, input, args);
-            const result = opInstance.run(transformedInput, transformedArgs);
-            return new SyncDish({
-                value: result,
-                type: opInstance.outputType
-            });
-        };
-    }
+
+    /**
+     * Async wrapped operation run function
+     * @param {*} input
+     * @param {Object | String[]} args - either in Object or normal args array
+     * @returns {Promise<NodeDish>} operation's output, on a Dish.
+     * @throws {OperationError} if the operation throws one.
+     */
+    const wrapped = async (input, args=null) => {
+        const dish = ensureIsDish(input);
+
+        // Transform object-style args to original args array
+        const transformedArgs = reconcileOpArgs(opInstance.args, args);
+
+        // ensure the input is the correct type
+        const transformedInput = await dish.get(opInstance.inputType);
+
+        const result = await opInstance.run(transformedInput, transformedArgs);
+        return new NodeDish({
+            value: result,
+            type: opInstance.outputType
+        });
+    };
 
     // used in chef.help
     wrapped.opName = OpClass.name;
@@ -288,7 +251,7 @@ export function bake(operations){
      * @param {*} input - some input for a recipe.
      * @param {String | Function | String[] | Function[] | [String | Function]} recipeConfig -
      * An operation, operation name, or an array of either.
-     * @returns {SyncDish} of the result
+     * @returns {NodeDish} of the result
      * @throws {TypeError} if invalid recipe given.
      */
     return function(input, recipeConfig) {

+ 2 - 2
src/node/config/excludedOperations.mjs

@@ -14,8 +14,8 @@ export default  [
     "Comment",
 
     // Exclude file ops until HTML5 File Object can be mimicked
-    "Tar",
-    "Untar",
+    // "Tar",
+    // "Untar",
     "Unzip",
     "Zip",
 

+ 3 - 3
src/node/config/scripts/generateNodeIndex.mjs

@@ -39,7 +39,7 @@ let code = `/**
 
 
 import "babel-polyfill";
-import SyncDish from "./SyncDish";
+import NodeDish from "./NodeDish";
 import { wrap, help, bake, explainExludedFunction } from "./api";
 import {
     // import as core_ to avoid name clashes after wrap.
@@ -87,7 +87,7 @@ code += `    };
 const chef = generateChef();
 // Add some additional features to chef object.
 chef.help = help;
-chef.Dish = SyncDish;
+chef.Dish = NodeDish;
 
 // Define consts here so we can add to top-level export - wont allow
 // export of chef property.
@@ -121,7 +121,7 @@ Object.keys(operations).forEach((op) => {
     code += `    ${decapitalise(op)},\n`;
 });
 
-code += "    SyncDish as Dish,\n";
+code += "    NodeDish as Dish,\n";
 code += "    prebaked as bake,\n";
 code += "    help,\n";
 code += "};\n";

+ 3 - 0
src/node/repl-index.mjs

@@ -9,6 +9,7 @@
 
 import chef from "./index";
 import repl from "repl";
+import File from "./File";
 import "babel-polyfill";
 
 /*eslint no-console: ["off"] */
@@ -26,6 +27,8 @@ const replServer = repl.start({
     prompt: "chef > ",
 });
 
+global.File = File;
+
 Object.keys(chef).forEach((key) => {
     if (key !== "operations") {
         replServer.context[key] = chef[key];

+ 3 - 3
tests/node/tests/nodeApi.mjs

@@ -14,7 +14,7 @@ import assert from "assert";
 import it from "../assertionHandler";
 import chef from "../../../src/node/index";
 import OperationError from "../../../src/core/errors/OperationError";
-import SyncDish from "../../../src/node/SyncDish";
+import NodeDish from "../../../src/node/NodeDish";
 import fs from "fs";
 
 import { toBase32, Dish, SHA3 } from "../../../src/node/index";
@@ -93,9 +93,9 @@ TestRegister.addApiTests([
         assert.equal(result.get("string"), "NFXHA5LU");
     }),
 
-    it("should return a SyncDish", () => {
+    it("should return a NodeDish", async () => {
         const result = chef.toBase32("input");
-        assert(result instanceof SyncDish);
+        assert(result instanceof NodeDish);
     }),
 
     it("should coerce to a string as you expect", () => {