eslint-sh 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +22 -13
  2. package/package.json +2 -2
package/README.md CHANGED
@@ -77,7 +77,7 @@ file lintable on its own, and ESLint skips the file without a warning. See
77
77
  `languageOptions` reference table below). This README's own [custom-rule tutorial](https://github.com/mike-north/eslint-sh/blob/main/packages/eslint-plugin/docs/custom-rule-tutorial.md)
78
78
  config omits `languageOptions` for exactly that reason — it targets bash, the default, so
79
79
  there's nothing to override. Add `languageOptions: { dialect: 'posix' }` to your config entry
80
- when targeting POSIX shell, or set a `shellVersion` hint or custom `directivePrefix` as needed.
80
+ when targeting POSIX shell, or set a `minBashVersion` hint or custom `directivePrefix` as needed.
81
81
 
82
82
  ### CommonJS config
83
83
 
@@ -127,7 +127,7 @@ export default defineConfig([{ files: ['**/*.sh', 'bin/?*'], extends: [sh.config
127
127
  (which caps function count, nesting depth and statement count).
128
128
  `sh/no-secret-flags` and `sh/quote-expansions` are `error` here too.
129
129
  - **`sh.configs['bash-3.2']`** is for scripts that must run on the Bash 3.2 macOS ships as
130
- `/bin/bash`. It sets `languageOptions: { dialect: 'bash', shellVersion: '3.2' }` and enables every
130
+ `/bin/bash`. It sets `languageOptions: { dialect: 'bash', minBashVersion: '3.2' }` and enables every
131
131
  version-gated `compat/*` rule at `error`.
132
132
  - **`sh.configs['posix-portable']`** reports Bash-only constructs that fail on dash, including
133
133
  `[[`, `let` and `source`, but not `local`, `echo -e` or the others it leaves to shellcheck, so a
@@ -140,9 +140,11 @@ export default defineConfig([{ files: ['**/*.sh', 'bin/?*'], extends: [sh.config
140
140
 
141
141
  Three `agent-authored` rules report nothing until you configure them. `sh/no-undeclared-commands`
142
142
  and `sh/no-unused-declarations` need a declaration convention bound in
143
- `settings.sh.declarationConvention`, and `sh/require-network-wrapper` needs the wrapper your
144
- network commands must run through, set once in `settings.sh.networkWrapper`. The declaration rules
145
- read that setting too, so they count `curl` in `with-retry curl …` as used:
143
+ `settings: { sh: { declarationConvention: commentPragma } }`, and `sh/require-network-wrapper` needs the wrapper your
144
+ network commands must run through, set once in `settings: { sh: { networkWrapper: 'with-retry' } }`. The declaration rules
145
+ read that setting too, so they count `curl` in `with-retry curl …` as used. Every wrapper-following
146
+ rule also reads project facts from `settings: { sh: { transparentWrappers: ['with-lock'] } }`;
147
+ see [shared transparent wrappers](https://github.com/mike-north/eslint-sh/blob/main/packages/eslint-plugin/docs/transparent-wrappers.md):
146
148
 
147
149
  ```js
148
150
  import { defineConfig } from 'eslint/config';
@@ -159,11 +161,11 @@ export default defineConfig([
159
161
 
160
162
  ## `languageOptions` reference
161
163
 
162
- | Option | Allowed values | Default | Effect |
163
- | ----------------- | ----------------------------------------------------------------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
164
- | `dialect` | `"bash"`, `"posix"`, `"mksh"`, `"bats"`, `"zsh"` | `"bash"` | Selects which shell grammar the parser accepts. Enforcement is partial: some non-dialect constructs are rejected (e.g. bash array literals under `posix`), but others (e.g. `[[ ... ]]`, `let`) are accepted as ordinary commands — see the [per-dialect enforcement table](https://github.com/mike-north/sh-ast/blob/main/packages/sh-ast/README.md#dialect-enforcement). |
165
- | `shellVersion` | A numeric `MAJOR` or `MAJOR.MINOR` string, e.g. `"5"` or `"3.2"` | unset | The Bash version your scripts must run on. It has no effect on parsing; the `compat/*` rules read it to report features that version lacks. Unset means the newest version. See [version compatibility](https://github.com/mike-north/eslint-sh/blob/main/packages/eslint-plugin/docs/compat.md). |
166
- | `directivePrefix` | Lowercase, hyphen-separated words, e.g. `"eslint"` or `"shellcheck-sh"` | `"eslint"` | The prefix directive/inline-config comments must start with — e.g. the default recognizes `# eslint-disable-next-line ...`. |
164
+ | Option | Allowed values | Default | Effect |
165
+ | ----------------- | ----------------------------------------------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
166
+ | `dialect` | `"bash"`, `"posix"`, `"mksh"`, `"bats"`, `"zsh"` | `"bash"` | Selects which shell grammar the parser accepts. Enforcement is partial: some non-dialect constructs are rejected (e.g. bash array literals under `posix`), but others (e.g. `[[ ... ]]`, `let`) are accepted as ordinary commands — see the [per-dialect enforcement table](https://github.com/mike-north/sh-ast/blob/main/packages/sh-ast/README.md#dialect-enforcement). |
167
+ | `minBashVersion` | A numeric `MAJOR` or `MAJOR.MINOR` string, e.g. `"5"` or `"3.2"` | unset | The minimum Bash version your scripts must support, including every newer Bash; no upper limit is checked. Accepted only for `bash` (the default) or `bats`. The parser ignores it; `compat/*` rules report features unavailable at the floor. Unset means no Bash version constraint. See [version compatibility](https://github.com/mike-north/eslint-sh/blob/main/packages/eslint-plugin/docs/compat.md). |
168
+ | `directivePrefix` | Lowercase, hyphen-separated words, e.g. `"eslint"` or `"shellcheck-sh"` | `"eslint"` | The prefix directive/inline-config comments must start with — e.g. the default recognizes `# eslint-disable-next-line ...`. |
167
169
 
168
170
  ## Continuous integration
169
171
 
@@ -242,6 +244,13 @@ to the `files` patterns in your config. `--no-warn-ignored` keeps a staged file
242
244
  does not cover from failing the hook as an "ignored file" warning. File names are passed
243
245
  NUL-separated, so names with spaces work, and the hook does nothing when no shell file is staged.
244
246
 
247
+ **Linting code you don't control.** The job above runs the checkout's own config and install,
248
+ which is right for your own repository. When CI lints contributions from people who don't own the
249
+ policy, a script can switch rules off with `# eslint-disable` comments, and the checkout's
250
+ `eslint.config.mjs` is code the contributor wrote. See
251
+ [linting code you don't control](https://github.com/mike-north/eslint-sh/blob/main/packages/eslint-plugin/docs/untrusted-code.md)
252
+ for a config that ignores those comments and a command that runs ESLint from outside the checkout.
253
+
245
254
  ## Editor setup
246
255
 
247
256
  Editors that run ESLint through its language server, such as the VS Code ESLint extension, run
@@ -447,8 +456,8 @@ from what the plugin actually does.
447
456
  export default defineConfig([{ files: ['**/*.sh'], extends: [sh.configs.recommended] }]);
448
457
  ```
449
458
 
450
- - **Setting `shellVersion` doesn't change anything.** `shellVersion` has no effect on parsing,
451
- and only the version-gated `compat/*` rules read it (`sh/compat/no-append-all-redirect`, `sh/compat/no-associative-arrays`, `sh/compat/no-case-attributes`, `sh/compat/no-case-fallthrough`, `sh/compat/no-case-modification`, `sh/compat/no-coproc`, `sh/compat/no-declare-g`, `sh/compat/no-epoch-variables`, `sh/compat/no-fd-variable`, `sh/compat/no-globstar`, `sh/compat/no-lastpipe-semantics`, `sh/compat/no-mapfile`, `sh/compat/no-nameref`, `sh/compat/no-negative-array-index`, `sh/compat/no-nounset-empty-array`, `sh/compat/no-parameter-transformation`, `sh/compat/no-pipe-all`, `sh/compat/no-printf-time-format`, `sh/compat/no-test-v`, `sh/compat/no-unicode-escape` and `sh/compat/no-wait-n`). The `bash-3.2` and `posix-portable` presets enable them; to pick rules yourself,
459
+ - **Setting `minBashVersion` doesn't change anything.** `minBashVersion` has no effect on parsing,
460
+ and only the version-gated `compat/*` rules read it (`sh/compat/no-append-all-redirect`, `sh/compat/no-associative-arrays`, `sh/compat/no-brace-sequence-padding-step`, `sh/compat/no-case-attributes`, `sh/compat/no-case-fallthrough`, `sh/compat/no-case-modification`, `sh/compat/no-coproc`, `sh/compat/no-declare-g`, `sh/compat/no-epoch-variables`, `sh/compat/no-fd-variable`, `sh/compat/no-globstar`, `sh/compat/no-lastpipe-semantics`, `sh/compat/no-mapfile`, `sh/compat/no-nameref`, `sh/compat/no-negative-array-index`, `sh/compat/no-nounset-empty-array`, `sh/compat/no-parameter-transformation`, `sh/compat/no-pipe-all`, `sh/compat/no-printf-time-format`, `sh/compat/no-test-v`, `sh/compat/no-unicode-escape` and `sh/compat/no-wait-n`). The `bash-3.2` and `posix-portable` presets enable them, except that `sh/compat/no-nounset-empty-array` requires explicit opt-in for `bash-3.2`. Enable that rule when a script uses `set -u` on Bash below 4.4 and its arrays can really be empty; to pick rules yourself,
452
461
  enable the ones you want, for example `'sh/compat/no-mapfile': 'error'`. See
453
462
  [version compatibility](https://github.com/mike-north/eslint-sh/blob/main/packages/eslint-plugin/docs/compat.md).
454
463
  - **`# eslint-disable-next-line ...` comments don't seem to do anything.** First check that the
@@ -491,7 +500,7 @@ plugin's own `sh-ast` dependency, the same module instance its language parses w
491
500
  `sh-ast` directly.
492
501
 
493
502
  **Versioning.** `eslint-sh/syntax` and `eslint-sh/syntax/analyze` track the plugin's pinned
494
- `sh-ast` minor (currently `sh-ast@^0.7.0`). Under 0.x, a different `sh-ast` minor is a breaking
503
+ `sh-ast` minor (currently `sh-ast@^0.9.0`). Under 0.x, a different `sh-ast` minor is a breaking
495
504
  change, so an `sh-ast` 0.x minor bump is a minor bump of this package, and the changelog entry
496
505
  names the new `sh-ast` version.
497
506
 
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "eslint-sh",
3
3
  "description": "Shell script linting for ESLint, with built-in policy rules, shared presets, and custom rules over a typed shell AST",
4
- "version": "0.6.0",
4
+ "version": "0.8.0",
5
5
  "author": "Mike North <michael.l.north@gmail.com>",
6
6
  "dependencies": {
7
- "@eslint-sh/eslint-plugin": "0.6.0"
7
+ "@eslint-sh/eslint-plugin": "0.8.0"
8
8
  },
9
9
  "devDependencies": {
10
10
  "eslint": "^10.7.0"