@systemfsoftware/oxlint-plugin-test-discipline 5.0.0 → 6.1.3

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.
package/CHANGELOG.md CHANGED
@@ -1,63 +1,5 @@
1
1
  # @systemfsoftware/oxlint-plugin-test-discipline
2
2
 
3
- ## 5.0.0
3
+ # @systemfsoftware/oxlint-plugin-test-discipline@6.1.3
4
4
 
5
- ### Major Changes
6
-
7
- - Rules recognize effect 4.0.0 module paths: `effect/Arbitrary` (and the root `Arbitrary` name), `effect/process/ChildProcessSpawner`, and the `effect/encoding` codecs. A module is judged the same whether it is imported from `effect`, from an `effect/<area>` barrel, or by its own subpath. `schema-file-imports-pure-modules-only` admits `Base64`, `Base64Url`, `Hex` and `EncodingError` from `effect/encoding` in place of the removed `Encoding` module.
8
-
9
- - Require `effect` `^4` (stable 4.0.0). Release candidates are no longer supported: imports follow 4.0.0's module layout (`effect/http`, `effect/rpc`, `effect/http-api`, `effect/cluster`, `effect/process`, `effect/socket`, `effect/persistence`, `effect/reactivity`, `effect/encoding`, `effect/Arbitrary`), which does not exist in any 4.0.0 RC.
10
-
11
- ## 4.1.0
12
-
13
- ### Minor Changes
14
-
15
- - The `contract` test suffix is retired. `test-suffix-outside-src` now reports a test file named with the `contract` suffix, and the behaviour-test rules (`behaviour-test-requires-gherkin`, `behaviour-one-feature-per-file`, `behaviour-exercises-use-case`, `no-pseudo-gherkin-unit-tests`) apply to the `integration` suffix alone. Rename a suite that drives a real medium to the `integration` suffix.
16
-
17
- ## 4.0.1
18
-
19
- ### Patch Changes
20
-
21
- - `in-source-test-targets-private`'s message now names an exported operation in the `it.prop` `subject` slot as a legal target for an in-source block, beside a private helper.
22
-
23
- ## 4.0.0
24
-
25
- ### Minor Changes
26
-
27
- - Contract suites are now a recognised kind of behaviour test. A test file with the `contract` suffix may live beside integration suites, and the rules hold it to the same obligations: exactly one Gherkin feature, no bare test runner, and an import of the package it proves.
28
-
29
- ## 3.9.0
30
-
31
- ### Minor Changes
32
-
33
- - Add `expect-boolean-predicate`, which refuses an `expect` on a predicate call, comparison, negation or `&&`/`||` asserted with `toBe(true|false)` and names the `toSatisfy` or `toEqual` rewrite, and `vitest-from-effect-vitest`, which refuses any value import from `vitest` — named, namespace, default, side-effect or dynamic — and names `@effect/vitest` as the rewrite; a type-only import stays legal. `prop-arbitrary-schema-origin` also checks the `of` entries of the object form `it.prop(name, { of, subject, runs }, holds)`.
34
-
35
- ## 3.8.1
36
-
37
- ### Patch Changes
38
-
39
- - Update peer and runtime dependency on `effect` and companion packages to `4.0.0-rc.117`.
40
-
41
- ## 3.8.0
42
-
43
- ### Minor Changes
44
-
45
- - New rule `ban-raw-span-name-emit` at error: a raw span name can no longer enter through an emit API. Calls to `startSpan`, `spanBuilder`, or `startActiveSpan` — bare or as a member call — are flagged when the first argument is a string literal or a template literal, interpolated templates included. The declared-span spelling is untouched: `Span.declare({ id, name, attrs })` and the `start(attrs)` it returns never trigger the rule, and emit calls given a dynamic name are left alone. The recommended preset enables it at error.
46
-
47
- - New rule `trace-test-requires-taxonomy` at error: a test file named with the `trace.test` suffix is a trace spec, and a trace spec cannot quietly assert HTTP status. It requires an import binding from `@systemfsoftware/trace-spec`, forbids raw emit calls (`startSpan`, `spanBuilder`, `startActiveSpan`), and forbids terminating a case on an HTTP status or body assertion in these shapes: `expect(res.status)`, `toHaveProperty('status')` (also `statusText`, `body`, dotted paths under them, and segment arrays like `['body', 'items']`), or an object matcher (`toMatchObject`, `toEqual`, `toStrictEqual`, `expect.objectContaining`) whose object literal carries one of those keys at any depth (nested objects and array elements), also through `.resolves`, `.rejects`, and `.not`. `test-suffix-outside-src` now admits the `trace.test` suffix. The recommended preset enables the new rule at error.
48
-
49
- ## 3.7.0
50
-
51
- ### Minor Changes
52
-
53
- - Enable `no-pseudo-gherkin-unit-tests` in the recommended rule set: every `*.integration.test.ts` Feature builder must declare its collaborator environment with `.withLayer(...)` or `.withScenarioLayer(...)`. The diagnostic now names `Layer.empty` as the remedy for features whose collaborators are in memory.
54
-
55
- ## 3.6.0
56
-
57
- ### Minor Changes
58
-
59
- - New rule `differential-test-requires-harness` (recommended, error): a `.differential.test.ts` file must import and invoke `@systemfsoftware/differential-spec` (`Differential.compare` / `Metamorphic.on`) and must not call raw test runners. `test-suffix-outside-src` now sanctions the `.differential.test.ts` altitude alongside `.integration.test.ts`, and `property-file-purity` treats differential files as property files.
60
-
61
- - Publish standalone domain-aligned oxlint plugins and shareable configurations for Effect Schema, DMMF workflows, Effect Platform runtime entrypoints, test discipline, and Cell Architecture.
62
-
63
- Consolidates and supersedes the 12 retired legacy packages (`@systemfsoftware/all`, `@systemfsoftware/oxlint-config`, `@systemfsoftware/oxlint-plugin`, `@systemfsoftware/oxlint-plugin-recommended`, `@systemfsoftware/oxlint-plugin-effect-dmmf`, `@systemfsoftware/oxlint-plugin-effect-native`, `@systemfsoftware/oxlint-plugin-effect-entrypoint`, `@systemfsoftware/oxlint-plugin-effect-workflow`, `@systemfsoftware/oxlint-plugin-property-testing`, `@systemfsoftware/oxlint-plugin-structure`, `@systemfsoftware/oxlint-plugin-tag-discipline`, `@systemfsoftware/oxlint-plugin-test-hygiene`, `@systemfsoftware/oxlint-plugin-test-placement`).
5
+ Hold the oxlint toolchain at ~1.89.0 (was ~1.93.0). The `oxlint-config-*` packages' oxlint peer range moves to ~1.89.0, and the oxlint-plugin packages' oxlint and @oxlint/plugins dependency range moves to ~1.89.0. Rules and presets are unchanged.
package/README.md CHANGED
@@ -4,35 +4,94 @@ Oxlint rules enforcing property-based test laws, test placement, and test naming
4
4
 
