@heroku-cli/command
Advanced tools
Comparing version 7.0.15 to 8.0.0-anycli.0
@@ -1,2 +0,2 @@ | ||
import { Config } from '@cli-engine/config'; | ||
import * as Config from '@anycli/config'; | ||
import { HTTP, HTTPError, HTTPRequestOptions } from 'http-call'; | ||
@@ -24,3 +24,3 @@ import { Mutex } from './mutex'; | ||
export declare class APIClient { | ||
protected config: Config; | ||
protected config: Config.IConfig; | ||
options: IOptions; | ||
@@ -32,3 +32,3 @@ preauthPromises: { | ||
private _twoFactorMutex; | ||
constructor(config: Config, options?: IOptions); | ||
constructor(config: Config.IConfig, options?: IOptions); | ||
readonly twoFactorMutex: Mutex<string>; | ||
@@ -45,3 +45,3 @@ readonly auth: string | undefined; | ||
request(url: string, options?: HTTPRequestOptions): Promise<HTTP>; | ||
readonly defaultOptions: HTTPRequestOptions; | ||
readonly defaults: typeof HTTP.defaults; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const tslib_1 = require("tslib"); | ||
const url = require("url"); | ||
@@ -42,46 +41,41 @@ const deps_1 = require("./deps"); | ||
let self = this; | ||
this.http = class APIHTTPClient extends deps_1.default.HTTP.HTTP { | ||
static get defaultOptions() { | ||
let opts = Object.assign({}, super.defaultOptions, { host: apiUrl.host, headers: Object.assign({}, super.defaultOptions.headers, { accept: 'application/vnd.heroku+json; version=3', 'user-agent': `heroku-cli/${self.config.version} ${self.config.platform}` }, envHeaders) }); | ||
if (auth) | ||
opts.headers.authorization = `Bearer ${auth}`; | ||
return opts; | ||
} | ||
static twoFactorRetry(err, url, opts = {}, retries = 3) { | ||
return tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
const app = err.body.app ? err.body.app.name : null; | ||
if (!app || !options.preauth) { | ||
opts.headers = opts.headers || {}; | ||
opts.headers['Heroku-Two-Factor-Code'] = yield self.twoFactorPrompt(); | ||
return this.request(url, opts, retries); | ||
const opts = { | ||
host: apiUrl.host, | ||
headers: Object.assign({ accept: 'application/vnd.heroku+json; version=3', 'user-agent': `heroku-cli/${self.config.version} ${self.config.platform}` }, envHeaders), | ||
}; | ||
if (auth) | ||
opts.headers.authorization = `Bearer ${auth}`; | ||
this.http = class APIHTTPClient extends deps_1.default.HTTP.HTTP.create(opts) { | ||
static async twoFactorRetry(err, url, opts = {}, retries = 3) { | ||
const app = err.body.app ? err.body.app.name : null; | ||
if (!app || !options.preauth) { | ||
opts.headers = opts.headers || {}; | ||
opts.headers['Heroku-Two-Factor-Code'] = await self.twoFactorPrompt(); | ||
return this.request(url, opts, retries); | ||
} | ||
else { | ||
// if multiple requests are run in parallel for the same app, we should | ||
// only preauth for the first so save the fact we already preauthed | ||
if (!self.preauthPromises[app]) { | ||
self.preauthPromises[app] = self.twoFactorPrompt().then((factor) => self.preauth(app, factor)); | ||
} | ||
else { | ||
// if multiple requests are run in parallel for the same app, we should | ||
// only preauth for the first so save the fact we already preauthed | ||
if (!self.preauthPromises[app]) { | ||
self.preauthPromises[app] = self.twoFactorPrompt().then(factor => self.preauth(app, factor)); | ||
} | ||
yield self.preauthPromises[app]; | ||
return this.request(url, opts, retries); | ||
} | ||
}); | ||
await self.preauthPromises[app]; | ||
return this.request(url, opts, retries); | ||
} | ||
} | ||
static request(url, opts = {}, retries = 3) { | ||
const _super = name => super[name]; | ||
return tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
retries--; | ||
try { | ||
return yield _super("request").call(this, url, opts); | ||
} | ||
catch (err) { | ||
if (!(err instanceof deps_1.default.HTTP.HTTPError)) | ||
throw err; | ||
if (retries > 0) { | ||
if (err.http.statusCode === 403 && err.body.id === 'two_factor') { | ||
return this.twoFactorRetry(err, url, opts, retries); | ||
} | ||
static async request(url, opts = {}, retries = 3) { | ||
retries--; | ||
try { | ||
return await super.request(url, opts); | ||
} | ||
catch (err) { | ||
if (!(err instanceof deps_1.default.HTTP.HTTPError)) | ||
throw err; | ||
if (retries > 0) { | ||
if (err.http.statusCode === 403 && err.body.id === 'two_factor') { | ||
return this.twoFactorRetry(err, url, opts, retries); | ||
} | ||
throw new HerokuAPIError(err); | ||
} | ||
}); | ||
throw new HerokuAPIError(err); | ||
} | ||
} | ||
@@ -108,5 +102,5 @@ }; | ||
deps_1.default.yubikey.enable(); | ||
return this.twoFactorMutex.synchronize(() => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
return this.twoFactorMutex.synchronize(async () => { | ||
try { | ||
let factor = yield deps_1.default.cli.prompt('Two-factor code', { type: 'mask' }); | ||
let factor = await deps_1.default.cli.prompt('Two-factor code', { type: 'mask' }); | ||
deps_1.default.yubikey.disable(); | ||
@@ -119,3 +113,3 @@ return factor; | ||
} | ||
})); | ||
}); | ||
} | ||
@@ -148,6 +142,6 @@ preauth(app, factor) { | ||
} | ||
get defaultOptions() { | ||
return this.http.defaultOptions; | ||
get defaults() { | ||
return this.http.defaults; | ||
} | ||
} | ||
exports.APIClient = APIClient; |
@@ -1,2 +0,2 @@ | ||
import { Command as Base } from '@cli-engine/command'; | ||
import { Command as Base } from '@anycli/command'; | ||
import { APIClient } from './api_client'; | ||
@@ -11,3 +11,2 @@ export declare abstract class Command extends Base { | ||
readonly out: any; | ||
readonly app: any; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const command_1 = require("@cli-engine/command"); | ||
const command_1 = require("@anycli/command"); | ||
const util_1 = require("util"); | ||
@@ -27,6 +27,6 @@ const deps_1 = require("./deps"); | ||
debug: this.config.debug, | ||
host: `${this.heroku.defaultOptions.protocol || 'https:'}//${this.heroku.defaultOptions.host || | ||
host: `${this.heroku.defaults.protocol || 'https:'}//${this.heroku.defaults.host || | ||
'api.heroku.com'}`, | ||
token: this.heroku.auth, | ||
userAgent: this.heroku.defaultOptions.headers['user-agent'], | ||
userAgent: this.heroku.defaults.headers['user-agent'], | ||
}; | ||
@@ -42,8 +42,3 @@ this._legacyHerokuClient = new HerokuClient(options); | ||
} | ||
get app() { | ||
return util_1.deprecate(() => { | ||
return this.flags.app; | ||
}, 'this.app is deprecated but you can implement it yourself as `get app() { return this.flags.app }`')(); | ||
} | ||
} | ||
exports.Command = Command; |
@@ -1,7 +0,7 @@ | ||
import { flags } from '@cli-engine/command'; | ||
import { Config } from '@cli-engine/config'; | ||
import { flags } from '@anycli/command'; | ||
import * as Config from '@anycli/config'; | ||
export { AppCompletion, RemoteCompletion } from './flags/app'; | ||
export declare const oneDay: number; | ||
export declare const herokuGet: (resource: string, ctx: { | ||
config: Config; | ||
config: Config.IConfig; | ||
}) => Promise<string[]>; | ||
@@ -8,0 +8,0 @@ export declare const BuildpackCompletion: flags.ICompletion; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const tslib_1 = require("tslib"); | ||
const path = require("path"); | ||
@@ -10,12 +9,12 @@ const deps_1 = require("./deps"); | ||
exports.oneDay = 60 * 60 * 24; | ||
exports.herokuGet = (resource, ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
exports.herokuGet = async (resource, ctx) => { | ||
const heroku = new deps_1.default.APIClient(ctx.config); | ||
let { body: resources } = yield heroku.get(`/${resource}`); | ||
let { body: resources } = await heroku.get(`/${resource}`); | ||
if (typeof resources === 'string') | ||
resources = JSON.parse(resources); | ||
return resources.map((a) => a.name).sort(); | ||
}); | ||
}; | ||
exports.BuildpackCompletion = { | ||
skipCache: true, | ||
options: () => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
options: async () => { | ||
return [ | ||
@@ -32,52 +31,52 @@ 'heroku/ruby', | ||
]; | ||
}), | ||
}, | ||
}; | ||
exports.AppAddonCompletion = { | ||
cacheDuration: exports.oneDay, | ||
cacheKey: (ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
cacheKey: async (ctx) => { | ||
return ctx.flags && ctx.flags.app ? `${ctx.flags.app}_addons` : ''; | ||
}), | ||
options: (ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
let addons = ctx.flags && ctx.flags.app ? yield exports.herokuGet(`apps/${ctx.flags.app}/addons`, ctx) : []; | ||
}, | ||
options: async (ctx) => { | ||
let addons = ctx.flags && ctx.flags.app ? await exports.herokuGet(`apps/${ctx.flags.app}/addons`, ctx) : []; | ||
return addons; | ||
}), | ||
}, | ||
}; | ||
exports.AppDynoCompletion = { | ||
cacheDuration: exports.oneDay, | ||
cacheKey: (ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
cacheKey: async (ctx) => { | ||
return ctx.flags && ctx.flags.app ? `${ctx.flags.app}_dynos` : ''; | ||
}), | ||
options: (ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
let dynos = ctx.flags && ctx.flags.app ? yield exports.herokuGet(`apps/${ctx.flags.app}/dynos`, ctx) : []; | ||
}, | ||
options: async (ctx) => { | ||
let dynos = ctx.flags && ctx.flags.app ? await exports.herokuGet(`apps/${ctx.flags.app}/dynos`, ctx) : []; | ||
return dynos; | ||
}), | ||
}, | ||
}; | ||
exports.DynoSizeCompletion = { | ||
cacheDuration: exports.oneDay * 90, | ||
options: (ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
let sizes = yield exports.herokuGet('dyno-sizes', ctx); | ||
options: async (ctx) => { | ||
let sizes = await exports.herokuGet('dyno-sizes', ctx); | ||
return sizes; | ||
}), | ||
}, | ||
}; | ||
exports.FileCompletion = { | ||
skipCache: true, | ||
options: () => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
let files = yield deps_1.default.file.readdir(process.cwd()); | ||
options: async () => { | ||
let files = await deps_1.default.file.readdir(process.cwd()); | ||
return files; | ||
}), | ||
}, | ||
}; | ||
exports.PipelineCompletion = { | ||
cacheDuration: exports.oneDay, | ||
options: (ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
let pipelines = yield exports.herokuGet('pipelines', ctx); | ||
options: async (ctx) => { | ||
let pipelines = await exports.herokuGet('pipelines', ctx); | ||
return pipelines; | ||
}), | ||
}, | ||
}; | ||
exports.ProcessTypeCompletion = { | ||
skipCache: true, | ||
options: () => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
options: async () => { | ||
let types = []; | ||
let procfile = path.join(process.cwd(), 'Procfile'); | ||
try { | ||
let buff = yield deps_1.default.file.readFile(procfile); | ||
let buff = await deps_1.default.file.readFile(procfile); | ||
types = buff | ||
@@ -99,49 +98,49 @@ .toString() | ||
return types; | ||
}), | ||
}, | ||
}; | ||
exports.RegionCompletion = { | ||
cacheDuration: exports.oneDay * 7, | ||
options: (ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
let regions = yield exports.herokuGet('regions', ctx); | ||
options: async (ctx) => { | ||
let regions = await exports.herokuGet('regions', ctx); | ||
return regions; | ||
}), | ||
}, | ||
}; | ||
exports.RoleCompletion = { | ||
skipCache: true, | ||
options: () => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
options: async () => { | ||
return ['admin', 'collaborator', 'member', 'owner']; | ||
}), | ||
}, | ||
}; | ||
exports.ScopeCompletion = { | ||
skipCache: true, | ||
options: () => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
options: async () => { | ||
return ['global', 'identity', 'read', 'write', 'read-protected', 'write-protected']; | ||
}), | ||
}, | ||
}; | ||
exports.SpaceCompletion = { | ||
cacheDuration: exports.oneDay, | ||
options: (ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
let spaces = yield exports.herokuGet('spaces', ctx); | ||
options: async (ctx) => { | ||
let spaces = await exports.herokuGet('spaces', ctx); | ||
return spaces; | ||
}), | ||
}, | ||
}; | ||
exports.StackCompletion = { | ||
cacheDuration: exports.oneDay, | ||
options: (ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
let stacks = yield exports.herokuGet('stacks', ctx); | ||
options: async (ctx) => { | ||
let stacks = await exports.herokuGet('stacks', ctx); | ||
return stacks; | ||
}), | ||
}, | ||
}; | ||
exports.StageCompletion = { | ||
skipCache: true, | ||
options: () => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
options: async () => { | ||
return ['test', 'review', 'development', 'staging', 'production']; | ||
}), | ||
}, | ||
}; | ||
exports.TeamCompletion = { | ||
cacheDuration: exports.oneDay, | ||
options: (ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
let teams = yield exports.herokuGet('teams', ctx); | ||
options: async (ctx) => { | ||
let teams = await exports.herokuGet('teams', ctx); | ||
return teams; | ||
}), | ||
}, | ||
}; |
@@ -11,3 +11,21 @@ /// <reference types="node" /> | ||
export declare const deps: { | ||
readonly cli: CLI.CLI; | ||
readonly cli: { | ||
config: CLI.Config; | ||
trace: (...data: any[]) => void; | ||
debug: (...data: any[]) => void; | ||
info: (...data: any[]) => void; | ||
log: (...data: any[]) => void; | ||
warn: (input: string | Error, opts?: CLI.ErrorOptions | undefined) => void; | ||
error: (input: string | Error, opts?: CLI.ErrorOptions | undefined) => void; | ||
fatal: (input: string | Error, opts?: CLI.ErrorOptions | undefined) => void; | ||
exit(code?: number | undefined, error?: Error | undefined): never; | ||
readonly prompt: (name: string, options?: CLI.IPromptOptions | undefined) => Promise<any>; | ||
readonly confirm: (message: string) => Promise<boolean>; | ||
readonly action: CLI.ActionBase; | ||
styledObject(obj: any, keys?: string[] | undefined): void; | ||
readonly styledHeader: (header: string) => void; | ||
readonly styledJSON: (obj: any) => void; | ||
readonly table: typeof CLI.Table.default; | ||
done(): Promise<void>; | ||
}; | ||
readonly HTTP: typeof HTTP; | ||
@@ -14,0 +32,0 @@ readonly netrc: netrc.Netrc; |
@@ -8,3 +8,3 @@ "use strict"; | ||
if (_debug) | ||
_debug = require('debug')('cli-engine-heroku:file'); | ||
_debug = require('debug')('@heroku-cli/command:file'); | ||
_debug(...args); | ||
@@ -11,0 +11,0 @@ } |
@@ -1,2 +0,2 @@ | ||
import { flags } from '@cli-engine/command'; | ||
import { flags } from '@anycli/command'; | ||
export declare const AppCompletion: flags.ICompletion; | ||
@@ -3,0 +3,0 @@ export declare const app: flags.Definition<string>; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const tslib_1 = require("tslib"); | ||
const command_1 = require("@cli-engine/command"); | ||
const command_1 = require("@anycli/command"); | ||
const completions_1 = require("../completions"); | ||
const deps_1 = require("../deps"); | ||
const git_1 = require("../git"); | ||
const vars_1 = require("../vars"); | ||
@@ -24,8 +23,8 @@ class MultipleRemotesError extends Error { | ||
cacheDuration: completions_1.oneDay, | ||
options: (ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
let apps = yield completions_1.herokuGet('apps', ctx); | ||
options: async (ctx) => { | ||
let apps = await completions_1.herokuGet('apps', ctx); | ||
return apps; | ||
}), | ||
}, | ||
}; | ||
exports.app = command_1.flags.option({ | ||
exports.app = command_1.flags.build({ | ||
char: 'a', | ||
@@ -51,8 +50,8 @@ completion: exports.AppCompletion, | ||
skipCache: true, | ||
options: () => tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
options: async () => { | ||
let remotes = getGitRemotes(configRemote()); | ||
return remotes.map(r => r.remote); | ||
}), | ||
}, | ||
}; | ||
exports.remote = command_1.flags.option({ | ||
exports.remote = command_1.flags.build({ | ||
char: 'r', | ||
@@ -63,10 +62,10 @@ completion: exports.RemoteCompletion, | ||
function configRemote() { | ||
let git = new deps_1.default.Git(); | ||
let git = new git_1.Git(); | ||
try { | ||
return git.exec('config heroku.remote').trim(); | ||
} | ||
catch (err) { } | ||
catch (_a) { } | ||
} | ||
function getGitRemotes(onlyRemote) { | ||
let git = new deps_1.default.Git(); | ||
let git = new git_1.Git(); | ||
let appRemotes = []; | ||
@@ -77,3 +76,3 @@ let remotes; | ||
} | ||
catch (err) { | ||
catch (_a) { | ||
return []; | ||
@@ -80,0 +79,0 @@ } |
@@ -1,2 +0,2 @@ | ||
export * from '@cli-engine/command/lib/flags'; | ||
export * from '@anycli/command/lib/flags'; | ||
export { app, remote } from './app'; | ||
@@ -3,0 +3,0 @@ export { org } from './org'; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const tslib_1 = require("tslib"); | ||
tslib_1.__exportStar(require("@cli-engine/command/lib/flags"), exports); | ||
tslib_1.__exportStar(require("@anycli/command/lib/flags"), exports); | ||
var app_1 = require("./app"); | ||
@@ -6,0 +6,0 @@ exports.app = app_1.app; |
@@ -1,2 +0,2 @@ | ||
import { flags } from '@cli-engine/command'; | ||
import { flags } from '@anycli/command'; | ||
export declare const org: flags.Definition<string>; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const command_1 = require("@cli-engine/command"); | ||
exports.org = command_1.flags.option({ | ||
const command_1 = require("@anycli/command"); | ||
exports.org = command_1.flags.build({ | ||
char: 'o', | ||
@@ -6,0 +6,0 @@ default: () => process.env.HEROKU_ORGANIZATION, |
@@ -1,2 +0,2 @@ | ||
import { flags } from '@cli-engine/command'; | ||
import { flags } from '@anycli/command'; | ||
export declare const pipeline: flags.Definition<string>; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const command_1 = require("@cli-engine/command"); | ||
exports.pipeline = command_1.flags.option({ | ||
const command_1 = require("@anycli/command"); | ||
exports.pipeline = command_1.flags.build({ | ||
char: 'p', | ||
description: 'name of pipeline', | ||
}); |
@@ -1,2 +0,2 @@ | ||
import { flags } from '@cli-engine/command'; | ||
import { flags } from '@anycli/command'; | ||
export declare const team: flags.Definition<string>; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const command_1 = require("@cli-engine/command"); | ||
const command_1 = require("@anycli/command"); | ||
const completions_1 = require("../completions"); | ||
exports.team = command_1.flags.option({ | ||
exports.team = command_1.flags.build({ | ||
char: 't', | ||
@@ -7,0 +7,0 @@ completion: completions_1.TeamCompletion, |
@@ -7,6 +7,6 @@ export declare type PromiseResolve<T> = (value: T | PromiseLike<T> | undefined) => void; | ||
private busy; | ||
private queue; | ||
private readonly queue; | ||
synchronize(task: Task<T>): Promise<T>; | ||
dequeue(): void; | ||
execute(record: Record<T>): void; | ||
dequeue(): Promise<void> | undefined; | ||
execute(record: Record<T>): Promise<void>; | ||
} |
@@ -20,3 +20,3 @@ "use strict"; | ||
if (next) { | ||
this.execute(next); | ||
return this.execute(next); | ||
} | ||
@@ -29,3 +29,3 @@ else { | ||
let [task, resolve, reject] = record; | ||
task() | ||
return task() | ||
.then(resolve, reject) | ||
@@ -32,0 +32,0 @@ .then(() => { |
@@ -10,3 +10,3 @@ "use strict"; | ||
} | ||
catch (err) { } | ||
catch (_a) { } | ||
} | ||
@@ -13,0 +13,0 @@ exports.yubikey = { |
{ | ||
"name": "@heroku-cli/command", | ||
"description": "heroku specific functionality for the cli-engine", | ||
"version": "7.0.15", | ||
"version": "8.0.0-anycli.0", | ||
"author": "Jeff Dickey @jdxcode", | ||
"bugs": "https://github.com/heroku/cli-engine-heroku/issues", | ||
"dependencies": { | ||
"@cli-engine/command": "^12.1.1", | ||
"@cli-engine/config": "^5.1.0", | ||
"cli-ux": "^2.0.21", | ||
"cli-ux": "^3.3.17", | ||
"debug": "^3.1.0", | ||
"heroku-client": "3.0.6", | ||
"http-call": "^4.0.8", | ||
"http-call": "^5.0.2", | ||
"netrc-parser": "^3.0.3" | ||
}, | ||
"devDependencies": { | ||
"@cli-engine/util": "^1.2.12", | ||
"@anycli/command": "^1.2.8", | ||
"@anycli/config": "^1.3.4", | ||
"@anycli/tslint": "^0.2.6", | ||
"@heroku-cli/tslint": "^1.1.4", | ||
"@types/ansi-styles": "^2.0.30", | ||
"@types/chai": "^4.1.2", | ||
"@types/chalk": "^2.2.0", | ||
"@types/jest": "22.0.1", | ||
"@types/nock": "9.1.1", | ||
"@types/node": "9.3.0", | ||
"husky": "0.14.3", | ||
"jest": "^22.1.1", | ||
"@types/mocha": "^2.2.48", | ||
"@types/nock": "9.1.2", | ||
"@types/node": "^9.4.0", | ||
"@types/proxyquire": "^1.3.28", | ||
"@types/sinon": "^4.1.3", | ||
"chai": "^4.1.2", | ||
"concurrently": "^3.5.1", | ||
"fancy-test": "^1.0.1", | ||
"mocha": "^5.0.0", | ||
"nock": "9.1.6", | ||
"prettier": "1.10.2", | ||
"ts-jest": "22.0.1", | ||
"proxyquire": "^1.8.0", | ||
"sinon": "^4.2.2", | ||
"testdouble": "^3.3.3", | ||
"ts-node": "^4.1.0", | ||
"tslint": "^5.9.1", | ||
"typescript": "2.6.2" | ||
"typescript": "^2.7.1" | ||
}, | ||
@@ -45,7 +54,9 @@ "engines": { | ||
"scripts": { | ||
"precommit": "cli-engine-util", | ||
"prepare": "cli-engine-util", | ||
"test": "cli-engine-util" | ||
"build": "rm -rf lib && tsc", | ||
"lint": "concurrently -p command \"tsc -p test --noEmit\" \"tslint -p test -t stylish\"", | ||
"posttest": "yarn run lint", | ||
"prepublishOnly": "yarn run build", | ||
"test": "mocha --forbid-only \"test/**/*.test.ts\"" | ||
}, | ||
"types": "./lib/index.d.ts" | ||
} |
@@ -1,6 +0,13 @@ | ||
# @cli-engine/heroku | ||
@heroku-cli/command | ||
=================== | ||
[![Greenkeeper badge](https://badges.greenkeeper.io/heroku/cli-engine-heroku.svg)](https://greenkeeper.io/) | ||
[![CircleCI](https://circleci.com/gh/heroku/cli-engine-heroku.svg?style=svg)](https://circleci.com/gh/heroku/cli-engine-heroku) | ||
[![Build status](https://ci.appveyor.com/api/projects/status/2o5qa4nbjryx8du5/branch/master?svg=true)](https://ci.appveyor.com/project/Heroku/cli-engine-heroku/branch/master) | ||
[![codecov](https://codecov.io/gh/heroku/cli-engine-heroku/branch/master/graph/badge.svg)](https://codecov.io/gh/heroku/cli-engine-heroku) | ||
heroku specific functionality for the cli-engine | ||
[![Version](https://img.shields.io/npm/v/@heroku-cli/command.svg)](https://npmjs.org/package/@heroku-cli/command) | ||
[![CircleCI](https://circleci.com/gh/heroku/cli-engine-heroku/tree/master.svg?style=svg)](https://circleci.com/gh/heroku/cli-engine-heroku/tree/master) | ||
[![Appveyor CI](https://ci.appveyor.com/api/projects/status/github/heroku/cli-engine-heroku?branch=master&svg=true)](https://ci.appveyor.com/project/heroku/cli-engine-heroku/branch/master) | ||
[![Codecov](https://codecov.io/gh/heroku/cli-engine-heroku/branch/master/graph/badge.svg)](https://codecov.io/gh/heroku/cli-engine-heroku) | ||
[![Greenkeeper](https://badges.greenkeeper.io/heroku/cli-engine-heroku.svg)](https://greenkeeper.io/) | ||
[![Known Vulnerabilities](https://snyk.io/test/npm/@heroku-cli/command/badge.svg)](https://snyk.io/test/npm/@heroku-cli/command) | ||
[![Downloads/week](https://img.shields.io/npm/dw/@heroku-cli/command.svg)](https://npmjs.org/package/@heroku-cli/command) | ||
[![License](https://img.shields.io/npm/l/@heroku-cli/command.svg)](https://github.com/heroku/cli-engine-heroku/blob/master/package.json) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
30681
5
835
14
11
24
1
+ Addeddebug@^3.1.0
+ Added@oclif/linewrap@1.0.0(transitive)
+ Added@oclif/screen@1.0.4(transitive)
+ Addedansicolors@0.3.2(transitive)
+ Addedcardinal@2.1.1(transitive)
+ Addedclean-stack@1.3.0(transitive)
+ Addedcli-ux@3.5.0(transitive)
+ Addeddebug@4.3.7(transitive)
+ Addederror-ex@1.3.2(transitive)
+ Addedesprima@4.0.1(transitive)
+ Addedextract-stack@1.0.0(transitive)
+ Addedfs-extra@6.0.1(transitive)
+ Addedgraceful-fs@4.2.11(transitive)
+ Addedhttp-call@5.3.0(transitive)
+ Addedindent-string@3.2.0(transitive)
+ Addedis-arrayish@0.2.1(transitive)
+ Addedis-stream@2.0.1(transitive)
+ Addedjson-parse-better-errors@1.0.2(transitive)
+ Addedjsonfile@4.0.0(transitive)
+ Addedparse-json@4.0.0(transitive)
+ Addedredeyed@2.1.1(transitive)
+ Addeduniversalify@0.1.2(transitive)
- Removed@cli-engine/command@^12.1.1
- Removed@cli-engine/config@^5.1.0
- Removed@cli-engine/command@12.1.1(transitive)
- Removed@cli-engine/config@5.1.0(transitive)
- Removed@cli-engine/screen@0.0.0(transitive)
- Removed@heroku-cli/color@1.1.16(transitive)
- Removed@heroku/linewrap@1.0.0(transitive)
- Removedansi-escapes@3.2.0(transitive)
- Removedansi-regex@4.1.1(transitive)
- Removedansicolors@0.2.1(transitive)
- Removedcardinal@1.0.0(transitive)
- Removedcli-flags@2.0.7(transitive)
- Removedcli-ux@2.1.1(transitive)
- Removedesprima@3.0.0(transitive)
- Removedhttp-call@4.0.8(transitive)
- Removedmoment@2.30.1(transitive)
- Removedredeyed@1.0.1(transitive)
- Removedstrip-ansi@5.2.0(transitive)
- Removedts-lodash@4.0.11(transitive)
- Removedtslib@1.14.1(transitive)
Updatedcli-ux@^3.3.17
Updatedhttp-call@^5.0.2