-
Notifications
You must be signed in to change notification settings - Fork 283
/
check-package-json-sort.ts
74 lines (64 loc) · 2.19 KB
/
check-package-json-sort.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import fs from "fs-extra";
import path from "path";
import { fileURLToPath } from "url";
import { globby, Options as GlobbyOptions } from "globby";
import { RuntimeError } from "run-time-error";
import { isStdLibRecord } from "./is-std-lib-record";
import { sortPackageJson } from "sort-package-json";
export interface ICheckPackageJsonSort {
readonly argv: string[];
readonly env: NodeJS.ProcessEnv;
}
/**
* Sorts and checks that all the package.json files within the Cactus project
* Note: this only sorts and checks the package.json files that are within the
* `packages` folder for this proeject
*
* @returns An array with the first item being a boolean indicating
* 1) success (`true`) or 2) failure (`false`)
*/
export async function checkPackageJsonSort(
req: ICheckPackageJsonSort,
): Promise<[boolean, string[]]> {
const TAG = "[tools/check-package-json-sort.ts]";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const SCRIPT_DIR = __dirname;
const PROJECT_DIR = path.join(SCRIPT_DIR, "../../");
console.log(`${TAG} SCRIPT_DIR=${SCRIPT_DIR}`);
console.log(`${TAG} PROJECT_DIR=${PROJECT_DIR}`);
if (!req) {
throw new RuntimeError(`req parameter cannot be falsy.`);
}
if (!req.argv) {
throw new RuntimeError(`req.argv cannot be falsy.`);
}
if (!req.env) {
throw new RuntimeError(`req.env cannot be falsy.`);
}
const globbyOpts: GlobbyOptions = {
cwd: PROJECT_DIR,
ignore: ["**/node_modules"],
};
const DEFAULT_GLOB = "**/cactus-*/package.json";
const pkgJsonPaths = await globby(DEFAULT_GLOB, globbyOpts);
sortPackageJson(pkgJsonPaths);
const errors: string[] = [];
const checks = pkgJsonPaths.map(async (pathRel) => {
const filePathAbs = path.join(PROJECT_DIR, pathRel);
const pkgJson: unknown = await fs.readJSON(filePathAbs);
if (typeof pkgJson !== "object") {
errors.push(`ERROR: ${pathRel} package.json cannot be empty.`);
return;
}
if (!pkgJson) {
errors.push(`ERROR: ${pathRel} package.json cannot be empty.`);
return;
}
if (!isStdLibRecord(pkgJson)) {
return;
}
});
await Promise.all(checks);
return [errors.length === 0, errors];
}