5
5
  ## Rules
6
6
 
7
- | Rule | What it enforces |
8
- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
9
- | `no-test-file-in-src` | Under `src/`, the only sanctioned test file is a single-segment `<stem>.workflow.property.test.ts` inside a sanctioned test directory, plus the generated `schema-laws.test.ts` entry point. Every other test file is banned: a kernel, policy, or schema suite becomes an in-source `import.meta.vitest` block, and a public-surface test moves outside `src/` as an integration test. |
10
- | `src-property-test-cell` | A property test under `src/` must be a single-segment `<stem>.workflow.property.test.ts` beside the `<stem>.workflow.ts` it covers. A source file whose suffix names a cell listed in `cellsRequiringTest` must also carry an in-source vitest block; that list is empty by default. |
11
- | `test-file-outside-tests-dir` | A test file outside `src/` must live under `tests/`. |
12
- | `test-suffix-outside-src` | Outside `src/`, a test file must end `.integration.test.ts`, `.differential.test.ts`, `.trace.test.ts`, or `.conformance.test.ts` — the four sanctioned lane suffixes. A runner-driving package (`vitest`, `vitest-conformance`, `effect-spec-runtime`) is exempt: its plain `*.test.ts` runners and nested-run probes are not consumer lanes. |
13
- | `tests-dir-helpers-in-fixtures` | Under `tests/`, the only non-test modules are helpers and fixtures, and they live inside `tests/__fixtures__/`. |
14
- | `no-io-module-in-source-test` | An in-source `import.meta.vitest` test block is forbidden in a module that performs I/O — decided from the module's own syntax (a non-type import from a filesystem, process or network module, called at least once), never from its filename. Only the in-source-test idiom is judged: a module whose tests live in separate files is a no-op for this rule. |
15
- | `behaviour-test-requires-gherkin` | A `.integration.test.ts` must import `makeFeature` from `@systemfsoftware/effect-gherkin-spec` and must not import test runners directly from `vitest`, `@effect/vitest` or `@systemfsoftware/vitest`. |
16
- | `behaviour-exercises-use-case` | A `.integration.test.ts` must reach at least one shell entry — an executor/handler/adapter/store, the package `main`/`mod`/`index`, or a non-foundation package — so it drives a use case. |
17
- | `behaviour-one-feature-per-file` | A `.integration.test.ts` must contain exactly one `Feature(...)` call; zero or two-or-more is the junk-drawer signal. |
18
- | `differential-test-requires-harness` | A `.differential.test.ts` must import `@systemfsoftware/differential-spec` and invoke its harness; direct `vitest`/`@effect/vitest`/`@systemfsoftware/vitest` imports and raw runner calls (`it`, `test`, `describe`, `it.effect`, and aliases) are forbidden, and importing the harness without invoking it is equally non-compliant. The harness is expressed as `Differential.compare({ name, reference, candidate })` or `Metamorphic.on({ name, system })`. |
19
- | `conformance-test-requires-harness` | A `.conformance.test.ts` must import `Conformance` from `@systemfsoftware/conformance-spec` and invoke one of its checks — `Conformance.linearizable`, `Conformance.sequential`, or `Conformance.released`; direct `vitest`/`@effect/vitest`/`@systemfsoftware/vitest` imports, raw runner calls (`it`, `test`, `describe`, `it.effect`, and aliases), and the retired `Linearizable.check` / `SequentialModel.check` / `Released.check` shapes are forbidden, and importing the barrel without invoking a check is equally non-compliant. |
20
- | `model-fixture-imports-subject` | A `*.model.ts` fixture may not import the package whose tests it serves. The package is read from the fixture's path — the directory its tests tree lives in — and an import, re-export, dynamic import, or require of that name, or of any subpath of it, is the implementation reaching its own oracle. A relative specifier is judged the same way lexically: resolved against the fixture's directory it must stay inside the tests tree, so `../../src/Lock.js` is reported and `./Locks.js` is a sibling fixture. `effect`, node builtins, and other packages' names stay allowed. |
21
- | `vitest-from-systemfsoftware-vitest` | Every value a test uses from Vitest is imported from `@systemfsoftware/vitest`, which re-exports all of Vitest. Any value import from `vitest` or the upstream `@effect/vitest` — named, namespace, default, side-effect or dynamic — is refused; a type-only import stays legal. Exempt: the packages that drive Vitest's own runner instead of the fork (`vitest` itself, `vitest-conformance`, and `effect-spec-runtime`, whose `Register` calls Vitest's option-taking collector). |
22
- | `tests-import-public-api` | Every file under the package-root `tests/` or `__tests__/` trees, regardless of basename, may not relative-import `src` or climb into an `internal` folder. Import the published package name or a sibling helper. |
23
-
24
- | suffix | layer | doubles | location |
25
- | ----------------------------- | ------------ | ------------------------ | ------------------ |
26
- | `*.workflow.property.test.ts` | Property | none — pure core | ONLY under `src/` |
27
- | `*.integration.test.ts` | Behaviour | permitted, at ports only | NEVER under `src/` |
28
- | `*.differential.test.ts` | Differential | permitted, at ports only | NEVER under `src/` |
29
- | `*.trace.test.ts` | Trace spec | none — observes graphs | NEVER under `src/` |
30
- | `*.conformance.test.ts` | Conformance | permitted, at ports only | NEVER under `src/` |
7
+ | Rule | What it enforces |
8
+ | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
9
+ | `no-test-file-in-src` | Under `src/`, the only sanctioned test file is a single-segment `<stem>.workflow.property.test.ts` inside a sanctioned test directory whose content is a property test (it imports FastCheck or calls `it.prop`/`it.effect.prop`, and imports no differential harness), plus the generated `schema-laws.test.ts` entry point. Every other test file is banned: a kernel, policy, or schema suite becomes an in-source `import.meta.vitest` block, and a public-surface test moves outside `src/` as a Gherkin behaviour test. |
10
+ | `src-property-test-cell` | A property test under `src/` must be a single-segment `<stem>.workflow.property.test.ts` beside the `<stem>.workflow.ts` it covers. A source file whose suffix names a cell listed in `cellsRequiringTest` must also carry an in-source vitest block; that list is empty by default. |
11
+ | `test-file-outside-tests-dir` | A test file outside `src/` must live under `tests/`. |
12
+ | `e2e-tier-placement` | An end-to-end test (a file value-importing `test`, or the namespace, from `@systemfsoftware/effect-e2e/runner`) is reported in a package whose lint settings do not declare the `e2e` role. In a package that declares it, an integration test (a file importing `@systemfsoftware/effect-gherkin-spec` that is not in the e2e lane) is reported. |
13
+ | `test-suffix-outside-src` | Outside `src/`, a test file's name must match the lanes its imports select. The lane word is the dotted segment just before `.test.ts`: `conformance`, `differential` or `trace` for a file importing that harness (a file importing several of them may take any of their words), `integration` for a file importing only the Gherkin harness, and `runner` for a file in a `vitest-runner` package that imports a Vitest runner module and no harness. A name for another lane (`laneMismatch`), a test whose imports select no lane (`noLane`), and a test whose only lane is the property lane (`propertyOutsideSrc`) are reported. A file in the e2e lane must be named `<subject>.e2e.ts`, which outranks every other lane word, so `<subject>.e2e.test.ts` is reported as `laneMismatch`. The name triggers no requirement. |
14
+ | `tests-dir-helpers-in-fixtures` | Under `tests/`, the only non-test modules are helpers and fixtures, and they live inside `tests/__fixtures__/`. A `*.e2e.ts` file under `tests/`, outside `tests/__fixtures__/`, is a test, not a helper. |
15
+ | `no-io-module-in-source-test` | An in-source `import.meta.vitest` test block is forbidden in a module that performs I/O — decided from the module's own syntax (a non-type import from a filesystem, process or network module, called at least once), never from its filename. Only the in-source-test idiom is judged: a module whose tests live in separate files is a no-op for this rule. |
16
+ | `behaviour-test-requires-gherkin` | Any test file that imports `@systemfsoftware/effect-gherkin-spec` must import `makeFeature` from it and build its suite through a Feature. Which runner it may import is owned by `vitest-from-systemfsoftware-vitest`. |
17
+ | `behaviour-exercises-use-case` | Any test file that imports `@systemfsoftware/effect-gherkin-spec` must import the package under test: a runtime import of something other than the runner, the Gherkin harness, `effect` (or a subpath), a Node builtin, or the file itself. Type-only imports never count. |
18
+ | `behaviour-one-feature-per-file` | Any test file in the behaviour lane must contain exactly one `Feature(...)` call; zero or two-or-more is the junk-drawer signal. |
19
+ | `no-pseudo-gherkin-unit-tests` | In any test file that imports `@systemfsoftware/effect-gherkin-spec`, every `Feature(...)` declares its environment with `.withLayer(layer)` or `.withScenarioLayer(layer)`. |
20
+ | `differential-test-requires-harness` | Any test file that imports `@systemfsoftware/differential-spec` must invoke its harness (`Differential.compare({ name, reference, candidate })` or `Metamorphic.on({ name, system })`); importing it without invoking it is non-compliant, and raw `fc.assert`/`fc.check`/`fc.property`/`fc.asyncProperty` calls are refused because the harness owns fast-check. |
21
+ | `conformance-test-requires-harness` | Any test file that imports `Conformance` from `@systemfsoftware/conformance-spec` must invoke one of its checks — `Conformance.linearizable`, `Conformance.sequential`, or `Conformance.released`. The retired `Linearizable.check` / `SequentialModel.check` / `Released.check` shapes are refused, and importing the barrel without invoking a check is non-compliant. |
22
+ | `trace-test-requires-taxonomy` | Any test file that imports `@systemfsoftware/trace-spec` must terminate cases on relation holds over the declared span graph. Raw emit calls and HTTP status, statusText, or body assertions are forbidden. The trace lane is selected by this import; `*.trace.test.ts` is the naming convention for trace tests. |
23
+ | `model-fixture-imports-subject` | A `*.model.ts` fixture may not import the package whose tests it serves. The package is read from the fixture's path — the directory its tests tree lives in — and an import, re-export, dynamic import, or require of that name, or of any subpath of it, is the implementation reaching its own oracle. A relative specifier is judged the same way lexically: resolved against the fixture's directory it must stay inside the tests tree, so `../../src/Lock.js` is reported and `./Locks.js` is a sibling fixture. `effect`, node builtins, and other packages' names stay allowed. |
24
+ | `property-file-purity` | A property file is found by content: a test file that imports FastCheck or calls `it.prop`/`it.effect.prop`, unless it is in the differential lane. A property file holds only property tests: no plain `it()`/`test()`/`it.effect()`, and no raw `fc.assert`/`fc.check`/`fc.property`/`fc.asyncProperty`. |
25
+ | `vitest-from-systemfsoftware-vitest` | Every value a test uses from Vitest is imported from `@systemfsoftware/vitest`, which re-exports all of Vitest. Any value import from `vitest` or the upstream `@effect/vitest` — named, namespace, default, side-effect or dynamic — is refused; a type-only import stays legal. In the behaviour, conformance and differential lanes the harness owns the runner: each `it`/`test`/`describe` imported from any of the three sources is reported once, and in the conformance and differential lanes every other `it`/`test`/`describe` call, the Gherkin `it` included, is reported too. The trace lane owns no runner: a trace test calls `it`/`describe` from `@systemfsoftware/vitest`, and only the refusal of `vitest` and `@effect/vitest` value imports applies to it. A package declaring the `vitest-runner` role is not refused for raw Vitest imports. |
26
+ | `tests-import-public-api` | Every file under the package-root `tests/` or `__tests__/` trees, regardless of basename, may not relative-import `src` or climb into an `internal` folder. Import the published package name or a sibling helper. |
27
+
28
+ ## Test Lanes
29
+
30
+ Which requirements apply to a test file is decided by what it imports and calls, never by its filename or folder. A file in several lanes meets every lane's requirements. Outside `src/` the name is checked against the lanes, never the reverse.
31
+
32
+ | Lane | Selected by | Name convention | Doubles | Location |
33
+ | ------------ | --------------------------------------------------------------------------------------- | ---------------------------------- | ------------------------ | ---------------------------------------------------------------------------------- |
34
+ | Property | FastCheck import or `it.prop`/`it.effect.prop` call | `<stem>.workflow.property.test.ts` | none — pure core | ONLY under `src/` |
35
+ | Behaviour | Import from `@systemfsoftware/effect-gherkin-spec` | `*.integration.test.ts` | permitted, at ports only | NEVER under `src/` |
36
+ | Differential | Import from `@systemfsoftware/differential-spec` | `*.differential.test.ts` | permitted, at ports only | NEVER under `src/` |
37
+ | Trace | Import from `@systemfsoftware/trace-spec` | `*.trace.test.ts` | none — observes graphs | NEVER under `src/` |
38
+ | Conformance | Import from `@systemfsoftware/conformance-spec` | `*.conformance.test.ts` | permitted, at ports only | NEVER under `src/` |
39
+ | Runner | A Vitest runner module, no harness, in a package that declares the `vitest-runner` role | `*.runner.test.ts` | n/a | NEVER under `src/` |
40
+ | E2E | Value import of `test` (or the namespace) from `@systemfsoftware/effect-e2e/runner` | `<subject>.e2e.ts` | n/a | under `tests/`, outside `tests/__fixtures__/`; the package declares the `e2e` role |
41
+
42
+ ## Package Roles
43
+
44
+ A package declares one role, once, in the `settings` of its `oxlint.config.ts`. Two roles exist: `vitest-runner` and `e2e`.
45
+
46
+ Packages that are the test framework itself (today `packages/runner/vitest`, `packages/runner/vitest-conformance`, and `packages/effect-spec-runtime`) declare the `vitest-runner` role:
47
+
48
+ ```ts
49
+ export default defineConfig({
50
+ extends: [recommended],
51
+ settings: { '@systemfsoftware/oxlint-plugin-test-discipline': { role: 'vitest-runner' } },
52
+ })
53
+ ```
54
+
55
+ Packages that hold end-to-end suites run by `@systemfsoftware/effect-e2e` declare the `e2e` role:
56
+
57
+ ```ts
58
+ export default defineConfig({
59
+ extends: [recommended],
60
+ settings: { '@systemfsoftware/oxlint-plugin-test-discipline': { role: 'e2e' } },
61
+ })
62
+ ```
63
+
64
+ Every rule reads this one setting, so no two rules can disagree about the role. No rule accepts a role option: oxlint refuses `['error', { role: 'vitest-runner' }]` on a rule as a configuration error.
65
+
66
+ With the `vitest-runner` role declared, raw Vitest imports in that package are its own lane and are not refused by `vitest-from-systemfsoftware-vitest`. A test there that imports a Vitest runner module and no harness is in the runner lane, and `test-suffix-outside-src` requires the name `*.runner.test.ts`. Every other check still runs: a runner import inside a harness lane is still reported, and a Gherkin-driven test keeps the `integration` name. The same imports in a package that declares no role are refused and select no lane.
67
+
68
+ With the `e2e` role declared, a file in the e2e lane is accepted by `e2e-tier-placement`, and a file that imports `@systemfsoftware/effect-gherkin-spec` outside that lane is reported as an integration test. Without the role, every e2e-lane file is reported.
69
+
70
+ The role is a trust point: the linter cannot verify that a package actually is the runner framework or holds end-to-end suites. A package that declares a role without being what it names (for example a fixture package) is treated identically to the real one. Reviewers must check every change to a role declaration in config diffs.
31
71
 
