1
0
Fork 0

Add lots of linting

pull/11/head
Jonathan Clem 2019-05-21 17:08:25 -04:00
parent 026ad6f559
commit 4f5f4f2fb8
No known key found for this signature in database
GPG Key ID: 48C5B22E9FD6E80F
10 changed files with 86 additions and 38 deletions

View File

@ -4,14 +4,53 @@
"parser": "@typescript-eslint/parser", "parser": "@typescript-eslint/parser",
"parserOptions": { "parserOptions": {
"ecmaVersion": 9, "ecmaVersion": 9,
"sourceType": "module" "sourceType": "module",
"project": "./tsconfig.json"
}, },
"rules": { "rules": {
"no-unused-vars": "off",
"eslint-comments/no-use": "off", "eslint-comments/no-use": "off",
"import/no-namespace": "off", "import/no-namespace": "off",
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": "error", "@typescript-eslint/no-unused-vars": "error",
"@typescript-eslint/explicit-member-accessibility": ["error", {"accessibility": "no-public"}] "@typescript-eslint/explicit-member-accessibility": ["error", {"accessibility": "no-public"}],
"@typescript-eslint/no-require-imports": "error",
"@typescript-eslint/array-type": "error",
"@typescript-eslint/await-thenable": "error",
"@typescript-eslint/ban-ts-ignore": "error",
"camelcase": "off",
"@typescript-eslint/camelcase": "error",
"@typescript-eslint/class-name-casing": "error",
"@typescript-eslint/explicit-function-return-type": ["error", {"allowExpressions": true}],
"@typescript-eslint/func-call-spacing": ["error", "never"],
"@typescript-eslint/generic-type-naming": ["error", "^[A-Z][A-Za-z]*$"],
"@typescript-eslint/no-array-constructor": "error",
"@typescript-eslint/no-empty-interface": "error",
"@typescript-eslint/no-explicit-any": "error",
"no-extra-parens": "off",
"@typescript-eslint/no-extra-parens": "error",
"@typescript-eslint/no-extraneous-class": "error",
"@typescript-eslint/no-for-in-array": "error",
"@typescript-eslint/no-inferrable-types": "error",
"@typescript-eslint/no-misused-new": "error",
"@typescript-eslint/no-namespace": "error",
"@typescript-eslint/no-non-null-assertion": "warn",
"@typescript-eslint/no-object-literal-type-assertion": "error",
"@typescript-eslint/no-unnecessary-qualifier": "error",
"@typescript-eslint/no-unnecessary-type-assertion": "error",
"@typescript-eslint/no-useless-constructor": "error",
"@typescript-eslint/no-var-requires": "error",
"@typescript-eslint/prefer-for-of": "warn",
"@typescript-eslint/prefer-function-type": "warn",
"@typescript-eslint/prefer-includes": "error",
"@typescript-eslint/prefer-interface": "error",
"@typescript-eslint/prefer-string-starts-ends-with": "error",
"@typescript-eslint/promise-function-async": "error",
"@typescript-eslint/require-array-sort-compare": "error",
"@typescript-eslint/restrict-plus-operands": "error",
"semi": "off",
"@typescript-eslint/semi": ["error", "never"],
"@typescript-eslint/type-annotation-spacing": "error",
"@typescript-eslint/unbound-method": "error"
}, },
"env": { "env": {
"node": true, "node": true,

View File

@ -1,6 +1,9 @@
import {ExitCode} from '@actions/exit'
import * as os from 'os' import * as os from 'os'
import * as core from '../src/core' import * as core from '../src/core'
/* eslint-disable @typescript-eslint/unbound-method */
const testEnvVars = { const testEnvVars = {
'my var': '', 'my var': '',
'special char var \r\n];': '', 'special char var \r\n];': '',
@ -103,18 +106,18 @@ describe('@actions/core', () => {
it('setNeutral sets the correct exit code', () => { it('setNeutral sets the correct exit code', () => {
core.setFailed('Failure message') core.setFailed('Failure message')
expect(process.exitCode).toBe(1) expect(process.exitCode).toBe(ExitCode.Failure)
}) })
it('setFailure sets the correct exit code and failure message', () => { it('setFailure sets the correct exit code and failure message', () => {
core.setFailed('Failure message') core.setFailed('Failure message')
expect(process.exitCode).toBe(1) expect(process.exitCode).toBe(ExitCode.Failure)
assertWriteCalls([`##[error]Failure message${os.EOL}`]) assertWriteCalls([`##[error]Failure message${os.EOL}`])
}) })
it('setFailure escapes the failure message', () => { it('setFailure escapes the failure message', () => {
core.setFailed('Failure \r\n\nmessage\r') core.setFailed('Failure \r\n\nmessage\r')
expect(process.exitCode).toBe(1) expect(process.exitCode).toBe(ExitCode.Failure)
assertWriteCalls([`##[error]Failure %0D%0A%0Amessage%0D${os.EOL}`]) assertWriteCalls([`##[error]Failure %0D%0A%0Amessage%0D${os.EOL}`])
}) })
@ -150,7 +153,7 @@ describe('@actions/core', () => {
}) })
// Assert that process.stdout.write calls called only with the given arguments. // Assert that process.stdout.write calls called only with the given arguments.
function assertWriteCalls(calls: string[]) { function assertWriteCalls(calls: string[]): void {
expect(process.stdout.write).toHaveBeenCalledTimes(calls.length) expect(process.stdout.write).toHaveBeenCalledTimes(calls.length)
for (let i = 0; i < calls.length; i++) { for (let i = 0; i < calls.length; i++) {

View File

@ -2,6 +2,10 @@ import * as os from 'os'
// For internal use, subject to change. // For internal use, subject to change.
interface CommandProperties {
[key: string]: string
}
/** /**
* Commands * Commands
* *
@ -14,25 +18,25 @@ import * as os from 'os'
*/ */
export function issueCommand( export function issueCommand(
command: string, command: string,
properties: any, properties: CommandProperties,
message: string message: string
) { ): void {
const cmd = new Command(command, properties, message) const cmd = new Command(command, properties, message)
process.stdout.write(cmd.toString() + os.EOL) process.stdout.write(cmd.toString() + os.EOL)
} }
export function issue(name: string, message: string) { export function issue(name: string, message: string): void {
issueCommand(name, {}, message) issueCommand(name, {}, message)
} }
const CMD_PREFIX = '##[' const CMD_PREFIX = '##['
class Command { class Command {
constructor( private readonly command: string
command: string, private readonly message: string
properties: {[key: string]: string}, private readonly properties: CommandProperties
message: string
) { constructor(command: string, properties: CommandProperties, message: string) {
if (!command) { if (!command) {
command = 'missing.command' command = 'missing.command'
} }
@ -42,11 +46,7 @@ class Command {
this.message = message this.message = message
} }
command: string toString(): string {
message: string
properties: {[key: string]: string}
toString() {
let cmdStr = CMD_PREFIX + this.command let cmdStr = CMD_PREFIX + this.command
if (this.properties && Object.keys(this.properties).length > 0) { if (this.properties && Object.keys(this.properties).length > 0) {
@ -67,7 +67,7 @@ class Command {
// safely append the message - avoid blowing up when attempting to // safely append the message - avoid blowing up when attempting to
// call .replace() if message is not a string for some reason // call .replace() if message is not a string for some reason
const message: string = `${this.message || ''}` const message = `${this.message || ''}`
cmdStr += escapeData(message) cmdStr += escapeData(message)
return cmdStr return cmdStr

View File

@ -18,7 +18,7 @@ export interface InputOptions {
* @param name the name of the variable to set * @param name the name of the variable to set
* @param val the value of the variable * @param val the value of the variable
*/ */
export function exportVariable(name: string, val: string) { export function exportVariable(name: string, val: string): void {
process.env[name] = val process.env[name] = val
issueCommand('set-env', {name}, val) issueCommand('set-env', {name}, val)
} }
@ -28,7 +28,7 @@ export function exportVariable(name: string, val: string) {
* @param name the name of the variable to set * @param name the name of the variable to set
* @param val value of the secret * @param val value of the secret
*/ */
export function exportSecret(name: string, val: string) { export function exportSecret(name: string, val: string): void {
exportVariable(name, val) exportVariable(name, val)
issueCommand('set-secret', {}, val) issueCommand('set-secret', {}, val)
} }
@ -57,7 +57,7 @@ export function getInput(name: string, options?: InputOptions): string {
/** /**
* Sets the action status to neutral * Sets the action status to neutral
*/ */
export function setNeutral() { export function setNeutral(): void {
process.exitCode = ExitCode.Neutral process.exitCode = ExitCode.Neutral
} }
@ -66,7 +66,7 @@ export function setNeutral() {
* When the action exits it will be with an exit code of 1 * When the action exits it will be with an exit code of 1
* @param message add error issue message * @param message add error issue message
*/ */
export function setFailed(message: string) { export function setFailed(message: string): void {
process.exitCode = ExitCode.Failure process.exitCode = ExitCode.Failure
error(message) error(message)
} }
@ -79,7 +79,7 @@ export function setFailed(message: string) {
* Writes debug message to user log * Writes debug message to user log
* @param message debug message * @param message debug message
*/ */
export function debug(message: string) { export function debug(message: string): void {
issueCommand('debug', {}, message) issueCommand('debug', {}, message)
} }
@ -87,7 +87,7 @@ export function debug(message: string) {
* Adds an error issue * Adds an error issue
* @param message error issue message * @param message error issue message
*/ */
export function error(message: string) { export function error(message: string): void {
issue('error', message) issue('error', message)
} }
@ -95,6 +95,6 @@ export function error(message: string) {
* Adds an warning issue * Adds an warning issue
* @param message warning issue message * @param message warning issue message
*/ */
export function warning(message: string) { export function warning(message: string): void {
issue('warning', message) issue('warning', message)
} }

View File

@ -1,5 +1,7 @@
import * as exit from '../src/exit' import * as exit from '../src/exit'
/* eslint-disable @typescript-eslint/unbound-method */
it('exits successfully', () => { it('exits successfully', () => {
jest.spyOn(process, 'exit').mockImplementation() jest.spyOn(process, 'exit').mockImplementation()
exit.success() exit.success()

View File

@ -24,20 +24,20 @@ export enum ExitCode {
/** /**
* Exit the action as a success. * Exit the action as a success.
*/ */
export function success() { export function success(): void {
process.exit(ExitCode.Success) process.exit(ExitCode.Success)
} }
/** /**
* Exit the action as a failure. * Exit the action as a failure.
*/ */
export function failure() { export function failure(): void {
process.exit(ExitCode.Failure) process.exit(ExitCode.Failure)
} }
/** /**
* Exit the action neither a success or a failure * Exit the action neither a success or a failure
*/ */
export function neutral() { export function neutral(): void {
process.exit(ExitCode.Neutral) process.exit(ExitCode.Neutral)
} }

View File

@ -2,6 +2,8 @@ import * as exitPkg from '@actions/exit'
import {Signale} from 'signale' import {Signale} from 'signale'
import {Exit} from '../src/exit' import {Exit} from '../src/exit'
/* eslint-disable @typescript-eslint/unbound-method */
jest.mock('@actions/exit') jest.mock('@actions/exit')
const tests: [keyof Exit, keyof Signale][] = [ const tests: [keyof Exit, keyof Signale][] = [

View File

@ -2,6 +2,8 @@ import * as exitPkg from '@actions/exit'
import {Signale} from 'signale' import {Signale} from 'signale'
import {Toolkit} from '../src/toolkit' import {Toolkit} from '../src/toolkit'
/* eslint-disable @typescript-eslint/unbound-method */
jest.mock('@actions/exit') jest.mock('@actions/exit')
describe('.run', () => { describe('.run', () => {

View File

@ -10,7 +10,7 @@ export class Exit {
/** /**
* Stop the action with a "success" status. * Stop the action with a "success" status.
*/ */
success(message?: string) { success(message?: string): void {
if (message) this.logger.success(message) if (message) this.logger.success(message)
exit.success() exit.success()
} }
@ -18,7 +18,7 @@ export class Exit {
/** /**
* Stop the action with a "neutral" status. * Stop the action with a "neutral" status.
*/ */
neutral(message?: string) { neutral(message?: string): void {
if (message) this.logger.info(message) if (message) this.logger.info(message)
exit.neutral() exit.neutral()
} }
@ -26,7 +26,7 @@ export class Exit {
/** /**
* Stop the action with a "failed" status. * Stop the action with a "failed" status.
*/ */
failure(message?: string) { failure(message?: string): void {
if (message) this.logger.fatal(message) if (message) this.logger.fatal(message)
exit.failure() exit.failure()
} }

View File

@ -6,7 +6,7 @@ export type ActionFn = (tools: Toolkit) => unknown
/** /**
* Options used to customize an instance of [[Toolkit]] * Options used to customize an instance of [[Toolkit]]
*/ */
export type ToolkitOptions = { export interface ToolkitOptions {
/** /**
* A custom Signale instance to use * A custom Signale instance to use
*/ */
@ -30,7 +30,7 @@ export class Toolkit {
* If an error occurs, the error will be logged and the action will exit as a * If an error occurs, the error will be logged and the action will exit as a
* failure. * failure.
*/ */
static async run(func: ActionFn, opts?: ToolkitOptions) { static async run(func: ActionFn, opts?: ToolkitOptions): Promise<void> {
const tools = new Toolkit(opts) const tools = new Toolkit(opts)
try { try {
@ -69,7 +69,7 @@ export class Toolkit {
/** /**
* Ensure that the given keys are in the environment. * Ensure that the given keys are in the environment.
*/ */
private checkRequiredEnv(keys: string[]) { private checkRequiredEnv(keys: string[]): void {
const missingEnv = keys.filter(key => !process.env.hasOwnProperty(key)) const missingEnv = keys.filter(key => !process.env.hasOwnProperty(key))
if (missingEnv.length === 0) return if (missingEnv.length === 0) return
@ -84,7 +84,7 @@ export class Toolkit {
/** /**
* Wrap a Signale logger so that its a callable class. * Wrap a Signale logger so that its a callable class.
*/ */
private wrapLogger(logger: Signale) { private wrapLogger(logger: Signale): Signale & LoggerFunc {
// Create a callable function // Create a callable function
const fn = logger.info.bind(logger) const fn = logger.info.bind(logger)
// Add the log methods onto the function // Add the log methods onto the function