From c3136adeeb837bf46e4fea201ed36b5938d93b4f Mon Sep 17 00:00:00 2001 From: develar Date: Thu, 3 Nov 2016 18:46:21 +0100 Subject: [PATCH] feat(linux): be more restrictive with executable name Closes #806 --- .idea/dictionaries/develar.xml | 3 ++ docs/Options.md | 1 + nsis-auto-updater/tsconfig.json | 1 + package.json | 2 +- src/linuxPackager.ts | 8 +++- src/options/linuxOptions.ts | 7 +++ src/publish/BintrayPublisher.ts | 2 +- src/targets/LinuxTargetHelper.ts | 6 +-- src/targets/appImage.ts | 14 ++---- src/targets/fpm.ts | 8 ++-- test/src/BuildTest.ts | 12 ++++- test/src/helpers/fileAssert.ts | 2 +- test/src/helpers/packTester.ts | 2 +- test/src/linuxPackagerTest.ts | 11 ++++- test/tsconfig.json | 1 + tsconfig.json | 1 + tslint.json | 3 -- yarn.lock | 79 +++++++++++++++----------------- 18 files changed, 93 insertions(+), 70 deletions(-) diff --git a/.idea/dictionaries/develar.xml b/.idea/dictionaries/develar.xml index 4e818960e1a..a5c1e1a0357 100644 --- a/.idea/dictionaries/develar.xml +++ b/.idea/dictionaries/develar.xml @@ -14,9 +14,11 @@ archiver archs aspx + atexit atime authenticode awaiter + bashism bintray buildpack chown @@ -160,6 +162,7 @@ xenial xorriso yargs + zenity zisofs diff --git a/docs/Options.md b/docs/Options.md index 8377ba06eca..67d10d9ff07 100644 --- a/docs/Options.md +++ b/docs/Options.md @@ -147,6 +147,7 @@ Linux specific build options. | desktop | The [Desktop file](https://developer.gnome.org/integration-guide/stable/desktop-files.html.en) entries. | compression | *deb-only.* The compression type, one of `gz`, `bzip2`, `xz`. Defaults to `xz`. | depends | Package dependencies. Defaults to `["libappindicator1", "libnotify-bin"]`. +| executableName |

The executable name. Defaults to productName.

Cannot be specified per target, allowed only in the .build.linux.

