From ebca7a0041e1773176172720f08cad6610969762 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 18 Oct 2018 17:20:22 -0300 Subject: [PATCH 1/7] switch to new module --- app/package.json | 2 +- app/yarn.lock | 146 ++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 134 insertions(+), 14 deletions(-) diff --git a/app/package.json b/app/package.json index 4325fccd680..451874b1d81 100644 --- a/app/package.json +++ b/app/package.json @@ -31,6 +31,7 @@ "event-kit": "^2.0.0", "file-uri-to-path": "0.0.2", "file-url": "^2.0.2", + "fs-admin": "^0.1.7", "fs-extra": "^6.0.0", "fuzzaldrin-plus": "^0.6.0", "keytar": "^4.0.4", @@ -45,7 +46,6 @@ "react-transition-group": "^1.2.0", "react-virtualized": "^9.20.0", "registry-js": "^1.0.7", - "runas": "^3.1.1", "source-map-support": "^0.4.15", "strip-ansi": "^4.0.0", "textarea-caret": "^3.0.2", diff --git a/app/yarn.lock b/app/yarn.lock index ec0bd890221..999709ff9f6 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -114,6 +114,10 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + byline@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" @@ -203,6 +207,12 @@ combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +commander@2.9.0: + version "2.9.0" + resolved "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -248,6 +258,12 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +debug@2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -279,6 +295,10 @@ dexie@^2.0.0: resolved "https://registry.yarnpkg.com/dexie/-/dexie-2.0.4.tgz#6027a5e05879424e8f9979d8c14e7420f27e3a11" integrity sha512-aQ/s1U2wHxwBKRrt2Z/mwFNHMQWhESerFsMYzE+5P5OsIe5o1kgpFMWkzKTtkvkyyEni6mWr/T4HUJuY9xIHLA== +diff@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + dom-classlist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dom-classlist/-/dom-classlist-1.0.1.tgz#722814dc2f509d3d7d06f2533ba9ff48eeea59b9" @@ -372,7 +392,7 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -escape-string-regexp@^1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -456,6 +476,13 @@ form-data@~2.3.2: combined-stream "1.0.6" mime-types "^2.1.12" +fs-admin@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/fs-admin/-/fs-admin-0.1.7.tgz#428e7d7678b87f159bcf74fa43107e829d25c7d7" + dependencies: + mocha "^3.5.0" + nan "^2.10.0" + fs-extra@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.0.tgz#0f0afb290bb3deb87978da816fcd3c7797f3a817" @@ -489,6 +516,17 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +glob@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.0.5: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -506,6 +544,14 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -519,11 +565,19 @@ har-validator@~5.1.0: ajv "^5.3.0" har-schema "^2.0.0" +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= +he@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + highlight.js@^9.3.0: version "9.12.0" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" @@ -619,6 +673,10 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + jsonfile@^2.2.3: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -660,6 +718,53 @@ keytar@^4.0.4: dependencies: nan "2.5.1" +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.0, loose-envify@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" @@ -709,7 +814,7 @@ mime-types@~2.1.19: dependencies: mime-db "~1.36.0" -minimatch@^3.0.4: +minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -750,6 +855,23 @@ mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "0.0.8" +mocha@^3.5.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.6.8" + diff "3.2.0" + escape-string-regexp "1.0.5" + glob "7.1.1" + growl "1.9.2" + he "1.1.1" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + moment@^2.17.1: version "2.18.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" @@ -770,10 +892,9 @@ nan@2.5.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2" integrity sha1-1bAWkSUzJql6K77p5hxV2NYDUeI= -nan@2.x: - version "2.7.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" - integrity sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY= +nan@^2.10.0: + version "2.11.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" nan@^2.8.0: version "2.8.0" @@ -1003,13 +1124,6 @@ rimraf@~2.2.6: resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= -runas@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/runas/-/runas-3.1.1.tgz#52dd538db0e41745399535a347091ba45cc0eab0" - integrity sha1-Ut1TjbDkF0U5lTWjRwkbpFzA6rA= - dependencies: - nan "2.x" - safe-buffer@^5.0.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -1081,6 +1195,12 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + supports-color@^4.0.0: version "4.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" From 2c6ffa95031a618c4b202e9c3f6cd9e0429a6c18 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 18 Oct 2018 17:20:35 -0300 Subject: [PATCH 2/7] update usages to suit new API --- app/src/ui/lib/install-cli.ts | 90 +++++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 25 deletions(-) diff --git a/app/src/ui/lib/install-cli.ts b/app/src/ui/lib/install-cli.ts index 584eb519139..f1f45c73e5b 100644 --- a/app/src/ui/lib/install-cli.ts +++ b/app/src/ui/lib/install-cli.ts @@ -1,11 +1,7 @@ -import * as Fs from 'fs' +import * as FSE from 'fs-extra' import * as Path from 'path' -const runas: ( - command: string, - args: ReadonlyArray, - options?: { admin: boolean } -) => number = require('runas') +const fsAdmin = require('fs-admin') /** The path for the installed command line tool. */ export const InstalledCLIPath = '/usr/local/bin/github' @@ -21,16 +17,16 @@ export async function installCLI(): Promise { } try { - symlinkCLI(false) + await symlinkCLI(false) } catch (e) { // If we error without running as an admin, try again as an admin. - symlinkCLI(true) + await symlinkCLI(true) } } async function getResolvedInstallPath(): Promise { return new Promise((resolve, reject) => { - Fs.readlink(InstalledCLIPath, (err, realpath) => { + FSE.readlink(InstalledCLIPath, (err, realpath) => { if (err) { resolve(null) } else { @@ -40,27 +36,71 @@ async function getResolvedInstallPath(): Promise { }) } -function symlinkCLI(asAdmin: boolean) { - let exitCode = runas('/bin/rm', ['-f', InstalledCLIPath], { admin: asAdmin }) - if (exitCode !== 0) { - throw new Error( - `Failed to remove file at ${InstalledCLIPath}. Authorization of GitHub Desktop Helper is required.` - ) +function removeExistingSymlink(asAdmin: boolean) { + if (!asAdmin) { + return FSE.unlink(InstalledCLIPath) } - exitCode = runas('/bin/mkdir', ['-p', Path.dirname(InstalledCLIPath)], { - admin: asAdmin, + return new Promise((resolve, reject) => { + fsAdmin.unlink(InstalledCLIPath, (error: Error | null) => { + if (error !== null) { + reject( + new Error( + `Failed to remove file at ${InstalledCLIPath}. Authorization of GitHub Desktop Helper is required.` + ) + ) + return + } + + resolve() + }) }) - if (exitCode !== 0) { - throw new Error( - `Failed to create intermediate directories to ${InstalledCLIPath}` - ) +} + +function createDirectories(asAdmin: boolean) { + const path = Path.dirname(InstalledCLIPath) + + if (!asAdmin) { + return FSE.mkdirp(path) } - exitCode = runas('/bin/ln', ['-s', PackagedPath, InstalledCLIPath], { - admin: asAdmin, + return new Promise((resolve, reject) => { + fsAdmin.makeTree(path, (error: Error | null) => { + if (error !== null) { + reject( + new Error( + `Failed to create intermediate directories to ${InstalledCLIPath}` + ) + ) + return + } + + resolve() + }) }) - if (exitCode !== 0) { - throw new Error(`Failed to symlink ${PackagedPath} to ${InstalledCLIPath}`) +} + +function createNewSymlink(asAdmin: boolean) { + if (!asAdmin) { + return FSE.symlink(PackagedPath, InstalledCLIPath) } + + return new Promise((resolve, reject) => { + fsAdmin.symlink(PackagedPath, InstalledCLIPath, (error: Error | null) => { + if (error !== null) { + reject( + new Error(`Failed to symlink ${PackagedPath} to ${InstalledCLIPath}`) + ) + return + } + + resolve() + }) + }) +} + +async function symlinkCLI(asAdmin: boolean): Promise { + await removeExistingSymlink(asAdmin) + await createDirectories(asAdmin) + await createNewSymlink(asAdmin) } From 162e4141cfabf1a4b245bbe912b77147c9ea33da Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 18 Oct 2018 17:22:05 -0300 Subject: [PATCH 3/7] we can promisify this too --- app/src/ui/lib/install-cli.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/app/src/ui/lib/install-cli.ts b/app/src/ui/lib/install-cli.ts index f1f45c73e5b..baca82a6757 100644 --- a/app/src/ui/lib/install-cli.ts +++ b/app/src/ui/lib/install-cli.ts @@ -25,15 +25,11 @@ export async function installCLI(): Promise { } async function getResolvedInstallPath(): Promise { - return new Promise((resolve, reject) => { - FSE.readlink(InstalledCLIPath, (err, realpath) => { - if (err) { - resolve(null) - } else { - resolve(realpath) - } - }) - }) + try { + return await FSE.readlink(InstalledCLIPath) + } catch { + return null + } } function removeExistingSymlink(asAdmin: boolean) { From 76fba8ff863465e8161381e8cf29f57903354599 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 17 Dec 2018 14:18:41 -0400 Subject: [PATCH 4/7] wrap this in some T Y P E S --- app/src/ui/lib/install-cli.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/app/src/ui/lib/install-cli.ts b/app/src/ui/lib/install-cli.ts index baca82a6757..d0da3d96129 100644 --- a/app/src/ui/lib/install-cli.ts +++ b/app/src/ui/lib/install-cli.ts @@ -1,7 +1,26 @@ import * as FSE from 'fs-extra' import * as Path from 'path' -const fsAdmin = require('fs-admin') +// stub type declaration for what fs-admin needs, using fs-extra as a starting point +type AdminFileSystem = { + makeTree( + path: string | Buffer, + callback: (err: NodeJS.ErrnoException) => void + ): void + + unlink( + path: string | Buffer, + callback: (err: NodeJS.ErrnoException) => void + ): void + + symlink( + srcpath: string | Buffer, + dstpath: string | Buffer, + callback: (err: NodeJS.ErrnoException) => void + ): void +} + +const fsAdmin: AdminFileSystem = require('fs-admin') /** The path for the installed command line tool. */ export const InstalledCLIPath = '/usr/local/bin/github' From 9b44455d171222a8570a640b6d93ab5a114eb485 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 17 Dec 2018 14:32:51 -0400 Subject: [PATCH 5/7] add a file loader to pull in the cmd file --- app/webpack.common.ts | 4 ++++ package.json | 3 ++- yarn.lock | 22 ++++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/app/webpack.common.ts b/app/webpack.common.ts index bba926c87ff..d0e8ec4fe61 100644 --- a/app/webpack.common.ts +++ b/app/webpack.common.ts @@ -88,6 +88,10 @@ export const renderer = merge({}, commonConfig, { test: /\.(jpe?g|png|gif|ico)$/, use: ['file?name=[path][name].[ext]'], }, + { + test: /\.cmd$/, + loader: 'file-loader', + }, ], }, plugins: [ diff --git a/package.json b/package.json index e1717408d9d..8145b18ba03 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ "eslint-plugin-typescript": "^0.12.0", "express": "^4.15.0", "fake-indexeddb": "^2.0.4", + "file-loader": "^2.0.0", "front-matter": "^2.3.0", "fs-extra": "^6.0.0", "glob": "^7.1.2", @@ -171,4 +172,4 @@ "electron-packager": "^12.0.0", "electron-winstaller": "2.5.2" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index dabc77daac1..e71190074a6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -769,6 +769,11 @@ airbnb-js-shims@^2.0.0: string.prototype.padstart "^3.0.0" symbol.prototype.description "^1.0.0" +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" @@ -4361,6 +4366,14 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" +file-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde" + integrity sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ== + dependencies: + loader-utils "^1.0.2" + schema-utils "^1.0.0" + filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -9558,6 +9571,15 @@ schema-utils@^0.4.4, schema-utils@^0.4.5: ajv "^6.1.0" ajv-keywords "^3.1.0" +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + scss-tokenizer@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" From 4bf476b556b9a38b5b421124926b4271ff731a7a Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 17 Dec 2018 17:06:46 -0400 Subject: [PATCH 6/7] extract typings from module --- app/src/ui/lib/install-cli.ts | 27 ++++----------------------- app/typings/fs-admin/index.d.ts | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 23 deletions(-) create mode 100644 app/typings/fs-admin/index.d.ts diff --git a/app/src/ui/lib/install-cli.ts b/app/src/ui/lib/install-cli.ts index d0da3d96129..6ab262196fe 100644 --- a/app/src/ui/lib/install-cli.ts +++ b/app/src/ui/lib/install-cli.ts @@ -1,26 +1,7 @@ import * as FSE from 'fs-extra' import * as Path from 'path' -// stub type declaration for what fs-admin needs, using fs-extra as a starting point -type AdminFileSystem = { - makeTree( - path: string | Buffer, - callback: (err: NodeJS.ErrnoException) => void - ): void - - unlink( - path: string | Buffer, - callback: (err: NodeJS.ErrnoException) => void - ): void - - symlink( - srcpath: string | Buffer, - dstpath: string | Buffer, - callback: (err: NodeJS.ErrnoException) => void - ): void -} - -const fsAdmin: AdminFileSystem = require('fs-admin') +import fsAdmin = require('fs-admin') /** The path for the installed command line tool. */ export const InstalledCLIPath = '/usr/local/bin/github' @@ -57,7 +38,7 @@ function removeExistingSymlink(asAdmin: boolean) { } return new Promise((resolve, reject) => { - fsAdmin.unlink(InstalledCLIPath, (error: Error | null) => { + fsAdmin.unlink(InstalledCLIPath, error => { if (error !== null) { reject( new Error( @@ -80,7 +61,7 @@ function createDirectories(asAdmin: boolean) { } return new Promise((resolve, reject) => { - fsAdmin.makeTree(path, (error: Error | null) => { + fsAdmin.makeTree(path, error => { if (error !== null) { reject( new Error( @@ -101,7 +82,7 @@ function createNewSymlink(asAdmin: boolean) { } return new Promise((resolve, reject) => { - fsAdmin.symlink(PackagedPath, InstalledCLIPath, (error: Error | null) => { + fsAdmin.symlink(PackagedPath, InstalledCLIPath, error => { if (error !== null) { reject( new Error(`Failed to symlink ${PackagedPath} to ${InstalledCLIPath}`) diff --git a/app/typings/fs-admin/index.d.ts b/app/typings/fs-admin/index.d.ts new file mode 100644 index 00000000000..e58d6920412 --- /dev/null +++ b/app/typings/fs-admin/index.d.ts @@ -0,0 +1,17 @@ +declare module 'fs-admin' { + export function makeTree( + path: string | Buffer, + callback: (err: Error | null) => void + ): void + + export function unlink( + path: string | Buffer, + callback: (err: Error | null) => void + ): void + + export function symlink( + srcpath: string | Buffer, + dstpath: string | Buffer, + callback: (err: Error | null) => void + ): void +} From 4fc3a1717401f46971b5967f6b6b807b7f062149 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 16 Jan 2019 17:38:36 -0400 Subject: [PATCH 7/7] use the newer import syntax --- app/src/ui/lib/install-cli.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/ui/lib/install-cli.ts b/app/src/ui/lib/install-cli.ts index 6ab262196fe..b0a775d1465 100644 --- a/app/src/ui/lib/install-cli.ts +++ b/app/src/ui/lib/install-cli.ts @@ -1,7 +1,7 @@ import * as FSE from 'fs-extra' import * as Path from 'path' -import fsAdmin = require('fs-admin') +import * as fsAdmin from 'fs-admin' /** The path for the installed command line tool. */ export const InstalledCLIPath = '/usr/local/bin/github'