diff --git a/.gitignore b/.gitignore index c569fc1c9..413283235 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,6 @@ coverage/ .idea/ typescript_lualib.lua +lualib_bundle.lua + +dist/* diff --git a/build_lualib.ts b/build_lualib.ts new file mode 100644 index 000000000..e43e9b000 --- /dev/null +++ b/build_lualib.ts @@ -0,0 +1,28 @@ +import * as fs from "fs"; +import * as glob from "glob"; +import {compile} from "./src/Compiler"; + +const bundlePath = "./dist/lualib/lualib_bundle.lua"; + +compile([ + "--luaLibImport", + "none", + "--luaTarget", + "5.1", + "--noHeader", + "--outDir", + "./dist/lualib", + "--rootDir", + "./src/lualib", + ...glob.sync("./src/lualib/*.ts"), + ]); + +if (fs.existsSync(bundlePath)) { + fs.unlinkSync(bundlePath); +} + +let bundle = ""; + +glob.sync("./dist/lualib/*.lua").forEach(fileName => bundle += fs.readFileSync(fileName)); + +fs.writeFileSync(bundlePath, bundle); diff --git a/dist/lualib/typescript.lua b/dist/lualib/typescript.lua deleted file mode 100644 index 2f241c888..000000000 --- a/dist/lualib/typescript.lua +++ /dev/null @@ -1,339 +0,0 @@ --- Ternary operator -function TS_ITE(condition, v1f, v2f) - if condition then - return v1f() - else - return v2f() - end -end - -function TS_forEach(list, func) - for i, v in ipairs(list) do - func(v, i-1, list) - end -end - -function TS_map(list, func) - local out = {} - for _, v in ipairs(list) do - table.insert(out, func(v)) - end - return out -end - -function TS_filter(list, func) - local out = {} - for _, v in ipairs(list) do - if func(v) then - table.insert(out, v) - end - end - return out -end - -function TS_slice(list, startI, endI) - if not endI or endI > #list then endI = #list end - if startI < 0 then startI = math.max(#list + startI, 1) end - if endI < 0 then endI = math.max(#list + endI, 1) end - local out = {} - for i = startI + 1, endI do - table.insert(out, list[i]) - end - return out -end - --- https://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf -function TS_splice(list, start, deleteCount, ...) - -- 1. 2. - local len = #list - - local actualStart - - -- 4. - if start < 0 then - actualStart = math.max(len + start, 0) - else - actualStart = math.min(start, len) - end - - -- 13. - local items = {...} - -- 14. - local itemCount = #items - - -- 5. - 7. - local actualDeleteCount - - if not start then - actualDeleteCount = 0 - elseif not deleteCount then - actualDeleteCount = len - actualStart - else - actualDeleteCount = math.min(math.max(deleteCount, 0), len - actualStart) - end - - -- 8. ignored - - -- 9. - local out = {} - - -- 10. - local k - - k = 0 - - -- 11. - while k < actualDeleteCount do - local from = actualStart + k - - if list[from + 1] then - out[k + 1] = list[from + 1] - end - - k = k + 1 - end - - -- 15. - if itemCount < actualDeleteCount then - -- a. b. - k = actualStart - while k < len - actualDeleteCount do - local from = k + actualDeleteCount - local to = k + itemCount - - if list[from + 1] then - list[to + 1] = list[from + 1] - else - list[to + 1] = nil - end - - k = k + 1 - end - -- c. d. - k = len - while k > len - actualDeleteCount + itemCount do - list[k] = nil - k = k - 1 - end - -- 16. - elseif itemCount > actualDeleteCount then - k = len - actualDeleteCount - while k > actualStart do - local from = k + actualDeleteCount - local to = k + itemCount - - if list[from] then - list[to] = list[from] - else - list[to] = nil - end - - k = k - 1 - end - end - - -- 17. - k = actualStart - - -- 18. - for _, e in ipairs(items) do - list[k + 1] = e - k = k + 1 - end - - -- 19. - k = #list - while k > len - actualDeleteCount + itemCount do - list[k] = nil - k = k - 1 - end - - -- 20. - return out -end - -function TS_some(list, func) - return #TS_filter(list, func) > 0 -end - -function TS_every(list, func) - return #list == #TS_filter(list, func) -end - -function TS_indexOf(list, object ) - for i = 1, #list do - if object == list[i] then - return i - 1 - end - end - return -1 -end - -function TS_replace(source, searchVal, newVal) - local result = string.gsub(source, searchVal, newVal) - return result -end - -function TS_split(str, separator) - local out = {} - - if separator == "" then - string.gsub(str,".", function(c) - table.insert(out, c) - end) - return out - end - - if not string.find(str, separator) then - return { str } - end - - local fstr = str .. separator - local fpat = "(.-)" .. separator - local last_end = 1 - local s, e, cap = string.find(fstr, fpat, 1) - while s do - table.insert(out, cap) - last_end = e+1 - s, e, cap = string.find(fstr, fpat, last_end) - end - if last_end <= #str then - cap = string.sub(fstr, last_end) - table.insert(out, cap) - end - return out -end - -function TS_push(list, ...) - for _, v in ipairs({...}) do - list[#list + 1] = v - end -end - -function TS_instanceof(obj, class) - while obj ~= nil do - if obj.__index == class then - return true - end - obj = obj.__base - end - return false -end - --- Set data structure implementation -Set = Set or {} -Set.__index = Set -function Set.new(construct, ...) - local instance = setmetatable({}, Set) - Set.constructor(instance, ...) - return instance -end -function Set.constructor(self, other) - self._items = {} - self.size = 0 - if other then - self.size = #other - for _, a in pairs(other) do - self._items[a] = true - end - end -end -function Set.add(self, item) - self._items[item] = true - self.size = self.size + 1 -end -function Set.clear(self) - self._items = {} - self.size = 0 -end -function Set.delete(self, item) - local contains = Set.has(self, item) - self._items[item] = nil - self.size = self.size - 1 - return contains -end -function Set.entries(self) - local out = {} - for item, _ in pairs(self._items) do - table.insert(out, {item, item}) - end - return out -end -function Set.forEach(self, callbackFn) - for k, v in pairs(self._items) do - callbackFn(k, k, self) - end -end -function Set.has(self, item) return self._items[item] ~= nil end -function Set.keys(self) - return Set.values(self) -end -function Set.values(self) - local out = {} - for k, _ in pairs(self._items) do - table.insert(out, k) - end - return out -end - --- Set data structure implementation -Map = Map or {} -Map.__index = Map -function Map.new(construct, ...) - local instance = setmetatable({}, Map) - Map.constructor(instance, ...) - return instance -end -function Map.constructor(self, other) - self._items = {} - self.size = 0 - if other then - self.size = #other - for _, v in pairs(other) do - self._items[v[1]] = v[2] - end - end -end -function Map.clear(self) - self._items = {} - self.size = 0 -end -function Map.delete(self, key) - local contains = self.has(self, key) - self._items[key] = nil - self.size = self.size - 1 - return contains -end -function Map.entries(self) - local out = {} - for k, v in pairs(self._items) do - table.insert(out, {k, v}) - end - return out -end -function Map.forEach(self, callbackFn) - for k, v in pairs(self._items) do - callbackFn(v, k, self) - end -end -function Map.get(self, key) return self._items[key] end -function Map.has(self, key) return self._items[key] ~= nil end -function Map.keys(self) - local out = {} - for k, v in pairs(self._items) do - table.insert(out, k) - end - return out -end -function Map.set(self, key, value) - self._items[key] = value - self.size = self.size + 1 - return self -end -function Map.values(self) - local out = {} - for k, v in pairs(self._items) do - table.insert(out, v) - end - return out -end diff --git a/package-lock.json b/package-lock.json index 90a177c9c..7dd5fda20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,9 +34,9 @@ "dev": true }, "@types/yargs": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-11.0.0.tgz", - "integrity": "sha512-vFql3tOxs6clgh+WVoLW3nOkNGCdeKsMU6mQZkOerJpV/CR9Xc1c1lZ+kYU+hNSobrQIOcNovWfPFDJIhcG5Pw==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-11.1.1.tgz", + "integrity": "sha512-Awgju4dqD8kHXX3jc/B/LaryJC7MsyNfnbN62lIbFzTi0GewH64zrkh4bxo/YTgVEK6r9V3GNecxMhXTJw0+jA==", "dev": true }, "ajv": { @@ -806,8 +806,7 @@ "dependencies": { "align-text": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "bundled": true, "dev": true, "requires": { "kind-of": "^3.0.2", @@ -817,26 +816,22 @@ }, "amdefine": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "bundled": true, "dev": true }, "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "bundled": true, "dev": true }, "ansi-styles": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "bundled": true, "dev": true }, "append-transform": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "bundled": true, "dev": true, "requires": { "default-require-extensions": "^1.0.0" @@ -844,62 +839,52 @@ }, "archy": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "bundled": true, "dev": true }, "arr-diff": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "bundled": true, "dev": true }, "arr-flatten": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "bundled": true, "dev": true }, "arr-union": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "bundled": true, "dev": true }, "array-unique": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "bundled": true, "dev": true }, "arrify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "bundled": true, "dev": true }, "assign-symbols": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "bundled": true, "dev": true }, "async": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "bundled": true, "dev": true }, "atob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "bundled": true, "dev": true }, "babel-code-frame": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "bundled": true, "dev": true, "requires": { "chalk": "^1.1.3", @@ -909,8 +894,7 @@ }, "babel-generator": { "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "bundled": true, "dev": true, "requires": { "babel-messages": "^6.23.0", @@ -925,8 +909,7 @@ }, "babel-messages": { "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "bundled": true, "dev": true, "requires": { "babel-runtime": "^6.22.0" @@ -934,8 +917,7 @@ }, "babel-runtime": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "bundled": true, "dev": true, "requires": { "core-js": "^2.4.0", @@ -944,8 +926,7 @@ }, "babel-template": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "bundled": true, "dev": true, "requires": { "babel-runtime": "^6.26.0", @@ -957,8 +938,7 @@ }, "babel-traverse": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "bundled": true, "dev": true, "requires": { "babel-code-frame": "^6.26.0", @@ -974,8 +954,7 @@ }, "babel-types": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "bundled": true, "dev": true, "requires": { "babel-runtime": "^6.26.0", @@ -986,20 +965,17 @@ }, "babylon": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "bundled": true, "dev": true }, "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "bundled": true, "dev": true }, "base": { "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "bundled": true, "dev": true, "requires": { "cache-base": "^1.0.1", @@ -1013,8 +989,7 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "bundled": true, "dev": true, "requires": { "is-descriptor": "^1.0.0" @@ -1022,8 +997,7 @@ }, "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "bundled": true, "dev": true, "requires": { "kind-of": "^6.0.0" @@ -1031,8 +1005,7 @@ }, "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "bundled": true, "dev": true, "requires": { "kind-of": "^6.0.0" @@ -1040,8 +1013,7 @@ }, "is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "bundled": true, "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -1051,22 +1023,19 @@ }, "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "bundled": true, "dev": true }, "kind-of": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "bundled": true, "dev": true } } }, "brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "bundled": true, "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -1075,8 +1044,7 @@ }, "braces": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "bundled": true, "dev": true, "requires": { "arr-flatten": "^1.1.0", @@ -1093,8 +1061,7 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "bundled": true, "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -1104,14 +1071,12 @@ }, "builtin-modules": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "bundled": true, "dev": true }, "cache-base": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "bundled": true, "dev": true, "requires": { "collection-visit": "^1.0.0", @@ -1127,16 +1092,14 @@ "dependencies": { "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "bundled": true, "dev": true } } }, "caching-transform": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", - "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", + "bundled": true, "dev": true, "requires": { "md5-hex": "^1.2.0", @@ -1146,15 +1109,13 @@ }, "camelcase": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "bundled": true, "dev": true, "optional": true }, "center-align": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -1164,8 +1125,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "bundled": true, "dev": true, "requires": { "ansi-styles": "^2.2.1", @@ -1177,8 +1137,7 @@ }, "class-utils": { "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "bundled": true, "dev": true, "requires": { "arr-union": "^3.1.0", @@ -1189,8 +1148,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "bundled": true, "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -1198,16 +1156,14 @@ }, "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "bundled": true, "dev": true } } }, "cliui": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -1218,8 +1174,7 @@ "dependencies": { "wordwrap": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "bundled": true, "dev": true, "optional": true } @@ -1227,14 +1182,12 @@ }, "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "bundled": true, "dev": true }, "collection-visit": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "bundled": true, "dev": true, "requires": { "map-visit": "^1.0.0", @@ -1243,44 +1196,37 @@ }, "commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "bundled": true, "dev": true }, "component-emitter": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "bundled": true, "dev": true }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "bundled": true, "dev": true }, "convert-source-map": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "bundled": true, "dev": true }, "copy-descriptor": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "bundled": true, "dev": true }, "core-js": { "version": "2.5.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", - "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ==", + "bundled": true, "dev": true }, "cross-spawn": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "bundled": true, "dev": true, "requires": { "lru-cache": "^4.0.1", @@ -1289,8 +1235,7 @@ }, "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "bundled": true, "dev": true, "requires": { "ms": "2.0.0" @@ -1298,26 +1243,22 @@ }, "debug-log": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "bundled": true, "dev": true }, "decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "bundled": true, "dev": true }, "decode-uri-component": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "bundled": true, "dev": true }, "default-require-extensions": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "bundled": true, "dev": true, "requires": { "strip-bom": "^2.0.0" @@ -1325,8 +1266,7 @@ }, "define-property": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "bundled": true, "dev": true, "requires": { "is-descriptor": "^1.0.2", @@ -1335,8 +1275,7 @@ "dependencies": { "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "bundled": true, "dev": true, "requires": { "kind-of": "^6.0.0" @@ -1344,8 +1283,7 @@ }, "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "bundled": true, "dev": true, "requires": { "kind-of": "^6.0.0" @@ -1353,8 +1291,7 @@ }, "is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "bundled": true, "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -1364,22 +1301,19 @@ }, "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "bundled": true, "dev": true }, "kind-of": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "bundled": true, "dev": true } } }, "detect-indent": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "bundled": true, "dev": true, "requires": { "repeating": "^2.0.0" @@ -1387,8 +1321,7 @@ }, "error-ex": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "bundled": true, "dev": true, "requires": { "is-arrayish": "^0.2.1" @@ -1396,20 +1329,17 @@ }, "escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "bundled": true, "dev": true }, "esutils": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "bundled": true, "dev": true }, "execa": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "bundled": true, "dev": true, "requires": { "cross-spawn": "^5.0.1", @@ -1423,8 +1353,7 @@ "dependencies": { "cross-spawn": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "bundled": true, "dev": true, "requires": { "lru-cache": "^4.0.1", @@ -1436,8 +1365,7 @@ }, "expand-brackets": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "bundled": true, "dev": true, "requires": { "debug": "^2.3.3", @@ -1451,8 +1379,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "bundled": true, "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -1460,8 +1387,7 @@ }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "bundled": true, "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -1471,8 +1397,7 @@ }, "extend-shallow": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "bundled": true, "dev": true, "requires": { "assign-symbols": "^1.0.0", @@ -1481,8 +1406,7 @@ "dependencies": { "is-extendable": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "bundled": true, "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -1492,8 +1416,7 @@ }, "extglob": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "bundled": true, "dev": true, "requires": { "array-unique": "^0.3.2", @@ -1508,8 +1431,7 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "bundled": true, "dev": true, "requires": { "is-descriptor": "^1.0.0" @@ -1517,8 +1439,7 @@ }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "bundled": true, "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -1526,8 +1447,7 @@ }, "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "bundled": true, "dev": true, "requires": { "kind-of": "^6.0.0" @@ -1535,8 +1455,7 @@ }, "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "bundled": true, "dev": true, "requires": { "kind-of": "^6.0.0" @@ -1544,8 +1463,7 @@ }, "is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "bundled": true, "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -1555,16 +1473,14 @@ }, "kind-of": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "bundled": true, "dev": true } } }, "fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "bundled": true, "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -1575,8 +1491,7 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "bundled": true, "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -1586,8 +1501,7 @@ }, "find-cache-dir": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "bundled": true, "dev": true, "requires": { "commondir": "^1.0.1", @@ -1597,8 +1511,7 @@ }, "find-up": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "bundled": true, "dev": true, "requires": { "locate-path": "^2.0.0" @@ -1606,14 +1519,12 @@ }, "for-in": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "bundled": true, "dev": true }, "foreground-child": { "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "bundled": true, "dev": true, "requires": { "cross-spawn": "^4", @@ -1622,8 +1533,7 @@ }, "fragment-cache": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "bundled": true, "dev": true, "requires": { "map-cache": "^0.2.2" @@ -1631,32 +1541,27 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "bundled": true, "dev": true }, "get-caller-file": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "bundled": true, "dev": true }, "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "bundled": true, "dev": true }, "get-value": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "bundled": true, "dev": true }, "glob": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "bundled": true, "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -1669,20 +1574,17 @@ }, "globals": { "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "bundled": true, "dev": true }, "graceful-fs": { "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "bundled": true, "dev": true }, "handlebars": { "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "bundled": true, "dev": true, "requires": { "async": "^1.4.0", @@ -1693,8 +1595,7 @@ "dependencies": { "source-map": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "bundled": true, "dev": true, "requires": { "amdefine": ">=0.0.4" @@ -1704,8 +1605,7 @@ }, "has-ansi": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "bundled": true, "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -1713,14 +1613,12 @@ }, "has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "bundled": true, "dev": true }, "has-value": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "bundled": true, "dev": true, "requires": { "get-value": "^2.0.6", @@ -1730,16 +1628,14 @@ "dependencies": { "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "bundled": true, "dev": true } } }, "has-values": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "bundled": true, "dev": true, "requires": { "is-number": "^3.0.0", @@ -1748,8 +1644,7 @@ "dependencies": { "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "bundled": true, "dev": true, "requires": { "kind-of": "^3.0.2" @@ -1757,8 +1652,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "bundled": true, "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -1768,8 +1662,7 @@ }, "kind-of": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "bundled": true, "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -1779,20 +1672,17 @@ }, "hosted-git-info": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "bundled": true, "dev": true }, "imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "bundled": true, "dev": true }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "bundled": true, "dev": true, "requires": { "once": "^1.3.0", @@ -1801,14 +1691,12 @@ }, "inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "bundled": true, "dev": true }, "invariant": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "bundled": true, "dev": true, "requires": { "loose-envify": "^1.0.0" @@ -1816,14 +1704,12 @@ }, "invert-kv": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "bundled": true, "dev": true }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "bundled": true, "dev": true, "requires": { "kind-of": "^3.0.2" @@ -1831,20 +1717,17 @@ }, "is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "bundled": true, "dev": true }, "is-buffer": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "bundled": true, "dev": true }, "is-builtin-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "bundled": true, "dev": true, "requires": { "builtin-modules": "^1.0.0" @@ -1852,8 +1735,7 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "bundled": true, "dev": true, "requires": { "kind-of": "^3.0.2" @@ -1861,8 +1743,7 @@ }, "is-descriptor": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "bundled": true, "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", @@ -1872,22 +1753,19 @@ "dependencies": { "kind-of": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "bundled": true, "dev": true } } }, "is-extendable": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "bundled": true, "dev": true }, "is-finite": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "bundled": true, "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -1895,14 +1773,12 @@ }, "is-fullwidth-code-point": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "bundled": true, "dev": true }, "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "bundled": true, "dev": true, "requires": { "kind-of": "^3.0.2" @@ -1910,8 +1786,7 @@ }, "is-odd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "bundled": true, "dev": true, "requires": { "is-number": "^4.0.0" @@ -1919,16 +1794,14 @@ "dependencies": { "is-number": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "bundled": true, "dev": true } } }, "is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "bundled": true, "dev": true, "requires": { "isobject": "^3.0.1" @@ -1936,58 +1809,49 @@ "dependencies": { "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "bundled": true, "dev": true } } }, "is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "bundled": true, "dev": true }, "is-utf8": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "bundled": true, "dev": true }, "is-windows": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "bundled": true, "dev": true }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "bundled": true, "dev": true }, "isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "bundled": true, "dev": true }, "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "bundled": true, "dev": true }, "istanbul-lib-coverage": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", - "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", + "bundled": true, "dev": true }, "istanbul-lib-hook": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", - "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", + "bundled": true, "dev": true, "requires": { "append-transform": "^0.4.0" @@ -1995,8 +1859,7 @@ }, "istanbul-lib-instrument": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", - "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", + "bundled": true, "dev": true, "requires": { "babel-generator": "^6.18.0", @@ -2010,8 +1873,7 @@ }, "istanbul-lib-report": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.3.tgz", - "integrity": "sha512-D4jVbMDtT2dPmloPJS/rmeP626N5Pr3Rp+SovrPn1+zPChGHcggd/0sL29jnbm4oK9W0wHjCRsdch9oLd7cm6g==", + "bundled": true, "dev": true, "requires": { "istanbul-lib-coverage": "^1.1.2", @@ -2022,8 +1884,7 @@ "dependencies": { "supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "bundled": true, "dev": true, "requires": { "has-flag": "^1.0.0" @@ -2033,8 +1894,7 @@ }, "istanbul-lib-source-maps": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", - "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", + "bundled": true, "dev": true, "requires": { "debug": "^3.1.0", @@ -2046,8 +1906,7 @@ "dependencies": { "debug": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "bundled": true, "dev": true, "requires": { "ms": "2.0.0" @@ -2057,8 +1916,7 @@ }, "istanbul-reports": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.4.0.tgz", - "integrity": "sha512-OPzVo1fPZ2H+owr8q/LYKLD+vquv9Pj4F+dj808MdHbuQLD7S4ACRjcX+0Tne5Vxt2lxXvdZaL7v+FOOAV281w==", + "bundled": true, "dev": true, "requires": { "handlebars": "^4.0.3" @@ -2066,20 +1924,17 @@ }, "js-tokens": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "bundled": true, "dev": true }, "jsesc": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "bundled": true, "dev": true }, "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "bundled": true, "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -2087,15 +1942,13 @@ }, "lazy-cache": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "bundled": true, "dev": true, "optional": true }, "lcid": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "bundled": true, "dev": true, "requires": { "invert-kv": "^1.0.0" @@ -2103,8 +1956,7 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "bundled": true, "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -2116,8 +1968,7 @@ }, "locate-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "bundled": true, "dev": true, "requires": { "p-locate": "^2.0.0", @@ -2126,28 +1977,24 @@ "dependencies": { "path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "bundled": true, "dev": true } } }, "lodash": { "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "bundled": true, "dev": true }, "longest": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "bundled": true, "dev": true }, "loose-envify": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "bundled": true, "dev": true, "requires": { "js-tokens": "^3.0.0" @@ -2155,8 +2002,7 @@ }, "lru-cache": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "bundled": true, "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -2165,14 +2011,12 @@ }, "map-cache": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "bundled": true, "dev": true }, "map-visit": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "bundled": true, "dev": true, "requires": { "object-visit": "^1.0.0" @@ -2180,8 +2024,7 @@ }, "md5-hex": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", + "bundled": true, "dev": true, "requires": { "md5-o-matic": "^0.1.1" @@ -2189,14 +2032,12 @@ }, "md5-o-matic": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", + "bundled": true, "dev": true }, "mem": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "bundled": true, "dev": true, "requires": { "mimic-fn": "^1.0.0" @@ -2204,8 +2045,7 @@ }, "merge-source-map": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "bundled": true, "dev": true, "requires": { "source-map": "^0.6.1" @@ -2213,16 +2053,14 @@ "dependencies": { "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "bundled": true, "dev": true } } }, "micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "bundled": true, "dev": true, "requires": { "arr-diff": "^4.0.0", @@ -2242,22 +2080,19 @@ "dependencies": { "kind-of": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "bundled": true, "dev": true } } }, "mimic-fn": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "bundled": true, "dev": true }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "bundled": true, "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -2265,14 +2100,12 @@ }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "bundled": true, "dev": true }, "mixin-deep": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "bundled": true, "dev": true, "requires": { "for-in": "^1.0.2", @@ -2281,8 +2114,7 @@ "dependencies": { "is-extendable": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "bundled": true, "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -2292,8 +2124,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "bundled": true, "dev": true, "requires": { "minimist": "0.0.8" @@ -2301,14 +2132,12 @@ }, "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "bundled": true, "dev": true }, "nanomatch": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "bundled": true, "dev": true, "requires": { "arr-diff": "^4.0.0", @@ -2327,28 +2156,24 @@ "dependencies": { "arr-diff": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "bundled": true, "dev": true }, "array-unique": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "bundled": true, "dev": true }, "kind-of": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "bundled": true, "dev": true } } }, "normalize-package-data": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "bundled": true, "dev": true, "requires": { "hosted-git-info": "^2.1.4", @@ -2359,8 +2184,7 @@ }, "npm-run-path": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "bundled": true, "dev": true, "requires": { "path-key": "^2.0.0" @@ -2368,20 +2192,17 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "bundled": true, "dev": true }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "bundled": true, "dev": true }, "object-copy": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "bundled": true, "dev": true, "requires": { "copy-descriptor": "^0.1.0", @@ -2391,8 +2212,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "bundled": true, "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -2402,8 +2222,7 @@ }, "object-visit": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "bundled": true, "dev": true, "requires": { "isobject": "^3.0.0" @@ -2411,16 +2230,14 @@ "dependencies": { "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "bundled": true, "dev": true } } }, "object.pick": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "bundled": true, "dev": true, "requires": { "isobject": "^3.0.1" @@ -2428,16 +2245,14 @@ "dependencies": { "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "bundled": true, "dev": true } } }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "bundled": true, "dev": true, "requires": { "wrappy": "1" @@ -2445,8 +2260,7 @@ }, "optimist": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "bundled": true, "dev": true, "requires": { "minimist": "~0.0.1", @@ -2455,14 +2269,12 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "bundled": true, "dev": true }, "os-locale": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "bundled": true, "dev": true, "requires": { "execa": "^0.7.0", @@ -2472,14 +2284,12 @@ }, "p-finally": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "bundled": true, "dev": true }, "p-limit": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "bundled": true, "dev": true, "requires": { "p-try": "^1.0.0" @@ -2487,8 +2297,7 @@ }, "p-locate": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "bundled": true, "dev": true, "requires": { "p-limit": "^1.1.0" @@ -2496,14 +2305,12 @@ }, "p-try": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "bundled": true, "dev": true }, "parse-json": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "bundled": true, "dev": true, "requires": { "error-ex": "^1.2.0" @@ -2511,14 +2318,12 @@ }, "pascalcase": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "bundled": true, "dev": true }, "path-exists": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "bundled": true, "dev": true, "requires": { "pinkie-promise": "^2.0.0" @@ -2526,26 +2331,22 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "bundled": true, "dev": true }, "path-key": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "bundled": true, "dev": true }, "path-parse": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "bundled": true, "dev": true }, "path-type": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "bundled": true, "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -2555,20 +2356,17 @@ }, "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "bundled": true, "dev": true }, "pinkie": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "bundled": true, "dev": true }, "pinkie-promise": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "bundled": true, "dev": true, "requires": { "pinkie": "^2.0.0" @@ -2576,8 +2374,7 @@ }, "pkg-dir": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "bundled": true, "dev": true, "requires": { "find-up": "^1.0.0" @@ -2585,8 +2382,7 @@ "dependencies": { "find-up": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "bundled": true, "dev": true, "requires": { "path-exists": "^2.0.0", @@ -2597,20 +2393,17 @@ }, "posix-character-classes": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "bundled": true, "dev": true }, "pseudomap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "bundled": true, "dev": true }, "read-pkg": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "bundled": true, "dev": true, "requires": { "load-json-file": "^1.0.0", @@ -2620,8 +2413,7 @@ }, "read-pkg-up": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "bundled": true, "dev": true, "requires": { "find-up": "^1.0.0", @@ -2630,8 +2422,7 @@ "dependencies": { "find-up": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "bundled": true, "dev": true, "requires": { "path-exists": "^2.0.0", @@ -2642,14 +2433,12 @@ }, "regenerator-runtime": { "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "bundled": true, "dev": true }, "regex-not": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "bundled": true, "dev": true, "requires": { "extend-shallow": "^3.0.2", @@ -2658,20 +2447,17 @@ }, "repeat-element": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "bundled": true, "dev": true }, "repeat-string": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "bundled": true, "dev": true }, "repeating": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "bundled": true, "dev": true, "requires": { "is-finite": "^1.0.0" @@ -2679,38 +2465,32 @@ }, "require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "bundled": true, "dev": true }, "require-main-filename": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "bundled": true, "dev": true }, "resolve-from": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "bundled": true, "dev": true }, "resolve-url": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "bundled": true, "dev": true }, "ret": { "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "bundled": true, "dev": true }, "right-align": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2719,8 +2499,7 @@ }, "rimraf": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "bundled": true, "dev": true, "requires": { "glob": "^7.0.5" @@ -2728,8 +2507,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "bundled": true, "dev": true, "requires": { "ret": "~0.1.10" @@ -2737,20 +2515,17 @@ }, "semver": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "bundled": true, "dev": true }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "bundled": true, "dev": true }, "set-value": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "bundled": true, "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -2761,8 +2536,7 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "bundled": true, "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -2772,8 +2546,7 @@ }, "shebang-command": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "bundled": true, "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -2781,26 +2554,22 @@ }, "shebang-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "bundled": true, "dev": true }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "bundled": true, "dev": true }, "slide": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "bundled": true, "dev": true }, "snapdragon": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "bundled": true, "dev": true, "requires": { "base": "^0.11.1", @@ -2815,8 +2584,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "bundled": true, "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -2824,8 +2592,7 @@ }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "bundled": true, "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -2835,8 +2602,7 @@ }, "snapdragon-node": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "bundled": true, "dev": true, "requires": { "define-property": "^1.0.0", @@ -2846,8 +2612,7 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "bundled": true, "dev": true, "requires": { "is-descriptor": "^1.0.0" @@ -2855,8 +2620,7 @@ }, "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "bundled": true, "dev": true, "requires": { "kind-of": "^6.0.0" @@ -2864,8 +2628,7 @@ }, "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "bundled": true, "dev": true, "requires": { "kind-of": "^6.0.0" @@ -2873,8 +2636,7 @@ }, "is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "bundled": true, "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -2884,22 +2646,19 @@ }, "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "bundled": true, "dev": true }, "kind-of": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "bundled": true, "dev": true } } }, "snapdragon-util": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "bundled": true, "dev": true, "requires": { "kind-of": "^3.2.0" @@ -2907,14 +2666,12 @@ }, "source-map": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "bundled": true, "dev": true }, "source-map-resolve": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "bundled": true, "dev": true, "requires": { "atob": "^2.0.0", @@ -2926,14 +2683,12 @@ }, "source-map-url": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "bundled": true, "dev": true }, "spawn-wrap": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "bundled": true, "dev": true, "requires": { "foreground-child": "^1.5.6", @@ -2946,8 +2701,7 @@ }, "spdx-correct": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "bundled": true, "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -2956,14 +2710,12 @@ }, "spdx-exceptions": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "bundled": true, "dev": true }, "spdx-expression-parse": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "bundled": true, "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -2972,14 +2724,12 @@ }, "spdx-license-ids": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "bundled": true, "dev": true }, "split-string": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "bundled": true, "dev": true, "requires": { "extend-shallow": "^3.0.0" @@ -2987,8 +2737,7 @@ }, "static-extend": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "bundled": true, "dev": true, "requires": { "define-property": "^0.2.5", @@ -2997,8 +2746,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "bundled": true, "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -3008,8 +2756,7 @@ }, "string-width": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "bundled": true, "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -3018,14 +2765,12 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "bundled": true, "dev": true }, "strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "bundled": true, "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -3035,8 +2780,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "bundled": true, "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -3044,8 +2788,7 @@ }, "strip-bom": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "bundled": true, "dev": true, "requires": { "is-utf8": "^0.2.0" @@ -3053,20 +2796,17 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "bundled": true, "dev": true }, "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "bundled": true, "dev": true }, "test-exclude": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", - "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", + "bundled": true, "dev": true, "requires": { "arrify": "^1.0.1", @@ -3078,20 +2818,17 @@ "dependencies": { "arr-diff": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "bundled": true, "dev": true }, "array-unique": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "bundled": true, "dev": true }, "braces": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "bundled": true, "dev": true, "requires": { "arr-flatten": "^1.1.0", @@ -3108,8 +2845,7 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "bundled": true, "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -3119,8 +2855,7 @@ }, "expand-brackets": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "bundled": true, "dev": true, "requires": { "debug": "^2.3.3", @@ -3134,8 +2869,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "bundled": true, "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -3143,8 +2877,7 @@ }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "bundled": true, "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -3152,8 +2885,7 @@ }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "bundled": true, "dev": true, "requires": { "kind-of": "^3.0.2" @@ -3161,8 +2893,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "bundled": true, "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -3172,8 +2903,7 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "bundled": true, "dev": true, "requires": { "kind-of": "^3.0.2" @@ -3181,8 +2911,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "bundled": true, "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -3192,8 +2921,7 @@ }, "is-descriptor": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "bundled": true, "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", @@ -3203,16 +2931,14 @@ }, "kind-of": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "bundled": true, "dev": true } } }, "extglob": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "bundled": true, "dev": true, "requires": { "array-unique": "^0.3.2", @@ -3227,8 +2953,7 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "bundled": true, "dev": true, "requires": { "is-descriptor": "^1.0.0" @@ -3236,8 +2961,7 @@ }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "bundled": true, "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -3247,8 +2971,7 @@ }, "fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "bundled": true, "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -3259,8 +2982,7 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "bundled": true, "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -3270,8 +2992,7 @@ }, "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "bundled": true, "dev": true, "requires": { "kind-of": "^6.0.0" @@ -3279,8 +3000,7 @@ }, "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "bundled": true, "dev": true, "requires": { "kind-of": "^6.0.0" @@ -3288,8 +3008,7 @@ }, "is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "bundled": true, "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -3299,8 +3018,7 @@ }, "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "bundled": true, "dev": true, "requires": { "kind-of": "^3.0.2" @@ -3308,8 +3026,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "bundled": true, "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -3319,20 +3036,17 @@ }, "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "bundled": true, "dev": true }, "kind-of": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "bundled": true, "dev": true }, "micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "bundled": true, "dev": true, "requires": { "arr-diff": "^4.0.0", @@ -3354,14 +3068,12 @@ }, "to-fast-properties": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "bundled": true, "dev": true }, "to-object-path": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "bundled": true, "dev": true, "requires": { "kind-of": "^3.0.2" @@ -3369,8 +3081,7 @@ }, "to-regex": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "bundled": true, "dev": true, "requires": { "define-property": "^2.0.2", @@ -3381,8 +3092,7 @@ }, "to-regex-range": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "bundled": true, "dev": true, "requires": { "is-number": "^3.0.0", @@ -3391,8 +3101,7 @@ "dependencies": { "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "bundled": true, "dev": true, "requires": { "kind-of": "^3.0.2" @@ -3402,14 +3111,12 @@ }, "trim-right": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "bundled": true, "dev": true }, "uglify-js": { "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -3420,8 +3127,7 @@ "dependencies": { "yargs": { "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -3435,15 +3141,13 @@ }, "uglify-to-browserify": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "bundled": true, "dev": true, "optional": true }, "union-value": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "bundled": true, "dev": true, "requires": { "arr-union": "^3.1.0", @@ -3454,8 +3158,7 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "bundled": true, "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -3463,8 +3166,7 @@ }, "set-value": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "bundled": true, "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -3477,8 +3179,7 @@ }, "unset-value": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "bundled": true, "dev": true, "requires": { "has-value": "^0.3.1", @@ -3487,8 +3188,7 @@ "dependencies": { "has-value": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "bundled": true, "dev": true, "requires": { "get-value": "^2.0.3", @@ -3498,8 +3198,7 @@ "dependencies": { "isobject": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "bundled": true, "dev": true, "requires": { "isarray": "1.0.0" @@ -3509,28 +3208,24 @@ }, "has-values": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "bundled": true, "dev": true }, "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "bundled": true, "dev": true } } }, "urix": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "bundled": true, "dev": true }, "use": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "bundled": true, "dev": true, "requires": { "kind-of": "^6.0.2" @@ -3538,16 +3233,14 @@ "dependencies": { "kind-of": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "bundled": true, "dev": true } } }, "validate-npm-package-license": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "bundled": true, "dev": true, "requires": { "spdx-correct": "^3.0.0", @@ -3556,8 +3249,7 @@ }, "which": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "bundled": true, "dev": true, "requires": { "isexe": "^2.0.0" @@ -3565,27 +3257,23 @@ }, "which-module": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "bundled": true, "dev": true }, "window-size": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "bundled": true, "dev": true, "optional": true }, "wordwrap": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "bundled": true, "dev": true }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "bundled": true, "dev": true, "requires": { "string-width": "^1.0.1", @@ -3594,8 +3282,7 @@ "dependencies": { "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "bundled": true, "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -3603,8 +3290,7 @@ }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "bundled": true, "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -3616,14 +3302,12 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "bundled": true, "dev": true }, "write-file-atomic": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "bundled": true, "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -3633,20 +3317,17 @@ }, "y18n": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "bundled": true, "dev": true }, "yallist": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "bundled": true, "dev": true }, "yargs": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "bundled": true, "dev": true, "requires": { "cliui": "^4.0.0", @@ -3665,20 +3346,17 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "bundled": true, "dev": true }, "camelcase": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "bundled": true, "dev": true }, "cliui": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "bundled": true, "dev": true, "requires": { "string-width": "^2.1.1", @@ -3688,8 +3366,7 @@ }, "strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "bundled": true, "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -3697,8 +3374,7 @@ }, "yargs-parser": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "bundled": true, "dev": true, "requires": { "camelcase": "^4.1.0" @@ -3708,8 +3384,7 @@ }, "yargs-parser": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "bundled": true, "dev": true, "requires": { "camelcase": "^4.1.0" @@ -3717,8 +3392,7 @@ "dependencies": { "camelcase": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "bundled": true, "dev": true } } @@ -4124,9 +3798,9 @@ "dev": true }, "tslint": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.10.0.tgz", - "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", + "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", "dev": true, "requires": { "babel-code-frame": "^6.22.0", @@ -4140,7 +3814,7 @@ "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", - "tsutils": "^2.12.1" + "tsutils": "^2.27.2" }, "dependencies": { "ansi-styles": { @@ -4181,9 +3855,9 @@ "dev": true }, "tsutils": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.2.tgz", - "integrity": "sha512-qf6rmT84TFMuxAKez2pIfR8UCai49iQsfB7YWVjV1bKpy/d0PWT5rEOSM6La9PiHZ0k1RRZQiwVdVJfQ3BPHgg==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", + "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", "dev": true, "requires": { "tslib": "^1.8.1" diff --git a/package.json b/package.json index 3cd12bfc6..c4f9a5398 100644 --- a/package.json +++ b/package.json @@ -10,12 +10,12 @@ "transpiler" ], "scripts": { - "build": "tsc -p tsconfig.json", - "test": "tslint -p . && ts-node ./test/runner.ts", - "test-threaded": "tslint -p . && ts-node ./test/threaded_runner.ts", - "coverage-threaded": "nyc npm run test-threaded && nyc report --reporter=text-lcov > coverage.lcov", + "build": "tsc -p tsconfig.json && npm run build-lualib", + "build-lualib": "ts-node ./build_lualib.ts", + "test": "tslint -p . && tslint -c ./tslint.json src/lualib/*.ts && ts-node ./test/runner.ts", "coverage": "nyc npm test && nyc report --reporter=text-lcov > coverage.lcov", "coverage-html": "nyc npm test && nyc report --reporter=html", + "test-threaded": "tslint -p . && npm run build && ts-node ./test/threaded_runner.ts", "release-patch": "npm version patch", "release-minor": "npm version minor", "release-major": "npm version major", @@ -23,7 +23,7 @@ "postversion": "git push && git push --tags" }, "bin": { - "tstl": "./dist/Compiler.js" + "tstl": "./dist/index.js" }, "nyc": { "all": true, @@ -32,6 +32,9 @@ ], "include": [ "src/**/*" + ], + "exclude": [ + "src/lualib/*" ] }, "engines": { diff --git a/src/CommandLineParser.ts b/src/CommandLineParser.ts index 62a0b2138..c6dfb11fc 100644 --- a/src/CommandLineParser.ts +++ b/src/CommandLineParser.ts @@ -6,7 +6,7 @@ import * as yargs from "yargs"; export interface CompilerOptions extends ts.CompilerOptions { addHeader?: boolean; luaTarget?: string; - dontRequireLuaLib?: boolean; + luaLibImport?: string; } export interface ParsedCommandLine extends ts.ParsedCommandLine { @@ -18,16 +18,11 @@ export class CLIError extends Error { } const optionDeclarations: { [key: string]: yargs.Options } = { - addHeader: { - alias: ["ah", "header"], - default: true, - describe: "Specify if a header will be added to compiled files.", - type: "boolean", - }, - dontRequireLuaLib: { - default: false, - describe: "Dont require lua library that enables advanced Typescipt/JS functionality.", - type: "boolean", + luaLibImport: { + choices: ["inline", "require", "none"], + default: "inline", + describe: "Specifies how js standard features missing in lua are imported.", + type: "string", }, luaTarget: { alias: "lt", @@ -36,6 +31,11 @@ const optionDeclarations: { [key: string]: yargs.Options } = { describe: "Specify Lua target version.", type: "string", }, + noHeader: { + default: false, + describe: "Specify if a header will be added to compiled files.", + type: "boolean", + }, }; /** @@ -102,7 +102,7 @@ export function parseCommandLine(args: string[]): ParsedCommandLine { function addTSTLOptions(commandLine: ts.ParsedCommandLine, additionalArgs?: yargs.Arguments, - forceOverride?: boolean) { + forceOverride?: boolean): void { additionalArgs = additionalArgs ? additionalArgs : commandLine.raw; // Add compiler options that are ignored by TS parsers if (additionalArgs) { @@ -116,7 +116,10 @@ function addTSTLOptions(commandLine: ts.ParsedCommandLine, } /** Check the current state of the ParsedCommandLine for errors */ -function runDiagnostics(commandLine: ts.ParsedCommandLine) { +function runDiagnostics(commandLine: ts.ParsedCommandLine): void { + // Remove files that dont exist + commandLine.fileNames = commandLine.fileNames.filter(file => fs.existsSync(file) || fs.existsSync(file + ".ts")); + const tsInvalidCompilerOptionErrorCode = 5023; if (commandLine.errors.length !== 0) { // Generate a list of valid option names and aliases @@ -151,7 +154,7 @@ function runDiagnostics(commandLine: ts.ParsedCommandLine) { } /** Find configFile, function from ts api seems to be broken? */ -export function findConfigFile(commandLine: ts.ParsedCommandLine) { +export function findConfigFile(commandLine: ts.ParsedCommandLine): void { if (!commandLine.options.project) { throw new CLIError(`error no base path provided, could not find config.`); } diff --git a/src/Compiler.ts b/src/Compiler.ts index 081dc26c2..1afc69425 100644 --- a/src/Compiler.ts +++ b/src/Compiler.ts @@ -1,5 +1,3 @@ -#!/usr/bin/env node - import * as fs from "fs"; import * as path from "path"; import * as ts from "typescript"; @@ -9,10 +7,14 @@ import { LuaTranspiler51 } from "./targets/Transpiler.51"; import { LuaTranspiler52 } from "./targets/Transpiler.52"; import { LuaTranspiler53 } from "./targets/Transpiler.53"; import { LuaTranspilerJIT } from "./targets/Transpiler.JIT"; -import { LuaTarget, LuaTranspiler, TranspileError } from "./Transpiler"; -import { TSHelper as tsEx } from "./TSHelper"; +import { LuaLibImportKind, LuaTarget, LuaTranspiler, TranspileError } from "./Transpiler"; -export function compile(fileNames: string[], options: CompilerOptions): void { +export function compile(argv: string[]): void { + const commandLine = parseCommandLine(argv); + compileFilesWithOptions(commandLine.fileNames, commandLine.options); +} + +export function compileFilesWithOptions(fileNames: string[], options: CompilerOptions): void { if (!options.luaTarget) { options.luaTarget = LuaTarget.LuaJIT; } @@ -93,10 +95,12 @@ export function compile(fileNames: string[], options: CompilerOptions): void { }); // Copy lualib to target dir - fs.copyFileSync( - path.resolve(__dirname, "../dist/lualib/typescript.lua"), - path.join(options.outDir, "typescript_lualib.lua") - ); + if (options.luaLibImport === LuaLibImportKind.Require) { + fs.copyFileSync( + path.resolve(__dirname, "../dist/lualib/lualib_bundle.lua"), + path.join(options.outDir, "lualib_bundle.lua") + ); + } } export function createTranspiler(checker: ts.TypeChecker, @@ -123,11 +127,3 @@ export function createTranspiler(checker: ts.TypeChecker, return luaTargetTranspiler; } - -export function execCommandLine(argv?: string[]) { - argv = argv ? argv : process.argv.slice(2); - const commandLine = parseCommandLine(argv); - compile(commandLine.fileNames, commandLine.options); -} - -execCommandLine(); diff --git a/src/Index.ts b/src/Index.ts new file mode 100644 index 000000000..5055ec8aa --- /dev/null +++ b/src/Index.ts @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +import { compile } from "./Compiler"; + +compile(process.argv.slice(2)); diff --git a/src/TSHelper.ts b/src/TSHelper.ts index b817b59bc..607966c46 100644 --- a/src/TSHelper.ts +++ b/src/TSHelper.ts @@ -3,7 +3,7 @@ import * as ts from "typescript"; export class TSHelper { // Reverse lookup of enum key by value - public static enumName(needle, haystack) { + public static enumName(needle, haystack): string { for (const name in haystack) { if (haystack[name] === needle) { return name; @@ -13,7 +13,7 @@ export class TSHelper { } // Breaks down a mask into all flag names. - public static enumNames(mask, haystack) { + public static enumNames(mask, haystack): string[] { const result = []; for (const name in haystack) { if ((mask & haystack[name]) !== 0 && mask >= haystack[name]) { @@ -41,7 +41,7 @@ export class TSHelper { return undefined; } - public static isFileModule(sourceFile: ts.SourceFile) { + public static isFileModule(sourceFile: ts.SourceFile): boolean { if (sourceFile) { // Vanilla ts flags files as external module if they have an import or // export statement, we only check for export statements @@ -53,7 +53,7 @@ export class TSHelper { return false; } - public static isInDestructingAssignment(node: ts.Node) { + public static isInDestructingAssignment(node: ts.Node): boolean { return node.parent && ts.isVariableDeclaration(node.parent) && ts.isArrayBindingPattern(node.parent.name); } diff --git a/src/Transpiler.ts b/src/Transpiler.ts index 05c2d58a0..7320fe7d5 100644 --- a/src/Transpiler.ts +++ b/src/Transpiler.ts @@ -3,6 +3,7 @@ import * as ts from "typescript"; import { CompilerOptions } from "./CommandLineParser"; import { TSHelper as tsHelper } from "./TSHelper"; +import * as fs from "fs"; import * as path from "path"; /* tslint:disable */ @@ -24,13 +25,38 @@ export enum LuaTarget { LuaJIT = "JIT", } +export enum LuaLibFeature { + ArrayEvery = "ArrayEvery", + ArrayFilter = "ArrayFilter", + ArrayForEach = "ArrayForEach", + ArrayIndexOf = "ArrayIndexOf", + ArrayMap = "ArrayMap", + ArrayPush = "ArrayPush", + ArraySlice = "ArraySlice", + ArraySome = "ArraySome", + ArraySplice = "ArraySplice", + InstanceOf = "InstanceOf", + Map = "Map", + Set = "Set", + StringReplace = "StringReplace", + StringSplit = "StringSplit", + Ternary = "Ternary", +} + +export enum LuaLibImportKind { + Inline = "inline", + Require = "require", + None = "none", +} + interface ExportInfo { - name: string | ts.__String; + name: string; node: ts.Node; dummy: boolean; } export abstract class LuaTranspiler { + public static AvailableLuaTargets = [LuaTarget.LuaJIT, LuaTarget.Lua53]; public indent: string; @@ -46,6 +72,8 @@ export abstract class LuaTranspiler { public classStack: string[]; public exportStack: ExportInfo[][]; + public luaLibFeatureSet: Set; + constructor(checker: ts.TypeChecker, options: CompilerOptions, sourceFile: ts.SourceFile) { this.indent = ""; this.checker = checker; @@ -59,6 +87,7 @@ export abstract class LuaTranspiler { this.loopStack = []; this.classStack = []; this.exportStack = []; + this.luaLibFeatureSet = new Set(); } public pushIndent(): void { @@ -69,7 +98,7 @@ export abstract class LuaTranspiler { this.indent = this.indent.slice(4); } - public definitionName(name: string | ts.__String): string { + public definitionName(name: string): string { return this.namespace.concat(name as string).join("."); } @@ -78,11 +107,11 @@ export abstract class LuaTranspiler { "local " : ""; } - public pushExport(nameIn: string | ts.__String, nodeIn: ts.Node, dummyIn: boolean = false) { + public pushExport(nameIn: string, nodeIn: ts.Node, dummyIn: boolean = false): void { this.exportStack[this.exportStack.length - 1].push({name: nameIn, node: nodeIn, dummy: dummyIn}); } - public makeExport(name: string | ts.__String, node: ts.Node, dummy?: boolean): string { + public makeExport(name: string, node: ts.Node, dummy?: boolean): string { let result: string = ""; if (node && node.modifiers && this.isModule && @@ -110,18 +139,23 @@ export abstract class LuaTranspiler { return result; } - public getAbsouluteImportPath(relativePath: string) { + public importLuaLibFeature(feature: LuaLibFeature): void { + // TODO inline imported features in output i option set + this.luaLibFeatureSet.add(feature); + } + + public getAbsoluteImportPath(relativePath: string): string { if (relativePath.charAt(0) !== "." && this.options.baseUrl) { return path.resolve(this.options.baseUrl, relativePath); } return path.resolve(path.dirname(this.sourceFile.fileName), relativePath); } - public getImportPath(relativePath: string) { + public getImportPath(relativePath: string): string { // Calculate absolute path to import - const absolutePathToImport = this.getAbsouluteImportPath(relativePath); + const absolutePathToImport = this.getAbsoluteImportPath(relativePath); if (this.options.rootDir) { - // Calculate path realtive to project root + // Calculate path relative to project root // and replace path.sep with dots (lua doesn't know paths) const relativePathToRoot = this.pathToLuaRequirePath(absolutePathToImport.replace(this.options.rootDir, "").slice(1)); @@ -131,7 +165,7 @@ export abstract class LuaTranspiler { return `"${this.pathToLuaRequirePath(relativePath)}"`; } - public pathToLuaRequirePath(filePath: string) { + public pathToLuaRequirePath(filePath: string): string { return filePath.replace(new RegExp("\\\\|\/", "g"), "."); } @@ -143,9 +177,9 @@ export abstract class LuaTranspiler { "-- https://github.com/Perryvw/TypescriptToLua\n"; } let result = header; - if (!this.options.dontRequireLuaLib) { + if (this.options.luaLibImport === LuaLibImportKind.Require) { // require helper functions - result += `require("typescript_lualib")\n`; + result += `require("lualib_bundle")\n`; } if (this.isModule) { // Shadow exports if it already exists @@ -155,6 +189,17 @@ export abstract class LuaTranspiler { // Transpile content statements this.exportStack.push([]); this.sourceFile.statements.forEach(s => result += this.transpileNode(s)); + + // Inline lualib features + if (this.options.luaLibImport === LuaLibImportKind.Inline) { + result += "\n" + "-- Lua Library Imports\n"; + for (const feature of this.luaLibFeatureSet) { + const featureFile = path.resolve(__dirname, `../dist/lualib/${feature}.lua`); + result += fs.readFileSync(featureFile).toString() + "\n"; + } + } + + // Exports result += this.makeExports(); if (this.isModule) { @@ -232,6 +277,11 @@ export abstract class LuaTranspiler { } } + public transpileLuaLibFunction(func: LuaLibFeature, ...params: string[]): string { + this.importLuaLibFeature(func); + return `__TS__${func}(${params.join(", ")})`; + } + public transpileImport(node: ts.ImportDeclaration): string { const importPath = this.transpileExpression(node.moduleSpecifier); const importPathWithoutQuotes = importPath.replace(new RegExp("\"", "g"), ""); @@ -248,22 +298,24 @@ export abstract class LuaTranspiler { if (ts.isNamedImports(imports)) { const fileImportTable = path.basename(importPathWithoutQuotes) + this.importCount; const resolvedImportPath = this.getImportPath(importPathWithoutQuotes); + let result = `local ${fileImportTable} = require(${resolvedImportPath})\n`; this.importCount++; + imports.elements.forEach(element => { - const nameText = element.name.escapedText; + const nameText = this.transpileIdentifier(element.name); if (element.propertyName) { - result += - `local ${nameText} = ${fileImportTable}.${element.propertyName.escapedText}\n`; + const propertyText = this.transpileIdentifier(element.propertyName); + result += `local ${nameText} = ${fileImportTable}.${propertyText}\n`; } else { - result += - `local ${nameText} = ${fileImportTable}.${element.name.escapedText}\n`; + result += `local ${nameText} = ${fileImportTable}.${nameText}\n`; } }); + return result; } else if (ts.isNamespaceImport(imports)) { const resolvedImportPath = this.getImportPath(importPathWithoutQuotes); - return `local ${imports.name.escapedText} = require(${resolvedImportPath})\n`; + return `local ${this.transpileIdentifier(imports.name)} = require(${resolvedImportPath})\n`; } else { throw new TranspileError("Unsupported import type.", node); } @@ -306,7 +358,7 @@ export abstract class LuaTranspiler { const membersOnly = tsHelper.isCompileMembersOnlyEnum(type, this.checker); if (!membersOnly) { - const name = node.name.escapedText; + const name = this.transpileIdentifier(node.name); result += this.indent + this.accessPrefix(node) + `${name}={}\n`; this.pushExport(name, node); } @@ -327,11 +379,11 @@ export abstract class LuaTranspiler { } if (membersOnly) { - const defName = this.definitionName((member.name as ts.Identifier).escapedText); + const defName = this.definitionName(this.transpileIdentifier(member.name as ts.Identifier)); result += this.indent + `${defName}=${val}\n`; } else { const defName = this.definitionName( - `${node.name.escapedText}.${(member.name as ts.Identifier).escapedText}` + `${this.transpileIdentifier(node.name)}.${this.transpileIdentifier((member.name as ts.Identifier))}` ); result += this.indent + `${defName}=${val}\n`; } @@ -439,7 +491,6 @@ export abstract class LuaTranspiler { public transpileForOf(node: ts.ForOfStatement): string { // Get variable identifier const variable = (node.initializer as ts.VariableDeclarationList).declarations[0]; - const identifier = variable.name as ts.Identifier; // Transpile expression const expression = this.transpileExpression(node.expression); @@ -449,7 +500,15 @@ export abstract class LuaTranspiler { const pairs = isArray ? "ipairs" : "pairs"; // Make header - let result = this.indent + `for _, ${identifier.escapedText} in ${pairs}(${expression}) do\n`; + let result = ""; + if (ts.isIdentifier(variable.name)) { + result = this.indent + `for _, ${this.transpileIdentifier(variable.name)} in ${pairs}(${expression}) do\n`; + } else if (ts.isArrayBindingPattern(variable.name)) { + const valueVar = "__forOfValue" + this.genVarCounter; + result = this.indent + `for _, ${valueVar} in ${pairs}(${expression}) do\n`; + const declaration = ts.createVariableDeclaration(variable.name, undefined, ts.createIdentifier(valueVar)); + result += this.indent + this.transpileVariableDeclaration(declaration); + } // For body this.pushIndent(); @@ -472,7 +531,7 @@ export abstract class LuaTranspiler { } // Make header - let result = this.indent + `for ${identifier.escapedText}, _ in pairs(${expression}) do\n`; + let result = this.indent + `for ${this.transpileIdentifier(identifier)}, _ in pairs(${expression}) do\n`; // For body this.pushIndent(); @@ -568,7 +627,7 @@ export abstract class LuaTranspiler { tryFunc += "end"; let catchFunc = "function(e)\nend"; if (node.catchClause && node.catchClause.variableDeclaration) { - const variableName = (node.catchClause.variableDeclaration.name as ts.Identifier).escapedText; + const variableName = this.transpileIdentifier(node.catchClause.variableDeclaration.name as ts.Identifier); catchFunc = this.indent + `function(${variableName})\n`; this.pushIndent(); catchFunc += this.transpileBlock(node.catchClause.block); @@ -639,7 +698,7 @@ export abstract class LuaTranspiler { return "nil"; } // Otherwise simply return the name - return (node as ts.Identifier).text; + return this.transpileIdentifier(node as ts.Identifier); case ts.SyntaxKind.StringLiteral: case ts.SyntaxKind.NoSubstitutionTemplateLiteral: const text = (node as ts.StringLiteral).text; @@ -686,6 +745,8 @@ export abstract class LuaTranspiler { return this.transpileExpression((node as ts.AsExpression).expression); case ts.SyntaxKind.TypeOfExpression: return this.transpileTypeOfExpression(node as ts.TypeOfExpression); + case ts.SyntaxKind.EmptyStatement: + return ""; default: throw new TranspileError( "Unsupported expression kind: " + tsHelper.enumName(node.kind, ts.SyntaxKind), @@ -788,7 +849,7 @@ export abstract class LuaTranspiler { result = `${rhs}[${lhs}]~=nil`; break; case ts.SyntaxKind.InstanceOfKeyword: - result = `TS_instanceof(${lhs}, ${rhs})`; + result = this.transpileLuaLibFunction(LuaLibFeature.InstanceOf, lhs, rhs); break; default: throw new TranspileError( @@ -814,7 +875,7 @@ export abstract class LuaTranspiler { throw new TranspileError(`Bit operations are not supported in Lua ${this.options.target}`, node); } - public transpileTemplateExpression(node: ts.TemplateExpression) { + public transpileTemplateExpression(node: ts.TemplateExpression): string { const parts = [`"${node.head.text}"`]; node.templateSpans.forEach(span => { const expr = this.transpileExpression(span.expression, true); @@ -832,7 +893,8 @@ export abstract class LuaTranspiler { const val1 = this.transpileExpression(node.whenTrue); const val2 = this.transpileExpression(node.whenFalse); - return `TS_ITE(${condition},function() return ${val1} end,function() return ${val2} end)`; + return this.transpileLuaLibFunction(LuaLibFeature.Ternary, condition, + `function() return ${val1} end`, `function() return ${val2} end`); } public transpilePostfixUnaryExpression(node: ts.PostfixUnaryExpression): string { @@ -901,7 +963,7 @@ export abstract class LuaTranspiler { return isTupleReturn && !isInDestructingAssignment ? `({ ${callPath}(${params}) })` : `${callPath}(${params})`; } - public transpilePropertyCall(node: ts.CallExpression) { + public transpilePropertyCall(node: ts.CallExpression): string { let params; let callPath; @@ -944,9 +1006,10 @@ export abstract class LuaTranspiler { params = this.transpileArguments(node.arguments); return `${callPath}(${params})`; } else { - // Replace last . with : here + // Replace last . with : here + const name = this.transpileIdentifier(node.expression.name); callPath = - `${this.transpileExpression(node.expression.expression)}:${node.expression.name.escapedText}`; + `${this.transpileExpression(node.expression.expression)}:${name}`; params = this.transpileArguments(node.arguments); return `${callPath}(${params})`; } @@ -956,15 +1019,24 @@ export abstract class LuaTranspiler { const expression = node.expression as ts.PropertyAccessExpression; const params = this.transpileArguments(node.arguments); const caller = this.transpileExpression(expression.expression); - switch (expression.name.escapedText) { + const expressionName = this.transpileIdentifier(expression.name); + switch (expressionName) { case "replace": - return `TS_replace(${caller},${params})`; + return this.transpileLuaLibFunction(LuaLibFeature.StringReplace, caller, params); case "indexOf": if (node.arguments.length === 1) { return `(string.find(${caller},${params},1,true) or 0)-1`; } else { return `(string.find(${caller},${params}+1,true) or 0)-1`; } + case "substr": + if (node.arguments.length === 1) { + return `string.sub(${caller},${params}+1)`; + } else { + const arg1 = this.transpileExpression(node.arguments[0]); + const arg2 = this.transpileExpression(node.arguments[1]); + return `string.sub(${caller},${arg1}+1,${arg1}+${arg2})`; + } case "substring": if (node.arguments.length === 1) { return `string.sub(${caller},${params}+1)`; @@ -978,11 +1050,11 @@ export abstract class LuaTranspiler { case "toUpperCase": return `string.upper(${caller})`; case "split": - return `TS_split(${caller},${params})`; + return this.transpileLuaLibFunction(LuaLibFeature.StringSplit, caller, params); case "charAt": return `string.sub(${caller},${params}+1,${params}+1)`; default: - throw new TranspileError("Unsupported string function: " + expression.name.escapedText, node); + throw new TranspileError("Unsupported string function: " + expressionName, node); } } @@ -995,11 +1067,12 @@ export abstract class LuaTranspiler { // Transpile a String._ property public transpileStringExpression(identifier: ts.Identifier): string { const translation = this.getValidStringProperties(); + const identifierString = this.transpileIdentifier(identifier); - if (translation[identifier.escapedText as string]) { - return `${translation[identifier.escapedText as string]}`; + if (translation[identifierString]) { + return `${translation[identifierString]}`; } else { - throw new TranspileError(`Unsupported string property ${identifier.escapedText}, ` + + throw new TranspileError(`Unsupported string property ${identifierString}, ` + `is not supported in Lua ${this.options.luaTarget}.`, identifier); } @@ -1009,34 +1082,35 @@ export abstract class LuaTranspiler { const expression = node.expression as ts.PropertyAccessExpression; const params = this.transpileArguments(node.arguments); const caller = this.transpileExpression(expression.expression); - switch (expression.name.escapedText) { + const expressionName = this.transpileIdentifier(expression.name); + switch (expressionName) { case "push": - return `TS_push(${caller}, ${params})`; + return this.transpileLuaLibFunction(LuaLibFeature.ArrayPush, caller, params); case "forEach": - return `TS_forEach(${caller}, ${params})`; + return this.transpileLuaLibFunction(LuaLibFeature.ArrayForEach, caller, params); case "indexOf": - return `TS_indexOf(${caller}, ${params})`; + return this.transpileLuaLibFunction(LuaLibFeature.ArrayIndexOf, caller, params); case "map": - return `TS_map(${caller}, ${params})`; + return this.transpileLuaLibFunction(LuaLibFeature.ArrayMap, caller, params); case "filter": - return `TS_filter(${caller}, ${params})`; + return this.transpileLuaLibFunction(LuaLibFeature.ArrayFilter, caller, params); case "some": - return `TS_some(${caller}, ${params})`; + return this.transpileLuaLibFunction(LuaLibFeature.ArraySome, caller, params); case "every": - return `TS_every(${caller}, ${params})`; + return this.transpileLuaLibFunction(LuaLibFeature.ArrayEvery, caller, params); case "slice": - return `TS_slice(${caller}, ${params})`; + return this.transpileLuaLibFunction(LuaLibFeature.ArraySlice, caller, params); case "splice": - return `TS_splice(${caller}, ${params})`; + return this.transpileLuaLibFunction(LuaLibFeature.ArraySplice, caller, params); case "join": if (node.arguments.length === 0) { - // if seperator is omitted default seperator is "," + // if separator is omitted default separator is "," return `table.concat(${caller}, ",")`; } else { return `table.concat(${caller}, ${params})`; } default: - throw new TranspileError("Unsupported array function: " + expression.name.escapedText, node); + throw new TranspileError("Unsupported array function: " + expressionName, node); } } @@ -1078,7 +1152,7 @@ export abstract class LuaTranspiler { } // Catch math expressions - if (ts.isIdentifier(node.expression) && node.expression.escapedText === "Math") { + if (ts.isIdentifier(node.expression) && this.transpileIdentifier(node.expression) === "Math") { return this.transpileMathExpression(node.name); } @@ -1087,13 +1161,13 @@ export abstract class LuaTranspiler { } public transpileGetAccessor(node: ts.PropertyAccessExpression): string { - const name = node.name.escapedText; + const name = this.transpileIdentifier(node.name); const expression = this.transpileExpression(node.expression); return `${expression}:get__${name}()`; } public transpileSetAccessor(node: ts.PropertyAccessExpression, value: string): string { - const name = node.name.escapedText; + const name = this.transpileIdentifier(node.name); const expression = this.transpileExpression(node.expression); return `${expression}:set__${name}(${value})`; } @@ -1121,32 +1195,34 @@ export abstract class LuaTranspiler { tan: "tan", }; - if (translation[identifier.escapedText as string]) { - return `math.${translation[identifier.escapedText as string]}`; + const identifierString = this.transpileIdentifier(identifier); + + if (translation[identifierString]) { + return `math.${translation[identifierString]}`; } else { - throw new TranspileError(`Unsupported math property: ${identifier.escapedText}.`, identifier); + throw new TranspileError(`Unsupported math property: ${identifierString}.`, identifier); } } // Transpile access of string properties, only supported properties are allowed public transpileStringProperty(node: ts.PropertyAccessExpression): string { - const property = node.name; - switch (property.escapedText) { + const propertyName = this.transpileIdentifier(node.name); + switch (propertyName) { case "length": return "#" + this.transpileExpression(node.expression); default: - throw new TranspileError("Unsupported string property: " + property.escapedText, node); + throw new TranspileError("Unsupported string property: " + propertyName, node); } } // Transpile access of array properties, only supported properties are allowed public transpileArrayProperty(node: ts.PropertyAccessExpression): string { - const property = node.name; - switch (property.escapedText) { + const propertyName = this.transpileIdentifier(node.name); + switch (propertyName) { case "length": return "#" + this.transpileExpression(node.expression); default: - throw new TranspileError("Unsupported array property: " + property.escapedText, node); + throw new TranspileError("Unsupported array property: " + propertyName, node); } } @@ -1164,6 +1240,33 @@ export abstract class LuaTranspiler { } } + // Counter-act typescript's identifier escaping: + // https://github.com/Microsoft/TypeScript/blob/master/src/compiler/utilities.ts#L556 + public transpileIdentifier(identifier: ts.Identifier): string { + const escapedText = identifier.escapedText as string; + const underScoreCharCode = "_".charCodeAt(0); + if (escapedText.length >= 3 + && escapedText.charCodeAt(0) === underScoreCharCode + && escapedText.charCodeAt(1) === underScoreCharCode + && escapedText.charCodeAt(2) === underScoreCharCode) { + return escapedText.substr(1); + } + return escapedText; + } + + public transpileArrayBindingElement(name: ts.ArrayBindingElement): string { + if (ts.isOmittedExpression(name)) { + return "__"; + } else if (ts.isIdentifier(name)) { + return this.transpileIdentifier(name); + } else if (ts.isBindingElement(name) && ts.isIdentifier(name.name)) { + return this.transpileIdentifier(name.name); + } else { + const kind = tsHelper.enumName(name.kind, ts.SyntaxKind); + throw new TranspileError(`Encountered not-supported array binding element kind: ${kind}`, name); + } + } + public transpileTypeOfExpression(node: ts.TypeOfExpression): string { const expression = this.transpileExpression(node.expression); return `(type(${expression}) == "table" and "object" or type(${expression}))`; @@ -1175,7 +1278,9 @@ export abstract class LuaTranspiler { node.declarationList.declarations.forEach(declaration => { result += this.transpileVariableDeclaration(declaration as ts.VariableDeclaration); - this.pushExport((declaration.name as ts.Identifier).escapedText, node); + if (ts.isIdentifier(declaration.name)) { + this.pushExport(this.transpileIdentifier(declaration.name as ts.Identifier), node); + } }); return result; @@ -1184,12 +1289,12 @@ export abstract class LuaTranspiler { public transpileVariableDeclaration(node: ts.VariableDeclaration): string { if (ts.isIdentifier(node.name)) { // Find variable identifier - const identifier = node.name; + const identifierName = this.transpileIdentifier(node.name); if (node.initializer) { const value = this.transpileExpression(node.initializer); - return `local ${identifier.escapedText} = ${value}\n`; + return `local ${identifierName} = ${value}\n`; } else { - return `local ${identifier.escapedText} = nil\n`; + return `local ${identifierName} = nil\n`; } } else if (ts.isArrayBindingPattern(node.name)) { // Destructuring type @@ -1200,9 +1305,7 @@ export abstract class LuaTranspiler { throw new TranspileError(`Ellipsis destruction is not allowed.`, node); } - const vars = node.name.elements.map( - element => ((element as ts.BindingElement).name as ts.Identifier - ).escapedText).join(","); + const vars = node.name.elements.map(e => this.transpileArrayBindingElement(e)).join(","); // Don't unpack TupleReturn decorated functions if (tsHelper.isTupleReturnCall(node.initializer, this.checker)) { @@ -1224,7 +1327,7 @@ export abstract class LuaTranspiler { let result = ""; const identifier = node.name; - const methodName = identifier.escapedText; + const methodName = this.transpileIdentifier(identifier); const parameters = node.parameters; const body = node.body; @@ -1235,7 +1338,7 @@ export abstract class LuaTranspiler { // Only push parameter name to paramName array if it isn't a spread parameter for (const param of parameters) { - const paramName = (param.name as ts.Identifier).escapedText as string; + const paramName = this.transpileIdentifier(param.name as ts.Identifier); // This parameter is a spread parameter (...param) if (!param.dotDotDotToken) { @@ -1274,7 +1377,7 @@ export abstract class LuaTranspiler { let result = ""; const identifier = node.name as ts.Identifier; - const methodName = identifier.escapedText; + const methodName = this.transpileIdentifier(identifier); const parameters = node.parameters; const body = node.body; @@ -1285,7 +1388,7 @@ export abstract class LuaTranspiler { // Only push parameter name to paramName array if it isn't a spread parameter for (const param of parameters) { - const paramName = (param.name as ts.Identifier).escapedText as string; + const paramName = this.transpileIdentifier(param.name as ts.Identifier); // This parameter is a spread parameter (...param) if (!param.dotDotDotToken) { @@ -1325,9 +1428,9 @@ export abstract class LuaTranspiler { throw new TranspileError("Class declaration has no name.", node); } - let className = node.name.escapedText as string; + let className = this.transpileIdentifier(node.name); - // Find out if this class is extension of exising class + // Find out if this class is extension of existing class const isExtension = tsHelper.isExtensionClass(this.checker.getTypeAtLocation(node), this.checker); // Get type that is extended @@ -1358,7 +1461,7 @@ export abstract class LuaTranspiler { // Add static declarations for (const field of staticFields) { - const fieldName = (field.name as ts.Identifier).escapedText; + const fieldName = this.transpileIdentifier(field.name as ts.Identifier); const value = this.transpileExpression(field.initializer); result += this.indent + `${className}.${fieldName} = ${value}\n`; } @@ -1366,7 +1469,7 @@ export abstract class LuaTranspiler { // Try to find constructor const constructor = node.members.filter(ts.isConstructorDeclaration)[0]; if (constructor) { - // Add constructor plus initialisation of instance fields + // Add constructor plus initialization of instance fields result += this.transpileConstructor(constructor, className); } else if (!isExtension) { // Generate a constructor if none was defined @@ -1394,7 +1497,7 @@ export abstract class LuaTranspiler { public transpileClassCreationMethods(node: ts.ClassDeclaration, instanceFields: ts.PropertyDeclaration[], extendsType: ts.Type): string { - const className = node.name.escapedText as string; + const className = this.transpileIdentifier(node.name); const noClassOr = extendsType && tsHelper.hasCustomDecorator(extendsType, this.checker, "!NoClassOr"); @@ -1421,7 +1524,7 @@ export abstract class LuaTranspiler { for (const f of instanceFields) { // Get identifier const fieldIdentifier = f.name as ts.Identifier; - const fieldName = fieldIdentifier.escapedText; + const fieldName = this.transpileIdentifier(fieldIdentifier); const value = this.transpileExpression(f.initializer); @@ -1438,7 +1541,7 @@ export abstract class LuaTranspiler { } public transpileGetAccessorDeclaration(getAccessor: ts.GetAccessorDeclaration, className: string): string { - const name = (getAccessor.name as ts.Identifier).escapedText; + const name = this.transpileIdentifier(getAccessor.name as ts.Identifier); let result = this.indent + `function ${className}.get__${name}(self)\n`; @@ -1452,11 +1555,11 @@ export abstract class LuaTranspiler { } public transpileSetAccessorDeclaration(setAccessor: ts.SetAccessorDeclaration, className: string): string { - const name = (setAccessor.name as ts.Identifier).escapedText; + const name = this.transpileIdentifier(setAccessor.name as ts.Identifier); const paramNames: string[] = ["self"]; setAccessor.parameters.forEach(param => { - paramNames.push((param.name as ts.Identifier).escapedText as string); + paramNames.push(this.transpileIdentifier(param.name as ts.Identifier)); }); let result = this.indent + `function ${className}.set__${name}(${paramNames.join(",")})\n`; @@ -1478,10 +1581,10 @@ export abstract class LuaTranspiler { node.parameters.forEach(param => { // If param has decorators, add extra instance field if (param.modifiers !== undefined) { - extraInstanceFields.push((param.name as ts.Identifier).escapedText as string); + extraInstanceFields.push(this.transpileIdentifier(param.name as ts.Identifier)); } // Add to parameter list - parameters.push((param.name as ts.Identifier).escapedText as string); + parameters.push(this.transpileIdentifier(param.name as ts.Identifier)); }); let result = this.indent + `function ${className}.constructor(${parameters.join(",")})\n`; @@ -1517,7 +1620,7 @@ export abstract class LuaTranspiler { node.properties.forEach(element => { let name = ""; if (ts.isIdentifier(element.name)) { - name = element.name.escapedText as string; + name = this.transpileIdentifier(element.name); } else if (ts.isComputedPropertyName(element.name)) { name = this.transpileExpression(element.name); } else { @@ -1540,7 +1643,7 @@ export abstract class LuaTranspiler { // Build parameter string const paramNames: string[] = []; node.parameters.forEach(param => { - paramNames.push((param.name as ts.Identifier).escapedText as string); + paramNames.push(this.transpileIdentifier(param.name as ts.Identifier)); }); const defaultValueParams = node.parameters.filter(declaration => declaration.initializer !== undefined); @@ -1563,7 +1666,7 @@ export abstract class LuaTranspiler { let result = ""; params.filter(declaration => declaration.initializer !== undefined).forEach(declaration => { - const paramName = (declaration.name as ts.Identifier).escapedText; + const paramName = this.transpileIdentifier(declaration.name as ts.Identifier); const paramValue = this.transpileExpression(declaration.initializer); result += this.indent + `if ${paramName}==nil then ${paramName}=${paramValue} end\n`; }); diff --git a/src/lualib/ArrayEvery.ts b/src/lualib/ArrayEvery.ts new file mode 100644 index 000000000..e8434175a --- /dev/null +++ b/src/lualib/ArrayEvery.ts @@ -0,0 +1,8 @@ +function __TS__ArrayEvery(arr: T[], callbackfn: (value: T, index?: number, array?: any[]) => boolean): boolean { + for (let i = 0; i < arr.length; i++) { + if (!callbackfn(arr[i], i, arr)) { + return false; + } + } + return true; +} diff --git a/src/lualib/ArrayFilter.ts b/src/lualib/ArrayFilter.ts new file mode 100644 index 000000000..8f0ac2fde --- /dev/null +++ b/src/lualib/ArrayFilter.ts @@ -0,0 +1,9 @@ +function __TS__ArrayFilter(arr: T[], callbackfn: (value: T, index?: number, array?: any[]) => boolean): T[] { + const result: T[] = []; + for (let i = 0; i < arr.length; i++) { + if (callbackfn(arr[i], i, arr)) { + result[result.length] = arr[i]; + } + } + return result; +} diff --git a/src/lualib/ArrayForEach.ts b/src/lualib/ArrayForEach.ts new file mode 100644 index 000000000..3001915f0 --- /dev/null +++ b/src/lualib/ArrayForEach.ts @@ -0,0 +1,5 @@ +function __TS__ArrayForEach(arr: T[], callbackFn: (value: T, index?: number, array?: any[]) => any): void { + for (let i = 0; i < arr.length; i++) { + callbackFn(arr[i], i, arr); + } +} diff --git a/src/lualib/ArrayIndexOf.ts b/src/lualib/ArrayIndexOf.ts new file mode 100644 index 000000000..c50ce5ded --- /dev/null +++ b/src/lualib/ArrayIndexOf.ts @@ -0,0 +1,33 @@ +function __TS__ArrayIndexOf(arr: T[], searchElement: T, fromIndex?: number): number { + const len = arr.length; + if (len === 0) { + return -1; + } + + let n = 0; + if (fromIndex) { + n = fromIndex; + } + + if (n >= len) { + return -1; + } + + let k; + if (n >= 0) { + k = n; + } else { + k = len + n; + if (k < 0) { + k = 0; + } + } + + for (let i = k; i < len; i++) { + if (arr[i] === searchElement) { + return i; + } + } + + return -1; +} diff --git a/src/lualib/ArrayMap.ts b/src/lualib/ArrayMap.ts new file mode 100644 index 000000000..f7ea7aa50 --- /dev/null +++ b/src/lualib/ArrayMap.ts @@ -0,0 +1,7 @@ +function __TS__ArrayMap(arr: T[], callbackfn: (value: T, index?: number, array?: T[]) => U): U[] { + const newArray: U[] = []; + for (let i = 0; i < arr.length; i++) { + newArray[i] = callbackfn(arr[i], i, arr); + } + return newArray; +} diff --git a/src/lualib/ArrayPush.ts b/src/lualib/ArrayPush.ts new file mode 100644 index 000000000..8e1d8e324 --- /dev/null +++ b/src/lualib/ArrayPush.ts @@ -0,0 +1,6 @@ +function __TS__ArrayPush(arr: T[], ...items: T[]): number { + for (const item of items) { + arr[arr.length] = item; + } + return arr.length; +} diff --git a/src/lualib/ArraySlice.ts b/src/lualib/ArraySlice.ts new file mode 100644 index 000000000..f3eb5b3d6 --- /dev/null +++ b/src/lualib/ArraySlice.ts @@ -0,0 +1,33 @@ +// https://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf 22.1.3.23 +function __TS__ArraySlice(list: T[], first: number, last: number): T[] { + const len = list.length; + + let k: number; + if (first < 0) { + k = Math.max(len + first, 0); + } else { + k = Math.min(first, len); + } + + let relativeEnd = last; + if (last === undefined) { + relativeEnd = len; + } + + let final: number; + if (relativeEnd < 0) { + final = Math.max(len + relativeEnd, 0); + } else { + final = Math.min(relativeEnd, len); + } + + const out = []; + + let n = 0; + while (k < final) { + out[n] = list[k]; + k++; + n++; + } + return out; +} diff --git a/src/lualib/ArraySome.ts b/src/lualib/ArraySome.ts new file mode 100644 index 000000000..d03e7a9fe --- /dev/null +++ b/src/lualib/ArraySome.ts @@ -0,0 +1,8 @@ +function __TS__ArraySome(arr: T[], callbackfn: (value: T, index?: number, array?: any[]) => boolean): boolean { + for (let i = 0; i < arr.length; i++) { + if (callbackfn(arr[i], i, arr)) { + return true; + } + } + return false; +} diff --git a/src/lualib/ArraySplice.ts b/src/lualib/ArraySplice.ts new file mode 100644 index 000000000..b875d706c --- /dev/null +++ b/src/lualib/ArraySplice.ts @@ -0,0 +1,74 @@ +function __TS__ArraySplice(list: T[], start: number, deleteCount: number, ...items: T[]): T[] { + + const len = list.length; + + let actualStart; + + if (start < 0) { + actualStart = Math.max(len + start, 0); + } else { + actualStart = Math.min(start, len); + } + + const itemCount = items.length; + + let actualDeleteCount: number; + + if (!start) { + actualDeleteCount = 0; + } else if (!deleteCount) { + actualDeleteCount = len - actualStart; + } else { + actualDeleteCount = Math.min(Math.max(deleteCount, 0), len - actualStart); + } + + const out: T[] = []; + + for (let k = 0; k < actualDeleteCount; k++) { + const from = actualStart + k; + + if (list[from]) { + out[k] = list[from]; + } + } + + if (itemCount < actualDeleteCount) { + for (let k = actualStart; k < len - actualDeleteCount; k++) { + const from = k + actualDeleteCount; + const to = k + itemCount; + + if (list[from]) { + list[to] = list[from]; + } else { + list[to] = undefined; + } + } + for (let k = len; k > len - actualDeleteCount + itemCount; k--) { + list[k - 1] = undefined; + } + } else if (itemCount > actualDeleteCount) { + + for (let k = len - actualDeleteCount; k > actualStart; k--) { + const from = k + actualDeleteCount - 1; + const to = k + itemCount - 1; + + if (list[from]) { + list[to] = list[from]; + } else { + list[to] = undefined; + } + } + } + + let j = actualStart; + for (const e of items) { + list[j] = e; + j++; + } + + for (let k = list.length - 1; k >= len - actualDeleteCount + itemCount; k--) { + list[k] = undefined; + } + + return out; +} diff --git a/src/lualib/InstanceOf.ts b/src/lualib/InstanceOf.ts new file mode 100644 index 000000000..3b6a12dab --- /dev/null +++ b/src/lualib/InstanceOf.ts @@ -0,0 +1,14 @@ +interface LuaClass { + __index: LuaClass; + __base: LuaClass; +} + +function __TS__InstanceOf(obj: LuaClass, classTbl: LuaClass): boolean { + while (obj !== undefined) { + if (obj.__index === classTbl) { + return true; + } + obj = obj.__base; + } + return false; +} diff --git a/src/lualib/Map.ts b/src/lualib/Map.ts new file mode 100644 index 000000000..a22756bdc --- /dev/null +++ b/src/lualib/Map.ts @@ -0,0 +1,84 @@ +class Map { + public size: number; + + private items: {[key: string]: TValue}; // Type of key is actually TKey + + constructor(other: Map | Array<[TKey, TValue]>) { + this.items = {}; + this.size = 0; + + if (other instanceof Map) { + this.size = other.size; + for (const [key, value] of other.entries()) { + this.items[key as any] = value; + } + } else if (other !== undefined) { + this.size = other.length; + for (const [key, value] of other) { + this.items[key as any] = value; + } + } + } + + public clear(): void { + this.items = {}; + this.size = 0; + return; + } + + public delete(key: TKey): boolean { + const contains = this.has(key); + if (contains) { + this.size--; + } + this.items[key as any] = undefined; + return contains; + } + + public entries(): Array<[TKey, TValue]> { + const out = []; + for (const key in this.items) { + out[out.length] = [key, this.items[key]]; + } + return out; + } + + public forEach(callback: (value: TValue, key: TKey, map: Map) => any): void { + for (const key in this.items) { + callback(this.items[key], key as any, this); + } + return; + } + + public get(key: TKey): TValue { + return this.items[key as any]; + } + + public has(key: TKey): boolean { + return this.items[key as any] !== undefined; + } + + public keys(): TKey[] { + const out = []; + for (const key in this.items) { + out[out.length] = key; + } + return out; + } + + public set(key: TKey, value: TValue): Map { + if (!this.has(key)) { + this.size++; + } + this.items[key as any] = value; + return this; + } + + public values(): TValue[] { + const out = []; + for (const key in this.items) { + out[out.length] = this.items[key]; + } + return out; + } +} diff --git a/src/lualib/Set.ts b/src/lualib/Set.ts new file mode 100644 index 000000000..81021dbef --- /dev/null +++ b/src/lualib/Set.ts @@ -0,0 +1,80 @@ +class Set { + public size: number; + + private items: {[key: string]: boolean}; // Key type is actually TValue + + constructor(other: Set | TValue[]) { + this.items = {}; + this.size = 0; + + if (other instanceof Set) { + this.size = other.size; + for (const value of other.values()) { + this.items[value as any] = true as any; + } + } else if (other !== undefined) { + this.size = other.length; + for (const value of other) { + this.items[value as any] = true as any; + } + } + } + + public add(value: TValue): Set { + if (!this.has(value)) { + this.size++; + } + this.items[value as any] = true; + return this; + } + + public clear(): void { + this.items = {}; + this.size = 0; + return; + } + + public delete(value: TValue): boolean { + const contains = this.has(value); + if (contains) { + this.size--; + } + this.items[value as any] = undefined; + return contains; + } + + public entries(): Array<[TValue, TValue]> { + const out = []; + for (const key in this.items) { + out[out.length] = [key, key]; + } + return out; + } + + public forEach(callback: (value: TValue, key: TValue, set: Set) => any): void { + for (const key in this.items) { + callback(key as any, key as any, this); + } + return; + } + + public has(value: TValue): boolean { + return this.items[value as any] === true; + } + + public keys(): TValue[] { + const out = []; + for (const key in this.items) { + out[out.length] = key; + } + return out; + } + + public values(): TValue[] { + const out = []; + for (const key in this.items) { + out[out.length] = key; + } + return out; + } +} diff --git a/src/lualib/StringReplace.ts b/src/lualib/StringReplace.ts new file mode 100644 index 000000000..7a5df979c --- /dev/null +++ b/src/lualib/StringReplace.ts @@ -0,0 +1,8 @@ +declare namespace string { + /** !TupleReturn */ + function gsub(source: string, searchValue: string, replaceValue: string): [string, number]; +} + +function __TS__StringReplace(source: string, searchValue: string, replaceValue: string): string { + return string.gsub(source, searchValue, replaceValue)[0]; +} diff --git a/src/lualib/StringSplit.ts b/src/lualib/StringSplit.ts new file mode 100644 index 000000000..005f57436 --- /dev/null +++ b/src/lualib/StringSplit.ts @@ -0,0 +1,36 @@ +function __TS__StringSplit(source: string, separator?: string, limit?: number): string[] { + if (limit === undefined) { + limit = 4294967295; + } + + if (limit === 0) { + return []; + } + + const out = []; + let index = 0; + let count = 0; + + if (separator === undefined || separator === "") { + while (index < source.length - 1 && count < limit) { + out[count] = source[index]; + count++; + index++; + } + } else { + const separatorLength = separator.length; + let nextIndex = source.indexOf(separator); + while (nextIndex >= 0 && count < limit) { + out[count] = source.substring(index, nextIndex); + count++; + index = nextIndex + separatorLength; + nextIndex = source.indexOf(separator, index); + } + } + + if (count < limit) { + out[count] = source.substring(index); + } + + return out; +} diff --git a/src/lualib/Ternary.ts b/src/lualib/Ternary.ts new file mode 100644 index 000000000..f1331f4f4 --- /dev/null +++ b/src/lualib/Ternary.ts @@ -0,0 +1,7 @@ +function __TS__Ternary(condition: boolean, cb1: () => T, cb2: () => T): T { + if (condition) { + return cb1(); + } else { + return cb2(); + } +} diff --git a/test/compiler/errorreport.spec.ts b/test/compiler/errorreport.spec.ts index bdcea51af..217684ca5 100644 --- a/test/compiler/errorreport.spec.ts +++ b/test/compiler/errorreport.spec.ts @@ -2,7 +2,7 @@ import { Any, Expect, Setup, SpyOn, Teardown, Test, TestCase } from "alsatian"; import * as fs from "fs"; import * as path from "path"; import * as ts from "typescript"; -import { compile } from "../../src/Compiler"; +import { compile, compileFilesWithOptions } from "../../src/Compiler"; export class CompilerErrorReportTests { private originalStdErr: any; @@ -15,7 +15,7 @@ export class CompilerErrorReportTests { @Test("Compile project") public compileProject(errorMsg: string, ...fileNames: string[]) { fileNames = fileNames.map((file) => path.resolve(__dirname, "testfiles", file)); - compile(fileNames, {outDir: ".", rootDir: "."}); + compileFilesWithOptions(fileNames, {outDir: ".", rootDir: "."}); Expect(process.stderr.write).toHaveBeenCalledWith(errorMsg, Any); diff --git a/test/compiler/outfile.spec.ts b/test/compiler/outfile.spec.ts index 37bcce5fe..1b0fa7a44 100644 --- a/test/compiler/outfile.spec.ts +++ b/test/compiler/outfile.spec.ts @@ -1,7 +1,7 @@ import { Expect, SetupFixture, Teardown, Test, TestCase } from "alsatian"; import * as fs from "fs"; import * as path from "path"; -import { execCommandLine } from "../../src/Compiler"; +import { compile } from "../../src/Compiler"; export class CompilerOutFileTests { @@ -17,7 +17,7 @@ export class CompilerOutFileTests { @Test("Outfile absoulte path") public outFileAbsTest() { // Compile project - execCommandLine(["--outFile", this.outFileAbsPath, path.join(__dirname, "./testfiles/out_file.ts")]); + compile(["--outFile", this.outFileAbsPath, path.join(__dirname, "./testfiles/out_file.ts")]); Expect(fs.existsSync(this.outFileAbsPath)).toBe(true); } @@ -25,7 +25,7 @@ export class CompilerOutFileTests { @Test("Outfile relative path") public outFileRelTest() { // Compile project - execCommandLine([ + compile([ "--outDir", __dirname, "--outFile", diff --git a/test/compiler/project.spec.ts b/test/compiler/project.spec.ts index 876b0af1f..329fa4083 100644 --- a/test/compiler/project.spec.ts +++ b/test/compiler/project.spec.ts @@ -1,7 +1,7 @@ import { Expect, Setup, Teardown, Test, TestCase } from "alsatian"; import * as fs from "fs"; import * as path from "path"; -import { execCommandLine } from "../../src/Compiler"; +import { compile } from "../../src/Compiler"; /** * Find all files inside a dir, recursively. @@ -24,37 +24,37 @@ export class CompilerProjectTests { @TestCase("basic", "tsconfig.json", - "typescript_lualib.lua", + "lualib_bundle.lua", "test_src/test_lib/file.lua", "test_src/main.lua") @TestCase("basic", ".", - "typescript_lualib.lua", + "lualib_bundle.lua", "test_src/test_lib/file.lua", "test_src/main.lua") @TestCase("basic", "test_src/main.ts", - "typescript_lualib.lua", + "lualib_bundle.lua", "test_src/test_lib/file.lua", "test_src/main.lua") @TestCase("basic", "tsconfig.outDir.json", - "out_dir/typescript_lualib.lua", + "out_dir/lualib_bundle.lua", "out_dir/test_src/test_lib/file.lua", "out_dir/test_src/main.lua") @TestCase("basic", "tsconfig.rootDir.json", - "test_src/typescript_lualib.lua", + "test_src/lualib_bundle.lua", "test_src/test_lib/file.lua", "test_src/main.lua") @TestCase("basic", "tsconfig.bothDirOptions.json", - "out_dir/typescript_lualib.lua", + "out_dir/lualib_bundle.lua", "out_dir/test_lib/file.lua", "out_dir/main.lua") @TestCase("baseurl", "tsconfig.json", - "out_dir/typescript_lualib.lua", + "out_dir/lualib_bundle.lua", "out_dir/test_src/test_lib/nested/lib_file.lua", "out_dir/test_src/main.lua") @Test("Compile project") @@ -69,7 +69,7 @@ export class CompilerProjectTests { const tsconfigPath = path.resolve(__dirname, relPathToProject, tsconfig); // Compile project - execCommandLine(["-p", tsconfigPath]); + compile(["-p", tsconfigPath]); this.filesAfterCompile = getAllFiles(path.resolve(__dirname, relPathToProject)); expectedFiles = expectedFiles.map(relPath => path.resolve(__dirname, relPathToProject, relPath)); diff --git a/test/compiler/projects/basic/test_src/main.lua b/test/compiler/projects/basic/test_src/main.lua deleted file mode 100644 index f9ab95ecb..000000000 --- a/test/compiler/projects/basic/test_src/main.lua +++ /dev/null @@ -1,7 +0,0 @@ --- Generated by TypescriptToLua v0.4.0 --- https://github.com/Perryvw/TypescriptToLua -require("typescript_lualib") -function main() - local main = 10 - -end diff --git a/test/compiler/projects/basic/test_src/test_lib/file.lua b/test/compiler/projects/basic/test_src/test_lib/file.lua deleted file mode 100644 index be41cba60..000000000 --- a/test/compiler/projects/basic/test_src/test_lib/file.lua +++ /dev/null @@ -1,5 +0,0 @@ --- Generated by TypescriptToLua v0.4.0 --- https://github.com/Perryvw/TypescriptToLua -require("typescript_lualib") -local test = true - diff --git a/test/runner.ts b/test/runner.ts index ca84aa80c..dfb723b50 100644 --- a/test/runner.ts +++ b/test/runner.ts @@ -23,4 +23,4 @@ testRunner.run(testSet); // this will be called after all tests have been run // .then((results) => done()) // this will be called if there was a problem - // .catch((error) => doSomethingWith(error)); + // .catch((error) => doSomethingWith(error)); \ No newline at end of file diff --git a/test/src/util.ts b/test/src/util.ts index 974d2d053..463172c22 100644 --- a/test/src/util.ts +++ b/test/src/util.ts @@ -1,19 +1,19 @@ -import * as ts from "typescript"; import * as path from "path"; +import * as ts from "typescript"; import { Expect } from "alsatian"; -import { LuaTarget, LuaTranspiler, TranspileError } from "../../src/Transpiler"; import { CompilerOptions } from "../../src/CommandLineParser"; import { createTranspiler } from "../../src/Compiler"; +import { LuaTarget, LuaTranspiler, TranspileError } from "../../src/Transpiler"; import {lauxlib, lua, lualib, to_jsstring, to_luastring } from "fengari"; const fs = require("fs"); -const libSource = fs.readFileSync(path.join(path.dirname(require.resolve('typescript')), 'lib.es6.d.ts')).toString(); +const libSource = fs.readFileSync(path.join(path.dirname(require.resolve("typescript")), "lib.es6.d.ts")).toString(); -export function transpileString(str: string, options: CompilerOptions = { dontRequireLuaLib: true, luaTarget: LuaTarget.Lua53 }): string { +export function transpileString(str: string, options: CompilerOptions = { luaLibImport: "none", luaTarget: LuaTarget.Lua53 }): string { const compilerHost = { directoryExists: () => true, fileExists: (fileName): boolean => true, @@ -55,7 +55,7 @@ export function transpileFile(filePath: string): string { const diagnostics = ts.getPreEmitDiagnostics(program).filter(diag => diag.code !== 6054); diagnostics.forEach(diagnostic => console.log(`${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`)); - const options: ts.CompilerOptions = { dontRequireLuaLib: true }; + const options: ts.CompilerOptions = { luaLibImport: "none" }; const result = createTranspiler(checker, options, program.getSourceFile(filePath)).transpileSourceFile(); return result.trim(); } @@ -106,7 +106,7 @@ export function expectCodeEqual(code1: string, code2: string) { // Get a mock transpiler to use for testing export function makeTestTranspiler(target: LuaTarget = LuaTarget.Lua53) { return createTranspiler({} as ts.TypeChecker, - { dontRequireLuaLib: true, luaTarget: target } as any, + { luaLibImport: "none", luaTarget: target } as any, { statements: [] } as any as ts.SourceFile); } @@ -114,8 +114,8 @@ export function transpileAndExecute(ts: string): any { return executeLua(transpileString(ts)); } -const tslualib = fs.readFileSync("dist/lualib/typescript.lua") + "\n"; +const tslualib = fs.readFileSync("dist/lualib/lualib_bundle.lua") + "\n"; const jsonlib = fs.readFileSync("test/src/json.lua") + "\n"; -export const minimalTestLib = tslualib + jsonlib; +export const minimalTestLib = tslualib + jsonlib; \ No newline at end of file diff --git a/test/translation/lua/tupleArrayUses.lua b/test/translation/lua/tupleArrayUses.lua deleted file mode 100644 index eb5076124..000000000 --- a/test/translation/lua/tupleArrayUses.lua +++ /dev/null @@ -1,11 +0,0 @@ -for _, value in ipairs(tuple) do - do - end - ::__continue0:: -end -TS_forEach(tuple, function(v) -end -) -local num = tuple[1+1] - -local len = #tuple \ No newline at end of file diff --git a/test/translation/lua/tupleReturnAssignment.lua b/test/translation/lua/tupleReturnAssignment.lua deleted file mode 100644 index c7f578b42..000000000 --- a/test/translation/lua/tupleReturnAssignment.lua +++ /dev/null @@ -1 +0,0 @@ -local a,b=myFunc() \ No newline at end of file diff --git a/test/translation/lua/tupleReturnDefinition.lua b/test/translation/lua/tupleReturnDefinition.lua deleted file mode 100644 index c5b1095ec..000000000 --- a/test/translation/lua/tupleReturnDefinition.lua +++ /dev/null @@ -1,3 +0,0 @@ -function myFunc() - return 3,"4" -end \ No newline at end of file diff --git a/test/translation/lua/tupleReturnIndex.lua b/test/translation/lua/tupleReturnIndex.lua deleted file mode 100644 index c6e46ac34..000000000 --- a/test/translation/lua/tupleReturnIndex.lua +++ /dev/null @@ -1 +0,0 @@ -local a = ({ myFunc() })[0+1] \ No newline at end of file diff --git a/test/translation/ts/tupleArrayUses.ts b/test/translation/ts/tupleArrayUses.ts deleted file mode 100644 index e4fb21307..000000000 --- a/test/translation/ts/tupleArrayUses.ts +++ /dev/null @@ -1,8 +0,0 @@ -// test cases where tuples are used as arrays -declare const tuple: [string, number, boolean]; - -// tslint:disable:no-empty no-unused-expression -for (const value of tuple) {} // for-of loop -tuple.forEach(v => {}); // Array.prototype.forEach -const num = tuple[1]; // array access -const len = tuple.length; // array length diff --git a/test/translation/ts/tupleReturnAssignment.ts b/test/translation/ts/tupleReturnAssignment.ts deleted file mode 100644 index 4cf884222..000000000 --- a/test/translation/ts/tupleReturnAssignment.ts +++ /dev/null @@ -1,3 +0,0 @@ -/** !TupleReturn */ -declare function myFunc(): [number, string]; -let [a, b] = myFunc(); diff --git a/test/translation/ts/tupleReturnDefinition.ts b/test/translation/ts/tupleReturnDefinition.ts deleted file mode 100644 index c857cc2fd..000000000 --- a/test/translation/ts/tupleReturnDefinition.ts +++ /dev/null @@ -1,4 +0,0 @@ -/** !TupleReturn */ -function myFunc(): [number, string] { - return [3, "4"]; -} diff --git a/test/translation/ts/tupleReturnIndex.ts b/test/translation/ts/tupleReturnIndex.ts deleted file mode 100644 index f5daa84b5..000000000 --- a/test/translation/ts/tupleReturnIndex.ts +++ /dev/null @@ -1,3 +0,0 @@ -/** !TupleReturn */ -declare function myFunc(): [number, string]; -let a = myFunc()[0]; diff --git a/test/tsconfig.json b/test/tsconfig.json index 727e452e7..c61b6bf47 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -1,11 +1,13 @@ { "compilerOptions": { "experimentalDecorators": true, - "sourceMap": true + "sourceMap": true, + "target": "es6", + "module": "commonjs" }, "exclude": [ "translation/ts/*", - "compiler/project/*", + "compiler/projects/*", "compiler/testfiles/*" ] } diff --git a/test/unit/cli.spec.ts b/test/unit/cli.spec.ts index f290767b7..f8ebcb7c2 100644 --- a/test/unit/cli.spec.ts +++ b/test/unit/cli.spec.ts @@ -6,8 +6,8 @@ export class CLITests { @Test("defaultOption") @TestCase("luaTarget", "JIT") - @TestCase("addHeader", true) - @TestCase("dontRequireLuaLib", false) + @TestCase("noHeader", false) + @TestCase("luaLibImport", "inline") @TestCase("rootDir", process.cwd()) @TestCase("outDir", process.cwd()) public defaultOptions(option: any, expected: any) { diff --git a/test/unit/expressions.spec.ts b/test/unit/expressions.spec.ts index c061a7d73..e3c3357f4 100644 --- a/test/unit/expressions.spec.ts +++ b/test/unit/expressions.spec.ts @@ -107,7 +107,7 @@ export class ExpressionTests { @Test("Bitop [5.1]") public bitOperatorOverride51(input: string, lua: string) { // Bit operations not supported in 5.1, expect an exception - Expect(() => util.transpileString(input, { luaTarget: LuaTarget.Lua51, dontRequireLuaLib: true })) + Expect(() => util.transpileString(input, { luaTarget: LuaTarget.Lua51, luaLibImport: "none" })) .toThrow(); } @@ -126,7 +126,7 @@ export class ExpressionTests { @TestCase("a>>>=b", "a = bit.arshift(a,b)") @Test("Bitop [JIT]") public bitOperatorOverrideJIT(input: string, lua: string) { - Expect(util.transpileString(input, { luaTarget: LuaTarget.LuaJIT, dontRequireLuaLib: true })).toBe(lua); + Expect(util.transpileString(input, { luaTarget: LuaTarget.LuaJIT, luaLibImport: "none" })).toBe(lua); } @TestCase("~a", "bit32.bnot(a)") @@ -144,7 +144,7 @@ export class ExpressionTests { @TestCase("a>>>=b", "a = bit32.arshift(a,b)") @Test("Bitop [5.2]") public bitOperatorOverride52(input: string, lua: string) { - Expect(util.transpileString(input, { luaTarget: LuaTarget.Lua52, dontRequireLuaLib: true })).toBe(lua); + Expect(util.transpileString(input, { luaTarget: LuaTarget.Lua52, luaLibImport: "none" })).toBe(lua); } @TestCase("~a", "~a") @@ -160,14 +160,14 @@ export class ExpressionTests { @TestCase("a>>=b", "a = a >> b") @Test("Bitop [5.3]") public bitOperatorOverride53(input: string, lua: string) { - Expect(util.transpileString(input, { luaTarget: LuaTarget.Lua53, dontRequireLuaLib: true })).toBe(lua); + Expect(util.transpileString(input, { luaTarget: LuaTarget.Lua53, luaLibImport: "none" })).toBe(lua); } @TestCase("a>>>b") @TestCase("a>>>=b") @Test("Unsupported bitop 5.3") public bitOperatorOverride53Unsupported(input: string) { - Expect(() => util.transpileString(input, { luaTarget: LuaTarget.Lua53, dontRequireLuaLib: true })) + Expect(() => util.transpileString(input, { luaTarget: LuaTarget.Lua53, luaLibImport: "none" })) .toThrowError(Error, "Bitwise operator >>> not supported in Lua 5.3"); } @@ -181,13 +181,6 @@ export class ExpressionTests { Expect(util.transpileString(input)).toBe(lua); } - @TestCase("1 + a ? 3*a : c", "TS_ITE(1+a,function() return 3*a end,function() return c end)") - @TestCase("a ? b : c", "TS_ITE(a,function() return b end,function() return c end)") - @Test("Ternary operator") - public conditional(input: string, lua: string) { - Expect(util.transpileString(input)).toBe(lua); - } - @Test("Null Expression") public nullExpression() { Expect(util.transpileString("null")).toBe("nil"); diff --git a/test/unit/lualib.spec.ts b/test/unit/lualib/lualib.spec.ts similarity index 82% rename from test/unit/lualib.spec.ts rename to test/unit/lualib/lualib.spec.ts index fd1fa91db..ecc470fc7 100644 --- a/test/unit/lualib.spec.ts +++ b/test/unit/lualib/lualib.spec.ts @@ -1,5 +1,5 @@ import { Expect, Test, TestCase } from "alsatian"; -import * as util from "../src/util"; +import * as util from "../../src/util"; export class LuaLibArrayTests { @@ -204,20 +204,26 @@ export class LuaLibArrayTests { @TestCase([], "test1") @TestCase(["test1"], "test1") @TestCase(["test1", "test2"], "test2") + @TestCase(["test1", "test2", "test3"], "test3", 1) + @TestCase(["test1", "test2", "test3"], "test1", 2) + @TestCase(["test1", "test2", "test3"], "test1", -2) + @TestCase(["test1", "test2", "test3"], "test1", 12) @Test("array.indexOf") - public indexOf(inp: string[], element: string) { - // Transpile - const lua = util.transpileString( - `return ${JSON.stringify(inp)}.indexOf("${element}"))` + public indexOf(inp: string[], element: string, fromIndex?: number) { + let str = `return ${JSON.stringify(inp)}.indexOf("${element}"))`; + if (fromIndex) { + str = `return ${JSON.stringify(inp)}.indexOf("${element}", ${fromIndex}))`; + } - ); + // Transpile + const lua = util.transpileString(str); // Execute const result = util.executeLua(lua); // Assert - // Acount for lua indexing (-1) - Expect(result).toBe(inp.indexOf(element)); + // Account for lua indexing (-1) + Expect(result).toBe(inp.indexOf(element, fromIndex)); } @TestCase([1, 2, 3], 3) @@ -255,4 +261,39 @@ export class LuaLibArrayTests { // Assert Expect(result).toBe(JSON.stringify([0].concat(inp))); } + + @TestCase("true", "4", "5", 4) + @TestCase("false", "4", "5", 5) + @TestCase("3", "4", "5", 4) + @Test("Ternary Conditional") + public ternaryConditional(condition: string, lhs: string, rhs: string, expected: any) { + // Transpile + const lua = util.transpileString(`return ${condition} ? ${lhs} : ${rhs};`); + + // Execute + const result = util.executeLua(lua); + + // Assert + Expect(result).toBe(expected); + } + + @TestCase("true", 11) + @TestCase("false", 13) + @TestCase("a < 4", 13) + @TestCase("a == 8", 11) + @Test("Ternary Conditional Delayed") + public ternaryConditionalDelayed(condition: string, expected: any) { + // Transpile + const lua = util.transpileString( + `let a = 3; + let delay = () => ${condition} ? a + 3 : a + 5; + a = 8; + return delay();`); + + // Execute + const result = util.executeLua(lua); + + // Assert + Expect(result).toBe(expected); + } } diff --git a/test/unit/map.spec.ts b/test/unit/lualib/map.spec.ts similarity index 85% rename from test/unit/map.spec.ts rename to test/unit/lualib/map.spec.ts index 1181cfae1..dfb638783 100644 --- a/test/unit/map.spec.ts +++ b/test/unit/lualib/map.spec.ts @@ -1,5 +1,5 @@ import { Expect, Test, TestCase } from "alsatian"; -import * as util from "../src/util"; +import * as util from "../../src/util"; export class MapTests { @Test("map constructor") @@ -19,6 +19,15 @@ export class MapTests { Expect(result).toBe(true); } + @Test("map iterable constructor map") + public mapIterableConstructor2() { + const lua = util.transpileString(`let mymap = new Map(new Map([["a", "c"],["b", "d"]])); + return mymap.has("a") && mymap.has("b");`); + const result = util.executeLua(lua); + + Expect(result).toBe(true); + } + @Test("map clear") public mapClear() { const mapTS = `let mymap = new Map([["a", "c"],["b", "d"]]); mymap.clear();`; @@ -39,12 +48,22 @@ export class MapTests { Expect(contains).toBe(true); } + @Test("map entries") + public mapEntries() { + const lua = util.transpileString(`let mymap = new Map([[5, 2],[6, 3],[7, 4]]); + let count = 0; + for (var [key, value] of mymap.entries()) { count += key + value; } + return count;`); + const result = util.executeLua(lua); + Expect(result).toBe(27); + } + @Test("map foreach") public mapForEach() { const lua = util.transpileString( `let mymap = new Map([["a", 2],["b", 3],["c", 4]]); let count = 0; - mymap.forEach(i => { count += i; }); + mymap.forEach(i => count += i); return count;` ); diff --git a/test/unit/set.spec.ts b/test/unit/lualib/set.spec.ts similarity index 84% rename from test/unit/set.spec.ts rename to test/unit/lualib/set.spec.ts index 0919363dc..2bb0d20e2 100644 --- a/test/unit/set.spec.ts +++ b/test/unit/lualib/set.spec.ts @@ -1,5 +1,5 @@ import { Expect, Test, TestCase } from "alsatian"; -import * as util from "../src/util"; +import * as util from "../../src/util"; export class SetTests { @Test("set constructor") @@ -19,6 +19,15 @@ export class SetTests { Expect(result).toBe(true); } + @Test("set iterable constructor set") + public setIterableConstructorSet() { + const lua = util.transpileString(`let myset = new Set(new Set(["a", "b"])); + return myset.has("a") || myset.has("b");`); + const result = util.executeLua(lua); + + Expect(result).toBe(true); + } + @Test("set add") public setAdd() { const lua = util.transpileString(`let myset = new Set(); myset.add("a"); return myset.has("a");`); @@ -46,6 +55,16 @@ export class SetTests { Expect(contains).toBe(true); } + @Test("set entries") + public setEntries() { + const lua = util.transpileString(`let myset = new Set([5, 6, 7]); + let count = 0; + for (var [key, value] of myset.entries()) { count += key + value; } + return count;`); + const result = util.executeLua(lua); + Expect(result).toBe(36); + } + @Test("set foreach") public setForEach() { const lua = util.transpileString( diff --git a/test/unit/modules.spec.ts b/test/unit/modules.spec.ts index 60147b9f0..31716fbf5 100644 --- a/test/unit/modules.spec.ts +++ b/test/unit/modules.spec.ts @@ -15,10 +15,10 @@ export class LuaModuleTests { @Test("lualibRequire") public lualibRequire() { // Transpile - const lua = util.transpileString(``, {dontRequireLuaLib: false, luaTarget: "JIT"}); + const lua = util.transpileString(``, {luaLibImport: "require", luaTarget: "JIT"}); // Assert - Expect(lua).toBe(`require("typescript_lualib")`); + Expect(lua).toBe(`require("lualib_bundle")`); } @Test("Import named bindings exception") diff --git a/test/unit/string.spec.ts b/test/unit/string.spec.ts index 8398fce1a..06848fc22 100644 --- a/test/unit/string.spec.ts +++ b/test/unit/string.spec.ts @@ -146,6 +146,25 @@ export class StringTests { Expect(result).toBe(inp.substring(start, end)); } + @TestCase("hello test", 0) + @TestCase("hello test", 1) + @TestCase("hello test", 1, 2) + @TestCase("hello test", 1, 5) + @Test("string.substring") + public substr(inp: string, start: number, end?: number) { + // Transpile + const paramStr = end ? `${start}, ${end}` : `${start}`; + const lua = util.transpileString( + `return "${inp}".substr(${paramStr})` + ); + + // Execute + const result = util.executeLua(lua); + + // Assert + Expect(result).toBe(inp.substr(start, end)); + } + @TestCase("", 0) @TestCase("h", 1) @TestCase("hello", 5) diff --git a/test/unit/tuples.spec.ts b/test/unit/tuples.spec.ts new file mode 100644 index 000000000..f087086a7 --- /dev/null +++ b/test/unit/tuples.spec.ts @@ -0,0 +1,117 @@ +import { Expect, Test, TestCase } from "alsatian"; +import * as util from "../src/util"; + +export class TupleTests { + @Test("Tuple loop") + public tupleLoop() { + // Transpile + const lua = util.transpileString( + `const tuple: [number, number, number] = [3,5,1]; + let count = 0; + for (const value of tuple) { count += value; } + return count;` + ); + + // Execute + const result = util.executeLua(lua); + + // Assert + Expect(result).toBe(9); + } + + @Test("Tuple foreach") + public tupleForEach() { + // Transpile + const lua = util.transpileString( + `const tuple: [number, number, number] = [3,5,1]; + let count = 0; + tuple.forEach(v => count += v); + return count;` + ); + + // Execute + const result = util.executeLua(lua); + + // Assert + Expect(result).toBe(9); + } + + @Test("Tuple access") + public tupleAccess() { + // Transpile + const lua = util.transpileString( + `const tuple: [number, number, number] = [3,5,1]; + return tuple[1];` + ); + + // Execute + const result = util.executeLua(lua); + + // Assert + Expect(result).toBe(5); + } + + @Test("Tuple Destruct") + public tupleDestruct() { + // Transpile + const lua = util.transpileString( + `function tuple(): [number, number, number] { return [3,5,1]; }\n + const [a,b,c] = tuple(); + return b;` + ); + + // Execute + const result = util.executeLua(lua); + + // Assert + Expect(result).toBe(5); + } + + @Test("Tuple length") + public tupleLength() { + // Transpile + const lua = util.transpileString( + `const tuple: [number, number, number] = [3,5,1]; + return tuple.length;` + ); + + // Execute + const result = util.executeLua(lua); + + // Assert + Expect(result).toBe(3); + } + + @Test("Tuple Return Access") + public tupleReturnAccess() { + // Transpile + const lua = util.transpileString( + `/** !TupleReturn */\n + function tuple(): [number, number, number] { return [3,5,1]; }\n + return tuple()[2];` + ); + + // Execute + const result = util.executeLua(lua); + + // Assert + Expect(result).toBe(1); + } + + @Test("Tuple Return Destruct") + public tupleReturnDestruct() { + // Transpile + const lua = util.transpileString( + `/** !TupleReturn */\n + function tuple(): [number, number, number] { return [3,5,1]; }\n + const [a,b,c] = tuple(); + return b;` + ); + + // Execute + const result = util.executeLua(lua); + + // Assert + Expect(result).toBe(5); + } +} diff --git a/tsconfig.json b/tsconfig.json index c91b6d03f..1d2eb76cc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,9 @@ "outDir": "./dist/", "rootDir": "./src/", "sourceMap": true, - "experimentalDecorators": true + "experimentalDecorators": true, + "target": "es6", + "module": "commonjs" }, - "exclude": ["test/**/*"] + "exclude": ["test/**/*", "build_lualib.ts", "src/lualib"] } diff --git a/tslint.json b/tslint.json index b9bed7d7c..bb6058aba 100644 --- a/tslint.json +++ b/tslint.json @@ -9,11 +9,13 @@ "align": [true, "parameters", "statements", "arguments", "members", "elements"], "arrow-parens": [true, "ban-single-arg-parens"], "class-name": true, + "forin": false, "no-bitwise": false, "indent": [true, "spaces", 4], "max-classes-per-file": 1, "max-line-length": [true, 120], "no-console": [false], + "no-namespace": false, "trailing-comma": [ true, { @@ -27,7 +29,12 @@ } ], "interface-name": false, - "radix": false + "radix": false, + "typedef": [ + true, + "call-signature", + "property-declaration" + ] }, "rulesDirectory": [] }