32
72
  ## Enrollment
33
73
 
34
74
  `@systemfsoftware/oxlint-config-recommended` loads this plugin in `jsPlugins` and spreads `configs.recommended` into its default `rules` at `error`, so every rule above fires in every package that extends the preset.
35
75
 
76
+ ## `no-inline-suppression`
77
+
78
+ The package also ships a `no-inline-suppression` bin. It fails when a scanned file has a comment that opens with any of these, in line and block comments alike:
79
+
80
+ - `oxlint-disable`, `oxlint-disable-line`, `oxlint-disable-next-line`
81
+ - `eslint-disable`, `eslint-disable-line`, `eslint-disable-next-line`
82
+ - `@ts-expect-error`, `@ts-ignore`, `@ts-nocheck`
83
+
84
+ A word that only appears inside a string literal, or later in a comment's prose, is not a directive and passes.
85
+
86
+ It runs outside oxlint on purpose: oxlint obeys a disable directive even for a JS plugin rule that names it, so a rule could be switched off by the code it grades. The bin reads no configuration, and nothing inside a scanned file can exempt it.
87
+
88
+ ```bash
89
+ no-inline-suppression # every git-tracked .ts/.tsx/.mts/.cts/.js/.jsx/.mjs/.cjs file under the working directory
90
+ no-inline-suppression src/a.ts # only the named files
91
+ ```
92
+
93
+ Each finding prints as `file:line:column: <form> is forbidden. ...`. Exit status: `0` clean, `1` a refused comment or a file the parser could not read, `2` the files could not be listed or opened.
94
+
36
95
  ## Testing
37
96
 
38
- Each rule ships a RuleTester suite at `src/rules/__tests__/<rule>.test.ts`, with 100% mutation coverage required.
97
+ Each rule ships a RuleTester suite at `src/rules/__tests__/<rule>.test.ts`.
package/dist/index.d.ts CHANGED
@@ -20,6 +20,7 @@ declare const _default: {
20
20
  'src-property-test-cell': import("@oxlint/plugins").Rule;
21
21
  'test-file-outside-tests-dir': import("@oxlint/plugins").Rule;
22
22
  'test-suffix-outside-src': import("@oxlint/plugins").Rule;
23
+ 'e2e-tier-placement': import("@oxlint/plugins").Rule;
23
24
  'behaviour-test-requires-gherkin': import("@oxlint/plugins").Rule;
24
25
  'behaviour-exercises-use-case': import("@oxlint/plugins").Rule;
25
26
  'behaviour-one-feature-per-file': import("@oxlint/plugins").Rule;