prettier-plugin-pkg
Version:
An opinionated package.json formatter plugin for Prettier
254 lines • 4.72 kB
JavaScript
import { alphabetSort, sortObject } from '../utils.js';
export const dependencyNames = [
'bundledDependencies',
'peerDependencies',
'peerDependenciesMeta',
'dependencies',
'dependenciesMeta',
'optionalDependencies',
'devDependencies',
'overrides',
'resolutions',
];
const NPM_SORTS = [
'$schema',
'name',
'version',
'description',
'keywords',
'homepage',
'bugs',
'license',
'author',
'contributors',
'funding',
'files',
'exports',
'main',
'browser',
'bin',
'man',
'directories',
'repository',
'scripts',
'config',
'dependencies',
'devDependencies',
'peerDependencies',
'peerDependenciesMeta',
'bundleDependencies',
'optionalDependencies',
'overrides',
'engines',
'os',
'cpu',
'libc',
'devEngines',
'private',
'publishConfig',
'workspaces',
];
const NPM_PLUS_SORTS = [
'$schema',
'name',
'displayName',
'version',
'private',
'description',
'categories',
'keywords',
'homepage',
'bugs',
'repository',
'funding',
'license',
'qna',
'author',
'maintainers',
'contributors',
'publisher',
'sideEffects',
'type',
'imports',
'exports',
'main',
'svelte',
'umd:main',
'jsdelivr',
'unpkg',
'module',
'source',
'jsnext:main',
'browser',
'react-native',
'types',
'typesVersions',
'typings',
'style',
'example',
'examplestyle',
'assets',
'bin',
'man',
'directories',
'files',
'workspaces',
'binary',
'scripts',
'betterScripts',
'contributes',
'activationEvents',
'husky',
'simple-git-hooks',
'pre-commit',
'commitlint',
'lint-staged',
'nano-staged',
'config',
'nodemonConfig',
'browserify',
'babel',
'browserslist',
'xo',
'prettier',
'eslintConfig',
'eslintIgnore',
'npmpackagejsonlint',
'release',
'remarkConfig',
'stylelint',
'ava',
'jest',
'mocha',
'nyc',
'tap',
'oclif',
'resolutions',
'dependencies',
'devDependencies',
'dependenciesMeta',
'peerDependencies',
'peerDependenciesMeta',
'optionalDependencies',
'bundledDependencies',
'bundleDependencies',
'extensionPack',
'extensionDependencies',
'flat',
'packageManager',
'engines',
'engineStrict',
'volta',
'languageName',
'os',
'cpu',
'preferGlobal',
'publishConfig',
'icon',
'badges',
'galleryBanner',
'preview',
'markdown',
'pnpm',
];
const primary = [
'$schema',
'name',
'version',
'type',
'flat',
'displayName',
'description',
'categories',
'repository',
'homepage',
'bugs',
'author',
'publisher',
'maintainers',
'contributors',
'donate',
'funding',
'sponsor',
'license',
'preview',
'private',
'workspaces',
'languageName',
'packageManager',
'engines',
'cpu',
'os',
'libc',
'devEngines',
'man',
'bin',
'main',
'types',
'typings',
'typesVersions',
'module',
'imports',
'exports',
'esnext',
'es2020',
'esm2020',
'fesm2020',
'es2015',
'esm2015',
'fesm2015',
'es5',
'esm5',
'fesm5',
'browser',
'umd',
'jsdelivr',
'unpkg',
'directories',
'files',
'keywords',
'scripts',
'config',
...dependencyNames,
'publishConfig',
'sideEffects',
'icon',
'badges',
'galleryBanner',
'activationEvents',
'contributes',
'markdown',
'qna',
'extensionPack',
'extensionDependencies',
'extensionKind',
];
const DEFAULT_SORT_ORDERS = {
npm: NPM_SORTS,
'npm-plus': NPM_PLUS_SORTS,
};
const uniqueArray = (arr) => {
return [...new Set(arr)];
};
export const sort = (props, options) => {
let { packageSortOrder, packageSortOrderPreset } = options;
const defaultSortOrder = (packageSortOrderPreset && DEFAULT_SORT_ORDERS[packageSortOrderPreset]) ||
[];
packageSortOrder = uniqueArray([
...(packageSortOrder ?? []),
...defaultSortOrder,
...primary,
]);
const others = [];
const known = props.filter(prop => {
if (packageSortOrder.includes(prop.key.value)) {
return true;
}
others.push(prop);
return false;
});
known.sort((a, b) => alphabetSort(packageSortOrder.indexOf(a.key.value), packageSortOrder.indexOf(b.key.value)));
others.sort(sortObject);
return [...known, ...others];
};
//# sourceMappingURL=sort.js.map