[READ-ONLY] Mirror of https://github.com/probablykasper/embler. Turn binaries into applications npmjs.com/package/embler
app builder cli dmg macos node package packager
0

Configure Feed

Select the types of activity you want to include in your feed.

More async, improved logging

Kasper (Aug 17, 2020, 10:34 PM +0200) 926c0902 2d6938a6

+276 -46
+32 -12
main.js
··· 1 - const fs = require('fs') 2 1 const path = require('path') 3 2 const process = require('process') 4 3 ··· 6 5 const log = require('./src/log.js') 7 6 const { parseOptions, macBuild } = require('./src/build.js') 8 7 9 - function build(options) { 10 - log('Pakager', version) 8 + function getOptionsFromFile(packageJsonPath) { 9 + try { 10 + const packageJson = require(packageJsonPath) 11 + return packageJson 12 + } catch (err) { 13 + if (err.code === 'MODULE_NOT_FOUND') { 14 + log.err(`config file not found (${packageJsonPath})`) 15 + } else { 16 + throw err 17 + } 18 + } 19 + } 20 + 21 + async function start(options) { 22 + log.info('Pakager ' + version) 11 23 12 24 workingDir = process.cwd() 13 25 14 26 if (typeof options === 'string') { 15 - const packageJsonPath = path.resolve(options) 16 - if (!fs.existsSync(packageJsonPath)) { 17 - log.err(`package.json not found (${packageJsonPath})`) 18 - } 19 - const packageJson = require(packageJsonPath) 20 - options = packageJson 27 + log.info(`Loading config file (${options})`) 28 + const packageJsonFullPath = path.resolve(options) 29 + options = getOptionsFromFile(packageJsonFullPath) 21 30 22 31 // make sure paths in package.json are resolved relative to the package.json 23 - workingDir = path.dirname(packageJsonPath) 32 + workingDir = path.dirname(packageJsonFullPath) 33 + } else { 34 + log.info('Loading config') 24 35 } 25 36 26 - const parsedOptions = parseOptions(options, workingDir) 27 - macBuild(parsedOptions) 37 + const parsedOptions = await parseOptions(options, workingDir) 38 + log.info('Packing macOS app') 39 + await macBuild(parsedOptions) 40 + } 41 + 42 + async function build(options) { 43 + try { 44 + await start(options) 45 + } catch(err) { 46 + log.err(err) 47 + } 28 48 } 29 49 30 50 module.exports = { build }
+49
package-lock.json
··· 35 35 "@hapi/hoek": "^9.0.0" 36 36 } 37 37 }, 38 + "@types/color-name": { 39 + "version": "1.1.1", 40 + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 41 + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" 42 + }, 43 + "ansi-styles": { 44 + "version": "4.2.1", 45 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 46 + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 47 + "requires": { 48 + "@types/color-name": "^1.1.1", 49 + "color-convert": "^2.0.1" 50 + } 51 + }, 38 52 "base64-js": { 39 53 "version": "1.3.1", 40 54 "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", ··· 61 75 "big-integer": "^1.6.44" 62 76 } 63 77 }, 78 + "chalk": { 79 + "version": "4.1.0", 80 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 81 + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 82 + "requires": { 83 + "ansi-styles": "^4.1.0", 84 + "supports-color": "^7.1.0" 85 + } 86 + }, 87 + "color-convert": { 88 + "version": "2.0.1", 89 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 90 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 91 + "requires": { 92 + "color-name": "~1.1.4" 93 + } 94 + }, 95 + "color-name": { 96 + "version": "1.1.4", 97 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 98 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 99 + }, 100 + "has-flag": { 101 + "version": "4.0.0", 102 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 103 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 104 + }, 64 105 "joi": { 65 106 "version": "17.2.0", 66 107 "resolved": "https://registry.npmjs.org/joi/-/joi-17.2.0.tgz", ··· 107 148 "version": "2.2.0", 108 149 "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", 109 150 "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=" 151 + }, 152 + "supports-color": { 153 + "version": "7.1.0", 154 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 155 + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 156 + "requires": { 157 + "has-flag": "^4.0.0" 158 + } 110 159 }, 111 160 "xmlbuilder": { 112 161 "version": "9.0.7",
+1
package.json
··· 6 6 "pakager": "bin.js" 7 7 }, 8 8 "dependencies": { 9 + "chalk": "^4.1.0", 9 10 "joi": "^17.2.0", 10 11 "jsonschema": "^1.2.6", 11 12 "png2icons": "^2.0.1",
+25 -22
src/build.js
··· 1 1 const path = require('path') 2 - const fs = require('fs') 2 + const fs = require('fs').promises 3 3 const png2icons = require('png2icons') 4 4 const plist = require('simple-plist') 5 5 6 6 const log = require('./log.js') 7 7 8 - module.exports.parseOptions = function(packageJson, workingDir) { 8 + module.exports.parseOptions = async function(packageJson, workingDir) { 9 9 const Joi = require('./joi.js').prepare(workingDir) 10 10 const schema = Joi.object({ 11 11 name: Joi.string(), ··· 45 45 .or('author', 'pakager.author') 46 46 .or('version', 'pakager.version') 47 47 48 - const vResult = schema.validate(packageJson, { allowUnknown: true, abortEarly: false }) 49 - if (vResult.error) { 48 + try { 49 + const vResult = await schema.validateAsync(packageJson, { allowUnknown: true, abortEarly: false }) 50 + return vResult.pakager 51 + } catch(err) { 50 52 let errorMsg = '' 51 - for (const err of vResult.error.details) { 52 - // log(err) 53 - errorMsg += `\n - property ${err.message}` 53 + for (const detail of err.details) { 54 + log(detail) 55 + errorMsg += `\n - property ${detail.message}` 54 56 } 55 57 log.err('Invalid package.json config:' + errorMsg) 56 58 } 57 - return vResult.value.pakager 58 59 } 59 60 60 - module.exports.macBuild = function(options) { 61 + module.exports.macBuild = async function(options) { 61 62 62 63 const distDir = options.outputDir 63 64 const appPath = path.join(distDir, `${options.realName}.app`) ··· 66 67 const MacOSPath = path.join(distDir, `${options.realName}.app/Contents/MacOS`) 67 68 68 69 // delete existing .app 69 - if (fs.existsSync(appPath) && fs.statSync(appPath).isDirectory()) { 70 - fs.rmdirSync(appPath, { recursive: true }) 71 - } else if (fs.existsSync(appPath)) { 72 - log.err(`Mac app path is a non-folder. Delete or move it manually (${appPath})`) 70 + try { 71 + const appPathStat = await fs.stat(appPath) 72 + if (appPathStat.isDirectory()) { 73 + await fs.rmdir(appPath, { recursive: true }) 74 + } else { 75 + log.err(`Mac app path is a non-folder. Delete or move it manually (${appPath})`) 76 + } 77 + } catch(err) { 78 + if (err.code !== 'ENOENT') log.err(err) 73 79 } 74 80 75 81 // create .app folders 76 - fs.mkdirSync(ResourcesPath, { recursive: true }) 77 - fs.mkdirSync(MacOSPath, { recursive: true }) 82 + await fs.mkdir(ResourcesPath, { recursive: true }) 83 + await fs.mkdir(MacOSPath, { recursive: true }) 78 84 79 85 // copy over icon 80 86 if (options.mac.icon) { 81 - const inputIcon = fs.readFileSync(options.mac.icon) 87 + const inputIcon = await fs.readFile(options.mac.icon) 82 88 const iconDestPath = path.resolve(ResourcesPath, 'app.icns') 83 89 if (options.mac.icon.endsWith('.png')) { 84 90 const output = png2icons.createICNS(inputIcon, png2icons.BICUBIC, 0) 85 - if (output) fs.writeFileSync(iconDestPath, output) 91 + if (output) await fs.writeFile(iconDestPath, output) 86 92 else log.err('Failed to convert PNG app icon to ICNS') 87 93 } else if (options.mac.icon.endsWith('.icns')) { 88 - fs.writeFileSync(inputIcon, output) 94 + await fs.writeFile(inputIcon, output) 89 95 } 90 96 } 91 97 92 98 93 99 // copy over binary 94 - // const inputBinary = fs.readFileSync(options.mac.binary) 95 - // fs.writeFileSync(`${ContentsPath}/MacOS/${options.realName}`, inputBinary) 96 - fs.copyFileSync(options.mac.binary, `${MacOSPath}/${options.realName}`) 100 + await fs.copyFile(options.mac.binary, `${MacOSPath}/${options.realName}`) 97 101 98 102 const data = { 99 103 // CFBundleDevelopmentRegion ··· 112 116 } 113 117 if (options.mac.category) data.LSApplicationCategoryType = options.mac.category 114 118 for (const [key, value] of Object.entries(options.mac.customInfo)) { 115 - console.log(key, value) 116 119 data[key] = value 117 120 } 118 121 plist.writeFileSync(`${ContentsPath}/Info.plist`, data)
+19 -3
src/log.js
··· 1 - module.exports = function(...msg) { 1 + const chalk = require('chalk') 2 + const process = require('process') 3 + 4 + // ⸤⸣ ⬤ ❯ • ‣ ❱ 5 + const symbol = '⬤' 6 + 7 + const log = function(...msg) { 2 8 console.log(...msg) 3 9 } 4 10 5 - module.exports.err = function(...msg) { 6 - console.log('Error:', ...msg) 11 + log.info = function(...msg) { 12 + console.log(chalk.blue(symbol), ...msg) 13 + } 14 + 15 + log.warn = function(...msg) { 16 + console.log(chalk.yellow(symbol), ...msg) 17 + } 18 + 19 + log.err = function(...msg) { 20 + console.log(chalk.red(symbol), ...msg) 7 21 console.log('') 8 22 process.exit(1) 9 23 } 24 + 25 + module.exports = log
+150 -8
test/package-lock.json
··· 3 3 "requires": true, 4 4 "lockfileVersion": 1, 5 5 "dependencies": { 6 - "7zip-bin": { 7 - "version": "5.0.3", 8 - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.0.3.tgz", 9 - "integrity": "sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA==" 10 - }, 11 6 "@babel/parser": { 12 7 "version": "7.11.3", 13 8 "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", ··· 103 98 "uri-js": "^4.2.2" 104 99 } 105 100 }, 101 + "ansi-regex": { 102 + "version": "5.0.0", 103 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 104 + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 105 + "dev": true 106 + }, 106 107 "ansi-styles": { 107 108 "version": "4.2.1", 108 109 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", ··· 213 214 "dev": true 214 215 }, 215 216 "chalk": { 216 - "version": "3.0.0", 217 - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 218 - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 217 + "version": "4.1.0", 218 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 219 + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 219 220 "dev": true, 220 221 "requires": { 221 222 "ansi-styles": "^4.1.0", 222 223 "supports-color": "^7.1.0" 223 224 } 224 225 }, 226 + "cli-cursor": { 227 + "version": "3.1.0", 228 + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 229 + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 230 + "dev": true, 231 + "requires": { 232 + "restore-cursor": "^3.1.0" 233 + } 234 + }, 235 + "cli-spinners": { 236 + "version": "2.4.0", 237 + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz", 238 + "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==", 239 + "dev": true 240 + }, 241 + "clone": { 242 + "version": "1.0.4", 243 + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 244 + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", 245 + "dev": true 246 + }, 225 247 "color-convert": { 226 248 "version": "2.0.1", 227 249 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", ··· 275 297 "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 276 298 "dev": true 277 299 }, 300 + "defaults": { 301 + "version": "1.0.3", 302 + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", 303 + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", 304 + "dev": true, 305 + "requires": { 306 + "clone": "^1.0.2" 307 + } 308 + }, 278 309 "delayed-stream": { 279 310 "version": "1.0.0", 280 311 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", ··· 544 575 "is-extglob": "^2.1.1" 545 576 } 546 577 }, 578 + "is-interactive": { 579 + "version": "1.0.0", 580 + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", 581 + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", 582 + "dev": true 583 + }, 547 584 "is-number": { 548 585 "version": "7.0.0", 549 586 "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", ··· 641 678 "type-check": "~0.3.2" 642 679 } 643 680 }, 681 + "log-symbols": { 682 + "version": "4.0.0", 683 + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", 684 + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", 685 + "dev": true, 686 + "requires": { 687 + "chalk": "^4.0.0" 688 + } 689 + }, 644 690 "merge2": { 645 691 "version": "1.4.1", 646 692 "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", ··· 672 718 "mime-db": "1.44.0" 673 719 } 674 720 }, 721 + "mimic-fn": { 722 + "version": "2.1.0", 723 + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 724 + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 725 + "dev": true 726 + }, 675 727 "minimist": { 676 728 "version": "1.2.5", 677 729 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", ··· 702 754 "readable-stream": "^2.0.5" 703 755 } 704 756 }, 757 + "mute-stream": { 758 + "version": "0.0.8", 759 + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 760 + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 761 + "dev": true 762 + }, 705 763 "oauth-sign": { 706 764 "version": "0.9.0", 707 765 "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 708 766 "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 709 767 "dev": true 710 768 }, 769 + "onetime": { 770 + "version": "5.1.2", 771 + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 772 + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 773 + "dev": true, 774 + "requires": { 775 + "mimic-fn": "^2.1.0" 776 + } 777 + }, 711 778 "optionator": { 712 779 "version": "0.8.3", 713 780 "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", ··· 720 787 "prelude-ls": "~1.1.2", 721 788 "type-check": "~0.3.2", 722 789 "word-wrap": "~1.2.3" 790 + } 791 + }, 792 + "ora": { 793 + "version": "5.0.0", 794 + "resolved": "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz", 795 + "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==", 796 + "dev": true, 797 + "requires": { 798 + "chalk": "^4.1.0", 799 + "cli-cursor": "^3.1.0", 800 + "cli-spinners": "^2.4.0", 801 + "is-interactive": "^1.0.0", 802 + "log-symbols": "^4.0.0", 803 + "mute-stream": "0.0.8", 804 + "strip-ansi": "^6.0.0", 805 + "wcwidth": "^1.0.1" 723 806 } 724 807 }, 725 808 "os-tmpdir": { ··· 740 823 "requires": { 741 824 "joi": "^17.2.0", 742 825 "jsonschema": "^1.2.6", 826 + "ora": "^5.0.0", 743 827 "png2icons": "^2.0.1", 744 828 "simple-plist": "^1.1.0" 745 829 } ··· 787 871 "progress": "^2.0.3", 788 872 "resolve": "^1.15.1", 789 873 "stream-meter": "^1.0.4" 874 + }, 875 + "dependencies": { 876 + "chalk": { 877 + "version": "3.0.0", 878 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 879 + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 880 + "dev": true, 881 + "requires": { 882 + "ansi-styles": "^4.1.0", 883 + "supports-color": "^7.1.0" 884 + } 885 + } 790 886 } 791 887 }, 792 888 "pkg-fetch": { ··· 806 902 "request-progress": "^3.0.0", 807 903 "semver": "^6.3.0", 808 904 "unique-temp-dir": "^1.0.0" 905 + }, 906 + "dependencies": { 907 + "chalk": { 908 + "version": "3.0.0", 909 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 910 + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 911 + "dev": true, 912 + "requires": { 913 + "ansi-styles": "^4.1.0", 914 + "supports-color": "^7.1.0" 915 + } 916 + } 809 917 } 810 918 }, 811 919 "plist": { ··· 928 1036 "path-parse": "^1.0.6" 929 1037 } 930 1038 }, 1039 + "restore-cursor": { 1040 + "version": "3.1.0", 1041 + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1042 + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1043 + "dev": true, 1044 + "requires": { 1045 + "onetime": "^5.1.0", 1046 + "signal-exit": "^3.0.2" 1047 + } 1048 + }, 931 1049 "reusify": { 932 1050 "version": "1.0.4", 933 1051 "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", ··· 958 1076 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 959 1077 "dev": true 960 1078 }, 1079 + "signal-exit": { 1080 + "version": "3.0.3", 1081 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1082 + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 1083 + "dev": true 1084 + }, 961 1085 "simple-plist": { 962 1086 "version": "1.1.0", 963 1087 "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.0.tgz", ··· 1021 1145 "dev": true, 1022 1146 "requires": { 1023 1147 "safe-buffer": "~5.1.0" 1148 + } 1149 + }, 1150 + "strip-ansi": { 1151 + "version": "6.0.0", 1152 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1153 + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1154 + "dev": true, 1155 + "requires": { 1156 + "ansi-regex": "^5.0.0" 1024 1157 } 1025 1158 }, 1026 1159 "supports-color": { ··· 1154 1287 "assert-plus": "^1.0.0", 1155 1288 "core-util-is": "1.0.2", 1156 1289 "extsprintf": "^1.2.0" 1290 + } 1291 + }, 1292 + "wcwidth": { 1293 + "version": "1.0.1", 1294 + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 1295 + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", 1296 + "dev": true, 1297 + "requires": { 1298 + "defaults": "^1.0.3" 1157 1299 } 1158 1300 }, 1159 1301 "word-wrap": {
-1
test/package.json
··· 30 30 } 31 31 }, 32 32 "dependencies": { 33 - "7zip-bin": "^5.0.3", 34 33 "systray": "^1.0.5" 35 34 }, 36 35 "devDependencies": {