### `.build.mac` diff --git a/nsis-auto-updater/tsconfig.json b/nsis-auto-updater/tsconfig.json index 2ad916c3ae4..ab901c69e6b 100755 --- a/nsis-auto-updater/tsconfig.json +++ b/nsis-auto-updater/tsconfig.json @@ -12,6 +12,7 @@ "strictNullChecks": true, "noEmitHelpers": true, "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, "skipLibCheck": true }, "declaration": { diff --git a/package.json b/package.json index 19d0dce32ca..be26cf7550a 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "json8": "^0.9.2", "path-sort": "^0.1.0", "ts-babel": "^1.1.3", - "tslint": "^4.0.0-dev.0", + "tslint": "^4.0.0-dev.1", "typescript": "^2.1.0-dev.20161101", "validate-commit-msg": "^2.8.2", "whitespace": "^2.1.0" diff --git a/src/linuxPackager.ts b/src/linuxPackager.ts index aad4907ce7b..cacbebbde74 100755 --- a/src/linuxPackager.ts +++ b/src/linuxPackager.ts @@ -8,10 +8,16 @@ import { LinuxTargetHelper } from "./targets/LinuxTargetHelper" import AppImageTarget from "./targets/appImage" import { rename } from "fs-extra-p" import { LinuxBuildOptions } from "./options/linuxOptions" +import sanitizeFileName from "sanitize-filename" export class LinuxPackager extends PlatformPackager { + readonly executableName: string + constructor(info: BuildInfo) { super(info) + + let executableName = this.platformSpecificBuildOptions.executableName + this.executableName = sanitizeFileName(executableName == null ? this.appInfo.name : executableName) } normalizePlatformSpecificBuildOptions(options: LinuxBuildOptions | n): LinuxBuildOptions { @@ -64,7 +70,7 @@ export class LinuxPackager extends PlatformPackager { } protected postInitApp(appOutDir: string): Promise { - return rename(path.join(appOutDir, "electron"), path.join(appOutDir, this.appInfo.productFilename)) + return rename(path.join(appOutDir, "electron"), path.join(appOutDir, this.executableName)) } protected async packageInDistributableFormat(outDir: string, appOutDir: string, arch: Arch, targets: Array): Promise { diff --git a/src/options/linuxOptions.ts b/src/options/linuxOptions.ts index 3af2ae9b16a..6573b3355dc 100644 --- a/src/options/linuxOptions.ts +++ b/src/options/linuxOptions.ts @@ -65,4 +65,11 @@ export interface LinuxBuildOptions extends PlatformSpecificBuildOptions { Package dependencies. Defaults to `["libappindicator1", "libnotify-bin"]`. */ readonly depends?: string[] | null + + /* + The executable name. Defaults to `productName`. + + Cannot be specified per target, allowed only in the `.build.linux`. + */ + readonly executableName?: string | null } diff --git a/src/publish/BintrayPublisher.ts b/src/publish/BintrayPublisher.ts index 13a0c8067a3..8274f07ce82 100644 --- a/src/publish/BintrayPublisher.ts +++ b/src/publish/BintrayPublisher.ts @@ -14,7 +14,7 @@ export class BintrayPublisher implements Publisher { private readonly client: BintrayClient - constructor(private readonly info: BintrayOptions, private readonly version: string, private readonly options: PublishOptions = {}) { + constructor(info: BintrayOptions, private readonly version: string, private readonly options: PublishOptions = {}) { let token = info.token if (isEmptyOrSpaces(token)) { token = process.env.BT_TOKEN diff --git a/src/targets/LinuxTargetHelper.ts b/src/targets/LinuxTargetHelper.ts index 1a1cd180a72..b20ddd836e9 100644 --- a/src/targets/LinuxTargetHelper.ts +++ b/src/targets/LinuxTargetHelper.ts @@ -1,9 +1,9 @@ import { readdir, outputFile, ensureDir } from "fs-extra-p" import * as path from "path" import { exec, debug, isEmptyOrSpaces } from "../util/util" -import { PlatformPackager } from "../platformPackager" import BluebirdPromise from "bluebird-lst-c" import { LinuxBuildOptions } from "../options/linuxOptions" +import { LinuxPackager } from "../linuxPackager" export const installPrefix = "/opt" @@ -12,7 +12,7 @@ export class LinuxTargetHelper { maxIconPath: string | null = null - constructor(private packager: PlatformPackager) { + constructor(private packager: LinuxPackager) { this.icons = this.computeDesktopIcons() } @@ -72,7 +72,7 @@ export class LinuxTargetHelper { const desktopMeta: any = Object.assign({ Name: appInfo.productName, Comment: platformSpecificBuildOptions.description || appInfo.description, - Exec: exec == null ? `"${installPrefix}/${productFilename}/${productFilename}"` : exec, + Exec: exec == null ? `"${installPrefix}/${productFilename}/${this.packager.executableName}"` : exec, Terminal: "false", Type: "Application", Icon: appInfo.name, diff --git a/src/targets/appImage.ts b/src/targets/appImage.ts index d81fc81ab5d..e9b70749a2f 100644 --- a/src/targets/appImage.ts +++ b/src/targets/appImage.ts @@ -1,4 +1,4 @@ -import { PlatformPackager, TargetEx } from "../platformPackager" +import { TargetEx } from "../platformPackager" import { Arch } from "../metadata" import * as path from "path" import { exec, unlinkIfExists } from "../util/util" @@ -7,7 +7,7 @@ import { LinuxTargetHelper } from "./LinuxTargetHelper" import { getBin } from "../util/binDownload" import BluebirdPromise from "bluebird-lst-c" import { v1 as uuid1 } from "uuid-1345" -import { LinuxBuildOptions } from "../options/linuxOptions" +import { LinuxPackager } from "../linuxPackager" const appImageVersion = process.platform === "darwin" ? "AppImage-09-07-16-mac" : "AppImage-09-07-16-linux" //noinspection SpellCheckingInspection @@ -19,7 +19,7 @@ export default class AppImageTarget extends TargetEx { private readonly options = Object.assign({}, this.packager.platformSpecificBuildOptions, (this.packager.devMetadata.build)[this.name]) private readonly desktopEntry: Promise - constructor(private packager: PlatformPackager, private helper: LinuxTargetHelper, private outDir: string) { + constructor(private packager: LinuxPackager, private helper: LinuxTargetHelper, private outDir: string) { super("appImage") // we add X-AppImage-BuildId to ensure that new desktop file will be installed @@ -35,11 +35,9 @@ export default class AppImageTarget extends TargetEx { // avoid spaces in the file name const image = path.join(this.outDir, packager.generateName("AppImage", arch, true)) - const appInfo = packager.appInfo await unlinkIfExists(image) const appImagePath = await appImagePathPromise - const appExecutableImagePath = `/usr/bin/${appInfo.name}` const args = [ "-joliet", "on", "-volid", "AppImage", @@ -47,10 +45,8 @@ export default class AppImageTarget extends TargetEx { "-padding", "0", "-map", appOutDir, "/usr/bin", "-map", path.join(__dirname, "..", "..", "templates", "linux", "AppRun.sh"), "/AppRun", - "-map", await this.desktopEntry, `/${appInfo.name}.desktop`, - "-move", `/usr/bin/${appInfo.productFilename}`, appExecutableImagePath, - // http://stackoverflow.com/questions/13633488/can-i-store-unix-permissions-in-a-zip-file-built-with-apache-ant, xorriso doesn't preserve it for zip, but we set it in any case - "-chmod", "+x", "/AppRun", appExecutableImagePath, "--", + // we get executable name in the AppRun by desktop file name, so, must be named as executable + "-map", await this.desktopEntry, `/${this.packager.executableName}.desktop`, ] for (let [from, to] of (await this.helper.icons)) { args.push("-map", from, `/usr/share/icons/default/${to}`) diff --git a/src/targets/fpm.ts b/src/targets/fpm.ts index 650ad365af5..6d1ec8eb2c0 100644 --- a/src/targets/fpm.ts +++ b/src/targets/fpm.ts @@ -1,5 +1,5 @@ import { Arch } from "../metadata" -import { smarten, PlatformPackager, TargetEx } from "../platformPackager" +import { smarten, TargetEx } from "../platformPackager" import { use, exec } from "../util/util" import * as path from "path" import { getBin } from "../util/binDownload" @@ -8,7 +8,7 @@ import BluebirdPromise from "bluebird-lst-c" import { LinuxTargetHelper, installPrefix } from "./LinuxTargetHelper" import * as errorMessages from "../errorMessages" import { TmpDir } from "../util/tmp" -import { LinuxBuildOptions } from "../options/linuxOptions" +import { LinuxPackager } from "../linuxPackager" const template = require("lodash.template") @@ -33,7 +33,7 @@ export default class FpmTarget extends TargetEx { private readonly scriptFiles: Promise> private readonly desktopEntry: Promise - constructor(name: string, private packager: PlatformPackager, private helper: LinuxTargetHelper, private outDir: string) { + constructor(name: string, private packager: LinuxPackager, private helper: LinuxTargetHelper, private outDir: string) { super(name) this.scriptFiles = this.createScripts() @@ -46,7 +46,7 @@ export default class FpmTarget extends TargetEx { const packager = this.packager const templateOptions = Object.assign({ // old API compatibility - executable: packager.appInfo.productFilename, + executable: this.packager.executableName, }, packager.platformSpecificBuildOptions) function getResource(value: string | n, defaultFile: string) { diff --git a/test/src/BuildTest.ts b/test/src/BuildTest.ts index 13e35eb5661..2c297f8478f 100755 --- a/test/src/BuildTest.ts +++ b/test/src/BuildTest.ts @@ -234,7 +234,11 @@ test.ifDevOrLinuxCi("extra metadata", () => { foo: { bar: 12, }, - productName: "NewName" + build: { + linux: { + executableName: "NewName" + } + } } return assertPack("test-app-one", { targets: Platform.LINUX.createTarget(DIR_TARGET), @@ -260,7 +264,11 @@ test.ifDevOrLinuxCi("extra metadata", () => { test.ifDevOrLinuxCi("extra metadata - two", () => { const extraMetadata = { - productName: "NewName" + build: { + linux: { + executableName: "NewName" + } + } } return assertPack("test-app", { targets: Platform.LINUX.createTarget(DIR_TARGET), diff --git a/test/src/helpers/fileAssert.ts b/test/src/helpers/fileAssert.ts index 71628624e3e..7339def6ef8 100644 --- a/test/src/helpers/fileAssert.ts +++ b/test/src/helpers/fileAssert.ts @@ -48,7 +48,7 @@ class Assertions { compare(this.actual.slice().sort(), Array.from(expected).slice().sort()) } - hasProperties(expected: any) { + hasProperties(expected: any) { const actual = Object.create(null) for (let name of Object.getOwnPropertyNames(this.actual)) { if (name in expected) { diff --git a/test/src/helpers/packTester.ts b/test/src/helpers/packTester.ts index e674f8dc6c0..ce2bc873fdd 100755 --- a/test/src/helpers/packTester.ts +++ b/test/src/helpers/packTester.ts @@ -208,7 +208,7 @@ async function checkLinuxResult(outDir: string, packager: Packager, checkOptions const productFilename = appInfo.productFilename const expectedContents = pathSorter(expectedLinuxContents.map(it => { if (it === "/opt/TestApp/TestApp") { - return `/opt/${productFilename}/${productFilename}` + return `/opt/${productFilename}/TestApp` } else if (it === "/usr/share/applications/TestApp.desktop") { return `/usr/share/applications/${productFilename}.desktop` diff --git a/test/src/linuxPackagerTest.ts b/test/src/linuxPackagerTest.ts index 990079ffa36..9a293dc7357 100755 --- a/test/src/linuxPackagerTest.ts +++ b/test/src/linuxPackagerTest.ts @@ -11,7 +11,16 @@ test.ifNotWindows("arm deb", app({targets: Platform.LINUX.createTarget("deb", Ar test.ifDevOrLinuxCi("AppImage", app({targets: Platform.LINUX.createTarget()})) -test.ifDevOrLinuxCi("AppImage - default icon", app({targets: Platform.LINUX.createTarget("appimage")}, { +test.ifDevOrLinuxCi("AppImage - default icon", app({ + targets: Platform.LINUX.createTarget("appimage"), + devMetadata: { + build: { + linux: { + executableName: "foo", + } + } + } +}, { projectDirCreated: projectDir => remove(path.join(projectDir, "build")) })) diff --git a/test/tsconfig.json b/test/tsconfig.json index 4298c72ea22..37aa9ef99b5 100755 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -12,6 +12,7 @@ "noImplicitReturns": true, "noEmitHelpers": true, "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, "skipLibCheck": true }, "rootDirs": [ diff --git a/tsconfig.json b/tsconfig.json index 9abbbfec8e2..74ec902d730 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,6 +12,7 @@ "strictNullChecks": true, "noEmitHelpers": true, "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, "skipLibCheck": true }, "declaration": { diff --git a/tslint.json b/tslint.json index 1ea19379d63..3758d0785ff 100644 --- a/tslint.json +++ b/tslint.json @@ -5,9 +5,6 @@ "static-before-instance", "variables-before-functions" ], - "no-unused-variable": [ - true - ], "one-line": [ true, "check-open-brace", diff --git a/yarn.lock b/yarn.lock index bce0f8def15..d24e36a38b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -90,8 +90,8 @@ align-text@^0.1.1, align-text@^0.1.3: repeat-string "^1.5.2" amdefine@>=0.0.4: - version "1.0.0" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" ansi-align@^1.1.0: version "1.1.0" @@ -138,8 +138,8 @@ archiver-utils@^1.3.0: readable-stream "^2.0.0" archiver@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-1.1.0.tgz#e1e8c4d356cf155308f351d60cc18cb6fb2344ee" + version "1.2.0" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-1.2.0.tgz#fb5c6af5443b3fa6a426344753bad2a7b444aadd" dependencies: archiver-utils "^1.3.0" async "^2.0.0" @@ -379,8 +379,8 @@ babel-code-frame@^6.16.0: js-tokens "^2.0.0" babel-core@^6.17.0, babel-core@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.0.tgz#bb5ce9bc0a956e6e94e2f12d597abb3b0b330deb" + version "6.18.2" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.2.tgz#d8bb14dd6986fa4f3566a26ceda3964fa0e04e5b" dependencies: babel-code-frame "^6.16.0" babel-generator "^6.18.0" @@ -1228,10 +1228,8 @@ co-with-promise@^4.6.0: pinkie-promise "^1.0.0" code-point-at@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.0.1.tgz#1104cd34f9b5b45d3eba88f1babc1924e1ce35fb" - dependencies: - number-is-nan "^1.0.0" + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" color-convert@~0.5.0: version "0.5.3" @@ -1621,10 +1619,6 @@ dezalgo@^1.0.0, dezalgo@^1.0.1: asap "^2.0.0" wrappy "1" -diff@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99" - diff@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/diff/-/diff-3.0.1.tgz#a52d90cc08956994be00877bff97110062582c35" @@ -1905,8 +1899,8 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.0.0: - version "1.0.14" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.14.tgz#558e8cc38643d8ef40fe45158486d0d25758eee4" + version "1.0.15" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" dependencies: nan "^2.3.0" node-pre-gyp "^0.6.29" @@ -2065,7 +2059,7 @@ glob@^6.0.0, glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: @@ -2101,12 +2095,11 @@ globby@^6.0.0: pinkie-promise "^2.0.0" got@^5.0.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-5.6.0.tgz#bb1d7ee163b78082bbc8eb836f3f395004ea6fbf" + version "5.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" dependencies: create-error-class "^3.0.1" duplexer2 "^0.1.4" - is-plain-obj "^1.0.0" is-redirect "^1.0.0" is-retry-allowed "^1.0.0" is-stream "^1.0.0" @@ -2117,13 +2110,13 @@ got@^5.0.0: pinkie-promise "^2.0.0" read-all-stream "^3.0.0" readable-stream "^2.0.5" - timed-out "^2.0.0" - unzip-response "^1.0.0" + timed-out "^3.0.0" + unzip-response "^1.0.2" url-parse-lax "^1.0.0" graceful-fs@^4.1.0, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29" + version "4.1.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.10.tgz#f2d720c22092f743228775c75e3612632501f131" "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -2693,8 +2686,8 @@ lodash@^3.6.0: resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" lodash@^4.0.0, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.5.1, lodash@^4.8.0: - version "4.16.5" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.5.tgz#77d88feac548009b1a5c4ca7b49ac431ce346ae8" + version "4.16.6" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.6.tgz#d22c9ac660288f3843e16ba7d2b5d06cca27d777" longest@^1.0.1: version "1.0.1" @@ -2737,8 +2730,8 @@ map-stream@~0.1.0: resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" markdown-it@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.0.1.tgz#ff60e2103d17896cb6c57407baa9766f916495cb" + version "8.1.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.1.0.tgz#38902d4e7bac2260c073eb67be623211fbb2c2e3" dependencies: argparse "^1.0.7" entities "~1.1.1" @@ -3515,8 +3508,8 @@ repeating@^3.0.0: resolved "https://registry.yarnpkg.com/repeating/-/repeating-3.0.0.tgz#f4c376fdd2015761f6f96f4303b1224d581e802f" request@^2.45.0, request@^2.74.0, request@^2.75.0: - version "2.76.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.76.0.tgz#be44505afef70360a0436955106be3945d95560e" + version "2.78.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.78.0.tgz#e1c8dec346e1c81923b24acdb337f11decabe9cc" dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" @@ -3911,9 +3904,9 @@ time-require@^0.1.2: pretty-ms "^0.2.1" text-table "^0.2.0" -timed-out@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" +timed-out@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.0.0.tgz#ff88de96030ce960eabd42487db61d3add229273" to-fast-properties@^1.0.1: version "1.0.2" @@ -3965,13 +3958,13 @@ ts-babel@^1.1.3: source-map-support "^0.4.5" tslint@^4.0.0-dev.0: - version "4.0.0-dev.0" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-4.0.0-dev.0.tgz#38826e164299c0fefb024a5587d391a430e0a6be" + version "4.0.0-dev.1" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-4.0.0-dev.1.tgz#10146c7ff47e18ce41315c146ff03dbdb5eb8abc" dependencies: colors "^1.1.2" - diff "^2.2.1" + diff "^3.0.1" findup-sync "~0.3.0" - glob "^7.0.3" + glob "^7.1.1" optimist "~0.6.0" resolve "^1.1.7" underscore.string "^3.3.4" @@ -3992,9 +3985,9 @@ typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -typescript@^2.1.0-dev.20161029: - version "2.1.0-dev.20161101" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.1.0-dev.20161101.tgz#c2abfbb4eaf2be5972d95799ebdce28d73a239af" +typescript@^2.1.0-dev.20161101: + version "2.1.0-dev.20161103" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.1.0-dev.20161103.tgz#747a2e148526cd10d8e7723e731bdbbf57f3b65e" uc.micro@^1.0.1, uc.micro@^1.0.3: version "1.0.3" @@ -4036,9 +4029,9 @@ unique-temp-dir@^1.0.0: os-tmpdir "^1.0.1" uid2 "0.0.3" -unzip-response@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.1.tgz#4a73959f2989470fa503791cefb54e1dbbc68412" +unzip-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" update-notifier@^1.0.2: version "1.0.2"