diff --git a/package-lock.json b/package-lock.json index 083b101..1e04029 100644 --- a/package-lock.json +++ b/package-lock.json @@ -108,6 +108,12 @@ "integrity": "sha512-KUyZdkGCnVPuXfsKmDUu2XLui65LZIJ2s0M57noy5e+ixUT2oK33ep7zlvgzI8LElcWqbf8AR+o/3GqAPac2zA==", "dev": true }, + "@types/triple-beam": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.1.tgz", + "integrity": "sha512-Hp2RwsY6bneFcyfl8Q4v1RTj9hCexh2JUXQtXNZt+GE2jWT+pbrcxJAb6iPml8FRJ5LWV0AvGi6LoCt5hbWIlw==", + "dev": true + }, "@types/yargs": { "version": "15.0.5", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", @@ -267,6 +273,14 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -365,6 +379,30 @@ "wrap-ansi": "^6.2.0" } }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -378,12 +416,45 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colornames": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", + "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "colorspace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -414,6 +485,16 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "diagnostics": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", + "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", + "requires": { + "colorspace": "1.1.x", + "enabled": "1.0.x", + "kuler": "1.0.x" + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -433,6 +514,19 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "enabled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "requires": { + "env-variable": "0.0.x" + } + }, + "env-variable": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", + "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -609,6 +703,16 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, + "fecha": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", + "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" + }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -792,8 +896,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "inquirer": { "version": "7.1.0", @@ -843,6 +946,11 @@ } } }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -863,6 +971,16 @@ "is-extglob": "^2.1.1" } }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -906,6 +1024,14 @@ "universalify": "^1.0.0" } }, + "kuler": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", + "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "requires": { + "colornames": "^1.1.1" + } + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -927,8 +1053,26 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "logform": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", + "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^2.3.3", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } }, "mimic-fn": { "version": "2.1.0", @@ -960,6 +1104,11 @@ "minimist": "^1.2.5" } }, + "moment": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz", + "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -986,6 +1135,11 @@ "wrappy": "1" } }, + "one-time": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", + "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" + }, "onetime": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", @@ -1068,6 +1222,11 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -1080,6 +1239,16 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", @@ -1136,6 +1305,11 @@ "tslib": "^1.9.0" } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -1174,6 +1348,14 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, "slice-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", @@ -1223,6 +1405,11 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -1233,6 +1420,14 @@ "strip-ansi": "^6.0.0" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -1308,6 +1503,11 @@ } } }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -1334,6 +1534,11 @@ "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, "tslib": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", @@ -1384,6 +1589,11 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "v8-compile-cache": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", @@ -1404,6 +1614,60 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "winston": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", + "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", + "requires": { + "async": "^2.6.1", + "diagnostics": "^1.1.1", + "is-stream": "^1.1.0", + "logform": "^2.1.1", + "one-time": "0.0.4", + "readable-stream": "^3.1.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.3.0" + } + }, + "winston-transport": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", + "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", + "requires": { + "readable-stream": "^2.3.6", + "triple-beam": "^1.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", diff --git a/package.json b/package.json index fcebca3..0797d31 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@types/adm-zip": "^0.4.33", "@types/fs-extra": "^9.0.1", "@types/node": "^12.12.43", + "@types/triple-beam": "^1.3.1", "@types/yargs": "^15.0.5", "@typescript-eslint/eslint-plugin": "^3.1.0", "@typescript-eslint/parser": "^3.1.0", @@ -41,8 +42,11 @@ "axios": "^0.19.2", "dotenv": "^8.2.0", "fs-extra": "^9.0.0", + "helios-distribution-types": "^1.0.0-pre.1", + "moment": "^2.26.0", "toml": "^3.0.0", - "yargs": "^15.3.1", - "helios-distribution-types": "^1.0.0-pre.1" + "triple-beam": "^1.3.0", + "winston": "^3.2.1", + "yargs": "^15.3.1" } } diff --git a/src/index.ts b/src/index.ts index c7b4944..f04d97b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,9 +10,12 @@ import { ServerStructure } from './model/struct/model/server.struct' import { VersionSegmentedRegistry } from './util/VersionSegmentedRegistry' import { VersionUtil } from './util/versionutil' import { MinecraftVersion } from './util/MinecraftVersion' +import { LoggerUtil } from './util/LoggerUtil' dotenv.config() +const logger = LoggerUtil.getLogger('Index') + function getRoot(): string { return resolvePath(process.env.ROOT as string) } @@ -86,13 +89,13 @@ const initRootCommand: yargs.CommandModule = { handler: async (argv) => { argv.root = getRoot() - console.debug(`Root set to ${argv.root}`) - console.debug('Invoked init root.') + logger.debug(`Root set to ${argv.root}`) + logger.debug('Invoked init root.') try { await new DistributionStructure(argv.root as string, '').init() - console.log(`Successfully created new root at ${argv.root}`) + logger.info(`Successfully created new root at ${argv.root}`) } catch (error) { - console.error(`Failed to init new root at ${argv.root}`, error) + logger.error(`Failed to init new root at ${argv.root}`, error) } } } @@ -141,8 +144,8 @@ const generateServerCommand: yargs.CommandModule = { handler: async (argv) => { argv.root = getRoot() - console.debug(`Root set to ${argv.root}`) - console.debug(`Generating server ${argv.id} for Minecraft ${argv.version}.`, + logger.debug(`Root set to ${argv.root}`) + logger.debug(`Generating server ${argv.id} for Minecraft ${argv.version}.`, `\n\t├ Forge version: ${argv.forge}`, `\n\t└ LiteLoader version: ${argv.liteloader}`) @@ -150,9 +153,9 @@ const generateServerCommand: yargs.CommandModule = { if(argv.forge != null) { if (VersionUtil.isPromotionVersion(argv.forge as string)) { - console.debug(`Resolving ${argv.forge} Forge Version..`) + logger.debug(`Resolving ${argv.forge} Forge Version..`) const version = await VersionUtil.getPromotedForgeVersion(minecraftVersion, argv.forge as string) - console.debug(`Forge version set to ${version}`) + logger.debug(`Forge version set to ${version}`) argv.forge = version } } @@ -183,16 +186,19 @@ const generateDistroCommand: yargs.CommandModule = { argv.root = getRoot() argv.baseUrl = getBaseURL() - console.debug(`Root set to ${argv.root}`) - console.debug(`Base Url set to ${argv.baseUrl}`) - console.debug(`Invoked generate distro name ${argv.name}.json.`) + logger.debug(`Root set to ${argv.root}`) + logger.debug(`Base Url set to ${argv.baseUrl}`) + logger.debug(`Invoked generate distro name ${argv.name}.json.`) try { const distributionStruct = new DistributionStructure(argv.root as string, argv.baseUrl as string) const distro = await distributionStruct.getSpecModel() - writeFile(resolvePath(argv.root as string, `${argv.name}.json`), JSON.stringify(distro, null, 2)) - console.log(distro) + const distroPath = resolvePath(argv.root as string, `${argv.name}.json`) + writeFile(distroPath, JSON.stringify(distro, null, 2)) + logger.info(`Successfully generated ${argv.name}.json`) + logger.info(`Saved to ${distroPath}`) + logger.debug('Preview:\n', distro) } catch (error) { - console.error(`Failed to generate distribution with root ${argv.root}.`, error) + logger.error(`Failed to generate distribution with root ${argv.root}.`, error) } } } @@ -218,7 +224,7 @@ const validateCommand: yargs.CommandModule = { return namePositional(yargs) }, handler: (argv) => { - console.debug(`Invoked validate with name ${argv.name}.json`) + logger.debug(`Invoked validate with name ${argv.name}.json`) } } @@ -226,11 +232,11 @@ const latestForgeCommand: yargs.CommandModule = { command: 'latest-forge ', describe: 'Get the latest version of forge.', handler: async (argv) => { - console.debug(`Invoked latest-forge with version ${argv.version}.`) + logger.debug(`Invoked latest-forge with version ${argv.version}.`) const minecraftVersion = new MinecraftVersion(argv.version as string) const forgeVer = await VersionUtil.getPromotedForgeVersion(minecraftVersion, 'latest') - console.log(`Latest version: Forge ${forgeVer} (${argv.version})`) + logger.info(`Latest version: Forge ${forgeVer} (${argv.version})`) } } @@ -238,21 +244,21 @@ const recommendedForgeCommand: yargs.CommandModule = { command: 'recommended-forge ', describe: 'Get the recommended version of forge. Returns latest if there is no recommended build.', handler: async (argv) => { - console.debug(`Invoked recommended-forge with version ${argv.version}.`) + logger.debug(`Invoked recommended-forge with version ${argv.version}.`) const index = await VersionUtil.getPromotionIndex() const minecraftVersion = new MinecraftVersion(argv.version as string) let forgeVer = VersionUtil.getPromotedVersionStrict(index, minecraftVersion, 'recommended') if (forgeVer != null) { - console.log(`Recommended version: Forge ${forgeVer} (${minecraftVersion})`) + logger.info(`Recommended version: Forge ${forgeVer} (${minecraftVersion})`) } else { - console.log(`No recommended build for ${minecraftVersion}. Checking for latest version..`) + logger.info(`No recommended build for ${minecraftVersion}. Checking for latest version..`) forgeVer = VersionUtil.getPromotedVersionStrict(index, minecraftVersion, 'latest') if (forgeVer != null) { - console.log(`Latest version: Forge ${forgeVer} (${minecraftVersion})`) + logger.info(`Latest version: Forge ${forgeVer} (${minecraftVersion})`) } else { - console.log(`No build available for ${minecraftVersion}.`) + logger.info(`No build available for ${minecraftVersion}.`) } } @@ -266,14 +272,14 @@ const testCommand: yargs.CommandModule = { return namePositional(yargs) }, handler: async (argv) => { - console.debug(`Invoked test with mcVer ${argv.mcVer} forgeVer ${argv.forgeVer}`) - console.log(process.cwd()) + logger.debug(`Invoked test with mcVer ${argv.mcVer} forgeVer ${argv.forgeVer}`) + logger.info(process.cwd()) const mcVer = new MinecraftVersion(argv.mcVer as string) const resolver = VersionSegmentedRegistry.getForgeResolver(mcVer, argv.forgeVer as string, getRoot(), '', getBaseURL()) if (resolver != null) { const mdl = await resolver.getModule() - console.log(inspect(mdl, false, null, true)) + logger.info(inspect(mdl, false, null, true)) } } } diff --git a/src/model/struct/model/module/forgemod/forgemod113.struct.ts b/src/model/struct/model/module/forgemod/forgemod113.struct.ts index 13eac64..6775eed 100644 --- a/src/model/struct/model/module/forgemod/forgemod113.struct.ts +++ b/src/model/struct/model/module/forgemod/forgemod113.struct.ts @@ -6,9 +6,12 @@ import { VersionUtil } from '../../../../../util/versionutil' import { ModsToml } from '../../../../forge/modstoml' import { BaseForgeModStructure } from '../forgemod.struct' import { MinecraftVersion } from '../../../../../util/MinecraftVersion' +import { LoggerUtil } from '../../../../../util/LoggerUtil' export class ForgeModStructure113 extends BaseForgeModStructure { + private static readonly logger = LoggerUtil.getLogger('ForgeModStructure (1.13)') + public static readonly IMPLEMENTATION_VERSION_REGEX = /^Implementation-Version: (.+)[\r\n]/ // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -83,25 +86,25 @@ export class ForgeModStructure113 extends BaseForgeModStructure { let version = '0.0.0' const manifest = zip.readAsText('META-INF/MANIFEST.MF') const keys = manifest.split('\n') - console.log(keys) + ForgeModStructure113.logger.debug(keys) for (const key of keys) { const match = ForgeModStructure113.IMPLEMENTATION_VERSION_REGEX.exec(key) if (match != null) { version = match[1] } } - console.debug(`ForgeMod ${name} contains a version wildcard, inferring ${version}`) + ForgeModStructure113.logger.debug(`ForgeMod ${name} contains a version wildcard, inferring ${version}`) parsed.mods[0].version = version } this.forgeModMetadata[name] = parsed } catch (err) { - console.error(`ForgeMod ${name} contains an invalid mods.toml file.`) + ForgeModStructure113.logger.error(`ForgeMod ${name} contains an invalid mods.toml file.`) createDefault = true } } else { - console.error(`ForgeMod ${name} does not contain mods.toml file.`) + ForgeModStructure113.logger.error(`ForgeMod ${name} does not contain mods.toml file.`) createDefault = true } diff --git a/src/model/struct/model/module/forgemod/forgemod17.struct.ts b/src/model/struct/model/module/forgemod/forgemod17.struct.ts index 98bd8b9..63e4976 100644 --- a/src/model/struct/model/module/forgemod/forgemod17.struct.ts +++ b/src/model/struct/model/module/forgemod/forgemod17.struct.ts @@ -6,9 +6,12 @@ import { McModInfo } from '../../../../forge/mcmodinfo' import { McModInfoList } from '../../../../forge/mcmodinfolist' import { BaseForgeModStructure } from '../forgemod.struct' import { MinecraftVersion } from '../../../../../util/MinecraftVersion' +import { LoggerUtil } from '../../../../../util/LoggerUtil' export class ForgeModStructure17 extends BaseForgeModStructure { + private static readonly logger = LoggerUtil.getLogger('ForgeModStructure (1.7)') + // eslint-disable-next-line @typescript-eslint/no-unused-vars public static isForVersion(version: MinecraftVersion, libraryVersion: string): boolean { return VersionUtil.isVersionAcceptable(version, [7, 8, 9, 10, 11, 12]) @@ -92,11 +95,11 @@ export class ForgeModStructure17 extends BaseForgeModStructure { this.forgeModMetadata[name]!.version = '0.0.0' } } catch (err) { - console.error(`ForgeMod ${name} contains an invalid mcmod.info file.`) + ForgeModStructure17.logger.error(`ForgeMod ${name} contains an invalid mcmod.info file.`) createDefault = true } } else { - console.error(`ForgeMod ${name} does not contain mcmod.info file.`) + ForgeModStructure17.logger.error(`ForgeMod ${name} does not contain mcmod.info file.`) createDefault = true } diff --git a/src/model/struct/model/server.struct.ts b/src/model/struct/model/server.struct.ts index 084d3fa..589c51f 100644 --- a/src/model/struct/model/server.struct.ts +++ b/src/model/struct/model/server.struct.ts @@ -9,9 +9,12 @@ import { MiscFileStructure } from './module/file.struct' import { LiteModStructure } from './module/litemod.struct' import { LibraryStructure } from './module/library.struct' import { MinecraftVersion } from '../../../util/MinecraftVersion' +import { LoggerUtil } from '../../../util/LoggerUtil' export class ServerStructure extends BaseModelStructure { + private static readonly logger = LoggerUtil.getLogger('ServerStructure') + private readonly ID_REGEX = /(.+-(.+)$)/ constructor( @@ -41,7 +44,7 @@ export class ServerStructure extends BaseModelStructure { const relativeServerRoot = join(this.relativeRoot, effectiveId) if (await pathExists(absoluteServerRoot)) { - console.error('Server already exists! Aborting.') + ServerStructure.logger.error('Server already exists! Aborting.') return } @@ -86,8 +89,8 @@ export class ServerStructure extends BaseModelStructure { const match = this.ID_REGEX.exec(file) if (match == null) { - console.warn(`Server directory ${file} does not match the defined standard.`) - console.warn('All server ids must end with - (ex. -1.12.2)') + ServerStructure.logger.warn(`Server directory ${file} does not match the defined standard.`) + ServerStructure.logger.warn('All server ids must end with - (ex. -1.12.2)') continue } @@ -103,7 +106,7 @@ export class ServerStructure extends BaseModelStructure { } if (!iconUrl) { - console.warn(`No icon file found for server ${file}.`) + ServerStructure.logger.warn(`No icon file found for server ${file}.`) iconUrl = '' } @@ -167,7 +170,7 @@ export class ServerStructure extends BaseModelStructure { }) } else { - console.warn(`Path ${file} in server directory is not a directory!`) + ServerStructure.logger.warn(`Path ${file} in server directory is not a directory!`) } } return accumulator diff --git a/src/model/struct/repo/BaseMavenRepo.ts b/src/model/struct/repo/BaseMavenRepo.ts index 8dc8331..f9f4dab 100644 --- a/src/model/struct/repo/BaseMavenRepo.ts +++ b/src/model/struct/repo/BaseMavenRepo.ts @@ -4,9 +4,12 @@ import { dirname, join, resolve } from 'path' import { resolve as resolveURL } from 'url' import { MavenUtil } from '../../../util/maven' import { BaseFileStructure } from '../BaseFileStructure' +import { LoggerUtil } from '../../../util/LoggerUtil' export abstract class BaseMavenRepo extends BaseFileStructure { + private static readonly logger = LoggerUtil.getLogger('BaseMavenRepo') + constructor( absoluteRoot: string, relativeRoot: string, @@ -54,7 +57,7 @@ export abstract class BaseMavenRepo extends BaseFileStructure { } public async downloadArtifactDirect(url: string, path: string): Promise { - console.debug(`Downloading ${url}..`) + BaseMavenRepo.logger.debug(`Downloading ${url}..`) const response = await axios({ method: 'get', url, @@ -67,7 +70,7 @@ export abstract class BaseMavenRepo extends BaseFileStructure { // tslint:disable-next-line: no-shadowed-variable return new Promise((resolve, reject) => { writer.on('finish', () => { - console.debug(`Completed download of ${url}.`) + BaseMavenRepo.logger.debug(`Completed download of ${url}.`) resolve() }) writer.on('error', reject) diff --git a/src/resolver/forge/adapter/ForgeGradle2.resolver.ts b/src/resolver/forge/adapter/ForgeGradle2.resolver.ts index f70b9da..368ebd7 100644 --- a/src/resolver/forge/adapter/ForgeGradle2.resolver.ts +++ b/src/resolver/forge/adapter/ForgeGradle2.resolver.ts @@ -10,11 +10,14 @@ import { PackXZExtractWrapper } from '../../../util/PackXZExtractWrapper' import { VersionUtil } from '../../../util/versionutil' import { ForgeResolver } from '../forge.resolver' import { MinecraftVersion } from '../../../util/MinecraftVersion' +import { LoggerUtil } from '../../../util/LoggerUtil' type ArrayElement = A extends readonly (infer T)[] ? T : never export class ForgeGradle2Adapter extends ForgeResolver { + private static readonly logger = LoggerUtil.getLogger('FG2 Adapter') + public static isForVersion(version: MinecraftVersion, libraryVersion: string): boolean { if(version.getMinor() === 12 && !VersionUtil.isOneDotTwelveFG2(libraryVersion)) { return false @@ -43,18 +46,18 @@ export class ForgeGradle2Adapter extends ForgeResolver { public async getForgeByVersion(): Promise { const libRepo = this.repoStructure.getLibRepoStruct() const targetLocalPath = libRepo.getLocalForge(this.artifactVersion, 'universal') - console.debug(`Checking for forge version at ${targetLocalPath}..`) + ForgeGradle2Adapter.logger.debug(`Checking for forge version at ${targetLocalPath}..`) if (!await libRepo.artifactExists(targetLocalPath)) { - console.debug('Forge not found locally, initializing download..') + ForgeGradle2Adapter.logger.debug('Forge not found locally, initializing download..') await libRepo.downloadArtifactByComponents( this.REMOTE_REPOSITORY, LibRepoStructure.FORGE_GROUP, LibRepoStructure.FORGE_ARTIFACT, this.artifactVersion, 'universal', 'jar') } else { - console.debug('Using locally discovered forge.') + ForgeGradle2Adapter.logger.debug('Using locally discovered forge.') } - console.debug(`Beginning processing of Forge v${this.forgeVersion} (Minecraft ${this.minecraftVersion})`) + ForgeGradle2Adapter.logger.debug(`Beginning processing of Forge v${this.forgeVersion} (Minecraft ${this.minecraftVersion})`) const forgeUniversalBuffer = await readFile(targetLocalPath) const zip = new AdmZip(forgeUniversalBuffer) @@ -103,7 +106,7 @@ export class ForgeGradle2Adapter extends ForgeResolver { // We've already processed forge. continue } - console.debug(`Processing ${lib.name}..`) + ForgeGradle2Adapter.logger.debug(`Processing ${lib.name}..`) const extension = await this.determineExtension(lib, libRepo) const localPath = libRepo.getArtifactById(lib.name, extension) @@ -120,13 +123,13 @@ export class ForgeGradle2Adapter extends ForgeResolver { if (lib.checksums != null && lib.checksums.length == 1) { const sha1 = createHash('sha1').update(libBuf).digest('hex') if (sha1 !== lib.checksums[0]) { - console.debug('Hashes do not match, redownloading..') + ForgeGradle2Adapter.logger.debug('Hashes do not match, redownloading..') queueDownload = true } } } } else { - console.debug('Not found locally, downloading..') + ForgeGradle2Adapter.logger.debug('Not found locally, downloading..') queueDownload = true } @@ -134,7 +137,7 @@ export class ForgeGradle2Adapter extends ForgeResolver { await libRepo.downloadArtifactById(lib.url || this.MOJANG_REMOTE_REPOSITORY, lib.name, extension) libBuf = await readFile(localPath) } else { - console.debug('Using local copy.') + ForgeGradle2Adapter.logger.debug('Using local copy.') } const stats = await lstat(localPath) @@ -174,7 +177,7 @@ export class ForgeGradle2Adapter extends ForgeResolver { if (el != null) { el.artifact.MD5 = entry.MD5 } else { - console.error(`Error during post processing, could not update ${entry.id}`) + ForgeGradle2Adapter.logger.error(`Error during post processing, could not update ${entry.id}`) } } @@ -185,7 +188,7 @@ export class ForgeGradle2Adapter extends ForgeResolver { if(lib.url == null) { return 'jar' } - console.log('Determing extension..') + ForgeGradle2Adapter.logger.debug('Determing extension..') const possibleExt = [ 'jar.pack.xz', 'jar' @@ -234,9 +237,9 @@ export class ForgeGradle2Adapter extends ForgeResolver { files.push(tmpFile) } - console.debug('Spawning PackXZExtract.') + ForgeGradle2Adapter.logger.debug('Spawning PackXZExtract.') await PackXZExtractWrapper.extractUnpack(files) - console.debug('All files extracted, calculating hashes..') + ForgeGradle2Adapter.logger.debug('All files extracted, calculating hashes..') for (const entry of processingQueue) { const tmpFileName = basename(entry.localPath) @@ -248,7 +251,7 @@ export class ForgeGradle2Adapter extends ForgeResolver { }) } - console.debug('Complete, removing temp directory..') + ForgeGradle2Adapter.logger.debug('Complete, removing temp directory..') await remove(tempDir) diff --git a/src/resolver/forge/adapter/ForgeGradle3.resolver.ts b/src/resolver/forge/adapter/ForgeGradle3.resolver.ts index 4e44bfb..61f1920 100644 --- a/src/resolver/forge/adapter/ForgeGradle3.resolver.ts +++ b/src/resolver/forge/adapter/ForgeGradle3.resolver.ts @@ -1,6 +1,7 @@ import AdmZip from 'adm-zip' import { ForgeResolver } from '../forge.resolver' import { MinecraftVersion } from '../../../util/MinecraftVersion' +import { LoggerUtil } from '../../../util/LoggerUtil' import { VersionUtil } from '../../../util/versionutil' import { Module, Type } from 'helios-distribution-types' import { LibRepoStructure } from '../../../model/struct/repo/librepo.struct' @@ -23,6 +24,8 @@ interface GeneratedFile { export class ForgeGradle3Adapter extends ForgeResolver { + private static readonly logger = LoggerUtil.getLogger('FG3 Adapter') + private static readonly WILDCARD_MCP_VERSION = '${mcpVersion}' public static isForVersion(version: MinecraftVersion, libraryVersion: string): boolean { @@ -133,9 +136,9 @@ export class ForgeGradle3Adapter extends ForgeResolver { // Get Installer const installerPath = libRepo.getLocalForge(this.artifactVersion, 'installer') - console.debug(`Checking for forge installer at ${installerPath}..`) + ForgeGradle3Adapter.logger.debug(`Checking for forge installer at ${installerPath}..`) if (!await libRepo.artifactExists(installerPath)) { - console.debug('Forge installer not found locally, initializing download..') + ForgeGradle3Adapter.logger.debug('Forge installer not found locally, initializing download..') await libRepo.downloadArtifactByComponents( this.REMOTE_REPOSITORY, LibRepoStructure.FORGE_GROUP, @@ -143,9 +146,9 @@ export class ForgeGradle3Adapter extends ForgeResolver { this.artifactVersion, 'installer', 'jar' ) } else { - console.debug('Using locally discovered forge installer.') + ForgeGradle3Adapter.logger.debug('Using locally discovered forge installer.') } - console.debug(`Beginning processing of Forge v${this.forgeVersion} (Minecraft ${this.minecraftVersion})`) + ForgeGradle3Adapter.logger.debug(`Beginning processing of Forge v${this.forgeVersion} (Minecraft ${this.minecraftVersion})`) if(this.generatedFiles != null && this.generatedFiles.length > 0) { // Run installer @@ -173,28 +176,28 @@ export class ForgeGradle3Adapter extends ForgeResolver { // Required for the installer to function. await writeFile(join(workDir, 'launcher_profiles.json'), JSON.stringify({})) - console.debug('Spawning forge installer') + ForgeGradle3Adapter.logger.debug('Spawning forge installer') - console.log('============== [ IMPORTANT ] ==============') - console.log('When the installer opens please set the client installation directory to:') - console.log(workDir) - console.log('===========================================') + ForgeGradle3Adapter.logger.info('============== [ IMPORTANT ] ==============') + ForgeGradle3Adapter.logger.info('When the installer opens please set the client installation directory to:') + ForgeGradle3Adapter.logger.info(workDir) + ForgeGradle3Adapter.logger.info('===========================================') await this.executeInstaller(workingInstaller) - console.debug('Installer finished, beginning processing..') + ForgeGradle3Adapter.logger.debug('Installer finished, beginning processing..') - console.debug('Processing Version Manifest') + ForgeGradle3Adapter.logger.debug('Processing Version Manifest') const versionManifestTuple = await this.processVersionManifest() const versionManifest = versionManifestTuple[0] as VersionManifestFG3 - console.debug('Processing generated forge files.') + ForgeGradle3Adapter.logger.debug('Processing generated forge files.') const forgeModule = await this.processForgeModule(versionManifest) // Attach version.json module. forgeModule.subModules?.unshift(versionManifestTuple[1] as Module) - console.debug('Processing Libraries') + ForgeGradle3Adapter.logger.debug('Processing Libraries') const libs = await this.processLibraries(versionManifest) forgeModule.subModules = forgeModule.subModules?.concat(libs) @@ -388,16 +391,22 @@ export class ForgeGradle3Adapter extends ForgeResolver { private executeInstaller(installerExec: string): Promise { return new Promise(resolve => { + const fiLogger = LoggerUtil.getLogger('Forge Installer') const child = spawn(JavaUtil.getJavaExecutable(), [ '-jar', installerExec ], { cwd: dirname(installerExec) }) - child.stdout.on('data', (data) => console.log('[Forge Installer]', data.toString('utf8').trim())) - child.stderr.on('data', (data) => console.error('[Forge Installer]', data.toString('utf8').trim())) + child.stdout.on('data', (data) => fiLogger.info(data.toString('utf8').trim())) + child.stderr.on('data', (data) => fiLogger.error(data.toString('utf8').trim())) child.on('close', code => { - console.log('[Forge Installer]', 'Exited with code', code) + if(code === 0) { + fiLogger.info('Exited with code', code) + } else { + fiLogger.error('Exited with code', code) + } + resolve() }) }) @@ -445,7 +454,7 @@ export class ForgeGradle3Adapter extends ForgeResolver { const libRepo = this.repoStructure.getLibRepoStruct() const universalLocalPath = libRepo.getLocalForge(this.artifactVersion, 'universal') - console.debug(`Checking for Forge Universal jar at ${universalLocalPath}..`) + ForgeGradle3Adapter.logger.debug(`Checking for Forge Universal jar at ${universalLocalPath}..`) const forgeMdl = versionManifest.libraries.find(val => val.name.startsWith('net.minecraftforge:forge:')) @@ -460,14 +469,14 @@ export class ForgeGradle3Adapter extends ForgeResolver { const localUniBuf = await readFile(universalLocalPath) const sha1 = createHash('sha1').update(localUniBuf).digest('hex') if(sha1 !== forgeMdl.downloads.artifact.sha1) { - console.debug('SHA-1 of local universal jar does not match version.json entry.') - console.debug('Redownloading Forge Universal jar..') + ForgeGradle3Adapter.logger.debug('SHA-1 of local universal jar does not match version.json entry.') + ForgeGradle3Adapter.logger.debug('Redownloading Forge Universal jar..') } else { - console.debug('Using locally discovered forge.') + ForgeGradle3Adapter.logger.debug('Using locally discovered forge.') forgeUniversalBuffer = localUniBuf } } else { - console.debug('Forge Universal jar not found locally, initializing download..') + ForgeGradle3Adapter.logger.debug('Forge Universal jar not found locally, initializing download..') } // Download if local is missing or corrupt @@ -480,7 +489,7 @@ export class ForgeGradle3Adapter extends ForgeResolver { forgeUniversalBuffer = await readFile(universalLocalPath) } - console.debug(`Beginning processing of Forge v${this.forgeVersion} (Minecraft ${this.minecraftVersion})`) + ForgeGradle3Adapter.logger.debug(`Beginning processing of Forge v${this.forgeVersion} (Minecraft ${this.minecraftVersion})`) const forgeModule: Module = { id: MavenUtil.mavenComponentsToIdentifier( @@ -521,7 +530,7 @@ export class ForgeGradle3Adapter extends ForgeResolver { // We've already processed forge. continue } - console.debug(`Processing ${lib.name}..`) + ForgeGradle3Adapter.logger.debug(`Processing ${lib.name}..`) const extension = 'jar' const localPath = libRepo.getArtifactById(lib.name, extension) @@ -533,11 +542,11 @@ export class ForgeGradle3Adapter extends ForgeResolver { libBuf = await readFile(localPath) const sha1 = createHash('sha1').update(libBuf).digest('hex') if (sha1 !== lib.downloads.artifact.sha1) { - console.debug('Hashes do not match, redownloading..') + ForgeGradle3Adapter.logger.debug('Hashes do not match, redownloading..') queueDownload = true } } else { - console.debug('Not found locally, downloading..') + ForgeGradle3Adapter.logger.debug('Not found locally, downloading..') queueDownload = true } @@ -545,7 +554,7 @@ export class ForgeGradle3Adapter extends ForgeResolver { await libRepo.downloadArtifactDirect(lib.downloads.artifact.url, lib.downloads.artifact.path) libBuf = await readFile(localPath) } else { - console.debug('Using local copy.') + ForgeGradle3Adapter.logger.debug('Using local copy.') } const stats = await lstat(localPath) diff --git a/src/util/LoggerUtil.ts b/src/util/LoggerUtil.ts new file mode 100644 index 0000000..f11000f --- /dev/null +++ b/src/util/LoggerUtil.ts @@ -0,0 +1,44 @@ +import { createLogger, format, transports, Logger } from 'winston' +import { SPLAT } from 'triple-beam' +import moment from 'moment' +import { inspect } from 'util' + +export class LoggerUtil { + + public static getLogger(label: string): Logger { + return createLogger({ + format: format.combine( + format.label(), + format.colorize(), + format.label({ label }), + format.printf(info => { + if(info[SPLAT]) { + if(info[SPLAT].length === 1 && info[SPLAT][0] instanceof Error) { + const err = info[SPLAT][0] as Error + if(info.message.length > err.message.length && info.message.endsWith(err.message)) { + info.message = info.message.substring(0, info.message.length-err.message.length) + } + } else if(info[SPLAT].length > 0) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + info.message += ' ' + info[SPLAT].map((it: any) => { + if(typeof it === 'object' && it != null) { + return inspect(it, false, 4, true) + } + return it + }).join(' ') + } + } + if(typeof info.message === 'object') { + info.message = inspect(info.message, false, 4, true) + } + return `[${moment().format('YYYY-MM-DD hh:mm:ss').trim()}] [${info.level}] [${info.label}]: ${info.message}${info.stack ? `\n${info.stack}` : ''}` + }) + ), + level: 'debug', + transports: [ + new transports.Console() + ] + }) + } + +} \ No newline at end of file diff --git a/src/util/PackXZExtractWrapper.ts b/src/util/PackXZExtractWrapper.ts index fee8032..fd50e55 100644 --- a/src/util/PackXZExtractWrapper.ts +++ b/src/util/PackXZExtractWrapper.ts @@ -1,9 +1,12 @@ import { spawn } from 'child_process' import { join } from 'path' import { JavaUtil } from './javautil' +import { LoggerUtil } from './LoggerUtil' export class PackXZExtractWrapper { + private static readonly logger = LoggerUtil.getLogger('PackXZExtract') + public static getPackXZExtract(): string { return join(process.cwd(), 'libraries', 'java', 'PackXZExtract.jar') } @@ -28,14 +31,14 @@ export class PackXZExtractWrapper { command, paths.join(',') ]) - child.stdout.on('data', (data) => console.log('[PackXZExtract]', data.toString('utf8').trim())) - child.stderr.on('data', (data) => console.error('[PackXZExtract]', data.toString('utf8').trim())) + child.stdout.on('data', (data) => PackXZExtractWrapper.logger.info(data.toString('utf8').trim())) + child.stderr.on('data', (data) => PackXZExtractWrapper.logger.error(data.toString('utf8').trim())) child.on('close', code => { - console.log('[PackXZExtract]', 'Exited with code', code) + PackXZExtractWrapper.logger.info('Exited with code', code) resolve() }) child.on('error', (err) => { - console.log('[PackXZExtract]', 'Error during process execution', err) + PackXZExtractWrapper.logger.info('Error during process execution', err) reject(err) }) }) diff --git a/src/util/versionutil.ts b/src/util/versionutil.ts index 39849bf..6fc22c0 100644 --- a/src/util/versionutil.ts +++ b/src/util/versionutil.ts @@ -1,9 +1,12 @@ import Axios from 'axios' import { PromotionsSlim } from '../model/forge/promotionsslim' import { MinecraftVersion } from './MinecraftVersion' +import { LoggerUtil } from './LoggerUtil' export class VersionUtil { + private static readonly logger = LoggerUtil.getLogger('VersionUtil') + public static readonly PROMOTION_TYPE = [ 'recommended', 'latest' @@ -54,8 +57,8 @@ export class VersionUtil { const res = await VersionUtil.getPromotionIndex() let version = res.promos[`${minecraftVersion}-${workingPromotion}`] if (version == null) { - console.warn(`No ${workingPromotion} version found for Forge ${minecraftVersion}.`) - console.warn('Attempting to pull latest version instead.') + VersionUtil.logger.warn(`No ${workingPromotion} version found for Forge ${minecraftVersion}.`) + VersionUtil.logger.warn('Attempting to pull latest version instead.') version = res.promos[`${minecraftVersion}-latest`] if (version == null) { throw new Error(`No latest version found for Forge ${minecraftVersion}.`)