diff --git a/.changeset/quiet-pots-cheer.md b/.changeset/quiet-pots-cheer.md new file mode 100644 index 0000000000..0670a8570a --- /dev/null +++ b/.changeset/quiet-pots-cheer.md @@ -0,0 +1,5 @@ +--- +'@lg-tools/lint': patch +--- + +Lint task now exits with code `1` if lint errors are found diff --git a/tools/build/src/tsdoc/test-package/package.json b/tools/build/src/tsdoc/test-package/package.json index 4eb9057814..31f9b15866 100644 --- a/tools/build/src/tsdoc/test-package/package.json +++ b/tools/build/src/tsdoc/test-package/package.json @@ -1,4 +1,5 @@ { "name": "test-package", - "private": "true" -} \ No newline at end of file + "version": "0.0.0", + "private": true +} diff --git a/tools/build/src/tsdoc/tsdoc.spec.ts b/tools/build/src/tsdoc/tsdoc.spec.ts index 2cd348c88d..78ee5fef2c 100644 --- a/tools/build/src/tsdoc/tsdoc.spec.ts +++ b/tools/build/src/tsdoc/tsdoc.spec.ts @@ -1,5 +1,6 @@ import child_process, { ChildProcess } from 'child_process'; import path from 'path'; + import { parseTSDoc } from './tsdocParser'; const spawnSpy = jest.spyOn(child_process, 'spawn'); diff --git a/tools/create/src/index.ts b/tools/create/src/index.ts index 993e1beb77..06f9ba507d 100644 --- a/tools/create/src/index.ts +++ b/tools/create/src/index.ts @@ -1,11 +1,10 @@ /* eslint-disable no-console */ +import { getLGConfig } from '@lg-tools/meta'; import chalk from 'chalk'; import fs from 'fs'; import { camelCase, kebabCase, startCase } from 'lodash'; import path from 'path'; -import { getLGConfig } from '@lg-tools/meta'; - import { CreatePackageOptions } from './create.types'; import { component, diff --git a/tools/install/src/index.ts b/tools/install/src/index.ts index 48e276c32e..365c89e7e4 100644 --- a/tools/install/src/index.ts +++ b/tools/install/src/index.ts @@ -1,8 +1,7 @@ /* eslint-disable no-console */ +import { getPackageManager } from '@lg-tools/meta'; import { spawn } from 'child_process'; import fetch from 'node-fetch'; - -import { getPackageManager } from '@lg-tools/meta'; export interface InstallCommandOptions { ignoreWorkspaceRootCheck: boolean; verbose: boolean; diff --git a/tools/link/src/link.ts b/tools/link/src/link.ts index 73a9745d09..95c2057e4c 100644 --- a/tools/link/src/link.ts +++ b/tools/link/src/link.ts @@ -1,10 +1,10 @@ /* eslint-disable no-console */ +import { getLGConfig } from '@lg-tools/meta'; import chalk from 'chalk'; import { spawn } from 'child_process'; import fs from 'fs'; import { homedir } from 'os'; import path from 'path'; -import { getLGConfig } from '@lg-tools/meta'; import { formatLog } from './utils'; @@ -39,6 +39,7 @@ export async function linkPackages(destination: string, opts: LinkOptions) { const { scopes: availableScopes } = getLGConfig(); const linkPromises: Array> = []; + for (const [scopeName, scopePath] of Object.entries(availableScopes)) { if (!scopeFlag || scopeFlag.includes(scopeName)) { linkPromises.push( @@ -57,6 +58,7 @@ export async function linkPackages(destination: string, opts: LinkOptions) { console.log(chalk.green('Finished linking packages.')); } + async function linkPackagesForScope( scopeName: string, scopePath: string, diff --git a/tools/link/src/unlink.ts b/tools/link/src/unlink.ts index a2130294df..06a3d524ad 100644 --- a/tools/link/src/unlink.ts +++ b/tools/link/src/unlink.ts @@ -1,9 +1,9 @@ /* eslint-disable no-console */ +import { getLGConfig } from '@lg-tools/meta'; import chalk from 'chalk'; import { spawn } from 'child_process'; import fs from 'fs'; import path from 'path'; -import { getLGConfig } from '@lg-tools/meta'; import { formatLog } from './utils'; diff --git a/tools/lint/src/eslint.ts b/tools/lint/src/eslint.ts index f5bd6cb397..c678643a38 100644 --- a/tools/lint/src/eslint.ts +++ b/tools/lint/src/eslint.ts @@ -3,18 +3,15 @@ import chalk from 'chalk'; import { spawn } from 'child_process'; import path from 'path'; -import { LintCommandOptions } from './lint.types'; +import { LintFn } from './lint.types'; const rootDir = process.cwd(); const eslintConfigPath = path.resolve(__dirname, '../config/eslint.config.js'); export const esLintExtensions = ['js', 'ts', 'tsx']; /** Spawns an eslint job */ -export function eslint({ - fix, - verbose, -}: Pick) { - return new Promise(resolve => { +export const eslint: LintFn = ({ fix, verbose }) => { + return new Promise((resolve, reject) => { console.log(chalk.blue('Running ESLint...')); spawn( 'eslint', @@ -28,6 +25,10 @@ export function eslint({ { stdio: 'inherit', }, - ).on('close', resolve); + ) + .on('exit', code => { + resolve(!code); + }) + .on('error', reject); }); -} +}; diff --git a/tools/lint/src/index.ts b/tools/lint/src/index.ts index 766140e636..9cb7ac3050 100755 --- a/tools/lint/src/index.ts +++ b/tools/lint/src/index.ts @@ -4,6 +4,8 @@ import { LintCommandOptions } from './lint.types'; import { npmPkgJsonLint } from './npmPkgJsonLint'; import { prettier } from './prettier'; +const isTrue = (test: any) => !!test; + export const lint = (options: LintCommandOptions) => { const { fix, prettierOnly, eslintOnly, pkgJsonOnly, verbose } = options; @@ -22,8 +24,11 @@ export const lint = (options: LintCommandOptions) => { } Promise.all(linters) - .then(() => { - process.exit(0); + .then(results => { + if (results.every(isTrue)) { + process.exit(0); + } + process.exit(1); }) .catch(() => { process.exit(1); diff --git a/tools/lint/src/lint.types.ts b/tools/lint/src/lint.types.ts index 2f82b6c3c1..17a2833ccf 100644 --- a/tools/lint/src/lint.types.ts +++ b/tools/lint/src/lint.types.ts @@ -5,3 +5,7 @@ export interface LintCommandOptions { pkgJsonOnly: boolean; verbose: boolean; } + +export type LintFn = ( + options: Pick, +) => Promise; diff --git a/tools/lint/src/npmPkgJsonLint.ts b/tools/lint/src/npmPkgJsonLint.ts index bf2223a0fb..a85758e042 100644 --- a/tools/lint/src/npmPkgJsonLint.ts +++ b/tools/lint/src/npmPkgJsonLint.ts @@ -3,7 +3,7 @@ import chalk from 'chalk'; import { spawn } from 'child_process'; import path from 'path'; -import { LintCommandOptions } from './lint.types'; +import { LintFn } from './lint.types'; // import { NpmPackageJsonLint } from 'npm-package-json-lint'; const rootDir = process.cwd(); const npmPkgLintConfigPath = path.resolve( @@ -12,20 +12,19 @@ const npmPkgLintConfigPath = path.resolve( ); /** Spawns a npmPkgJsonLint job */ -export function npmPkgJsonLint({ - fix, - verbose, -}: Pick) { - return new Promise((resolve, reject) => { +export const npmPkgJsonLint: LintFn = ({ fix, verbose }) => { + return new Promise((resolve, reject) => { console.log(chalk.yellow('Running npmPkgJsonLint...')); spawn('npmPkgJsonLint', [rootDir, '--configFile', npmPkgLintConfigPath], { cwd: rootDir, stdio: 'inherit', }) - .on('close', resolve) + .on('exit', code => { + resolve(!code); + }) .on('error', reject); /* TODO: use the JS API */ }); -} +}; diff --git a/tools/lint/src/prettier.ts b/tools/lint/src/prettier.ts index cd356cda6d..613d037a5a 100644 --- a/tools/lint/src/prettier.ts +++ b/tools/lint/src/prettier.ts @@ -4,7 +4,7 @@ import { spawn } from 'child_process'; import path from 'path'; import { esLintExtensions } from './eslint'; -import { LintCommandOptions } from './lint.types'; +import { LintFn } from './lint.types'; const rootDir = process.cwd(); const prettierConfigPath = path.resolve( @@ -14,11 +14,8 @@ const prettierConfigPath = path.resolve( const prettierExtensions = [...esLintExtensions, 'mjs', 'json', 'md', 'yml']; /** Spawns a prettier job */ -export function prettier({ - fix, - verbose, -}: Pick) { - return new Promise(resolve => { +export const prettier: LintFn = ({ fix, verbose }) => { + return new Promise((resolve, reject) => { console.log(chalk.magenta('Running Prettier...')); spawn( 'prettier', @@ -31,6 +28,10 @@ export function prettier({ { stdio: 'inherit', }, - ).on('close', resolve); + ) + .on('exit', code => { + resolve(!code); + }) + .on('error', reject); }); -} +}; diff --git a/tools/meta/src/getAllPackages.ts b/tools/meta/src/getAllPackages.ts index 27a39ff986..ad63637ebc 100644 --- a/tools/meta/src/getAllPackages.ts +++ b/tools/meta/src/getAllPackages.ts @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; + import { getLGConfig } from './getLGConfig'; import { getPackageName } from './getPackageName'; @@ -12,6 +13,7 @@ export const getAllPackages = () => { for (let scopePath of Object.values(scopes)) { const scopeDir = path.resolve(rootDir, scopePath); + if (fs.existsSync(scopeDir)) { const pkgNames = fs.readdirSync(scopeDir); const pkgPaths = pkgNames.map(name => path.resolve(scopeDir, name)); diff --git a/tools/meta/src/getPackageName.ts b/tools/meta/src/getPackageName.ts index bf99c15783..bba1f6f921 100644 --- a/tools/meta/src/getPackageName.ts +++ b/tools/meta/src/getPackageName.ts @@ -1,5 +1,7 @@ +/* eslint-disable no-console */ import chalk from 'chalk'; import fs from 'fs'; + import { getLGConfig } from './getLGConfig'; /** diff --git a/tools/meta/src/index.ts b/tools/meta/src/index.ts index 5cd9988d60..553321bd5c 100644 --- a/tools/meta/src/index.ts +++ b/tools/meta/src/index.ts @@ -1,4 +1,4 @@ +export { getAllPackageNames, getAllPackages } from './getAllPackages'; export { getLGConfig, type LGConfig } from './getLGConfig'; export { getPackageManager } from './getPackageManager'; -export { getAllPackages, getAllPackageNames } from './getAllPackages'; export { getPackageName } from './getPackageName'; diff --git a/tools/test/src/index.ts b/tools/test/src/index.ts index 87eb16f9ff..3476620307 100755 --- a/tools/test/src/index.ts +++ b/tools/test/src/index.ts @@ -1,7 +1,7 @@ #! /usr/bin/env node import { spawn } from 'child_process'; -import path from 'path'; import fs from 'fs'; +import path from 'path'; export interface TestCommandOptions { watch: boolean; diff --git a/tools/update/src/index.ts b/tools/update/src/index.ts index ea033fcbea..1b019e7265 100644 --- a/tools/update/src/index.ts +++ b/tools/update/src/index.ts @@ -1,9 +1,9 @@ /* eslint-disable no-console */ +import { getPackageManager } from '@lg-tools/meta'; import chalk from 'chalk'; import { spawn } from 'child_process'; import fs from 'fs'; import path from 'path'; -import { getPackageManager } from '@lg-tools/meta'; export interface UpdateCommandOptions { /** diff --git a/tools/validate/src/builds/index.ts b/tools/validate/src/builds/index.ts index ec8acf5b05..ae9f807967 100644 --- a/tools/validate/src/builds/index.ts +++ b/tools/validate/src/builds/index.ts @@ -3,13 +3,14 @@ */ /* eslint-disable no-console */ +import { getAllPackages, getPackageName } from '@lg-tools/meta'; import chalk from 'chalk'; import fs from 'fs'; import path from 'path'; import vm from 'vm'; -import { getAllPackages, getPackageName } from '@lg-tools/meta'; import { ValidateCommandOptions } from '../validate.types'; + import { ModuleType } from './modules.types'; // A list of diff --git a/tools/validate/src/builds/modules.types.ts b/tools/validate/src/builds/modules.types.ts index f94fef9511..fad082969c 100644 --- a/tools/validate/src/builds/modules.types.ts +++ b/tools/validate/src/builds/modules.types.ts @@ -6,4 +6,4 @@ export const ModuleType = { amd: 'amd', steal: 'steal', } as const; -export type ModuleType = (typeof ModuleType)[keyof typeof ModuleType]; +export type ModuleType = typeof ModuleType[keyof typeof ModuleType]; diff --git a/tools/validate/src/dependencies/checkPackage.ts b/tools/validate/src/dependencies/checkPackage.ts index 0cf8254a0e..2969141bfa 100644 --- a/tools/validate/src/dependencies/checkPackage.ts +++ b/tools/validate/src/dependencies/checkPackage.ts @@ -1,6 +1,7 @@ /* eslint-disable no-console */ import { getPackageName } from '@lg-tools/meta'; import depcheck from 'depcheck'; + import { ValidateCommandOptions } from '../validate.types'; import { depcheckOptions, DependencyIssues } from './config'; diff --git a/tools/validate/src/dependencies/fixDependencyIssues.ts b/tools/validate/src/dependencies/fixDependencyIssues.ts index a9dd2893ee..ba93f973f4 100644 --- a/tools/validate/src/dependencies/fixDependencyIssues.ts +++ b/tools/validate/src/dependencies/fixDependencyIssues.ts @@ -53,6 +53,7 @@ export async function fixDependencies( // Remove all unused dependencies const unused = [...unusedDependencies, ...unusedDevDependencies]; + if (unused.length > 0) { verbose && console.log('Removing unused dependencies...', unused); spawnSync('npx', ['yarn@1.19.0', 'remove', ...unused], spawnContext); diff --git a/tools/validate/src/dependencies/utils/getPackageDependencies.ts b/tools/validate/src/dependencies/utils/getPackageDependencies.ts index db31b32044..683f0a9bd4 100644 --- a/tools/validate/src/dependencies/utils/getPackageDependencies.ts +++ b/tools/validate/src/dependencies/utils/getPackageDependencies.ts @@ -1,8 +1,7 @@ +import { getAllPackageNames } from '@lg-tools/meta'; import { readFileSync } from 'fs'; import { defaults } from 'lodash'; -import { getAllPackageNames } from '@lg-tools/meta'; - interface DependenciesOptions { dev?: boolean; peer?: boolean; diff --git a/tools/validate/src/dependencies/utils/index.ts b/tools/validate/src/dependencies/utils/index.ts index 27b33ee13c..9e264210a2 100644 --- a/tools/validate/src/dependencies/utils/index.ts +++ b/tools/validate/src/dependencies/utils/index.ts @@ -5,9 +5,10 @@ import { readFileSync, writeFileSync } from 'fs'; import { isEqual } from 'lodash'; import path from 'path'; -import { getPackageLGDependencies } from './getPackageDependencies'; import { ignoreFilePatterns, ignoreMatches } from '../config'; +import { getPackageLGDependencies } from './getPackageDependencies'; + const rootDir = process.cwd(); /**