@skypack/package-check
Version:
A quality score checker for npm packages.
177 lines • 6.25 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.cli = void 0;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const yargs_parser_1 = __importDefault(require("yargs-parser"));
const colors = __importStar(require("kleur/colors"));
const get_repo_url_1 = require("./get-repo-url");
function runCheck({ pass, title, url }) {
try {
const result = pass();
if (result) {
console.error(colors.green(`✓`) + colors.dim(` ${title}`));
}
else if (!result) {
console.error(colors.red(`✖ ${title}`));
console.error('');
console.error(colors.red('check failed:'), title);
console.error(colors.red(' how to fix:'), url);
process.exit(1);
}
}
catch (err) {
console.error('run failed (internal tool error, please report this!)');
throw err;
}
}
async function cli(args) {
const cliFlags = yargs_parser_1.default(args, {});
const cwd = cliFlags.cwd ? path_1.default.resolve(cliFlags.cwd) : process.cwd();
const files = fs_1.default.readdirSync(cwd);
// Check: Has a package.json
runCheck({
title: 'package.json',
url: 'https://docs.skypack.dev/package-authors/package-checks#esm',
pass: () => {
return !!files.includes('package.json');
},
});
// Load package.json
const pkg = await fs_1.default.promises
.readFile(path_1.default.join(cwd, 'package.json'), {
encoding: 'utf-8',
})
.then((packageJsonContents) => JSON.parse(packageJsonContents));
// Check: Has ESM
runCheck({
title: 'ES Module Entrypoint',
url: 'https://docs.skypack.dev/package-authors/package-checks#esm',
pass: () => {
if (pkg.type === 'module') {
return true;
}
if (pkg.module) {
return true;
}
if (typeof pkg.main === 'string' && pkg.main.endsWith('.mjs')) {
return true;
}
if (pkg.exports &&
(pkg.exports['import'] ||
!!Object.values(pkg.exports).find((x) => typeof x === 'object' && x.import))) {
return true;
}
return false;
},
});
// Check: Export Map
runCheck({
title: 'Export Map',
url: 'https://docs.skypack.dev/package-authors/package-checks#export-map',
pass: () => {
return !!pkg.exports;
},
});
// Check: Has "files"
runCheck({
title: 'No Unnecessary Files',
url: 'https://docs.skypack.dev/package-authors/package-checks#files',
pass: () => {
return !!pkg.files;
},
});
// Check: Has "keywords"
runCheck({
title: 'Keywords',
url: 'https://docs.skypack.dev/package-authors/package-checks#keywords',
pass: () => {
return !!pkg.keywords;
},
});
// Check: Has "keywords"
runCheck({
title: 'Keywords (Empty)',
url: 'https://docs.skypack.dev/package-authors/package-checks#keywords',
pass: () => {
return !!pkg.keywords.length;
},
});
// Check: Has "license"
runCheck({
title: 'License',
url: 'https://docs.skypack.dev/package-authors/package-checks#license',
pass: () => {
return !!pkg.license;
},
});
// Check: Has "repository url"
runCheck({
title: 'Repository URL',
url: 'https://docs.skypack.dev/package-authors/package-checks#repository',
pass: () => {
let repositoryUrl;
if (!pkg.repository) {
return false;
}
if (typeof pkg.repository === 'string') {
return true;
}
if (pkg.repository.url) {
return !!new URL(get_repo_url_1.repoURL(pkg.repository.url));
}
return false;
},
});
// Check: Has types
runCheck({
title: 'TypeScript Types',
url: 'https://docs.skypack.dev/package-authors/package-checks#types',
pass: () => {
const isOk = !!pkg.types || !!pkg.typings || !!pkg.typesVersions;
if (isOk) {
return true;
}
if (files.includes('index.d.ts')) {
console.error(colors.yellow('"./index.d.ts" file found, but package.json "types" entry is missing.'));
console.error(colors.yellow('Learn more about why this is still required: https://github.com/skypackjs/package-check/issues/6#issuecomment-714840634'));
return false;
}
return false;
},
});
// Check: Has "README"
runCheck({
title: 'README',
url: 'https://docs.skypack.dev/package-authors/package-checks#readme',
pass: () => {
return !!files.find((f) => /^readme\.?/i.test(f));
},
});
console.error('');
console.error(colors.green(`[100/100] ${pkg.name} passes all quality checks.`));
}
exports.cli = cli;
//# sourceMappingURL=index.js.map