UNPKG

@stencil/eslint-plugin

Version:

ESLint rules specific to Stencil JS projects.

127 lines (125 loc) 4.21 kB
import { t as configs_default } from "./configs-Ciyc5czw.js"; import { access, readFile, rm, writeFile } from "node:fs/promises"; import { join } from "node:path"; //#region src/wizard.ts const ESLINT_CONFIG_FILE = "eslint.config.js"; const OXLINT_CONFIG_FILE = ".oxlintrc.json"; async function fileExists(path) { try { await access(path); return true; } catch { return false; } } function eslintConfigContent(preset) { return `import stencil from '@stencil/eslint-plugin'; export default [stencil.configs.flat.${preset}]; `; } function oxlintConfigContent() { return JSON.stringify({ $schema: "./node_modules/oxlint/configuration_schema.json", jsPlugins: [{ name: "stencil", specifier: "@stencil/eslint-plugin" }], rules: configs_default.oxlint }, null, 2) + "\n"; } async function updatePackageJsonScripts(rootDir, runner, force) { const pkgPath = join(rootDir, "package.json"); const pkg = JSON.parse(await readFile(pkgPath, "utf8")); pkg["scripts"] ??= {}; const lint = runner === "eslint" ? "eslint ." : "oxlint ."; const lintFix = runner === "eslint" ? "eslint . --fix" : "oxlint . --fix"; if (force) { pkg["scripts"]["lint"] = lint; pkg["scripts"]["lint:fix"] = lintFix; } else { pkg["scripts"]["lint"] ??= lint; pkg["scripts"]["lint:fix"] ??= lintFix; } await writeFile(pkgPath, JSON.stringify(pkg, null, 2) + "\n", "utf8"); } const wizard = { init: { id: "@stencil/eslint-plugin", displayName: "ESLint Plugin", description: "Stencil-specific lint rules, via ESLint or oxlint", async run({ config, prompts, nypm }) { const { intro, outro, select, confirm, isCancel, cancel, spinner } = prompts; const rootDir = config.rootDir; intro("@stencil/eslint-plugin - Stencil-specific lint rules"); const eslintConfigPath = join(rootDir, ESLINT_CONFIG_FILE); const oxlintConfigPath = join(rootDir, OXLINT_CONFIG_FILE); const [hasEslintConfig, hasOxlintConfig] = await Promise.all([fileExists(eslintConfigPath), fileExists(oxlintConfigPath)]); const isReconfigure = hasEslintConfig || hasOxlintConfig; if (isReconfigure) { const reconfigure = await confirm({ message: `Lint is already configured (${[hasEslintConfig && ESLINT_CONFIG_FILE, hasOxlintConfig && OXLINT_CONFIG_FILE].filter((name) => Boolean(name)).join(" and ")}). Reconfigure?`, initialValue: false }); if (isCancel(reconfigure) || !reconfigure) { cancel("Lint setup left unchanged."); return; } if (hasEslintConfig) await rm(eslintConfigPath); if (hasOxlintConfig) await rm(oxlintConfigPath); } const runner = await select({ message: "Which linter do you want to run Stencil rules with?", options: [{ value: "oxlint", label: "oxlint", hint: "fast, Rust-based - a few type-aware rules cannot run at-present" }, { value: "eslint", label: "ESLint", hint: "slower, JS-based - full rule coverage, including type-aware rules" }] }); if (isCancel(runner)) { cancel("Setup cancelled."); process.exit(0); } let preset = "recommended"; if (runner === "eslint") { const chosenPreset = await select({ message: "Which rule preset?", options: [{ value: "recommended", label: "Recommended", hint: "sensible defaults" }, { value: "strict", label: "Strict", hint: "recommended + formatting/style rules" }] }); if (isCancel(chosenPreset)) { cancel("Setup cancelled."); process.exit(0); } preset = chosenPreset; } const deps = runner === "eslint" ? [ "eslint", "@typescript-eslint/parser", "@typescript-eslint/eslint-plugin", "eslint-plugin-react" ] : ["oxlint"]; const s = spinner(); s.start("Installing dependencies"); await nypm.addDependency(deps, { cwd: rootDir, dev: true }); s.stop("Dependencies installed"); await writeFile(runner === "eslint" ? eslintConfigPath : oxlintConfigPath, runner === "eslint" ? eslintConfigContent(preset) : oxlintConfigContent(), "utf8"); await updatePackageJsonScripts(rootDir, runner, isReconfigure); outro(`${runner === "eslint" ? "ESLint" : "oxlint"} configured with Stencil rules`); } } }; //#endregion export { wizard }; //# sourceMappingURL=wizard.js.map