Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updates prettier config to 120 and trailing commas #23

Merged
merged 3 commits into from
Dec 19, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .prettierrc
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
{
"printWidth": 80
"printWidth": 120,
"trailingComma": "es5"
}
12 changes: 4 additions & 8 deletions packages/cli/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ export default function run() {
y
.option("verbose", {
count: true,
type: "boolean"
type: "boolean",
})
.option("fix", {
type: "boolean"
type: "boolean",
}),
handler: handleCheck
handler: handleCheck,
})
.demandCommand(1, "At least one command required")
.help()
Expand All @@ -47,11 +47,7 @@ interface Args {
function handleCheck(args: Args) {
const configPath = path.resolve(process.cwd(), ".monorepolint.config.ts");
const config = Config.check(require(configPath));
const resolvedConfig = resolveConfig(
config,
args,
findWorkspaceDir(process.cwd())!
);
const resolvedConfig = resolveConfig(config, args, findWorkspaceDir(process.cwd())!);

if (!check(resolvedConfig, process.cwd())) {
// tslint:disable-next-line:no-console
Expand Down
14 changes: 5 additions & 9 deletions packages/core/src/Config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,20 @@ export const RuleEntry = r.Partial({
options: r.Unknown,
excludePackages: r.Array(r.String),
includePackages: r.Array(r.String),
includeWorkspaceRoot: r.Boolean
includeWorkspaceRoot: r.Boolean,
});
export type RuleEntry = r.Static<typeof RuleEntry>;

export const Config = r.Record({
rules: r.Dictionary(RuleEntry)
rules: r.Dictionary(RuleEntry),
});
export type Config = r.Static<typeof Config>;

export const RuleModule = r.Record({
check: r.Function,
optionsRuntype: r.Unknown
optionsRuntype: r.Unknown,
});
export interface RuleModule<T extends Runtype = Runtype>
extends r.Static<typeof RuleModule> {
export interface RuleModule<T extends Runtype = Runtype> extends r.Static<typeof RuleModule> {
check: Checker<T>;
optionsRuntype: T;
}
Expand All @@ -37,10 +36,7 @@ export interface Options {
fix: boolean;
}

export type Checker<T extends Runtype> = (
context: Context,
args: r.Static<T>
) => void;
export type Checker<T extends Runtype> = (context: Context, args: r.Static<T>) => void;
export type ResolvedRule = RuleModule & RuleEntry;
export interface ResolvedConfig extends Options {
readonly rules: ReadonlyArray<ResolvedRule>;
Expand Down
8 changes: 2 additions & 6 deletions packages/core/src/PackageContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,10 @@ export class PackageContext implements Context {

if (this.resolvedConfig.fix && fixer) {
fixer();
this.print(
`${chalk.green("Fixed!")} ${chalk.magenta(shortFile)}: ${message}`
);
this.print(`${chalk.green("Fixed!")} ${chalk.magenta(shortFile)}: ${message}`);
} else {
this.setFailed();
this.print(
`${chalk.red("Error!")} ${chalk.magenta(shortFile)}: ${message}`
);
this.print(`${chalk.red("Error!")} ${chalk.magenta(shortFile)}: ${message}`);

if (this.resolvedConfig.verbose && longMessage) {
for (let i = 0; i <= this.depth + 1; i++) {
Expand Down
21 changes: 14 additions & 7 deletions packages/core/src/__tests__/shouldSkipPackage.spec.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
/*!
* Copyright (c) 2018 monorepolint (http://monorepolint.com). All Right Reserved.
*
* Licensed under the MIT license. See LICENSE file in the project root for details.
*
*/

/*!
* Copyright (c) 2018 monorepo-lint (http://monorepo-lint.com). All Right Reserved.
*
Expand All @@ -13,7 +20,7 @@ describe("shouldSkipPackage", () => {
const resolvedConfig: ResolvedConfig = {
rules: [],
verbose: false,
fix: false
fix: false,
};
const workspaceContext = new WorkspaceContext(".", resolvedConfig);
jest.spyOn(workspaceContext, "getName").mockImplementation(() => "root");
Expand All @@ -25,7 +32,7 @@ describe("shouldSkipPackage", () => {
check: () => true,
excludePackages: [fooContext.getName(), "other"],
includePackages: [fooContext.getName()],
optionsRuntype: {} as any
optionsRuntype: {} as any,
});

expect(actual).toEqual(true);
Expand All @@ -35,7 +42,7 @@ describe("shouldSkipPackage", () => {
const actual = shouldSkipPackage(fooContext, {
check: () => true,
includePackages: [],
optionsRuntype: {} as any
optionsRuntype: {} as any,
});

expect(actual).toEqual(true);
Expand All @@ -44,7 +51,7 @@ describe("shouldSkipPackage", () => {
it("should not skip if excludes and includes are omitted", () => {
const actual = shouldSkipPackage(fooContext, {
check: () => true,
optionsRuntype: {} as any
optionsRuntype: {} as any,
});

expect(actual).toEqual(false);
Expand All @@ -53,7 +60,7 @@ describe("shouldSkipPackage", () => {
it("should skip root by default", () => {
const actual = shouldSkipPackage(workspaceContext, {
check: () => true,
optionsRuntype: {} as any
optionsRuntype: {} as any,
});

expect(actual).toEqual(true);
Expand All @@ -63,7 +70,7 @@ describe("shouldSkipPackage", () => {
const actual = shouldSkipPackage(workspaceContext, {
check: () => true,
excludePackages: ["@foo/*", "other"],
optionsRuntype: {} as any
optionsRuntype: {} as any,
});

expect(actual).toEqual(true);
Expand All @@ -73,7 +80,7 @@ describe("shouldSkipPackage", () => {
const actual = shouldSkipPackage(workspaceContext, {
check: () => true,
includePackages: ["@foo/*", "other"],
optionsRuntype: {} as any
optionsRuntype: {} as any,
});

expect(actual).toEqual(true);
Expand Down
14 changes: 3 additions & 11 deletions packages/core/src/check.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,7 @@ import { ResolvedConfig, ResolvedRule } from "./Config";
import { Context } from "./Context";
import { WorkspaceContext } from "./WorkspaceContext";

export function check(
resolvedConfig: ResolvedConfig,
cwd = process.cwd()
): boolean {
export function check(resolvedConfig: ResolvedConfig, cwd = process.cwd()): boolean {
const workspaceDir = findWorkspaceDir(cwd);
if (workspaceDir === undefined) {
throw new Error(`Unable to find a workspace from ${cwd}`);
Expand Down Expand Up @@ -57,18 +54,13 @@ function checkPackage(context: Context) {
* @param ruleConfig
*/
export function shouldSkipPackage(context: Context, ruleConfig: ResolvedRule) {
const exclude = (ruleConfig.excludePackages || []).some(a =>
minimatch(context.getName(), a)
);
const exclude = (ruleConfig.excludePackages || []).some(a => minimatch(context.getName(), a));
const include =
ruleConfig.includePackages === undefined
? true
: ruleConfig.includePackages.some(a => minimatch(context.getName(), a));

if (
context.getWorkspaceContext() === context &&
!ruleConfig.includeWorkspaceRoot
) {
if (context.getWorkspaceContext() === context && !ruleConfig.includeWorkspaceRoot) {
return true;
}

Expand Down
10 changes: 1 addition & 9 deletions packages/core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,7 @@
*/

export { Context, Failure } from "./Context";
export {
Config,
RuleModule,
Checker,
Options,
ResolvedConfig,
ResolvedRule,
RuleEntry
} from "./Config";
export { Config, RuleModule, Checker, Options, ResolvedConfig, ResolvedRule, RuleEntry } from "./Config";
export { check } from "./check";
export { PackageContext } from "./PackageContext";
export { WorkspaceContext } from "./WorkspaceContext";
Expand Down
37 changes: 8 additions & 29 deletions packages/core/src/resolveConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,63 +7,42 @@

import * as path from "path";
import { ValidationError } from "runtypes";
import {
Config,
Options,
ResolvedConfig,
ResolvedRule,
RuleEntry,
RuleModule
} from "./Config";
import { Config, Options, ResolvedConfig, ResolvedRule, RuleEntry, RuleModule } from "./Config";

export function resolveConfig(
config: Config,
options: Options,
workspaceRootDir: string
): ResolvedConfig {
export function resolveConfig(config: Config, options: Options, workspaceRootDir: string): ResolvedConfig {
try {
return {
...options,
rules: Object.entries(config.rules).map(([type, ruleEntry]) => ({
...ruleEntry,
...resolveRule(type, workspaceRootDir, ruleEntry)
}))
...resolveRule(type, workspaceRootDir, ruleEntry),
})),
};
} catch (err) {
if (err instanceof ValidationError) {
// tslint:disable-next-line:no-console
console.error(
`Failed to parse config for key '${err.key}':`,
err.message,
err
);
console.error(`Failed to parse config for key '${err.key}':`, err.message, err);
}
return process.exit(10);
}
}

function resolveRule(
type: string,
workspaceRootDir: string,
ruleEntry: RuleEntry
): ResolvedRule {
function resolveRule(type: string, workspaceRootDir: string, ruleEntry: RuleEntry): ResolvedRule {
const ruleModule = loadRuleModule(type, workspaceRootDir);

try {
ruleModule.optionsRuntype.check(ruleEntry.options);

const ret: ResolvedRule = {
...ruleModule,
...ruleEntry
...ruleEntry,
};

return ret;
} catch (err) {
if (err instanceof ValidationError) {
// tslint:disable:no-console
console.error(
`Failed to validate the configuration for the rule '${type}'`
);
console.error(`Failed to validate the configuration for the rule '${type}'`);
console.group();
console.error("Recieved:", ruleEntry.options);
console.error("Error Message:", err.message);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,10 @@ export default {
checkAlpha(context, "devDependencies");
checkAlpha(context, "peerDependencies");
},
optionsRuntype: Options
optionsRuntype: Options,
} as RuleModule<typeof Options>;

function checkAlpha(
context: Context,
block: "dependencies" | "devDependencies" | "peerDependencies"
) {
function checkAlpha(context: Context, block: "dependencies" | "devDependencies" | "peerDependencies") {
const packageJson = context.getPackageJson();
const packagePath = context.getPackageJsonPath();

Expand Down Expand Up @@ -52,7 +49,7 @@ function checkAlpha(
const newPackageJson = { ...packageJson };
newPackageJson[block] = expectedDependencies;
writeJson(packagePath, newPackageJson);
}
},
});
}
}
Expand Down
16 changes: 5 additions & 11 deletions packages/rule-banned-dependencies/src/bannedDependencies.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,18 @@ import diff from "jest-diff";
import * as r from "runtypes";

export const Options = r.Record({
bannedDependencies: r.Array(r.String)
bannedDependencies: r.Array(r.String),
});
export type Options = r.Static<typeof Options>;
const ruleModule: RuleModule<typeof Options> = {
check: function expectAlphabeticalDependencies(
context: Context,
opts: Options
) {
check: function expectAlphabeticalDependencies(context: Context, opts: Options) {
const { bannedDependencies } = opts;

checkBanned(context, bannedDependencies, "dependencies");
checkBanned(context, bannedDependencies, "devDependencies");
checkBanned(context, bannedDependencies, "peerDependencies");
},
optionsRuntype: Options
optionsRuntype: Options,
};
export default ruleModule;

Expand All @@ -51,10 +48,7 @@ function checkBanned(
}
}

if (
Object.keys(expectedDependencies).length !==
Object.keys(dependencies).length
) {
if (Object.keys(expectedDependencies).length !== Object.keys(dependencies).length) {
context.addError({
file: packagePath,
message: `Banned depdendencies in ${block} in package.json`,
Expand All @@ -63,7 +57,7 @@ function checkBanned(
const newPackageJson = { ...packageJson };
newPackageJson[block] = expectedDependencies;
writeJson(packagePath, newPackageJson);
}
},
});
}
}
Loading