@atomicsmash/coding-standards
Version:
A collection of coding standards configurations.
134 lines (133 loc) • 4.2 kB
JavaScript
import { existsSync, readFileSync } from "fs";
import { resolve, dirname, join } from "path";
/**
* Search for `package.json`
*/
function findNearestPackageJson(from) {
from = resolve(from);
const parent = dirname(from);
if (!from || parent === from) {
return;
}
const pkg = join(from, "package.json");
if (existsSync(pkg)) {
return pkg;
}
return findNearestPackageJson(parent);
}
/**
* Load the nearest package.json
*/
function loadPackageJson(cwd) {
const pkgFile = findNearestPackageJson(cwd);
if (!pkgFile)
return null;
const packageJson = JSON.parse(readFileSync(pkgFile, "utf-8"));
if (typeof packageJson === "object" && packageJson !== null) {
return packageJson;
}
return null;
}
function determinePackageNamesAndMethods(cwd = process.cwd()) {
const packageImport = loadPackageJson(cwd) ?? {};
const packageNames = Object.keys(("dependencies" in packageImport && packageImport.dependencies) ?? {}).concat(Object.keys(("devDependencies" in packageImport && packageImport.devDependencies) ??
{}));
return { packageNames };
}
/**
* Search for `composer.json`
*/
function findNearestComposerJson(from) {
from = resolve(from);
const parent = dirname(from);
if (!from || parent === from) {
return;
}
const composerJsonPath = join(from, "composer.json");
if (existsSync(composerJsonPath)) {
return composerJsonPath;
}
return findNearestComposerJson(parent);
}
/**
* Load the nearest composer.json
*/
function loadComposer(cwd) {
const composerJsonFile = findNearestComposerJson(cwd);
if (!composerJsonFile)
return;
const composerJson = JSON.parse(readFileSync(composerJsonFile, "utf-8"));
if (typeof composerJson === "object" && composerJson !== null) {
return composerJson;
}
return null;
}
function determineComposerPackageNamesAndMethods(cwd = process.cwd()) {
const packageImport = loadComposer(cwd) ?? {};
const packageNames = Object.keys(("require" in packageImport && packageImport.require) ?? {})
.concat(Object.keys(("require-dev" in packageImport && packageImport["require-dev"]) ?? {}))
.reduce((allowedWords, packageName) => {
return [...allowedWords, ...packageName.split("/")];
}, []);
return { packageNames };
}
const config = {
language: "en-GB",
words: [
...[
...determinePackageNamesAndMethods().packageNames,
...determineComposerPackageNamesAndMethods().packageNames,
"commitlint",
"sass",
"Userback",
"phpcs",
"phpcbf",
], // package and language names
...["tsbuildinfo", "svgs"], // filenames
...["combobox", "spinbutton"], // accessible roles
...["popover", "dialog"], // custom element names
...["atomicsmash"], // company all lowercase
...["unstringified", "formattable", "keyof", "nonnullable", "hidable"], // coding actions
...[
"alignfull",
"alignleft",
"alignright",
"muplugin",
"textdomain",
"color", // For in theme.json
"gfield", // Gravity Forms field class
"phpmailer",
"WPMDB", // WP Migrate DB
"shortcode",
"wp_kses",
"sprintf", // For @wordpress/i18n
], // WordPress stuff
],
languageSettings: [
{
languageId: "*",
locale: "en-GB",
},
{
languageId: "css, less, scss, sass",
locale: "en-US",
dictionaries: ["css"],
},
{
languageId: "javascript,typescript,javascriptreact,typescriptreact",
locale: "en-GB",
dictionaries: ["typescript"],
},
{
languageId: "php",
locale: "en-GB",
dictionaries: ["php", "html"],
},
{
languageId: "html,vue-html,javascriptreact,typescriptreact",
locale: "en-GB",
dictionaries: ["html"],
},
],
};
export default config;