From 04b7f2fa8c1a478d241ddc1c00be1fffd54e3460 Mon Sep 17 00:00:00 2001 From: d98762625 Date: Fri, 15 Feb 2019 15:20:05 +0000 Subject: [PATCH] WIP HAD to move NodeDish out - NONE of it is async! --- Gruntfile.js | 4 +- package-lock.json | 145 +++++++------ package.json | 1 + src/core/Dish.mjs | 2 +- src/core/Utils.mjs | 77 +++++-- src/core/operations/Tar.mjs | 2 + src/core/operations/Untar.mjs | 1 + src/node/File.mjs | 41 ++++ src/node/NodeDish.mjs | 186 +++++++++++++++++ src/node/NodeRecipe.mjs | 14 +- src/node/SyncDish.mjs | 196 ------------------ src/node/api.mjs | 165 ++++++--------- src/node/config/excludedOperations.mjs | 4 +- src/node/config/scripts/generateNodeIndex.mjs | 6 +- src/node/repl-index.mjs | 3 + tests/node/tests/nodeApi.mjs | 6 +- 16 files changed, 442 insertions(+), 411 deletions(-) create mode 100644 src/node/File.mjs create mode 100644 src/node/NodeDish.mjs delete mode 100644 src/node/SyncDish.mjs diff --git a/Gruntfile.js b/Gruntfile.js index 359723e5..3193feca 100755 --- a/Gruntfile.js +++ b/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({ diff --git a/package-lock.json b/package-lock.json index 4f29f477..b6dc24b0 100644 --- a/package-lock.json +++ b/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": { diff --git a/package.json b/package.json index 9b578388..caf10d64 100644 --- a/package.json +++ b/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", diff --git a/src/core/Dish.mjs b/src/core/Dish.mjs index 6b5c9fc2..30b8621d 100755 --- a/src/core/Dish.mjs +++ b/src/core/Dish.mjs @@ -74,6 +74,7 @@ class Dish { case "list": 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; } - } diff --git a/src/core/Utils.mjs b/src/core/Utils.mjs index f70e2941..efd57acd 100755 --- a/src/core/Utils.mjs +++ b/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 + 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); - }; + 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; diff --git a/src/core/operations/Tar.mjs b/src/core/operations/Tar.mjs index 84674bff..6e2334b8 100644 --- a/src/core/operations/Tar.mjs +++ b/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]); } diff --git a/src/core/operations/Untar.mjs b/src/core/operations/Untar.mjs index af029184..c69aa771 100644 --- a/src/core/operations/Untar.mjs +++ b/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); } diff --git a/src/node/File.mjs b/src/node/File.mjs new file mode 100644 index 00000000..768c46a8 --- /dev/null +++ b/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; diff --git a/src/node/NodeDish.mjs b/src/node/NodeDish.mjs new file mode 100644 index 00000000..246defbf --- /dev/null +++ b/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; diff --git a/src/node/NodeRecipe.mjs b/src/node/NodeRecipe.mjs index b49fb9f9..aa72fa6b 100644 --- a/src/node/NodeRecipe.mjs +++ b/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); } } diff --git a/src/node/SyncDish.mjs b/src/node/SyncDish.mjs deleted file mode 100644 index b1667198..00000000 --- a/src/node/SyncDish.mjs +++ /dev/null @@ -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; diff --git a/src/node/api.mjs b/src/node/api.mjs index b0cd8658..35d5bf22 100644 --- a/src/node/api.mjs +++ b/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; + /** + * Async wrapped operation run function + * @param {*} input + * @param {Object | String[]} args - either in Object or normal args array + * @returns {Promise} operation's output, on a Dish. + * @throws {OperationError} if the operation throws one. + */ + const wrapped = async (input, args=null) => { + const dish = ensureIsDish(input); - // 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} 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 - }); - }; - } + // 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) { diff --git a/src/node/config/excludedOperations.mjs b/src/node/config/excludedOperations.mjs index ee097bbb..53cdfa95 100644 --- a/src/node/config/excludedOperations.mjs +++ b/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", diff --git a/src/node/config/scripts/generateNodeIndex.mjs b/src/node/config/scripts/generateNodeIndex.mjs index ea2c044b..3056c270 100644 --- a/src/node/config/scripts/generateNodeIndex.mjs +++ b/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"; diff --git a/src/node/repl-index.mjs b/src/node/repl-index.mjs index 3acc16fb..0a5c3f75 100644 --- a/src/node/repl-index.mjs +++ b/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]; diff --git a/tests/node/tests/nodeApi.mjs b/tests/node/tests/nodeApi.mjs index 7604ae13..fc5f01b9 100644 --- a/tests/node/tests/nodeApi.mjs +++ b/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", () => {