diff --git a/package.json b/package.json index a0da58391..f509e7e51 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "test": "./node_modules/.bin/karma start --single-run --browsers PhantomJS", "test:node": "JASMINE_CONFIG_PATH=static/test/jasmine.json ./node_modules/.bin/jasmine-ts './static/js/**/*.spec.ts'", - "build": "./node_modules/.bin/webpack --progress -p -v", + "build": "./node_modules/.bin/webpack --progress", "watch": "./node_modules/.bin/webpack --watch" }, "repository": { diff --git a/static/js/quay.module.ts b/static/js/quay.module.ts index a21188a25..a8b946fd1 100644 --- a/static/js/quay.module.ts +++ b/static/js/quay.module.ts @@ -14,6 +14,7 @@ import { QuayConfig } from './quay-config.module'; import { QuayRun } from './quay-run.module'; import { BuildServiceImpl } from './services/build/build.service.impl'; import { AvatarServiceImpl } from './services/avatar/avatar.service.impl'; +import { DockerfileServiceImpl } from './services/dockerfile/dockerfile.service.impl'; /** @@ -37,6 +38,7 @@ import { AvatarServiceImpl } from './services/avatar/avatar.service.impl'; ViewArrayImpl, BuildServiceImpl, AvatarServiceImpl, + DockerfileServiceImpl, ], }) export class quay { diff --git a/static/js/services/dockerfile-service.js b/static/js/services/dockerfile-service.js index 8763b8a13..4495d6917 100644 --- a/static/js/services/dockerfile-service.js +++ b/static/js/services/dockerfile-service.js @@ -2,7 +2,7 @@ * Service which provides helper methods for extracting information out from a Dockerfile * or an archive containing a Dockerfile. */ -angular.module('quay').factory('DockerfileService', ['DataFileService', 'Config', function(DataFileService, Config) { +angular.module('quay').factory('DockerfileServiceOld', ['DataFileService', 'Config', function(DataFileService, Config) { var dockerfileService = {}; function DockerfileInfo(contents) { diff --git a/static/js/services/dockerfile/dockerfile.service.impl.spec.ts b/static/js/services/dockerfile/dockerfile.service.impl.spec.ts new file mode 100644 index 000000000..041f31e64 --- /dev/null +++ b/static/js/services/dockerfile/dockerfile.service.impl.spec.ts @@ -0,0 +1,91 @@ +import { DockerfileServiceImpl, DockerfileInfoImpl } from './dockerfile.service.impl'; +import Spy = jasmine.Spy; + + +describe("DockerfileInfoImpl", () => { + var dockerfileInfoImpl: DockerfileInfoImpl; + var contents: string; + var configMock: any; + + beforeEach(() => { + contents = ""; + configMock = jasmine.createSpyObj('configMock', ['getDomain']); + dockerfileInfoImpl = new DockerfileInfoImpl(contents, configMock); + }); + + describe("forData", () => { + + it("returns null if given contents do not contain a 'FROM' command", () => { + expect(DockerfileInfoImpl.forData(contents, configMock)).toBe(null); + }); + + it("returns a new DockerfileInfoImpl instance if given contents are valid", () => { + contents = "FROM quay.io/coreos/nginx"; + + expect(DockerfileInfoImpl.forData(contents, configMock) instanceof DockerfileInfoImpl).toBe(true); + }); + }); + + describe("getRegistryBaseImage", () => { + + + }); + + describe("getBaseImage", () => { + var baseImageAndTag + + it("returns null if instance's contents do not contain a 'FROM' command", () => { + var getBaseImageAndTagSpy: Spy = spyOn(dockerfileInfoImpl, "getBaseImageAndTag").and.returnValue() + }); + + it("returns") + }); + + describe("getBaseImageAndTag", () => { + + it("returns null if instance's contents do not contain a 'FROM' command", () => { + expect(dockerfileInfoImpl.getBaseImageAndTag()).toBe(null); + }); + + it("returns a string containing the base image and tag from the instance's contents", () => { + contents = "FROM quay.io/coreos/nginx"; + dockerfileInfoImpl = new DockerfileInfoImpl(contents, configMock); + var baseImageAndTag: string = dockerfileInfoImpl.getBaseImageAndTag(); + + expect(baseImageAndTag).toEqual(contents.substring('FROM '.length, contents.length).trim()); + }); + + it("handles the presence of newlines", () => { + contents = "FROM quay.io/coreos/nginx\nRUN echo $0"; + dockerfileInfoImpl = new DockerfileInfoImpl(contents, configMock); + var baseImageAndTag: string = dockerfileInfoImpl.getBaseImageAndTag(); + + expect(baseImageAndTag).toEqual(contents.substring('FROM '.length, contents.indexOf('\n')).trim()); + }); + }); +}); + + +describe("DockerfileServiceImpl", () => { + var dockerfileServiceImpl: DockerfileServiceImpl; + var dataFileServiceMock: any; + var configMock: any; + + beforeEach(() => { + dataFileServiceMock = jasmine.createSpyObj('dataFileServiceMock', [ + 'readDataArrayAsPossibleArchive', + 'arrayToString', + 'blobToString', + ]); + configMock = jasmine.createSpyObj('configMock', ['getDomain']); + dockerfileServiceImpl = new DockerfileServiceImpl(dataFileServiceMock, configMock); + }); + + describe("getDockerfile", () => { + + }); + + describe("extractDockerfile", () => { + + }); +}); \ No newline at end of file diff --git a/static/js/services/dockerfile/dockerfile.service.impl.ts b/static/js/services/dockerfile/dockerfile.service.impl.ts new file mode 100644 index 000000000..fbeb02c71 --- /dev/null +++ b/static/js/services/dockerfile/dockerfile.service.impl.ts @@ -0,0 +1,147 @@ +import { DockerfileService, DockerfileInfo } from './dockerfile.service'; +import { Injectable } from 'angular-ts-decorators'; + + +@Injectable(DockerfileService.name) +export class DockerfileServiceImpl implements DockerfileService { + + constructor(private DataFileService: any, private Config: any) { + console.log(`=================== DockerfileServiceImpl ==========================`); + } + + public getDockerfile(file: any, + success: (dockerfile: DockerfileInfoImpl) => void, + failure: (error: Event | string) => void): void { + var reader: FileReader = new FileReader(); + reader.onload = (event: Event) => { + var dataArray: any = reader.result; + this.DataFileService.readDataArrayAsPossibleArchive(dataArray, (files) => { + this.processFiles(files, dataArray, success, failure); + }, () => { + // Not an archive. Read directly as a single file. + this.processFiles([], dataArray, success, failure); + }); + }; + + reader.onerror = failure; + reader.readAsArrayBuffer(file); + } + + public extractDockerfile(file: any): Promise { + return new Promise((resolve, reject) => { + // TODO: Replace callbacks with promise + }); + } + + private processFiles(files: any, + dataArray: any[], + success: (dockerfile: DockerfileInfoImpl) => void, + failure: (error: ErrorEvent | string) => void): void { + // The files array will be empty if the submitted file was not an archive. We therefore + // treat it as a single Dockerfile. + if (files.length == 0) { + this.DataFileService.arrayToString(dataArray, (contents: string) => { + var result = DockerfileInfoImpl.forData(contents, Object.assign({}, this.Config)); + if (!result) { + failure('File chosen is not a valid Dockerfile'); + return; + } + + success(result); + }); + return; + } + + var found: boolean = false; + files.forEach((file) => { + if (file['name'] == 'Dockerfile') { + this.DataFileService.blobToString(file.toBlob(), (contents: string) => { + var result: DockerfileInfoImpl | null = DockerfileInfoImpl.forData(contents, Object.assign({}, this.Config)); + if (result != null) { + failure('Dockerfile inside archive is not a valid Dockerfile'); + return; + } + + success(result); + }); + found = true; + } + }); + + if (!found) { + failure('No Dockerfile found in root of archive'); + } + } +} + + +export class DockerfileInfoImpl implements DockerfileInfo { + + constructor(private contents: string, private config: any) { + + } + + public static forData(contents: string, config: any): DockerfileInfoImpl | null { + var dockerfileInfo: DockerfileInfoImpl = null; + if (contents.indexOf('FROM ') != -1) { + dockerfileInfo = new DockerfileInfoImpl(contents, config); + } + + return dockerfileInfo; + } + + public getRegistryBaseImage(): string | null { + var baseImage = this.getBaseImage(); + if (!baseImage) { + return null; + } + + if (baseImage.indexOf(this.config.getDomain() + '/') != 0) { + return null; + } + + return baseImage.substring(this.config.getDomain().length + 1); + } + + public getBaseImage(): string | null { + var imageAndTag = this.getBaseImageAndTag(); + if (!imageAndTag) { + return null; + } + + // Note, we have to handle a few different cases here: + // 1) someimage + // 2) someimage:tag + // 3) host:port/someimage + // 4) host:port/someimage:tag + var lastIndex = imageAndTag.lastIndexOf(':'); + if (lastIndex < 0) { + return imageAndTag; + } + + // Otherwise, check if there is a / in the portion after the split point. If so, + // then the latter is part of the path (and not a tag). + var afterColon = imageAndTag.substring(lastIndex + 1); + if (afterColon.indexOf('/') >= 0) { + return imageAndTag; + } + + return imageAndTag.substring(0, lastIndex); + } + + public getBaseImageAndTag(): string | null { + var baseImageAndTag: string = null; + + const fromIndex: number = this.contents.indexOf('FROM '); + if (fromIndex != -1) { + var newlineIndex: number = this.contents.indexOf('\n', fromIndex); + if (newlineIndex == -1) { + newlineIndex = this.contents.length; + } + + baseImageAndTag = this.contents.substring(fromIndex + 'FROM '.length, newlineIndex).trim(); + } + + return baseImageAndTag; + } +} \ No newline at end of file diff --git a/static/js/services/dockerfile/dockerfile.service.ts b/static/js/services/dockerfile/dockerfile.service.ts new file mode 100644 index 000000000..db62913c2 --- /dev/null +++ b/static/js/services/dockerfile/dockerfile.service.ts @@ -0,0 +1,43 @@ +/** + * Service which provides helper methods for extracting information out from a Dockerfile + * or an archive containing a Dockerfile. + */ +export abstract class DockerfileService { + + /** + * Retrieve Dockerfile from given archive file. + * @param file File containing Dockerfile. + * @param success Success callback with retrieved Dockerfile as parameter. + * @param failure Failure callback with failure message as parameter. + */ + public abstract getDockerfile(file: any, + success: (dockerfile: DockerfileInfo) => void, + failure: (error: ErrorEvent | string) => void): void; + + public abstract extractDockerfile(file: any): Promise; +} + + +/** + * Model representing information about a specific Dockerfile. + */ +export abstract class DockerfileInfo { + + /** + * Extract the registry base image from the Dockerfile contents. + * @return registryBaseImage The registry base image. + */ + public abstract getRegistryBaseImage(): string | null; + + /** + * Extract the base image from the Dockerfile contents. + * @return baseImage The base image. + */ + public abstract getBaseImage(): string | null; + + /** + * Extract the base image and tag from the Dockerfile contents. + * @return baseImageAndTag The base image and tag. + */ + public abstract getBaseImageAndTag(): string | null; +} \ No newline at end of file diff --git a/test/data/test.db b/test/data/test.db index dc4f5960a..c583ad3a6 100644 Binary files a/test/data/test.db and b/test/data/test.db differ diff --git a/yarn.lock b/yarn.lock index 4d37e330f..6a2b4aa68 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14,12 +14,22 @@ dependencies: "@types/angular" "*" +"@types/angular-sanitize@^1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/angular-sanitize/-/angular-sanitize-1.3.4.tgz#aa63bd32a1c3c8846e16d66be891a5bdb3b0fc65" + dependencies: + "@types/angular" "*" + "@types/angular@*", "@types/angular@1.5.16": version "1.5.16" resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.5.16.tgz#02a56754b50dbf9209266b4339031a54317702d9" dependencies: "@types/jquery" "*" +"@types/es6-shim@^0.31.32": + version "0.31.32" + resolved "https://registry.yarnpkg.com/@types/es6-shim/-/es6-shim-0.31.32.tgz#8196c09e1e40ac977c713bf258090989f501d8ff" + "@types/jasmine@^2.5.41": version "2.5.43" resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.43.tgz#6328a8c26082f2fd84f043c802c9ed7fa110b2dd" @@ -119,6 +129,12 @@ angular-sanitize@^1.5.3: version "1.6.2" resolved "https://registry.yarnpkg.com/angular-sanitize/-/angular-sanitize-1.6.2.tgz#8a327c1acb2c14f50da5b5cad5ea452750a1a375" +angular-ts-decorators@0.0.19: + version "0.0.19" + resolved "https://registry.yarnpkg.com/angular-ts-decorators/-/angular-ts-decorators-0.0.19.tgz#071f6a4f791fe661a91cf3b1925e02fe593076ef" + dependencies: + reflect-metadata "^0.1.8" + angular@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/angular/-/angular-1.5.3.tgz#37c2f198ae76c2d6f3717a4ecef1cddcb048af79" @@ -129,10 +145,6 @@ ansi-align@^1.1.0: dependencies: string-width "^1.0.1" -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -294,13 +306,6 @@ babel-code-frame@^6.11.0: esutils "^2.0.2" js-tokens "^3.0.0" -babel-runtime@^6.0.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.10.0" - backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" @@ -345,12 +350,6 @@ binary-extensions@^1.0.0: version "1.8.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" -bl@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.0.tgz#1397e7ec42c5f5dc387470c500e34a9f6be9ea98" - dependencies: - readable-stream "^2.0.5" - blob@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" @@ -529,7 +528,7 @@ builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" -bytes@2.4.0, bytes@^2.4.0: +bytes@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" @@ -615,10 +614,6 @@ chokidar@^1.4.1, chokidar@^1.4.3: optionalDependencies: fsevents "^1.0.0" -ci-info@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" - cipher-base@^1.0.0, cipher-base@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" @@ -635,16 +630,6 @@ cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" - cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" @@ -665,13 +650,6 @@ clone@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" -cmd-shim@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" - dependencies: - graceful-fs "^4.1.2" - mkdirp "~0.5.0" - co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -818,7 +796,7 @@ core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" -core-js@^2.1.0, core-js@^2.4.0: +core-js@^2.1.0: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" @@ -991,10 +969,6 @@ dateformat@^1.0.6: get-stdin "^4.0.1" meow "^3.3.0" -death@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" - debug@0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" @@ -1064,10 +1038,6 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -detect-indent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" @@ -1149,12 +1119,6 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -end-of-stream@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07" - dependencies: - once "~1.3.0" - engine.io-client@1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab" @@ -1252,7 +1216,7 @@ escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -1332,12 +1296,6 @@ extend@3, extend@^3.0.0, extend@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" -external-editor@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.1.tgz#4c597c6c88fa6410e41dbbaa7b1be2336aa31095" - dependencies: - tmp "^0.0.31" - extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -1383,12 +1341,6 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - dependencies: - escape-string-regexp "^1.0.5" - filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" @@ -1794,28 +1746,10 @@ inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" -ini@^1.3.4, ini@~1.3.0: +ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" -inquirer@^3.0.1: - version "3.0.5" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.5.tgz#172cabc8eacbfb91d595f5d7c354b446b8141f65" - dependencies: - ansi-escapes "^1.1.0" - chalk "^1.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.1" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx "^4.1.0" - string-width "^2.0.0" - strip-ansi "^3.0.0" - through "^2.3.6" - interpret@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" @@ -1861,12 +1795,6 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-ci@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" - dependencies: - ci-info "^1.0.0" - is-dotfile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" @@ -1897,10 +1825,6 @@ is-fullwidth-code-point@^1.0.0: dependencies: number-is-nan "^1.0.0" -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -1946,10 +1870,6 @@ is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - is-property@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" @@ -2264,10 +2184,6 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -leven@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -2355,7 +2271,7 @@ lodash@^3.8.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.3.0, lodash@~4.17.0: +lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@~4.17.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -2380,7 +2296,7 @@ loose-envify@^1.0.0, loose-envify@^1.1.0: dependencies: js-tokens "^3.0.0" -loud-rejection@^1.0.0, loud-rejection@^1.2.0: +loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" dependencies: @@ -2493,10 +2409,6 @@ mime@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" -mimic-fn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" - minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" @@ -2505,7 +2417,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@~3.0.2: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" dependencies: @@ -2553,10 +2465,6 @@ ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" -mute-stream@0.0.7, mute-stream@~0.0.4: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - nan@^2.3.0, nan@^2.3.2: version "2.5.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2" @@ -2565,12 +2473,6 @@ negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" -node-emoji@^1.0.4: - version "1.5.1" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.5.1.tgz#fd918e412769bf8c448051238233840b2aff16a1" - dependencies: - string.prototype.codepointat "^0.2.0" - node-fetch@^1.0.1: version "1.6.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" @@ -2578,7 +2480,7 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-gyp@^3.2.1, node-gyp@^3.3.1: +node-gyp@^3.3.1: version "3.5.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.5.0.tgz#a8fe5e611d079ec16348a3eb960e78e11c85274a" dependencies: @@ -2738,10 +2640,6 @@ object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" -object-path@^0.11.2: - version "0.11.4" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" - object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -2767,18 +2665,12 @@ once@1.x, once@^1.3.0: dependencies: wrappy "1" -once@~1.3.0, once@~1.3.3: +once@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.0.tgz#52aa8110e52fc5126ffc667bd8ec21c2ed209ce6" - dependencies: - mimic-fn "^1.0.0" - optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -3255,13 +3147,6 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -proper-lockfile@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-2.0.0.tgz#b21f5e79bcbb6b4e23eeeced15cfc7f63e8a2e55" - dependencies: - graceful-fs "^4.1.2" - retry "^0.10.0" - prr@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" @@ -3391,12 +3276,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - dependencies: - mute-stream "~0.0.4" - readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.3.tgz#9cf49463985df016c8ae8813097a9293a9b33729" @@ -3471,14 +3350,14 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^0.4.2" +reflect-metadata@^0.1.8: + version "0.1.10" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.10.tgz#b4f83704416acad89988c9b15635d47e03b9344a" + regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" -regenerator-runtime@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e" - regex-cache@^0.4.2: version "0.4.3" resolved "http://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" @@ -3534,17 +3413,13 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request-capture-har@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-capture-har/-/request-capture-har-1.1.4.tgz#e6ad76eb8e7a1714553fdbeef32cd4518e4e2013" - request-progress@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" dependencies: throttleit "^1.0.0" -request@2, request@^2.61.0, request@^2.75.0, request@^2.79.0, request@~2.79.0: +request@2, request@^2.61.0, request@^2.79.0, request@~2.79.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" dependencies: @@ -3591,24 +3466,13 @@ restangular@^1.2.0: dependencies: lodash "~4.17.0" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -retry@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" - right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.3.3, rimraf@^2.4.4, rimraf@^2.5.0: +rimraf@2, rimraf@^2.3.3, rimraf@^2.4.4: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: @@ -3624,20 +3488,6 @@ ripemd160@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e" -roadrunner@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/roadrunner/-/roadrunner-1.1.0.tgz#1180a30d64e1970d8f55dd8cb0da8ffccecad71e" - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - dependencies: - is-promise "^2.1.0" - -rx@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" - sass-graph@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.1.2.tgz#965104be23e8103cb7e5f710df65935b317da57b" @@ -3664,14 +3514,14 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - -semver@~4.3.3: +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@~4.3.3: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" +semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + semver@~5.0.1: version "5.0.3" resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" @@ -3698,7 +3548,7 @@ sha.js@^2.3.6: dependencies: inherits "^2.0.1" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -3872,17 +3722,6 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^3.0.0" - -string.prototype.codepointat@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" - string_decoder@^0.10.25, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -3903,10 +3742,6 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -3966,16 +3801,7 @@ tar-pack@~3.3.0: tar "~2.2.1" uid-number "~0.0.6" -tar-stream@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.2.tgz#fbc6c6e83c1a19d4cb48c7d96171fc248effc7bf" - dependencies: - bl "^1.0.0" - end-of-stream "^1.0.0" - readable-stream "^2.0.0" - xtend "^4.0.0" - -tar@^2.0.0, tar@^2.2.1, tar@~2.2.1: +tar@^2.0.0, tar@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" dependencies: @@ -3997,10 +3823,6 @@ throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - throwback@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/throwback/-/throwback-1.1.1.tgz#f007e7c17604a6d16d7a07c41aa0e8fedc6184a4" @@ -4017,7 +3839,7 @@ timers-browserify@^2.0.2: dependencies: setimmediate "^1.0.4" -tmp@0.0.x, tmp@^0.0.31: +tmp@0.0.x: version "0.0.31" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" dependencies: @@ -4047,7 +3869,7 @@ trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" -ts-loader@0.9.5: +ts-loader@^0.9.5: version "0.9.5" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-0.9.5.tgz#7149b386c61bab9c6c3fd1d5d70a0145b7d3d3a1" dependencies: @@ -4113,11 +3935,7 @@ typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -typescript@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.0.3.tgz#33dec9eae86b8eee327dd419ca050c853cabd514" - -typescript@>=2.1.4, typescript@^2.0.0, typescript@^2.0.3: +typescript@>=2.1.4, typescript@^2.0.0, typescript@^2.0.3, typescript@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.2.1.tgz#4862b662b988a4c8ff691cc7969622d24db76ae9" @@ -4538,44 +4356,6 @@ yargs@~3.10.0: decamelize "^1.0.0" window-size "0.1.0" -yarn@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/yarn/-/yarn-0.21.3.tgz#8dda3a63c798b383cfa577452c2b3cb3e4aa87e0" - dependencies: - babel-runtime "^6.0.0" - bytes "^2.4.0" - camelcase "^3.0.0" - chalk "^1.1.1" - cmd-shim "^2.0.1" - commander "^2.9.0" - death "^1.0.0" - debug "^2.2.0" - defaults "^1.0.3" - detect-indent "^5.0.0" - ini "^1.3.4" - inquirer "^3.0.1" - invariant "^2.2.0" - is-builtin-module "^1.0.0" - is-ci "^1.0.10" - leven "^2.0.0" - loud-rejection "^1.2.0" - minimatch "^3.0.3" - mkdirp "^0.5.1" - node-emoji "^1.0.4" - node-gyp "^3.2.1" - object-path "^0.11.2" - proper-lockfile "^2.0.0" - read "^1.0.7" - request "^2.75.0" - request-capture-har "^1.1.4" - rimraf "^2.5.0" - roadrunner "^1.1.0" - semver "^5.1.0" - strip-bom "^3.0.0" - tar "^2.2.1" - tar-stream "^1.5.2" - validate-npm-package-license "^3.0.1" - yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"