jimmy-zhening-luo / linted

ESLint mono-plugin bundler with strict, opinionated defaults for (Stylistic) JavaScript, TypeScript, Svelte, HTML, Tailwind/CSS, JSON, JSONC, YAML, and Mocha.
https://npmjs.com/package/linted
MIT License
1 stars 0 forks source link
css eslint eslint-config eslint-plugin formatter html javascript json jsonc linter mocha stylistic svelte sveltekit tailwindcss typescript yaml

linted

NPM Publish (RELEASE)

DO NOT USE - DOCUMENTATION IS SIGNIFICANTLY OUTDATED AS OF AUGUST 4, 2024

ESLint mono-plugin bundler with strict, opinionated defaults for (Stylistic) JavaScript, TypeScript, Svelte, HTML, Tailwind/CSS, JSON, JSONC, YAML, and Mocha.

  1. Languages
  2. Features
  3. Limitation
  4. Install
  5. Roadmap
  6. Rule Logic (Advanced)

Languages

Web

Data

Library


See language support roadmap.

Features

Zero-Dependency

No need to install 17 plugins and 12 parsers: each language's latest plugin is bundled and configured.

Zero-Config

No need to remember each plugin's parserOptions; you won't have to do this just to enable Svelte linting:

    // lint TypeScript blocks in Svelte
    plugins: {
      "@stylistic": stylistic,
      "@typescript-eslint": ts,
      svelte,
    },
    languageOptions: {
      ecmaVersion: "latest",
      sourceType: "module",
      parser: svelteParser,
      parserOptions: {
        parser: tsParser,
        ecmaVersion: "latest",
        sourceType: "module",
        project: "tsconfig.json",
        extraFileExtensions: [".svelte"],
      },
    },
    processor: "svelte/svelte",

Zero-Arugment API

linted();

Two-Statement eslint.config.js

import linted from "linted";

export default linted();

Total Control via Optional Arguments

WIP for v14.1, currently inaccurate.

includes (Scoped)

import linted from "linted";

linted(
  {
    /** includes **/
    js: [
      "scripts/**/*/.{js,mjs}",
      "*.config.js",
    ], /* example: array of glob patterns to lint using JavaScript rules */
    ts: [
      "src/**/*.ts",
      "*.config.ts",
    ],

    // svelte: [],
    // html: [],

    /* ...json, jsonc, yml, */
  },
)

ignores (Global)

import linted from "linted";

linted(
  { /** includes **/ },
  {
    /** ignores **/
    gitignore: true, /* (default) never lint any git-ignored file */
    ignoreArtifacts: true, /* (default) never lint "**/*/package-lock.json" */
    global: [], /* array of glob patterns to never lint */
  },
)

overrides (Scoped)

linted(
  { /** includes **/ },
  { /** ignores **/ },
  {
    /** overrides **/
    overrideJs: {}, /* js rule overrides */
    overrideTs: {
      /* Overrides apply to `ts` scope,
       * but NOT to `js` scope,
       * NOR to `svelte` scope.
       */
      "no-unused-vars": "off", /* example: ESLint base rule */
      "@typescript-eslint/indent": "warn", /* example: TypeScript plugin rule */
    }, /* js rule overrides */

    /* ...overrideTs, overrideSvelte, overrideHtml, overrideJson, overrideJsonc, overrideYml, */
  },
)

Limitation

In TypeScript projects, skipLibCheck must be true.

Enable skipLibCheck

By default, skipLibCheck is false. To set it to true:

tsconfig.json

{
  "compilerOptions": {
    "skipLibCheck": true,
  },
}

...or tsc CLI option

tsc --skipLibCheck

Install

  1. Install eslint and linted.

    npm i -D eslint@^8.57 linted
  2. Create eslint.config.js in your project root.

  3. In eslint.config.js:

    • Import function linted.

      import linted from "linted";
    • Export linted with optional arguments:

      import linted from "linted";
      
      export default linted(
        // ...
      );

Roadmap

v11

Mocha

Tailwind PostCSS

HTML Connectors

JSON (Custom Schema Validation)


Rule Logic (Advanced)

What is scope?

Each scope maps to a unique language:

Rules

Each scope supports:

Default Rules

Language-Aggregate scope

A language can be an extension of or depend on another language.

For example:

For such a language, its scope's default rules are aggregated with the default rules of extended or consumed languages by scope precedence:

Files

Global Ignores

.gitignore

By default, linted ignores all files in .gitignore. This behavior can be disabled.

package-lock.json

**/*.package-lock.json is always skipped. This cannot be overriden.

ignores

Additional glob patterns supplied if matched by a file will skip linting that file, even if a scope pattern matches the file.

Scoped Includes

Files specified in scope are appended to the following default files:

  {
    js: [
      "{src,static}/**/*.{js,mjs,cjs}",
      "*.{js,mjs,cjs}",
    ],
    ts: [
      "{src,static}/**/*.{ts,mts,cts}",
      "*.{ts,mts,cts}",
    ],
    svelte: ["{src,static}/**/*.svelte"],
    html: [
      "{src,static}/**/*.html",
      "*.html",
    ],
    json: [
      "{src,static}/**/*.json",
      "*.json",
    ],
    jsonc: [
      "tsconfig.json",
      "{src,static}/**/*.jsonc",
      "*.jsonc",
    ],
    yml: [
      ".github/workflows/*.{yml,yaml}",
      "{src,static}/**/*.{yml,yaml}",
      "*.{yml,yaml}",
    ],
  },

Scope Conflict

Scope Precedence (low to high)
js
ts
svelte
html
json
jsonc
yml
ignores (global)

Override

Overrides are per-scope.

Example

overrideTs rules apply to files which: